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