diff --git a/backend/config.py b/backend/config.py index fda11d2..993c716 100644 --- a/backend/config.py +++ b/backend/config.py @@ -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') diff --git a/models/product.py b/models/product.py index 8e3c4d9..08b044d 100644 --- a/models/product.py +++ b/models/product.py @@ -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") diff --git a/schemas/product.py b/schemas/product.py index 2b55e5d..ffcf249 100644 --- a/schemas/product.py +++ b/schemas/product.py @@ -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 diff --git a/services/product.py b/services/product.py index 81f1b4a..979beba 100644 --- a/services/product.py +++ b/services/product.py @@ -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')