import enum from datetime import date, datetime from sqlalchemy import Date, DateTime, Enum, ForeignKey, String, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import Base class PrinterStatus(enum.Enum): idle = "idle" printing = "printing" error = "error" offline = "offline" class Printer(Base): __tablename__ = "printers" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100)) location: Mapped[str | None] = mapped_column(String(100)) type_id: Mapped[int | None] = mapped_column(ForeignKey("printer_types.id")) status: Mapped[PrinterStatus] = mapped_column( Enum(PrinterStatus), default=PrinterStatus.offline ) bought_at: Mapped[date | None] = mapped_column(Date) last_maintenance_at: Mapped[date | None] = mapped_column(Date) decommissioned_at: Mapped[date | None] = mapped_column(Date) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), onupdate=func.now() ) printer_type: Mapped["PrinterType | None"] = relationship(back_populates="printers") jobs: Mapped[list["PrintJob"]] = relationship(back_populates="printer") todos: Mapped[list["Todo"]] = relationship(back_populates="printer") logs: Mapped[list["PrinterLog"]] = relationship( back_populates="printer", order_by="PrinterLog.created_at.desc()" )