feat: image upload on product

This commit is contained in:
2024-05-26 09:28:56 +03:00
parent 88679089b6
commit 8e7812fb66
4 changed files with 26 additions and 4 deletions

View File

@@ -15,4 +15,4 @@ PG_HOST = os.environ.get('PG_HOST')
TELEGRAM_BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN') TELEGRAM_BOT_TOKEN = os.environ.get('TELEGRAM_BOT_TOKEN')
SECRET_KEY = os.environ.get('SECRET_KEY') 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')

View File

@@ -26,7 +26,7 @@ class Product(BaseModel):
additional_info = Column(String, nullable=True, comment='Дополнительное поле') additional_info = Column(String, nullable=True, comment='Дополнительное поле')
images = relationship('ProductImage', images = relationship('ProductImage',
back_populates='product', back_populates='product',
lazy='selectin',
cascade="all, delete-orphan") cascade="all, delete-orphan")

View File

@@ -1,11 +1,17 @@
from typing import List from typing import List
from schemas.barcode import BarcodeTemplateSchema from schemas.barcode import BarcodeTemplateSchema
from schemas.base import CustomModelCamel, PaginationInfoSchema, OkMessageSchema from schemas.base import CustomModelCamel, PaginationInfoSchema, OkMessageSchema
from pydantic import field_validator from pydantic import field_validator, model_validator
from models import ProductBarcode from models import ProductBarcode
# region Entities # region Entities
class ProductImageSchema(CustomModelCamel):
id: int
product_id: int
image_url: str
class BaseProductSchema(CustomModelCamel): class BaseProductSchema(CustomModelCamel):
name: str name: str
article: str | None = '' article: str | None = ''
@@ -19,6 +25,8 @@ class BaseProductSchema(CustomModelCamel):
composition: str | None = None composition: str | None = None
size: str | None = None size: str | None = None
additional_info: str | None = None additional_info: str | None = None
image_url: str | None = None
images: list[ProductImageSchema]
@field_validator('barcodes', mode="before") @field_validator('barcodes', mode="before")
def barcodes_to_list(cls, v): def barcodes_to_list(cls, v):
@@ -26,6 +34,15 @@ class BaseProductSchema(CustomModelCamel):
return [barcode.barcode for barcode in v] return [barcode.barcode for barcode in v]
return 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): class ProductSchema(BaseProductSchema):
id: int id: int

View File

@@ -67,6 +67,8 @@ class ProductService(BaseService):
del product_dict['id'] del product_dict['id']
del product_dict['barcodes'] del product_dict['barcodes']
del product_dict['barcode_template'] del product_dict['barcode_template']
del product_dict['image_url']
del product_dict['images']
if request.product.barcode_template: if request.product.barcode_template:
product_dict['barcode_template_id'] = request.product.barcode_template.id 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: async def upload_image(self, product_id: int, file_bytes: bytes) -> ProductUploadImageResponse:
try: try:
product = await self.get_by_id(product_id) product: Product = await self.session.get(Product, product_id)
if not product: if not product:
raise Exception("Неудалось найти товар с указанным ID") raise Exception("Неудалось найти товар с указанным ID")
# removing previous images
for image in product.images:
await self.session.delete(image)
s3_uploader = S3Uploader(config.S3_API_KEY) s3_uploader = S3Uploader(config.S3_API_KEY)
response = await s3_uploader.upload(file_bytes) response = await s3_uploader.upload(file_bytes)
response_url = response.get('link') response_url = response.get('link')