maintenance.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. """Maintenance tracking schemas."""
  2. from datetime import datetime
  3. from pydantic import BaseModel, Field
  4. # Maintenance Type schemas
  5. class MaintenanceTypeBase(BaseModel):
  6. name: str = Field(..., min_length=1, max_length=100)
  7. description: str | None = None
  8. default_interval_hours: float = Field(default=100.0, ge=1.0)
  9. # "hours" = print hours, "days" = calendar days
  10. interval_type: str = Field(default="hours", pattern="^(hours|days)$")
  11. icon: str | None = None
  12. class MaintenanceTypeCreate(MaintenanceTypeBase):
  13. pass
  14. class MaintenanceTypeUpdate(BaseModel):
  15. name: str | None = None
  16. description: str | None = None
  17. default_interval_hours: float | None = Field(default=None, ge=1.0)
  18. interval_type: str | None = Field(default=None, pattern="^(hours|days)$")
  19. icon: str | None = None
  20. class MaintenanceTypeResponse(MaintenanceTypeBase):
  21. id: int
  22. is_system: bool
  23. created_at: datetime
  24. class Config:
  25. from_attributes = True
  26. # Printer Maintenance schemas
  27. class PrinterMaintenanceBase(BaseModel):
  28. printer_id: int
  29. maintenance_type_id: int
  30. custom_interval_hours: float | None = None
  31. enabled: bool = True
  32. class PrinterMaintenanceCreate(PrinterMaintenanceBase):
  33. pass
  34. class PrinterMaintenanceUpdate(BaseModel):
  35. custom_interval_hours: float | None = None
  36. custom_interval_type: str | None = Field(default=None, pattern="^(hours|days)$")
  37. enabled: bool | None = None
  38. class PrinterMaintenanceResponse(BaseModel):
  39. id: int
  40. printer_id: int
  41. maintenance_type_id: int
  42. maintenance_type: MaintenanceTypeResponse
  43. custom_interval_hours: float | None
  44. enabled: bool
  45. last_performed_at: datetime | None
  46. last_performed_hours: float
  47. created_at: datetime
  48. updated_at: datetime
  49. class Config:
  50. from_attributes = True
  51. # Maintenance History schemas
  52. class MaintenanceHistoryBase(BaseModel):
  53. notes: str | None = None
  54. class MaintenanceHistoryCreate(MaintenanceHistoryBase):
  55. pass
  56. class MaintenanceHistoryResponse(MaintenanceHistoryBase):
  57. id: int
  58. printer_maintenance_id: int
  59. performed_at: datetime
  60. hours_at_maintenance: float
  61. class Config:
  62. from_attributes = True
  63. # Combined status response for frontend
  64. class MaintenanceStatus(BaseModel):
  65. """Maintenance status for a printer with calculated values."""
  66. id: int
  67. printer_id: int
  68. printer_name: str
  69. maintenance_type_id: int
  70. maintenance_type_name: str
  71. maintenance_type_icon: str | None
  72. enabled: bool
  73. # Interval configuration
  74. interval_hours: float # custom or default (hours for print-based, days for time-based)
  75. interval_type: str # "hours" or "days"
  76. # For print-hour based maintenance
  77. current_hours: float # total print hours for printer
  78. hours_since_maintenance: float # current - last_performed
  79. hours_until_due: float # interval - hours_since (for hours type)
  80. # For time-based maintenance
  81. days_since_maintenance: float | None # days since last performed
  82. days_until_due: float | None # for days type
  83. # Status flags
  84. is_due: bool # hours_until_due <= 0 OR days_until_due <= 0
  85. is_warning: bool # within 10% of interval
  86. last_performed_at: datetime | None
  87. class PrinterMaintenanceOverview(BaseModel):
  88. """Overview of all maintenance items for a printer."""
  89. printer_id: int
  90. printer_name: str
  91. total_print_hours: float
  92. maintenance_items: list[MaintenanceStatus]
  93. due_count: int
  94. warning_count: int
  95. class PerformMaintenanceRequest(BaseModel):
  96. """Request to mark maintenance as performed."""
  97. notes: str | None = None