feat: barcode templates
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
from sqlalchemy import select, update, insert
|
||||
from sqlalchemy.orm import selectinload, joinedload
|
||||
|
||||
from models import BarcodeTemplate, BarcodeTemplateAttribute, barcode_template_attribute_link, Product
|
||||
from barcodes.attributes import AttributeWriterFactory
|
||||
from models import BarcodeTemplate, BarcodeTemplateAttribute, barcode_template_attribute_link, Product, \
|
||||
BarcodeTemplateAdditionalField, BarcodeTemplateSize
|
||||
from schemas.barcode import *
|
||||
from services.base import BaseService
|
||||
|
||||
@@ -9,21 +11,7 @@ from services.base import BaseService
|
||||
class BarcodeService(BaseService):
|
||||
|
||||
# region Barcode
|
||||
async def get_barcode(self, request: GetProductBarcodeRequest) -> GetProductBarcodeResponse:
|
||||
# get product by id
|
||||
stmt = (
|
||||
select(Product)
|
||||
.options(
|
||||
joinedload(Product.client)
|
||||
)
|
||||
.filter(Product.id == request.product_id)
|
||||
)
|
||||
query = await self.session.execute(stmt)
|
||||
product: Product = query.scalar()
|
||||
if not product:
|
||||
raise ValueError('Товар не найден')
|
||||
|
||||
# get barcode template by id
|
||||
async def _get_barcode_template(self, request: GetProductBarcodeRequest, product: Product) -> BarcodeTemplate:
|
||||
if request.barcode_template_id:
|
||||
stmt = select(BarcodeTemplate).filter(BarcodeTemplate.id == request.barcode_template_id)
|
||||
query = await self.session.execute(stmt)
|
||||
@@ -41,9 +29,46 @@ class BarcodeService(BaseService):
|
||||
if not barcode_template:
|
||||
raise ValueError('Стандартный шаблон не найден')
|
||||
barcode_template: BarcodeTemplate
|
||||
return barcode_template
|
||||
|
||||
|
||||
# endregion
|
||||
async def get_barcode(self, request: GetProductBarcodeRequest) -> GetProductBarcodeResponse:
|
||||
# get product by id
|
||||
stmt = (
|
||||
select(Product)
|
||||
.options(
|
||||
joinedload(Product.client)
|
||||
)
|
||||
.filter(Product.id == request.product_id)
|
||||
)
|
||||
query = await self.session.execute(stmt)
|
||||
product: Product = query.scalar()
|
||||
if not product:
|
||||
raise ValueError('Товар не найден')
|
||||
barcode_template = await self._get_barcode_template(request, product)
|
||||
attributes_list = []
|
||||
for attribute in barcode_template.attributes:
|
||||
attribute_getter = AttributeWriterFactory.get_writer(attribute.key)
|
||||
if not attribute_getter:
|
||||
continue
|
||||
value = attribute_getter.get_value(product)
|
||||
attributes_list.append(
|
||||
BarcodeAttributeSchema(
|
||||
name=attribute.name,
|
||||
value=value
|
||||
)
|
||||
)
|
||||
for additional_attribute in barcode_template.additional_attributes:
|
||||
attributes_list.append(
|
||||
BarcodeAttributeSchema(
|
||||
name=additional_attribute.name,
|
||||
value=additional_attribute.value
|
||||
)
|
||||
)
|
||||
barcode = BarcodeSchema(
|
||||
barcode=request.barcode,
|
||||
attributes=attributes_list
|
||||
)
|
||||
return GetProductBarcodeResponse(barcode=barcode)
|
||||
|
||||
# endregion
|
||||
|
||||
@@ -84,6 +109,9 @@ class BarcodeService(BaseService):
|
||||
# create template then add attributes
|
||||
request_dict = request.dict()
|
||||
del request_dict['attribute_ids']
|
||||
del request_dict['additional_attributes']
|
||||
del request_dict['size']
|
||||
request_dict['size_id'] = request.size.id
|
||||
template = BarcodeTemplate(**request_dict)
|
||||
self.session.add(template)
|
||||
await self.session.flush()
|
||||
@@ -97,6 +125,11 @@ class BarcodeService(BaseService):
|
||||
# add attributes to template
|
||||
for attribute in attributes:
|
||||
template.attributes.append(attribute)
|
||||
for additional_attribute in request.additional_attributes:
|
||||
template.additional_attributes.append(
|
||||
BarcodeTemplateAdditionalField(**additional_attribute.dict(),
|
||||
barcode_template_id=template.id)
|
||||
)
|
||||
await self.session.commit()
|
||||
return BarcodeTemplateCreateResponse(message='Шаблон успешно создан',
|
||||
ok=True,
|
||||
@@ -126,6 +159,10 @@ class BarcodeService(BaseService):
|
||||
request_dict = request.dict()
|
||||
del request_dict['id']
|
||||
del request_dict['attribute_ids']
|
||||
del request_dict['additional_attributes']
|
||||
del request_dict['size']
|
||||
request_dict['size_id'] = request.size.id
|
||||
|
||||
await self.session.execute(
|
||||
update(BarcodeTemplate)
|
||||
.where(BarcodeTemplate.id == request.id)
|
||||
@@ -151,6 +188,24 @@ class BarcodeService(BaseService):
|
||||
await self.session.execute(stmt)
|
||||
await self.session.flush()
|
||||
|
||||
# working with additional attributes
|
||||
# deleting additioanl attributes that is deleted
|
||||
template_additional_attributes = set([attribute.name for attribute in template.additional_attributes])
|
||||
request_additional_attributes = set([attribute.name for attribute in request.additional_attributes])
|
||||
new_additional_attributes = request_additional_attributes.difference(template_additional_attributes)
|
||||
deleted_additional_attributes = template_additional_attributes.difference(request_additional_attributes)
|
||||
for attribute in template.additional_attributes:
|
||||
if attribute.name not in deleted_additional_attributes:
|
||||
continue
|
||||
await self.session.delete(attribute)
|
||||
for new_attribute in request.additional_attributes:
|
||||
if new_attribute.name not in new_additional_attributes:
|
||||
continue
|
||||
template.additional_attributes.append(
|
||||
BarcodeTemplateAdditionalField(**new_attribute.dict(),
|
||||
barcode_template_id=template.id)
|
||||
)
|
||||
|
||||
await self.session.commit()
|
||||
return BarcodeTemplateUpdateResponse(message='Шаблон успешно обновлен',
|
||||
ok=True)
|
||||
@@ -196,4 +251,13 @@ class BarcodeService(BaseService):
|
||||
return BarcodeTemplateCreateResponse(message=str(e),
|
||||
ok=False,
|
||||
id=-1)
|
||||
|
||||
# endregion
|
||||
|
||||
# region Template sizes
|
||||
async def get_all_barcode_template_sizes(self) -> GetAllBarcodeTemplateSizesResponse:
|
||||
stmt = select(BarcodeTemplateSize).order_by(BarcodeTemplateSize.id)
|
||||
query = await self.session.execute(stmt)
|
||||
sizes = query.scalars().all()
|
||||
return GetAllBarcodeTemplateSizesResponse(sizes=sizes)
|
||||
# endregion
|
||||
|
||||
Reference in New Issue
Block a user