othr
This commit is contained in:
		@@ -1,21 +1,21 @@
 | 
				
			|||||||
from abc import abstractmethod, ABC
 | 
					# from abc import abstractmethod, ABC
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
from .article_attribute_writer import ArticleAttributeWriter
 | 
					# from .article_attribute_writer import ArticleAttributeWriter
 | 
				
			||||||
from .name_attribute_writer import NameAttributeWriter
 | 
					# from .name_attribute_writer import NameAttributeWriter
 | 
				
			||||||
from ..barcode import Barcode
 | 
					# from ..barcode import Barcode
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class BaseAttributeWriter(ABC):
 | 
					# class BaseAttributeWriter(ABC):
 | 
				
			||||||
    @abstractmethod
 | 
					#     @abstractmethod
 | 
				
			||||||
    def write(self, barcode: Barcode):
 | 
					#     def write(self, barcode: Barcode):
 | 
				
			||||||
        pass
 | 
					#         pass
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class AttributeWriterFactory:
 | 
					# class AttributeWriterFactory:
 | 
				
			||||||
    @staticmethod
 | 
					#     @staticmethod
 | 
				
			||||||
    def get_writer(key: str):
 | 
					#     def get_writer(key: str):
 | 
				
			||||||
        match key:
 | 
					#         match key:
 | 
				
			||||||
            case 'name':
 | 
					#             case 'name':
 | 
				
			||||||
                return NameAttributeWriter()
 | 
					#                 return NameAttributeWriter()
 | 
				
			||||||
            case 'article':
 | 
					#             case 'article':
 | 
				
			||||||
                return ArticleAttributeWriter()
 | 
					#                 return ArticleAttributeWriter()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from barcodes.attributes import BaseAttributeWriter
 | 
					# from barcodes.attributes import BaseAttributeWriter
 | 
				
			||||||
from barcodes.barcode import Barcode
 | 
					# from barcodes.barcode import Barcode
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class ArticleAttributeWriter(BaseAttributeWriter):
 | 
					# class ArticleAttributeWriter(BaseAttributeWriter):
 | 
				
			||||||
    def write(self, barcode: Barcode):
 | 
					#     def write(self, barcode: Barcode):
 | 
				
			||||||
        pass
 | 
					#         pass
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from barcodes.attributes import BaseAttributeWriter
 | 
					# from barcodes.attributes import BaseAttributeWriter
 | 
				
			||||||
from barcodes.barcode import Barcode
 | 
					# from barcodes.barcode import Barcode
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class NameAttributeWriter(BaseAttributeWriter):
 | 
					# class NameAttributeWriter(BaseAttributeWriter):
 | 
				
			||||||
    def write(self, barcode: Barcode):
 | 
					#     def write(self, barcode: Barcode):
 | 
				
			||||||
        pass
 | 
					#         pass
 | 
				
			||||||
@@ -1,15 +1,15 @@
 | 
				
			|||||||
from .attributes import AttributeWriterFactory
 | 
					# from .attributes import AttributeWriterFactory
 | 
				
			||||||
from models import ProductBarcode, BarcodeTemplate, BarcodeTemplateAttribute
 | 
					# from models import ProductBarcode, BarcodeTemplate, BarcodeTemplateAttribute
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class Barcode:
 | 
					# class Barcode:
 | 
				
			||||||
    def __init__(self, session, barcode: ProductBarcode):
 | 
					#     def __init__(self, session, barcode: ProductBarcode):
 | 
				
			||||||
        self.session = session
 | 
					#         self.session = session
 | 
				
			||||||
        self.barcode = barcode
 | 
					#         self.barcode = barcode
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
    def render(self, template: BarcodeTemplate):
 | 
					#     def render(self, template: BarcodeTemplate):
 | 
				
			||||||
        for attribute in template.attributes:
 | 
					#         for attribute in template.attributes:
 | 
				
			||||||
            attribute: BarcodeTemplateAttribute
 | 
					#             attribute: BarcodeTemplateAttribute
 | 
				
			||||||
            writer = AttributeWriterFactory.get_writer(attribute.key)
 | 
					#             writer = AttributeWriterFactory.get_writer(attribute.key)
 | 
				
			||||||
            writer.write(self)
 | 
					#             writer.write(self)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
