cloud.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from pydantic import BaseModel, Field
  2. class CloudLoginRequest(BaseModel):
  3. """Request to initiate cloud login."""
  4. email: str = Field(..., description="Bambu Lab account email")
  5. password: str = Field(..., description="Account password")
  6. region: str = Field(default="global", description="Region: 'global' or 'china'")
  7. class CloudVerifyRequest(BaseModel):
  8. """Request to verify login with 2FA code (email or TOTP)."""
  9. email: str = Field(..., description="Bambu Lab account email")
  10. code: str = Field(..., description="6-digit verification code")
  11. tfa_key: str | None = Field(None, description="TFA key for TOTP verification (from login response)")
  12. class CloudLoginResponse(BaseModel):
  13. """Response from login attempt."""
  14. success: bool
  15. needs_verification: bool = False
  16. message: str
  17. verification_type: str | None = None # "email" or "totp"
  18. tfa_key: str | None = None # Key needed for TOTP verification
  19. class CloudAuthStatus(BaseModel):
  20. """Current authentication status."""
  21. is_authenticated: bool
  22. email: str | None = None
  23. class CloudTokenRequest(BaseModel):
  24. """Request to set access token directly."""
  25. access_token: str = Field(..., description="Bambu Lab access token")
  26. class SlicerSetting(BaseModel):
  27. """A slicer setting/preset."""
  28. setting_id: str
  29. name: str
  30. type: str # filament, printer, process
  31. version: str | None = None
  32. user_id: str | None = None
  33. updated_time: str | None = None
  34. is_custom: bool = False
  35. class SlicerSettingsResponse(BaseModel):
  36. """Response containing slicer settings."""
  37. filament: list[SlicerSetting] = []
  38. printer: list[SlicerSetting] = []
  39. process: list[SlicerSetting] = []
  40. class CloudDevice(BaseModel):
  41. """A bound printer device."""
  42. dev_id: str
  43. name: str
  44. dev_model_name: str | None = None
  45. dev_product_name: str | None = None
  46. online: bool = False
  47. class SlicerSettingCreate(BaseModel):
  48. """Request to create a new slicer preset."""
  49. type: str = Field(..., description="Preset type: 'filament', 'print', or 'printer'")
  50. name: str = Field(..., description="Display name for the preset")
  51. base_id: str = Field(..., description="Base preset ID to inherit from")
  52. version: str = Field(default="2.0.0.0", description="Version string for the preset")
  53. setting: dict = Field(default_factory=dict, description="Setting key-value pairs (delta from base)")
  54. class SlicerSettingUpdate(BaseModel):
  55. """Request to update an existing slicer preset."""
  56. name: str | None = Field(None, description="New display name")
  57. setting: dict | None = Field(None, description="Setting key-value pairs to update")
  58. class SlicerSettingDetail(BaseModel):
  59. """Detailed slicer setting/preset response."""
  60. message: str | None = None
  61. code: str | None = None
  62. error: str | None = None
  63. public: bool = False
  64. version: str | None = None
  65. type: str
  66. name: str
  67. update_time: str | None = None
  68. nickname: str | None = None
  69. base_id: str | None = None
  70. setting: dict = Field(default_factory=dict)
  71. filament_id: str | None = None
  72. setting_id: str | None = None # For response after create
  73. class SlicerSettingDeleteResponse(BaseModel):
  74. """Response from deleting a preset."""
  75. success: bool
  76. message: str
  77. class FirmwareUpdateInfo(BaseModel):
  78. """Firmware update information for a device."""
  79. device_id: str = Field(..., description="Device ID")
  80. device_name: str = Field(..., description="Device name")
  81. current_version: str | None = Field(None, description="Currently installed firmware version")
  82. latest_version: str | None = Field(None, description="Latest available firmware version")
  83. update_available: bool = Field(False, description="Whether an update is available")
  84. release_notes: str | None = Field(None, description="Release notes for the latest version")
  85. class FirmwareUpdatesResponse(BaseModel):
  86. """Response containing firmware updates for all devices."""
  87. updates: list[FirmwareUpdateInfo] = Field(default_factory=list)
  88. updates_available: int = Field(0, description="Total number of devices with updates available")