feat: attrs on product
This commit is contained in:
		@@ -1,5 +1,8 @@
 | 
				
			|||||||
from .article_attribute_getter import ArticleAttributeGetter
 | 
					from .article_attribute_getter import ArticleAttributeGetter
 | 
				
			||||||
 | 
					from .brand_attribute_getter import BrandAttributeGetter
 | 
				
			||||||
from .client_name_attribute_getter import ClientNameAttributeGetter
 | 
					from .client_name_attribute_getter import ClientNameAttributeGetter
 | 
				
			||||||
 | 
					from .color_attribute_getter import ColorAttributeGetter
 | 
				
			||||||
 | 
					from .composition_attribute_getter import CompositionAttributeGetter
 | 
				
			||||||
from .name_attribute_getter import NameAttributeGetter
 | 
					from .name_attribute_getter import NameAttributeGetter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -13,5 +16,11 @@ class AttributeWriterFactory:
 | 
				
			|||||||
                return ArticleAttributeGetter()
 | 
					                return ArticleAttributeGetter()
 | 
				
			||||||
            case 'client.name':
 | 
					            case 'client.name':
 | 
				
			||||||
                return ClientNameAttributeGetter()
 | 
					                return ClientNameAttributeGetter()
 | 
				
			||||||
 | 
					            case 'brand':
 | 
				
			||||||
 | 
					                return BrandAttributeGetter()
 | 
				
			||||||
 | 
					            case 'color':
 | 
				
			||||||
 | 
					                return ColorAttributeGetter()
 | 
				
			||||||
 | 
					            case 'composition':
 | 
				
			||||||
 | 
					                return CompositionAttributeGetter()
 | 
				
			||||||
            case _:
 | 
					            case _:
 | 
				
			||||||
                return None
 | 
					                return None
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								barcodes/attributes/brand_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								barcodes/attributes/brand_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					from barcodes.attributes.base import BaseAttributeGetter
 | 
				
			||||||
 | 
					from models import Product
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BrandAttributeGetter(BaseAttributeGetter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_value(self, product: Product):
 | 
				
			||||||
 | 
					        result = product.brand
 | 
				
			||||||
 | 
					        if not result:
 | 
				
			||||||
 | 
					            result = ''
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
							
								
								
									
										11
									
								
								barcodes/attributes/color_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								barcodes/attributes/color_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					from barcodes.attributes.base import BaseAttributeGetter
 | 
				
			||||||
 | 
					from models import Product
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ColorAttributeGetter(BaseAttributeGetter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_value(self, product: Product):
 | 
				
			||||||
 | 
					        result = product.color
 | 
				
			||||||
 | 
					        if not result:
 | 
				
			||||||
 | 
					            result = ''
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
							
								
								
									
										11
									
								
								barcodes/attributes/composition_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								barcodes/attributes/composition_attribute_getter.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					from barcodes.attributes.base import BaseAttributeGetter
 | 
				
			||||||
 | 
					from models import Product
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CompositionAttributeGetter(BaseAttributeGetter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_value(self, product: Product):
 | 
				
			||||||
 | 
					        result = product.composition
 | 
				
			||||||
 | 
					        if not result:
 | 
				
			||||||
 | 
					            result = ''
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
@@ -17,6 +17,12 @@ class Product(BaseModel):
 | 
				
			|||||||
    barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=True)
 | 
					    barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=True)
 | 
				
			||||||
    barcode_template = relationship('BarcodeTemplate', lazy='joined')
 | 
					    barcode_template = relationship('BarcodeTemplate', lazy='joined')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Attributes
 | 
				
			||||||
 | 
					    # TODO move to another table
 | 
				
			||||||
 | 
					    brand = Column(String, nullable=True, comment='Бренд')
 | 
				
			||||||
 | 
					    color = Column(String, nullable=True, comment='Цвет')
 | 
				
			||||||
 | 
					    composition = Column(String, nullable=True, comment='Состав')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProductBarcode(BaseModel):
 | 
					class ProductBarcode(BaseModel):
 | 
				
			||||||
    __tablename__ = 'product_barcodes'
 | 
					    __tablename__ = 'product_barcodes'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,11 @@ class ProductSchema(CustomModelCamel):
 | 
				
			|||||||
    barcodes: list[str]
 | 
					    barcodes: list[str]
 | 
				
			||||||
    barcode_template: BarcodeTemplateSchema | None = None
 | 
					    barcode_template: BarcodeTemplateSchema | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Attributes
 | 
				
			||||||
 | 
					    brand: str | None = None
 | 
				
			||||||
 | 
					    color: str | None = None
 | 
				
			||||||
 | 
					    composition: str | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @field_validator('barcodes', mode="before")
 | 
					    @field_validator('barcodes', mode="before")
 | 
				
			||||||
    def barcodes_to_list(cls, v):
 | 
					    def barcodes_to_list(cls, v):
 | 
				
			||||||
        if isinstance(v, list) and all([type(barcode) is ProductBarcode for barcode in v]):
 | 
					        if isinstance(v, list) and all([type(barcode) is ProductBarcode for barcode in v]):
 | 
				
			||||||
@@ -32,6 +37,7 @@ class ProductCreateRequest(CustomModelCamel):
 | 
				
			|||||||
    barcodes: List[str]
 | 
					    barcodes: List[str]
 | 
				
			||||||
    barcode_template: BarcodeTemplateSchema | None = None
 | 
					    barcode_template: BarcodeTemplateSchema | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ProductDeleteRequest(CustomModelCamel):
 | 
					class ProductDeleteRequest(CustomModelCamel):
 | 
				
			||||||
    product_id: int
 | 
					    product_id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user