from models import ProductBarcode
 | 
					# from models import ProductBarcode
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
class BarcodeGenerator:
 | 
					# class BarcodeGenerator:
 | 
				
			||||||
    def __init__(self, barcode: ProductBarcode):
 | 
					#     def __init__(self, barcode: ProductBarcode):
 | 
				
			||||||
        self.barcode = barcode
 | 
					#         self.barcode = barcode
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from sqlalchemy import Integer, Column, String, Boolean
 | 
					from sqlalchemy import Integer, Column, String, Boolean, ForeignKey
 | 
				
			||||||
from sqlalchemy.orm import relationship
 | 
					from sqlalchemy.orm import relationship
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from models import BaseModel
 | 
					from models import BaseModel, barcode_template_attribute_link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BarcodeTemplateAttribute(BaseModel):
 | 
					class BarcodeTemplateAttribute(BaseModel):
 | 
				
			||||||
@@ -11,14 +11,31 @@ class BarcodeTemplateAttribute(BaseModel):
 | 
				
			|||||||
    name = Column(String, nullable=False, index=True, comment='Метка атрибута')
 | 
					    name = Column(String, nullable=False, index=True, comment='Метка атрибута')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BarcodeTemplateAdditionalField(BaseModel):
 | 
				
			||||||
 | 
					    __tablename__ = 'barcode_template_additional_fields'
 | 
				
			||||||
 | 
					    id = Column(Integer, autoincrement=True, primary_key=True, index=True)
 | 
				
			||||||
 | 
					    name = Column(String, nullable=False)
 | 
				
			||||||
 | 
					    value = Column(String, nullable=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=False)
 | 
				
			||||||
 | 
					    barcode_template = relationship('BarcodeTemplate', back_populates='additional_fields')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BarcodeTemplate(BaseModel):
 | 
					class BarcodeTemplate(BaseModel):
 | 
				
			||||||
    __tablename__ = 'barcode_templates'
 | 
					    __tablename__ = 'barcode_templates'
 | 
				
			||||||
    id = Column(Integer, autoincrement=True, primary_key=True, index=True)
 | 
					    id = Column(Integer, autoincrement=True, primary_key=True, index=True)
 | 
				
			||||||
    name = Column(String, nullable=False, index=True, comment='Название шаблона')
 | 
					    name = Column(String, nullable=False, index=True, comment='Название шаблона')
 | 
				
			||||||
    attributes = relationship('BarcodeTemplateAttributeLink',
 | 
					    attributes = relationship('BarcodeTemplateAttribute',
 | 
				
			||||||
                              back_populates='barcode_template',
 | 
					                              secondary=barcode_template_attribute_link,
 | 
				
			||||||
                              cascade="all, delete-orphan",
 | 
					                              # back_populates='barcode_template',
 | 
				
			||||||
                              lazy='joined')
 | 
					                              # cascade="all, delete-orphan",
 | 
				
			||||||
 | 
					                              lazy='selectin'
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					    additional_fields = relationship('BarcodeTemplateAdditionalField',
 | 
				
			||||||
 | 
					                                     back_populates='barcode_template',
 | 
				
			||||||
 | 
					                                     lazy='selectin'
 | 
				
			||||||
 | 
					                                     )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_default = Column(Boolean, nullable=False, default=False, comment='По умолчанию')
 | 
					    is_default = Column(Boolean, nullable=False, default=False, comment='По умолчанию')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # size
 | 
					    # size
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ class Client(BaseModel):
 | 
				
			|||||||
    details = relationship('ClientDetails', uselist=False, back_populates='client', cascade='all, delete')
 | 
					    details = relationship('ClientDetails', uselist=False, back_populates='client', cascade='all, delete')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=True)
 | 
					    barcode_template_id = Column(Integer, ForeignKey('barcode_templates.id'), nullable=True)
 | 
				
			||||||
    barcode_template = relationship('BarcodeTemplate')
 | 
					    barcode_template = relationship('BarcodeTemplate', lazy='selectin')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ClientDetails(BaseModel):
 | 
					class ClientDetails(BaseModel):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,9 @@
 | 
				
			|||||||
from enum import IntEnum, unique
 | 
					from enum import IntEnum, unique
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, Sequence
 | 
					from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean
 | 
				
			||||||
