maintenance.py 3.9 KB

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