134 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import List
 | 
						|
from schemas.barcode import BarcodeTemplateSchema
 | 
						|
from schemas.base import BaseSchema, PaginationInfoSchema, OkMessageSchema
 | 
						|
from pydantic import field_validator, model_validator
 | 
						|
from models import ProductBarcode
 | 
						|
 | 
						|
 | 
						|
# region Entities
 | 
						|
class ProductImageSchema(BaseSchema):
 | 
						|
    id: int
 | 
						|
    product_id: int
 | 
						|
    image_url: str
 | 
						|
 | 
						|
 | 
						|
class BaseProductSchema(BaseSchema):
 | 
						|
    name: str
 | 
						|
    article: str | None = ''
 | 
						|
    factory_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(BaseSchema):
 | 
						|
    product_id: int
 | 
						|
 | 
						|
 | 
						|
class ProductUpdateRequest(BaseSchema):
 | 
						|
    product: ProductSchema
 | 
						|
 | 
						|
 | 
						|
class ProductAddBarcodeRequest(BaseSchema):
 | 
						|
    product_id: int
 | 
						|
    barcode: str
 | 
						|
 | 
						|
 | 
						|
class ProductDeleteBarcodeRequest(BaseSchema):
 | 
						|
    product_id: int
 | 
						|
    barcode: str
 | 
						|
 | 
						|
 | 
						|
class ProductGenerateBarcodeRequest(BaseSchema):
 | 
						|
    product_id: int
 | 
						|
 | 
						|
 | 
						|
# endregion
 | 
						|
 | 
						|
# region Responses
 | 
						|
class ProductCreateResponse(OkMessageSchema):
 | 
						|
    product_id: int | None = None
 | 
						|
 | 
						|
 | 
						|
class ProductGetResponse(BaseSchema):
 | 
						|
    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(BaseSchema):
 | 
						|
    exists: bool
 | 
						|
 | 
						|
 | 
						|
class ProductUploadImageResponse(OkMessageSchema):
 | 
						|
    image_url: str | None = None
 | 
						|
 | 
						|
 | 
						|
class ProductUploadBarcodeImageResponse(OkMessageSchema):
 | 
						|
    barcode_image_url: str | None = None
 | 
						|
 | 
						|
 | 
						|
class ProductDeleteBarcodeImageResponse(OkMessageSchema):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
class ProductGetBarcodeImageResponse(BaseSchema):
 | 
						|
    barcode_image_url: str | None = None
 | 
						|
 | 
						|
 | 
						|
# endregion
 |