119 lines
2.5 KiB
Python
119 lines
2.5 KiB
Python
from typing import List
|
|
from schemas.barcode import BarcodeTemplateSchema
|
|
from schemas.base import CustomModelCamel, PaginationInfoSchema, OkMessageSchema
|
|
from pydantic import field_validator, model_validator
|
|
from models import ProductBarcode
|
|
|
|
|
|
# region Entities
|
|
class ProductImageSchema(CustomModelCamel):
|
|
id: int
|
|
product_id: int
|
|
image_url: str
|
|
|
|
|
|
class BaseProductSchema(CustomModelCamel):
|
|
name: str
|
|
article: str | None = ''
|
|
client_id: int
|
|
barcodes: list[str]
|
|
barcode_template: BarcodeTemplateSchema | None = None
|
|
|
|
# Attributes
|
|
brand: str | None = None
|
|
color: str | None = None
|
|
composition: str | None = None
|
|
size: str | None = None
|
|
additional_info: str | None = None
|
|
image_url: str | None = None
|
|
images: list[ProductImageSchema] | None = []
|
|
|
|
@field_validator('barcodes', mode="before")
|
|
def barcodes_to_list(cls, v):
|
|
if isinstance(v, list) and all([type(barcode) is ProductBarcode for barcode in v]):
|
|
return [barcode.barcode for barcode in v]
|
|
return v
|
|
|
|
@model_validator(mode="after")
|
|
def image_url_to_list(cls, values):
|
|
images = values.images
|
|
if not images:
|
|
return values
|
|
latest_image = images[-1]
|
|
values.image_url = latest_image.image_url
|
|
return values
|
|
|
|
|
|
class ProductSchema(BaseProductSchema):
|
|
id: int
|
|
|
|
|
|
# endregion
|
|
|
|
# region Requests
|
|
class ProductCreateRequest(BaseProductSchema):
|
|
pass
|
|
|
|
|
|
class ProductDeleteRequest(CustomModelCamel):
|
|
product_id: int
|
|
|
|
|
|
class ProductUpdateRequest(CustomModelCamel):
|
|
product: ProductSchema
|
|
|
|
|
|
class ProductAddBarcodeRequest(CustomModelCamel):
|
|
product_id: int
|
|
barcode: str
|
|
|
|
|
|
class ProductDeleteBarcodeRequest(CustomModelCamel):
|
|
product_id: int
|
|
barcode: str
|
|
|
|
|
|
class ProductGenerateBarcodeRequest(CustomModelCamel):
|
|
product_id: int
|
|
|
|
|
|
# endregion
|
|
|
|
# region Responses
|
|
class ProductCreateResponse(OkMessageSchema):
|
|
product_id: int | None = None
|
|
|
|
|
|
class ProductGetResponse(CustomModelCamel):
|
|
products: List[ProductSchema]
|
|
pagination_info: PaginationInfoSchema
|
|
|
|
|
|
class ProductDeleteResponse(OkMessageSchema):
|
|
pass
|
|
|
|
|
|
class ProductUpdateResponse(OkMessageSchema):
|
|
pass
|
|
|
|
|
|
class ProductAddBarcodeResponse(OkMessageSchema):
|
|
pass
|
|
|
|
|
|
class ProductDeleteBarcodeResponse(OkMessageSchema):
|
|
pass
|
|
|
|
|
|
class ProductGenerateBarcodeResponse(OkMessageSchema):
|
|
barcode: str
|
|
|
|
|
|
class ProductExistsBarcodeResponse(CustomModelCamel):
|
|
exists: bool
|
|
|
|
|
|
class ProductUploadImageResponse(OkMessageSchema):
|
|
image_url: str | None = None
|
|
# endregion
|