schema.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. from datetime import datetime
  2. from typing import Literal
  3. from pydantic import BaseModel
  4. # -- settings --
  5. class SettingsLocalDB(BaseModel):
  6. filepath: str
  7. class SettingsOrderUpload(BaseModel):
  8. filepath: str
  9. class SettingsCurrency(BaseModel):
  10. default: str
  11. now_payments: str
  12. class Settings(BaseModel):
  13. git_repo: str
  14. document_match: list[str]
  15. document_exclude: list[str]
  16. block_types: list[str]
  17. local_db: SettingsLocalDB
  18. order_upload: SettingsOrderUpload
  19. currency: SettingsCurrency
  20. # -- cart --
  21. # session-related data structures
  22. class CartSessionMeta(BaseModel):
  23. order_id: str
  24. currency: str
  25. subtotal: int = 0
  26. total_weight: int = 0
  27. shipping: float = 0.0
  28. total: float = 0.0
  29. item_amount: int = 0
  30. class CartSessionItemOptions(BaseModel):
  31. product_variation_id: str | None = None
  32. size: Literal["s", "m", "l", "xl", "xxl"] | None
  33. style: str | None
  34. weight: int | None
  35. class CartSessionItem(BaseModel):
  36. product_id: str
  37. options: CartSessionItemOptions
  38. price: int = 0
  39. quantity: int = 0
  40. availability: bool = False
  41. class CartSession(BaseModel):
  42. meta: CartSessionMeta
  43. items: dict[str, CartSessionItem]
  44. class CartUpdate(BaseModel):
  45. operation: Literal["add", "remove", "delete", "manual"]
  46. product_id: str
  47. options: CartSessionItemOptions
  48. price: int = 0
  49. # view-related data structures
  50. class CheckoutItemImage(BaseModel):
  51. url: str
  52. width: int
  53. height: int
  54. class CheckoutItem(CartSessionItem):
  55. path: str
  56. title: str
  57. image: CheckoutItemImage
  58. product_id: str
  59. options: CartSessionItemOptions
  60. price: int = 0
  61. weight: int
  62. quantity: int = 0
  63. total: int = 0
  64. availability: bool = False
  65. is_selectable: bool = False
  66. class CheckoutItemUpdate(BaseModel):
  67. quantity: int = 0
  68. total: int = 0
  69. is_selectable: bool = False
  70. class CartOrderInfo(BaseModel):
  71. code: str
  72. title: str
  73. price: int = 0
  74. quantity: int = 0
  75. options: CartSessionItemOptions
  76. class ProductInfoCode(BaseModel):
  77. path: str
  78. options: CartSessionItemOptions
  79. quantity: int
  80. # -- shipping info
  81. class ShippingInfo(BaseModel):
  82. email: str
  83. first_name: str | None = None
  84. last_name: str
  85. address: str
  86. address_no: str
  87. address_extra: str | None = None
  88. postal_code: str
  89. city: str
  90. country: str
  91. phone_number: str | None = None
  92. note: str | None = None
  93. # -- shipping cost
  94. class ShippingCostEntry(BaseModel):
  95. price: float
  96. min: int
  97. max: int | None
  98. class ShippingRate(BaseModel):
  99. price: float
  100. area: str
  101. class ProductShippingMeta(BaseModel):
  102. weight: int
  103. customs_tariff_code: str
  104. origin_country_iso: str
  105. # -- documents --
  106. class DocumentBlockImageInfo(BaseModel):
  107. width: int
  108. height: int
  109. class DocumentBlock(BaseModel):
  110. type: str
  111. value: str | None = None
  112. url: str | None = None
  113. caption: str | None = None
  114. info: DocumentBlockImageInfo | None = None
  115. # -- document: site
  116. class DocumentMetaLink(BaseModel):
  117. label: str
  118. url: str
  119. class DocumentSiteMeta(BaseModel):
  120. type: str
  121. title: str
  122. template: str
  123. path: str | None = None
  124. footer: list[DocumentMetaLink]
  125. class DocumentSite(BaseModel):
  126. meta: DocumentSiteMeta
  127. blocks: list[DocumentBlock]
  128. # -- document: index
  129. class DocumentIndexMeta(BaseModel):
  130. type: str
  131. title: str
  132. template: str
  133. path: str | None = None
  134. class DocumentIndex(BaseModel):
  135. meta: DocumentIndexMeta
  136. blocks: list[DocumentBlock]
  137. # -- document: page --
  138. class DocumentPageMeta(BaseModel):
  139. type: str
  140. title: str
  141. template: str
  142. category: str | None = None
  143. path: str | None = None
  144. class DocumentPage(BaseModel):
  145. meta: DocumentPageMeta
  146. blocks: list[DocumentBlock]
  147. # -- document: products index --
  148. class DocumentProductIndexMeta(BaseModel):
  149. type: str
  150. title: str
  151. template: str
  152. path: str | None = None
  153. class DocumentProductIndex(BaseModel):
  154. meta: DocumentProductIndexMeta
  155. blocks: list[DocumentBlock]
  156. # -- document: product
  157. class DocumentProductMetaOptions(BaseModel):
  158. size: list[str] | None = None
  159. style: list[str] | None = None
  160. class DocumentProductMetaInventory(BaseModel):
  161. product_variation_id: str | None = None
  162. size: str | None = None
  163. style: str | None = None
  164. amount: int
  165. class DocumentProductMeta(BaseModel):
  166. type: str
  167. title: str
  168. template: str
  169. code: str
  170. product_id: str
  171. price: int
  172. weight: int
  173. customs_tariff_code: str
  174. origin_country_iso: str
  175. category: str
  176. inventory: list[DocumentProductMetaInventory]
  177. options: DocumentProductMetaOptions | None = None
  178. path: str | None = None
  179. class DocumentProduct(BaseModel):
  180. meta: DocumentProductMeta
  181. blocks: list[DocumentBlock]
  182. # -- document: orders
  183. class DocumentOrdersMeta(BaseModel):
  184. type: str
  185. title: str
  186. template: str
  187. path: str | None = None
  188. class OrdersBlockItem(BaseModel):
  189. code: str
  190. title: str
  191. quantity: int
  192. price: int
  193. class OrdersBlockShippingInfo(BaseModel):
  194. first_name: str | None
  195. last_name: str
  196. address: str
  197. address_no: str
  198. address_extra: str | None
  199. postal_code: str
  200. city: str
  201. country: str
  202. note: str | None
  203. phone_number: str | None
  204. email: str
  205. class OrdersBlock(BaseModel):
  206. type: str
  207. date: datetime
  208. order_id: str
  209. product_list: str
  210. payment_provider: str
  211. payment_reference: str
  212. status: str
  213. items: list[OrdersBlockItem]
  214. currency: str
  215. subtotal: int
  216. shipping: float
  217. total: float
  218. shipping_info: OrdersBlockShippingInfo
  219. class DocumentOrders(BaseModel):
  220. meta: DocumentOrdersMeta
  221. blocks: list[OrdersBlock]
  222. # -- document: checkout
  223. class DocumentCheckoutMeta(BaseModel):
  224. type: str
  225. title: str
  226. template: str
  227. path: str | None = None
  228. class DocumentCheckout(BaseModel):
  229. meta: DocumentCheckoutMeta
  230. blocks: list[DocumentBlock]
  231. # -- document: checkout product info
  232. class DocumentCheckoutProductInfo(BaseModel):
  233. filename: str
  234. quantity: int
  235. size: Literal["s", "m", "l", "xl", "xxl"] | None
  236. style: str | None
  237. # -- document: email
  238. class DocumentEmailMeta(BaseModel):
  239. type: str
  240. title: str
  241. template: str
  242. sender: str
  243. path: str | None = None
  244. class DocumentEmail(BaseModel):
  245. meta: DocumentEmailMeta
  246. blocks: list[DocumentBlock]
  247. # -- NOW Payments invoice payload
  248. class NowPaymentsInvoice(BaseModel):
  249. price_amount: float
  250. price_currency: str
  251. ipn_callback_url: str
  252. order_id: str
  253. success_url: str | None = None
  254. cancel_url: str | None = None