maintenance.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. icon: str | None = None
  10. class MaintenanceTypeCreate(MaintenanceTypeBase):
  11. pass
  12. class MaintenanceTypeUpdate(BaseModel):
  13. name: str | None = None
  14. description: str | None = None
  15. default_interval_hours: float | None = Field(default=None, ge=1.0)
  16. icon: str | None = None
  17. class MaintenanceTypeResponse(MaintenanceTypeBase):
  18. id: int
  19. is_system: bool
  20. created_at: datetime
  21. class Config:
  22. from_attributes = True
  23. # Printer Maintenance schemas
  24. class PrinterMaintenanceBase(BaseModel):
  25. printer_id: int
  26. maintenance_type_id: int
  27. custom_interval_hours: float | None = None
  28. enabled: bool = True
  29. class PrinterMaintenanceCreate(PrinterMaintenanceBase):
  30. pass
  31. class PrinterMaintenanceUpdate(BaseModel):
  32. custom_interval_hours: float | None = None
  33. enabled: bool | None = None
  34. class PrinterMaintenanceResponse(BaseModel):
  35. id: int
  36. printer_id: int
  37. maintenance_type_id: int
  38. maintenance_type: MaintenanceTypeResponse
  39. custom_interval_hours: float | None
  40. enabled: bool
  41. last_performed_at: datetime | None
  42. last_performed_hours: float
  43. created_at: datetime
  44. updated_at: datetime
  45. class Config:
  46. from_attributes = True
  47. # Maintenance History schemas
  48. class MaintenanceHistoryBase(BaseModel):
  49. notes: str | None = None
  50. class MaintenanceHistoryCreate(MaintenanceHistoryBase):
  51. pass
  52. class MaintenanceHistoryResponse(MaintenanceHistoryBase):
  53. id: int
  54. printer_maintenance_id: int
  55. performed_at: datetime
  56. hours_at_maintenance: float
  57. class Config:
  58. from_attributes = True
  59. # Combined status response for frontend
  60. class MaintenanceStatus(BaseModel):
  61. """Maintenance status for a printer with calculated values."""
  62. id: int
  63. printer_id: int
  64. printer_name: str
  65. maintenance_type_id: int
  66. maintenance_type_name: str
  67. maintenance_type_icon: str | None
  68. enabled: bool
  69. interval_hours: float # custom or default
  70. current_hours: float # total print hours for printer
  71. hours_since_maintenance: float # current - last_performed
  72. hours_until_due: float # interval - hours_since
  73. is_due: bool # hours_until_due <= 0
  74. is_warning: bool # hours_until_due <= 10% of interval
  75. last_performed_at: datetime | None
  76. class PrinterMaintenanceOverview(BaseModel):
  77. """Overview of all maintenance items for a printer."""
  78. printer_id: int
  79. printer_name: str
  80. total_print_hours: float
  81. maintenance_items: list[MaintenanceStatus]
  82. due_count: int
  83. warning_count: int
  84. class PerformMaintenanceRequest(BaseModel):
  85. """Request to mark maintenance as performed."""
  86. notes: str | None = None