from sqlalchemy.orm import relationship, backref
 | 
					from sqlalchemy.orm import relationship, backref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from models.base import BaseModel, metadata
 | 
					from models.base import BaseModel
 | 
				
			||||||
from models.utils import add_sequence_to_model
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@unique
 | 
					@unique
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,7 @@
 | 
				
			|||||||
from sqlalchemy import Column, Integer, String, ForeignKey, Sequence
 | 
					from sqlalchemy import Column, Integer, String, ForeignKey, Sequence
 | 
				
			||||||
from sqlalchemy.orm import relationship
 | 
					from sqlalchemy.orm import relationship
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from models import BaseModel, metadata
 | 
					from models import BaseModel
 | 
				
			||||||
 | 
					 | 
				
			||||||
deal_rank_seq = Sequence('test_ochko', start=1, increment=1, metadata=metadata)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sequence = Sequence('my_sequence_name')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Product(BaseModel):
 | 
					class Product(BaseModel):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,18 +33,26 @@ class DealProduct(BaseModel):
 | 
				
			|||||||
    quantity = Column(Integer, nullable=False, comment='Кол-во продукта')
 | 
					    quantity = Column(Integer, nullable=False, comment='Кол-во продукта')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BarcodeTemplateAttributeLink(BaseModel):
 | 
					# class BarcodeTemplateAttributeLink(BaseModel):
 | 
				
			||||||
    __tablename__ = 'barcode_template_attributes_links'
 | 
					#     __tablename__ = 'barcode_template_attributes_links'
 | 
				
			||||||
    barcode_template_id = Column(Integer,
 | 
					#     barcode_template_id = Column(Integer,
 | 
				
			||||||
                                 ForeignKey('barcode_templates.id'),
 | 
					#                                  ForeignKey('barcode_templates.id'),
 | 
				
			||||||
                                 nullable=False,
 | 
					#                                  nullable=False,
 | 
				
			||||||
                                 comment='ID Шаблона ШК',
 | 
					#                                  comment='ID Шаблона ШК',
 | 
				
			||||||
                                 primary_key=True)
 | 
					#                                  primary_key=True)
 | 
				
			||||||
    barcode_template = relationship('BarcodeTemplate', back_populates='attributes')
 | 
					#     barcode_template = relationship('BarcodeTemplate',
 | 
				
			||||||
 | 
					#                                     # back_populates='attributes'
 | 
				
			||||||
    attribute_id = Column(Integer,
 | 
					#                                     )
 | 
				
			||||||
                          ForeignKey('barcode_template_attributes.id'),
 | 
					#
 | 
				
			||||||
                          nullable=False,
 | 
					#     attribute_id = Column(Integer,
 | 
				
			||||||
                          comment='ID Атрибута',
 | 
					#                           ForeignKey('barcode_template_attributes.id'),
 | 
				
			||||||
                          primary_key=True)
 | 
					#                           nullable=False,
 | 
				
			||||||
    attribute = relationship('BarcodeTemplateAttribute')
 | 
					#                           comment='ID Атрибута',
 | 
				
			||||||
 | 
					#                           primary_key=True)
 | 
				
			||||||
 | 
					#     attribute = relationship('BarcodeTemplateAttribute')
 | 
				
			||||||
 | 
					barcode_template_attribute_link = Table(
 | 
				
			||||||
 | 
					    'barcode_template_attribute_links',
 | 
				
			||||||
 | 
					    BaseModel.metadata,
 | 
				
			||||||
 | 
					    Column('barcode_template_id', ForeignKey('barcode_templates.id')),
 | 
				
			||||||
 | 
					    Column('attribute_id', ForeignKey('barcode_template_attributes.id'))
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,8 @@ from schemas.barcode import (GetBarcodeTemplateByIdResponse,
 | 
				
			|||||||
                             BarcodeTemplateCreateRequest, GetAllBarcodeTemplateAttributesResponse,
 | 
					                             BarcodeTemplateCreateRequest, GetAllBarcodeTemplateAttributesResponse,
 | 
				
			||||||
                             CreateBarcodeTemplateAttributeResponse, CreateBarcodeTemplateAttributeRequest,
 | 
					                             CreateBarcodeTemplateAttributeResponse, CreateBarcodeTemplateAttributeRequest,
 | 
				
			||||||
                             BarcodeTemplateUpdateResponse, BarcodeTemplateUpdateRequest,
 | 
					                             BarcodeTemplateUpdateResponse, BarcodeTemplateUpdateRequest,
 | 
				
			||||||
                             GetAllBarcodeTemplatesResponse)
 | 
					                             GetAllBarcodeTemplatesResponse, BarcodeTemplateDeleteRequest,
 | 
				
			||||||
 | 
					                             BarcodeTemplateDeleteResponse)
 | 
				
			||||||
