This commit is contained in:
2024-05-09 01:32:37 +03:00
parent 3e83cf6f92
commit 61d27d2389
16 changed files with 179 additions and 115 deletions

View File

@@ -1,13 +1,15 @@
from sqlalchemy import select, update
from sqlalchemy import select, update, insert
from sqlalchemy.orm import selectinload
from models import BarcodeTemplate, BarcodeTemplateAttribute, BarcodeTemplateAttributeLink
from models import BarcodeTemplate, BarcodeTemplateAttribute, barcode_template_attribute_link
from schemas.barcode import (GetBarcodeTemplateByIdRequest,
GetBarcodeTemplateByIdResponse,
BarcodeTemplateCreateResponse,
BarcodeTemplateCreateRequest, CreateBarcodeTemplateAttributeRequest,
BarcodeTemplateUpdateResponse, BarcodeTemplateUpdateRequest,
BarcodeTemplateAttributeSchema, GetAllBarcodeTemplateAttributesResponse,
GetAllBarcodeTemplatesResponse)
GetAllBarcodeTemplatesResponse, BarcodeTemplateDeleteRequest,
BarcodeTemplateDeleteResponse)
from services.base import BaseService
@@ -23,7 +25,12 @@ class BarcodeService(BaseService):
return query.scalar()
async def get_all_barcode_templates(self) -> GetAllBarcodeTemplatesResponse:
stmt = select(BarcodeTemplate).order_by(BarcodeTemplate.id)
stmt = (
select(BarcodeTemplate)
.options(
selectinload(BarcodeTemplate.attributes)
)
.order_by(BarcodeTemplate.id))
query = await self.session.execute(stmt)
templates = query.scalars().all()
return GetAllBarcodeTemplatesResponse(templates=templates)
@@ -43,10 +50,12 @@ class BarcodeService(BaseService):
raise ValueError('Шаблон с таким именем уже существует')
# create template then add attributes
template = BarcodeTemplate(name=request.name, is_default=request.is_default)
request_dict = request.dict()
del request_dict['attribute_ids']
template = BarcodeTemplate(**request_dict)
self.session.add(template)
await self.session.flush()
await self.session.refresh(template)
# get all attributes from database
stmt = select(BarcodeTemplateAttribute).filter(
BarcodeTemplateAttribute.id.in_(request.attribute_ids))
@@ -55,12 +64,7 @@ class BarcodeService(BaseService):
# add attributes to template
for attribute in attributes:
template_attribute_link = BarcodeTemplateAttributeLink(
barcode_template_id=template.id,
attribute_id=attribute.id
)
self.session.add(template_attribute_link)
await self.session.flush()
template.attributes.append(attribute)
await self.session.commit()
return BarcodeTemplateCreateResponse(message='Шаблон успешно создан',
ok=True,
@@ -97,24 +101,22 @@ class BarcodeService(BaseService):
)
# difference deleted and new
template_attributes = set([attribute.attribute_id for attribute in template.attributes])
template_attributes = set([attribute.id for attribute in template.attributes])
request_attributes = set(request.attribute_ids)
new_attributes = request_attributes.difference(template_attributes)
deleted_attributes = template_attributes.difference(request_attributes)
new_attribute_ids = request_attributes.difference(template_attributes)
deleted_attribute_ids = template_attributes.difference(request_attributes)
# delete attributes
for attribute in template.attributes:
if attribute.attribute_id not in deleted_attributes:
if attribute.id not in deleted_attribute_ids:
continue
await self.session.delete(attribute)
# add new attributes
for new_attribute in new_attributes:
template_attribute_link = BarcodeTemplateAttributeLink(
barcode_template_id=template.id,
attribute_id=new_attribute
)
self.session.add(template_attribute_link)
template.attributes.remove(attribute)
for new_attribute_id in new_attribute_ids:
stmt = insert(barcode_template_attribute_link).values({
'barcode_template_id': template.id,
'attribute_id': new_attribute_id
})
await self.session.execute(stmt)
await self.session.flush()
await self.session.commit()
@@ -125,6 +127,15 @@ class BarcodeService(BaseService):
return BarcodeTemplateUpdateResponse(message=str(e),
ok=False)
async def delete_template(self, request: BarcodeTemplateDeleteRequest) -> BarcodeTemplateDeleteResponse:
try:
template = await self.session.get(BarcodeTemplate, request.id)
await self.session.delete(template)
await self.session.commit()
return BarcodeTemplateDeleteResponse(ok=True, message='Шаблон успешно удален')
except Exception as e:
return BarcodeTemplateDeleteResponse(ok=False, message=str(e))
# endregion
# region Template attributes