maintenance.py 4.1 KB

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