spoolman.py 1.1 KB

123456789101112131415161718192021222324252627282930
  1. from pydantic import BaseModel, Field, model_validator
  2. class SpoolmanFilamentPatch(BaseModel):
  3. name: str | None = Field(None, min_length=1, max_length=200)
  4. spool_weight: float | None = Field(None, ge=0.0, le=10_000.0)
  5. keep_existing_spools: bool = False
  6. @model_validator(mode="after")
  7. def keep_existing_requires_weight(self) -> "SpoolmanFilamentPatch":
  8. if self.keep_existing_spools and self.spool_weight is None:
  9. raise ValueError("keep_existing_spools=True requires spool_weight to be provided")
  10. return self
  11. class SpoolmanSlotAssignmentEnriched(BaseModel):
  12. """Slot assignment row enriched with printer name and AMS label.
  13. ``printer_name`` is null only in the cascade-deleted edge case where the
  14. Printer relation has been removed. ``ams_label`` is null when no
  15. ``ams_labels`` row matches the slot's MQTT serial (or the synthetic
  16. ``f"p{printer_id}a{ams_id}"`` fallback key).
  17. """
  18. printer_id: int
  19. printer_name: str | None
  20. ams_id: int
  21. tray_id: int
  22. spoolman_spool_id: int
  23. ams_label: str | None