feat: image upload on product
This commit is contained in:
		@@ -15,4 +15,4 @@ PG_HOST = os.environ.get('PG_HOST')
 | 
			
		||||
TELEGRAM_BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
 | 
			
		||||
 | 
			
		||||
SECRET_KEY = os.environ.get('SECRET_KEY')
 | 
			
		||||
S3_API_KEY = '1cc46590-4532-4046-97aa-baf3e49f20ad-AUF'
 | 
			
		||||
S3_API_KEY = os.environ.get('S3_API_KEY')
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ class Product(BaseModel):
 | 
			
		||||
    additional_info = Column(String, nullable=True, comment='Дополнительное поле')
 | 
			
		||||
    images = relationship('ProductImage',
 | 
			
		||||
                          back_populates='product',
 | 
			
		||||
 | 
			
		||||
                          lazy='selectin',
 | 
			
		||||
                          cascade="all, delete-orphan")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,17 @@
 | 
			
		||||
from typing import List
 | 
			
		||||
from schemas.barcode import BarcodeTemplateSchema
 | 
			
		||||
from schemas.base import CustomModelCamel, PaginationInfoSchema, OkMessageSchema
 | 
			
		||||
from pydantic import field_validator
 | 
			
		||||
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 = ''
 | 
			
		||||
@@ -19,6 +25,8 @@ class BaseProductSchema(CustomModelCamel):
 | 
			
		||||
    composition: str | None = None
 | 
			
		||||
    size: str | None = None
 | 
			
		||||
    additional_info: str | None = None
 | 
			
		||||
    image_url: str | None = None
 | 
			
		||||
    images: list[ProductImageSchema]
 | 
			
		||||
 | 
			
		||||
    @field_validator('barcodes', mode="before")
 | 
			
		||||
    def barcodes_to_list(cls, v):
 | 
			
		||||
@@ -26,6 +34,15 @@ class BaseProductSchema(CustomModelCamel):
 | 
			
		||||
            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
 | 
			
		||||
 
 | 
			
		||||
@@ -67,6 +67,8 @@ class ProductService(BaseService):
 | 
			
		||||
        del product_dict['id']
 | 
			
		||||
        del product_dict['barcodes']
 | 
			
		||||
        del product_dict['barcode_template']
 | 
			
		||||
        del product_dict['image_url']
 | 
			
		||||
        del product_dict['images']
 | 
			
		||||
        if request.product.barcode_template:
 | 
			
		||||
            product_dict['barcode_template_id'] = request.product.barcode_template.id
 | 
			
		||||
 | 
			
		||||
@@ -150,9 +152,12 @@ class ProductService(BaseService):
 | 
			
		||||
 | 
			
		||||
    async def upload_image(self, product_id: int, file_bytes: bytes) -> ProductUploadImageResponse:
 | 
			
		||||
        try:
 | 
			
		||||
            product = await self.get_by_id(product_id)
 | 
			
		||||
            product: Product = await self.session.get(Product, product_id)
 | 
			
		||||
            if not product:
 | 
			
		||||
                raise Exception("Неудалось найти товар с указанным ID")
 | 
			
		||||
            # removing previous images
 | 
			
		||||
            for image in product.images:
 | 
			
		||||
                await self.session.delete(image)
 | 
			
		||||
            s3_uploader = S3Uploader(config.S3_API_KEY)
 | 
			
		||||
            response = await s3_uploader.upload(file_bytes)
 | 
			
		||||
            response_url = response.get('link')
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user