from __future__ import annotations from datetime import datetime from sqlmodel import Field, Relationship, SQLModel from app.core.constants import DeviceStatus from app.db.base import SoftDeleteMixin, TimestampMixin class DeviceGroup(TimestampMixin, SQLModel, table=True): __tablename__ = "device_groups" id: int | None = Field(default=None, primary_key=True) name: str = Field(max_length=100, unique=True) description: str = Field(default="", max_length=500) devices: list[Device] = Relationship(back_populates="group") class Device(TimestampMixin, SoftDeleteMixin, SQLModel, table=True): __tablename__ = "devices" id: int | None = Field(default=None, primary_key=True) device_uid: str = Field(max_length=100, unique=True, index=True) name: str = Field(max_length=100) device_type: str = Field(default="", max_length=50) status: str = Field(default=DeviceStatus.OFFLINE, max_length=20) firmware_version: str = Field(default="", max_length=50) ip_address: str = Field(default="", max_length=45) group_id: int | None = Field(default=None, foreign_key="device_groups.id") owner_id: int | None = Field(default=None, foreign_key="users.id") last_seen_at: datetime | None = Field(default=None) metadata_json: str = Field(default="{}", max_length=2000) group: DeviceGroup | None = Relationship(back_populates="devices")