cloud.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from pydantic import BaseModel, Field
  2. from typing import Optional
  3. class CloudLoginRequest(BaseModel):
  4. """Request to initiate cloud login."""
  5. email: str = Field(..., description="Bambu Lab account email")
  6. password: str = Field(..., description="Account password")
  7. region: str = Field(default="global", description="Region: 'global' or 'china'")
  8. class CloudVerifyRequest(BaseModel):
  9. """Request to verify login with 2FA code."""
  10. email: str = Field(..., description="Bambu Lab account email")
  11. code: str = Field(..., description="6-digit verification code from email")
  12. class CloudLoginResponse(BaseModel):
  13. """Response from login attempt."""
  14. success: bool
  15. needs_verification: bool = False
  16. message: str
  17. class CloudAuthStatus(BaseModel):
  18. """Current authentication status."""
  19. is_authenticated: bool
  20. email: Optional[str] = None
  21. class CloudTokenRequest(BaseModel):
  22. """Request to set access token directly."""
  23. access_token: str = Field(..., description="Bambu Lab access token")
  24. class SlicerSetting(BaseModel):
  25. """A slicer setting/preset."""
  26. setting_id: str
  27. name: str
  28. type: str # filament, printer, process
  29. version: Optional[str] = None
  30. user_id: Optional[str] = None
  31. updated_time: Optional[str] = None
  32. class SlicerSettingsResponse(BaseModel):
  33. """Response containing slicer settings."""
  34. filament: list[SlicerSetting] = []
  35. printer: list[SlicerSetting] = []
  36. process: list[SlicerSetting] = []
  37. class CloudDevice(BaseModel):
  38. """A bound printer device."""
  39. dev_id: str
  40. name: str
  41. dev_model_name: Optional[str] = None
  42. dev_product_name: Optional[str] = None
  43. online: bool = False
  44. class SlicerSettingCreate(BaseModel):
  45. """Request to create a new slicer preset."""
  46. type: str = Field(..., description="Preset type: 'filament', 'print', or 'printer'")
  47. name: str = Field(..., description="Display name for the preset")
  48. base_id: str = Field(..., description="Base preset ID to inherit from")
  49. version: str = Field(default="2.0.0.0", description="Version string for the preset")
  50. setting: dict = Field(default_factory=dict, description="Setting key-value pairs (delta from base)")
  51. class SlicerSettingUpdate(BaseModel):
  52. """Request to update an existing slicer preset."""
  53. name: Optional[str] = Field(None, description="New display name")
  54. setting: Optional[dict] = Field(None, description="Setting key-value pairs to update")
  55. class SlicerSettingDetail(BaseModel):
  56. """Detailed slicer setting/preset response."""
  57. message: Optional[str] = None
  58. code: Optional[str] = None
  59. error: Optional[str] = None
  60. public: bool = False
  61. version: Optional[str] = None
  62. type: str
  63. name: str
  64. update_time: Optional[str] = None
  65. nickname: Optional[str] = None
  66. base_id: Optional[str] = None
  67. setting: dict = Field(default_factory=dict)
  68. filament_id: Optional[str] = None
  69. setting_id: Optional[str] = None # For response after create
  70. class SlicerSettingDeleteResponse(BaseModel):
  71. """Response from deleting a preset."""
  72. success: bool
  73. message: str