print_queue.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from datetime import datetime, timezone
  2. from typing import Literal, Annotated
  3. from pydantic import BaseModel, PlainSerializer
  4. # Custom serializer to ensure UTC datetimes have Z suffix
  5. def serialize_utc_datetime(dt: datetime | None) -> str | None:
  6. if dt is None:
  7. return None
  8. # Add Z suffix to indicate UTC
  9. return dt.isoformat() + "Z"
  10. UTCDatetime = Annotated[datetime | None, PlainSerializer(serialize_utc_datetime)]
  11. class PrintQueueItemCreate(BaseModel):
  12. printer_id: int
  13. archive_id: int
  14. scheduled_time: datetime | None = None # None = ASAP (next when idle)
  15. require_previous_success: bool = False
  16. auto_off_after: bool = False # Power off printer after print completes
  17. class PrintQueueItemUpdate(BaseModel):
  18. printer_id: int | None = None
  19. position: int | None = None
  20. scheduled_time: datetime | None = None
  21. require_previous_success: bool | None = None
  22. auto_off_after: bool | None = None
  23. class PrintQueueItemResponse(BaseModel):
  24. id: int
  25. printer_id: int
  26. archive_id: int
  27. position: int
  28. scheduled_time: UTCDatetime
  29. require_previous_success: bool
  30. auto_off_after: bool
  31. status: Literal["pending", "printing", "completed", "failed", "skipped", "cancelled"]
  32. started_at: UTCDatetime
  33. completed_at: UTCDatetime
  34. error_message: str | None
  35. created_at: UTCDatetime
  36. # Nested info for UI (populated in route)
  37. archive_name: str | None = None
  38. archive_thumbnail: str | None = None
  39. printer_name: str | None = None
  40. print_time_seconds: int | None = None # Estimated print time from archive
  41. class Config:
  42. from_attributes = True
  43. class PrintQueueReorderItem(BaseModel):
  44. id: int
  45. position: int
  46. class PrintQueueReorder(BaseModel):
  47. items: list[PrintQueueReorderItem]