signcontrol/db.py

111 lines
2.8 KiB
Python

# from __future__ import annotations
from sqlmodel import Field, Relationship, SQLModel
from netbrite import Colors, Fonts, Priorities, ScrollSpeeds, Message
MAX_WIDTH = 120
MAX_HEIGHT = 7
# --- Message ---
class MessageBase(SQLModel):
text: str = ""
activation_delay: int = 0
display_delay: int = 0
display_repeat: int = 0
priority: Priorities = Priorities.OVERRIDE
sound_alarm: bool = False
ttl: int = 0
class MessageUpdate(SQLModel):
text: str | None = ""
activation_delay: int | None = 0
display_delay: int | None = 0
display_repeat: int | None = 0
priority: Priorities | None = Priorities.OVERRIDE
sound_alarm: bool = False
ttl: int | None = 0
class MessageDB(MessageBase, table=True):
id: int | None = Field(default=None, primary_key=True)
zone: "ZoneDB" = Relationship( # pyright: ignore[reportAny]
back_populates="default_message"
)
class MessagePublic(MessageBase):
id: int
# --- Device ---
class NetBriteBase(SQLModel):
address: str = Field(unique=True, index=True)
port: int = 700
class NetBriteUpdate(SQLModel):
address: str = Field(unique=True, index=True)
port: int = 700
class NetBriteDB(NetBriteBase, table=True):
id: int | None = Field(default=None, primary_key=True)
zones: list["ZoneDB"] = Relationship( # pyright: ignore[reportAny]
back_populates="netbrite"
)
class NetBritePublic(NetBriteBase):
id: int
zones: list["ZoneDB"]
active: bool
# --- Zone ---
class ZoneBase(SQLModel):
name: str
x: int = 0
y: int = 0
width: int = MAX_WIDTH
height: int = MAX_HEIGHT
scroll_speed: ScrollSpeeds = ScrollSpeeds.NORMAL
pause_duration: int = 1000
volume: int = 4
default_font: Fonts = Fonts.NORMAL_7
default_color: Colors = Colors.RED
class ZoneUpdate(SQLModel):
name: str | None = None
x: int | None = None
y: int | None = None
width: int | None = None
height: int | None = None
scroll_speed: ScrollSpeeds | None = ScrollSpeeds.NORMAL
pause_duration: int | None = 1000
volume: int | None = 4
default_font: Fonts | None = Fonts.NORMAL_7
default_color: Colors | None = Colors.RED
class ZoneDBBase(ZoneBase):
default_message_id: int | None = Field(default=None, foreign_key="messagedb.id")
netbrite_id: int = Field(default=None, foreign_key="netbritedb.id")
class ZoneDB(ZoneDBBase, table=True):
id: int | None = Field(default=None, primary_key=True)
default_message: MessageDB | None = Relationship( # pyright: ignore[reportAny]
back_populates="zone"
)
netbrite: NetBriteDB = Relationship( # pyright: ignore[reportAny]
back_populates="zones"
)
class ZonePublic(ZoneDBBase):
id: int
default_message: MessagePublic
# netbrite: NetBritePublic