archive.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from datetime import datetime
  2. from pydantic import BaseModel
  3. class ArchiveBase(BaseModel):
  4. print_name: str | None = None
  5. is_favorite: bool | None = None
  6. tags: str | None = None
  7. notes: str | None = None
  8. cost: float | None = None
  9. failure_reason: str | None = None
  10. class ArchiveUpdate(ArchiveBase):
  11. printer_id: int | None = None
  12. class ArchiveResponse(BaseModel):
  13. id: int
  14. printer_id: int | None
  15. filename: str
  16. file_path: str
  17. file_size: int
  18. thumbnail_path: str | None
  19. timelapse_path: str | None
  20. print_name: str | None
  21. print_time_seconds: int | None
  22. filament_used_grams: float | None
  23. filament_type: str | None
  24. filament_color: str | None
  25. layer_height: float | None
  26. nozzle_diameter: float | None
  27. bed_temperature: int | None
  28. nozzle_temperature: int | None
  29. status: str
  30. started_at: datetime | None
  31. completed_at: datetime | None
  32. extra_data: dict | None
  33. makerworld_url: str | None
  34. designer: str | None
  35. is_favorite: bool
  36. tags: str | None
  37. notes: str | None
  38. cost: float | None
  39. photos: list | None
  40. failure_reason: str | None
  41. created_at: datetime
  42. class Config:
  43. from_attributes = True
  44. class ArchiveStats(BaseModel):
  45. total_prints: int
  46. successful_prints: int
  47. failed_prints: int
  48. total_print_time_hours: float
  49. total_filament_grams: float
  50. total_cost: float
  51. prints_by_filament_type: dict
  52. prints_by_printer: dict
  53. class ProjectPageImage(BaseModel):
  54. """Image embedded in 3MF project page."""
  55. name: str
  56. path: str # Path within 3MF
  57. url: str # API URL to fetch image
  58. class ProjectPageResponse(BaseModel):
  59. """Project page data extracted from 3MF file."""
  60. # Model info
  61. title: str | None = None
  62. description: str | None = None # HTML content
  63. designer: str | None = None
  64. designer_user_id: str | None = None
  65. license: str | None = None
  66. copyright: str | None = None
  67. creation_date: str | None = None
  68. modification_date: str | None = None
  69. origin: str | None = None # "original" or "remix"
  70. # Profile info
  71. profile_title: str | None = None
  72. profile_description: str | None = None
  73. profile_cover: str | None = None
  74. profile_user_id: str | None = None
  75. profile_user_name: str | None = None
  76. # MakerWorld info
  77. design_model_id: str | None = None
  78. design_profile_id: str | None = None
  79. design_region: str | None = None
  80. # Images
  81. model_pictures: list[ProjectPageImage] = []
  82. profile_pictures: list[ProjectPageImage] = []
  83. thumbnails: list[ProjectPageImage] = []
  84. class ProjectPageUpdate(BaseModel):
  85. """Update project page data in 3MF file."""
  86. title: str | None = None
  87. description: str | None = None
  88. designer: str | None = None
  89. license: str | None = None
  90. copyright: str | None = None
  91. profile_title: str | None = None
  92. profile_description: str | None = None