from typing import Optional from pydantic import field_validator, model_validator from modules.fulfillment_base.models import ProductBarcode from modules.fulfillment_base.schemas.barcode_template import BarcodeTemplateSchema from schemas.base import BaseSchema, BaseResponse, PaginationInfoSchema, BasePdfResponse # region Entity class ProductImageSchema(BaseSchema): id: int product_id: int image_url: str class ProductBarcodeImageSchema(BaseSchema): product_id: int image_url: str class CreateProductSchema(BaseSchema): name: str article: str factory_article: str client_id: int barcode_template_id: int brand: Optional[str] color: Optional[str] composition: Optional[str] size: Optional[str] additional_info: Optional[str] barcodes: list[str] = [] class BaseProductSchema(CreateProductSchema): image_url: Optional[str] = None images: Optional[list[ProductImageSchema]] = [] barcode_image_url: Optional[str] = None barcode_image: Optional[ProductBarcodeImageSchema] = None @model_validator(mode="after") def images_list_to_image_url(cls, values): if values.images: latest_image = values.images[-1] values.image_url = latest_image.image_url if values.barcode_image: values.barcode_image_url = values.barcode_image.image_url return values class ProductSchema(BaseProductSchema): id: int barcode_template: BarcodeTemplateSchema @field_validator("barcodes", mode="before") def barcodes_to_list(cls, v: Optional[list[ProductBarcode]]): if isinstance(v, list): return [barcode.barcode for barcode in v] return v class UpdateProductSchema(BaseSchema): name: Optional[str] = None article: Optional[str] = None factory_article: Optional[str] = None barcode_template_id: Optional[int] = None brand: Optional[str] = None color: Optional[str] = None composition: Optional[str] = None size: Optional[str] = None additional_info: Optional[str] = None barcodes: Optional[list[str]] = None images: list[ProductImageSchema] | None = [] # endregion # region Request class CreateProductRequest(BaseSchema): entity: CreateProductSchema class UpdateProductRequest(BaseSchema): entity: UpdateProductSchema class GetProductBarcodePdfRequest(BaseSchema): quantity: int product_id: int barcode: str # endregion # region Response class GetProductsResponse(BaseSchema): items: list[ProductSchema] pagination_info: PaginationInfoSchema class CreateProductResponse(BaseResponse): entity: ProductSchema class UpdateProductResponse(BaseResponse): pass class ProductUploadImageResponse(BaseResponse): image_url: Optional[str] = None class DeleteProductResponse(BaseResponse): pass class GetProductBarcodePdfResponse(BasePdfResponse): pass class BarcodeUploadImageResponse(BaseResponse): image_url: Optional[str] = None class DeleteBarcodeImageResponse(BaseResponse): pass # endregion