schemas.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from pydantic import BaseModel, EmailStr, Field
  2. from typing import Optional, List
  3. from datetime import datetime
  4. # Response models
  5. class MaterialBase(BaseModel):
  6. id: int
  7. name_en: Optional[str] = None
  8. name_ru: Optional[str] = None
  9. name_me: Optional[str] = None
  10. desc_en: Optional[str] = None
  11. desc_ru: Optional[str] = None
  12. desc_me: Optional[str] = None
  13. name_key: Optional[str] = None
  14. description_key: Optional[str] = None
  15. price_per_cm3: float
  16. is_active: bool
  17. class ServiceBase(BaseModel):
  18. id: int
  19. name_key: str
  20. description_key: Optional[str]
  21. tech_type: Optional[str]
  22. is_active: bool
  23. # Management models
  24. class MaterialCreate(BaseModel):
  25. name_en: str
  26. name_ru: str
  27. name_me: str
  28. desc_en: str
  29. desc_ru: str
  30. desc_me: str
  31. price_per_cm3: float
  32. is_active: bool = True
  33. class MaterialUpdate(BaseModel):
  34. name_en: Optional[str] = None
  35. name_ru: Optional[str] = None
  36. name_me: Optional[str] = None
  37. desc_en: Optional[str] = None
  38. desc_ru: Optional[str] = None
  39. desc_me: Optional[str] = None
  40. price_per_cm3: Optional[float] = None
  41. is_active: Optional[bool] = None
  42. class ServiceCreate(BaseModel):
  43. name_key: str
  44. description_key: Optional[str] = None
  45. tech_type: Optional[str] = None
  46. is_active: bool = True
  47. class ServiceUpdate(BaseModel):
  48. name_key: Optional[str] = None
  49. description_key: Optional[str] = None
  50. tech_type: Optional[str] = None
  51. is_active: Optional[bool] = None
  52. # Order creation models
  53. class OrderFileBase(BaseModel):
  54. filename: str
  55. file_size: Optional[int]
  56. class OrderCreate(BaseModel):
  57. first_name: str = Field(..., min_length=1)
  58. last_name: str = Field(..., min_length=1)
  59. phone: str = Field(..., min_length=5)
  60. email: EmailStr
  61. shipping_address: str = Field(..., min_length=10)
  62. model_link: Optional[str] = None
  63. quantity: int = Field(1, ge=1)
  64. notes: Optional[str] = None
  65. # User models
  66. class UserCreate(BaseModel):
  67. email: EmailStr
  68. password: str = Field(..., min_length=6)
  69. first_name: Optional[str] = None
  70. last_name: Optional[str] = None
  71. phone: Optional[str] = None
  72. shipping_address: Optional[str] = None
  73. preferred_language: Optional[str] = "en"
  74. class UserUpdate(BaseModel):
  75. first_name: Optional[str] = None
  76. last_name: Optional[str] = None
  77. phone: Optional[str] = None
  78. shipping_address: Optional[str] = None
  79. preferred_language: Optional[str] = None
  80. class UserLogin(BaseModel):
  81. email: EmailStr
  82. password: str
  83. class UserResponse(BaseModel):
  84. id: int
  85. email: EmailStr
  86. first_name: Optional[str] = None
  87. last_name: Optional[str] = None
  88. phone: Optional[str] = None
  89. shipping_address: Optional[str] = None
  90. preferred_language: str = "en"
  91. role: str
  92. ip_address: Optional[str] = None
  93. created_at: datetime
  94. class Config:
  95. from_attributes = True
  96. class AdminOrderUpdate(BaseModel):
  97. status: Optional[str] = None
  98. total_price: Optional[float] = None
  99. class EstimateRequest(BaseModel):
  100. material_id: int
  101. file_sizes: List[int] # in bytes
  102. file_quantities: Optional[List[int]] = None
  103. # Possible to add density or other params later
  104. class Token(BaseModel):
  105. access_token: str
  106. token_type: str
  107. class SocialLogin(BaseModel):
  108. provider: str # 'google' or 'facebook'
  109. token: str
  110. email: EmailStr
  111. first_name: Optional[str] = None
  112. last_name: Optional[str] = None
  113. preferred_language: Optional[str] = "en"
  114. class ForgotPassword(BaseModel):
  115. email: EmailStr
  116. class ResetPassword(BaseModel):
  117. token: str
  118. new_password: str = Field(..., min_length=6)
  119. class PhotoUpdate(BaseModel):
  120. is_public: bool
  121. class OrderResponse(OrderCreate):
  122. id: int
  123. status: str
  124. total_price: Optional[float] = None
  125. estimated_price: Optional[float] = None
  126. material_name: Optional[str] = None
  127. material_price: Optional[float] = None
  128. created_at: datetime
  129. class Config:
  130. from_attributes = True