| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- from datetime import datetime, timezone
- from typing import Literal, Annotated
- from pydantic import BaseModel, PlainSerializer
- # Custom serializer to ensure UTC datetimes have Z suffix
- def serialize_utc_datetime(dt: datetime | None) -> str | None:
- if dt is None:
- return None
- # Add Z suffix to indicate UTC
- return dt.isoformat() + "Z"
- UTCDatetime = Annotated[datetime | None, PlainSerializer(serialize_utc_datetime)]
- class PrintQueueItemCreate(BaseModel):
- printer_id: int
- archive_id: int
- scheduled_time: datetime | None = None # None = ASAP (next when idle)
- require_previous_success: bool = False
- auto_off_after: bool = False # Power off printer after print completes
- class PrintQueueItemUpdate(BaseModel):
- printer_id: int | None = None
- position: int | None = None
- scheduled_time: datetime | None = None
- require_previous_success: bool | None = None
- auto_off_after: bool | None = None
- class PrintQueueItemResponse(BaseModel):
- id: int
- printer_id: int
- archive_id: int
- position: int
- scheduled_time: UTCDatetime
- require_previous_success: bool
- auto_off_after: bool
- status: Literal["pending", "printing", "completed", "failed", "skipped", "cancelled"]
- started_at: UTCDatetime
- completed_at: UTCDatetime
- error_message: str | None
- created_at: UTCDatetime
- # Nested info for UI (populated in route)
- archive_name: str | None = None
- archive_thumbnail: str | None = None
- printer_name: str | None = None
- class Config:
- from_attributes = True
- class PrintQueueReorderItem(BaseModel):
- id: int
- position: int
- class PrintQueueReorder(BaseModel):
- items: list[PrintQueueReorderItem]
|