printer.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from datetime import datetime
  2. from sqlalchemy import Boolean, DateTime, Float, String, func
  3. from sqlalchemy.orm import Mapped, mapped_column, relationship
  4. from backend.app.core.database import Base
  5. class Printer(Base):
  6. __tablename__ = "printers"
  7. id: Mapped[int] = mapped_column(primary_key=True)
  8. name: Mapped[str] = mapped_column(String(100))
  9. serial_number: Mapped[str] = mapped_column(String(50), unique=True)
  10. ip_address: Mapped[str] = mapped_column(String(45))
  11. access_code: Mapped[str] = mapped_column(String(20))
  12. model: Mapped[str | None] = mapped_column(String(50))
  13. location: Mapped[str | None] = mapped_column(String(100)) # Group/location name
  14. nozzle_count: Mapped[int] = mapped_column(default=1) # 1 or 2, auto-detected from MQTT
  15. is_active: Mapped[bool] = mapped_column(Boolean, default=True)
  16. auto_archive: Mapped[bool] = mapped_column(Boolean, default=True)
  17. print_hours_offset: Mapped[float] = mapped_column(Float, default=0.0) # Baseline hours to add
  18. runtime_seconds: Mapped[int] = mapped_column(default=0) # Accumulated active runtime (RUNNING/PAUSE states)
  19. last_runtime_update: Mapped[datetime | None] = mapped_column(
  20. DateTime, nullable=True
  21. ) # Last time runtime was updated
  22. # External camera configuration
  23. external_camera_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
  24. external_camera_type: Mapped[str | None] = mapped_column(String(20), nullable=True) # mjpeg, rtsp, snapshot
  25. external_camera_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
  26. # Plate detection - check if build plate is empty before starting print
  27. plate_detection_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
  28. # ROI for plate detection (percentages: 0.0-1.0)
  29. plate_detection_roi_x: Mapped[float | None] = mapped_column(Float, nullable=True) # X start %
  30. plate_detection_roi_y: Mapped[float | None] = mapped_column(Float, nullable=True) # Y start %
  31. plate_detection_roi_w: Mapped[float | None] = mapped_column(Float, nullable=True) # Width %
  32. plate_detection_roi_h: Mapped[float | None] = mapped_column(Float, nullable=True) # Height %
  33. created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  34. updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())
  35. # Relationships
  36. archives: Mapped[list["PrintArchive"]] = relationship(back_populates="printer", cascade="all, delete-orphan")
  37. smart_plug: Mapped["SmartPlug | None"] = relationship(back_populates="printer", uselist=False)
  38. notification_providers: Mapped[list["NotificationProvider"]] = relationship(back_populates="printer")
  39. maintenance_items: Mapped[list["PrinterMaintenance"]] = relationship(
  40. back_populates="printer", cascade="all, delete-orphan"
  41. )
  42. kprofile_notes: Mapped[list["KProfileNote"]] = relationship(back_populates="printer", cascade="all, delete-orphan")
  43. ams_history: Mapped[list["AMSSensorHistory"]] = relationship(back_populates="printer", cascade="all, delete-orphan")
  44. from backend.app.models.ams_history import AMSSensorHistory # noqa: E402
  45. from backend.app.models.archive import PrintArchive # noqa: E402
  46. from backend.app.models.kprofile_note import KProfileNote # noqa: E402
  47. from backend.app.models.maintenance import PrinterMaintenance # noqa: E402
  48. from backend.app.models.notification import NotificationProvider # noqa: E402
  49. from backend.app.models.smart_plug import SmartPlug # noqa: E402