from services.barcode import BarcodeService
 | 
					from services.barcode import BarcodeService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
barcode_router = APIRouter(
 | 
					barcode_router = APIRouter(
 | 
				
			||||||
@@ -67,6 +68,18 @@ async def update_barcode_template(
 | 
				
			|||||||
    return await BarcodeService(session).update_barcode_template(request)
 | 
					    return await BarcodeService(session).update_barcode_template(request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@barcode_router.post(
 | 
				
			||||||
 | 
					    '/template/delete',
 | 
				
			||||||
 | 
					    response_model=BarcodeTemplateDeleteResponse,
 | 
				
			||||||
 | 
					    operation_id='delete_barcode_template'
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					async def delete_barcode_template(
 | 
				
			||||||
 | 
					        request: BarcodeTemplateDeleteRequest,
 | 
				
			||||||
 | 
					        session: Annotated[AsyncSession, Depends(get_session)]
 | 
				
			||||||
 | 
					):
 | 
				
			||||||
 | 
					    return await BarcodeService(session).delete_template(request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Template attributes
 | 
					# region Template attributes
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,10 @@ class CreateBarcodeTemplateAttributeRequest(CustomModelCamel):
 | 
				
			|||||||
    label: str
 | 
					    label: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BarcodeTemplateDeleteRequest(CustomModelCamel):
 | 
				
			||||||
 | 
					    id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Responses
 | 
					# region Responses
 | 
				
			||||||
@@ -66,4 +70,8 @@ class GetAllBarcodeTemplatesResponse(CustomModelCamel):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class GetAllBarcodeTemplateAttributesResponse(CustomModelCamel):
 | 
					class GetAllBarcodeTemplateAttributesResponse(CustomModelCamel):
 | 
				
			||||||
    attributes: list[BarcodeTemplateAttributeSchema]
 | 
					    attributes: list[BarcodeTemplateAttributeSchema]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BarcodeTemplateDeleteResponse(OkMessageSchema):
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ from typing import List
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from pydantic import validator, field_validator
 | 
					from pydantic import validator, field_validator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from schemas.barcode import BarcodeTemplateSchema
 | 
				
			||||||
from schemas.base import CustomModelCamel, OkMessageSchema
 | 
					from schemas.base import CustomModelCamel, OkMessageSchema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,6 +21,7 @@ class ClientDetailsSchema(CustomModelCamel):
 | 
				
			|||||||
class ClientSchema(CustomModelCamel):
 | 
					class ClientSchema(CustomModelCamel):
 | 
				
			||||||
    id: int
 | 
					    id: int
 | 
				
			||||||
    name: str
 | 
					    name: str
 | 
				
			||||||
 | 
					    barcode_template: BarcodeTemplateSchema | None = None
 | 
				
			||||||
    details: ClientDetailsSchema | None = None
 | 
					    details: ClientDetailsSchema | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
					from schemas.barcode import (GetBarcodeTemplateByIdRequest,
 | 
				
			||||||
                             GetBarcodeTemplateByIdResponse,
 | 
					                             GetBarcodeTemplateByIdResponse,
 | 
				
			||||||
                             BarcodeTemplateCreateResponse,
 | 
					                             BarcodeTemplateCreateResponse,
 | 
				
			||||||
                             BarcodeTemplateCreateRequest, CreateBarcodeTemplateAttributeRequest,
 | 
					                             BarcodeTemplateCreateRequest, CreateBarcodeTemplateAttributeRequest,
 | 
				
			||||||
                             BarcodeTemplateUpdateResponse, BarcodeTemplateUpdateRequest,
 | 
					                             BarcodeTemplateUpdateResponse, BarcodeTemplateUpdateRequest,
 | 
				
			||||||
                             BarcodeTemplateAttributeSchema, GetAllBarcodeTemplateAttributesResponse,
 | 
					                             BarcodeTemplateAttributeSchema, GetAllBarcodeTemplateAttributesResponse,
 | 
				
			||||||
                             GetAllBarcodeTemplatesResponse)
 | 
					                             GetAllBarcodeTemplatesResponse, BarcodeTemplateDeleteRequest,
 | 
				
			||||||
 | 
					                             BarcodeTemplateDeleteResponse)
 | 
				
			||||||
from services.base import BaseService
 | 
					from services.base import BaseService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,7 +25,12 @@ class BarcodeService(BaseService):
 | 
				
			|||||||
        return query.scalar()
 | 
					        return query.scalar()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def get_all_barcode_templates(self) -> GetAllBarcodeTemplatesResponse:
 | 
					    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)
 | 
					        query = await self.session.execute(stmt)
 | 
				
			||||||
        templates = query.scalars().all()
 | 
					        templates = query.scalars().all()
 | 
				
			||||||
        return GetAllBarcodeTemplatesResponse(templates=templates)
 | 
					        return GetAllBarcodeTemplatesResponse(templates=templates)
 | 
				
			||||||
@@ -43,10 +50,12 @@ class BarcodeService(BaseService):
 | 
				
			|||||||
                raise ValueError('Шаблон с таким именем уже существует')
 | 
					                raise ValueError('Шаблон с таким именем уже существует')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # create template then add attributes
 | 
					            # 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)
 | 
					            self.session.add(template)
 | 
				
			||||||
            await self.session.flush()
 | 
					            await self.session.flush()
 | 
				
			||||||
 | 
					            await self.session.refresh(template)
 | 
				
			||||||
            # get all attributes from database
 | 
					            # get all attributes from database
 | 
				
			||||||
            stmt = select(BarcodeTemplateAttribute).filter(
 | 
					            stmt = select(BarcodeTemplateAttribute).filter(
 | 
				
			||||||
                BarcodeTemplateAttribute.id.in_(request.attribute_ids))
 | 
					                BarcodeTemplateAttribute.id.in_(request.attribute_ids))
 | 
				
			||||||
@@ -55,12 +64,7 @@ class BarcodeService(BaseService):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            # add attributes to template
 | 
					            # add attributes to template
 | 
				
			||||||
            for attribute in attributes:
 | 
					            for attribute in attributes:
 | 
				
			||||||
                template_attribute_link = BarcodeTemplateAttributeLink(
 | 
					                template.attributes.append(attribute)
 | 
				
			||||||
                    barcode_template_id=template.id,
 | 
					 | 
				
			||||||
                    attribute_id=attribute.id
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
                self.session.add(template_attribute_link)
 | 
					 | 
				
			||||||
                await self.session.flush()
 | 
					 | 
				
			||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
            return BarcodeTemplateCreateResponse(message='Шаблон успешно создан',
 | 
					            return BarcodeTemplateCreateResponse(message='Шаблон успешно создан',
 | 
				
			||||||
                                                 ok=True,
 | 
					                                                 ok=True,
 | 
				
			||||||
@@ -97,24 +101,22 @@ class BarcodeService(BaseService):
 | 
				
			|||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # difference deleted and new
 | 
					            # 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)
 | 
					            request_attributes = set(request.attribute_ids)
 | 
				
			||||||
            new_attributes = request_attributes.difference(template_attributes)
 | 
					            new_attribute_ids = request_attributes.difference(template_attributes)
 | 
				
			||||||
            deleted_attributes = template_attributes.difference(request_attributes)
 | 
					            deleted_attribute_ids = template_attributes.difference(request_attributes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # delete attributes
 | 
					            # delete attributes
 | 
				
			||||||
            for attribute in template.attributes:
 | 
					            for attribute in template.attributes:
 | 
				
			||||||
                if attribute.attribute_id not in deleted_attributes:
 | 
					                if attribute.id not in deleted_attribute_ids:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
                await self.session.delete(attribute)
 | 
					                template.attributes.remove(attribute)
 | 
				
			||||||
 | 
					            for new_attribute_id in new_attribute_ids:
 | 
				
			||||||
            # add new attributes
 | 
					                stmt = insert(barcode_template_attribute_link).values({
 | 
				
			||||||
            for new_attribute in new_attributes:
 | 
					                    'barcode_template_id': template.id,
 | 
				
			||||||
                template_attribute_link = BarcodeTemplateAttributeLink(
 | 
					                    'attribute_id': new_attribute_id
 | 
				
			||||||
                    barcode_template_id=template.id,
 | 
					                })
 | 
				
			||||||
                    attribute_id=new_attribute
 | 
					                await self.session.execute(stmt)
 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
                self.session.add(template_attribute_link)
 | 
					 | 
				
			||||||
                await self.session.flush()
 | 
					                await self.session.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
@@ -125,6 +127,15 @@ class BarcodeService(BaseService):
 | 
				
			|||||||
            return BarcodeTemplateUpdateResponse(message=str(e),
 | 
					            return BarcodeTemplateUpdateResponse(message=str(e),
 | 
				
			||||||
                                                 ok=False)
 | 
					                                                 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
 | 
					    # endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # region Template attributes
 | 
					    # region Template attributes
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,7 +91,17 @@ class ClientService(BaseService):
 | 
				
			|||||||
            client = await self.get_by_id(request.data.id)
 | 
					            client = await self.get_by_id(request.data.id)
 | 
				
			||||||
            if not client:
 | 
					            if not client:
 | 
				
			||||||
                return ClientUpdateResponse(ok=False, message='Клиент не найден')
 | 
					                return ClientUpdateResponse(ok=False, message='Клиент не найден')
 | 
				
			||||||
            await self.session.execute(update(Client).where(Client.id == client.id).values(name=request.data.name))
 | 
					            request_dict = request.data.dict()
 | 
				
			||||||
 | 
					            del request_dict['id']
 | 
				
			||||||
 | 
					            del request_dict['details']
 | 
				
			||||||
 | 
					            del request_dict['barcode_template']
 | 
				
			||||||
 | 
					            request_dict['barcode_template_id'] = request.data.barcode_template.id
 | 
				
			||||||
 | 
					            stmt = (
 | 
				
			||||||
 | 
					                update(Client)
 | 
				
			||||||
 | 
					                .where(Client.id == client.id)
 | 
				
			||||||
 | 
					                .values(**request_dict)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            await self.session.execute(stmt)
 | 
				
			||||||
            await self.update_details(user, client, request.data.details)
 | 
					            await self.update_details(user, client, request.data.details)
 | 
				
			||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
            return ClientUpdateResponse(ok=True, message='Клиент обновлен')
 | 
					            return ClientUpdateResponse(ok=True, message='Клиент обновлен')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ class DealService(BaseService):
 | 
				
			|||||||
    async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
 | 
					    async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
 | 
				
			||||||
        return await self.session.get(Deal, deal_id)
 | 
					        return await self.session.get(Deal, deal_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def _get_rank_for_deal(self, deal_status: DealStatus) -> int:
 | 
					    async def _get_rank_for_deal(self, deal_status: DealStatus) -> str:
 | 
				
			||||||
        deal_query = await self.session.execute(
 | 
					        deal_query = await self.session.execute(
 | 
				
			||||||
            select(Deal).where(Deal.current_status == deal_status).order_by(Deal.lexorank.desc()).limit(1))
 | 
					            select(Deal).where(Deal.current_status == deal_status).order_by(Deal.lexorank.desc()).limit(1))
 | 
				
			||||||
        deal = deal_query.scalar_one_or_none()
 | 
					        deal = deal_query.scalar_one_or_none()
 | 
				
			||||||
@@ -35,7 +35,7 @@ class DealService(BaseService):
 | 
				
			|||||||
                            user: User,
 | 
					                            user: User,
 | 
				
			||||||
                            deadline: datetime.datetime = None,
 | 
					                            deadline: datetime.datetime = None,
 | 
				
			||||||
                            rank=None,
 | 
					                            rank=None,
 | 
				
			||||||
                            comment: str = '') -> DealStatusHistory:
 | 
					                            comment: str = ''):
 | 
				
			||||||
        if not deal.current_status == status:
 | 
					        if not deal.current_status == status:
 | 
				
			||||||
            deadline = deadline
 | 
					            deadline = deadline
 | 
				
			||||||
            status_change = DealStatusHistory(
 | 
					            status_change = DealStatusHistory(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user