"""Model for storing AMS slot to filament preset mappings. This stores the user's preferred filament preset for each AMS slot, similar to how Bambu Studio remembers preset selections. """ from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, String, UniqueConstraint, func from sqlalchemy.orm import Mapped, mapped_column, relationship from backend.app.core.database import Base class SlotPresetMapping(Base): """Maps an AMS slot to a cloud filament preset.""" __tablename__ = "slot_preset_mappings" __table_args__ = (UniqueConstraint("printer_id", "ams_id", "tray_id", name="uq_slot_preset"),) id: Mapped[int] = mapped_column(primary_key=True) printer_id: Mapped[int] = mapped_column(ForeignKey("printers.id", ondelete="CASCADE")) ams_id: Mapped[int] = mapped_column(Integer) # AMS unit ID (0, 1, 2, 3) tray_id: Mapped[int] = mapped_column(Integer) # Tray ID within AMS (0-3) preset_id: Mapped[str] = mapped_column(String(100)) # Cloud preset setting_id preset_name: Mapped[str] = mapped_column(String(200)) # Preset name for display preset_source: Mapped[str] = mapped_column(String(20), default="cloud") # cloud or local # The filament id the slot was configured with alongside this preset. When # the printer later reports a different one, something else (the slicer's # Device tab, the printer screen) re-configured the slot and this row no # longer describes it (#3216). None for rows written before it was recorded # and by callers that do not know it. tray_info_idx: Mapped[str | None] = mapped_column(String(32), nullable=True) 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()) # Relationship printer: Mapped["Printer"] = relationship() from backend.app.models.printer import Printer # noqa: E402