Files
Fulfillment-Backend/services/attribute.py

88 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from sqlalchemy import select, and_
from models import Attribute, AttributeType
from schemas.attribute import *
from services.base import BaseService
class AttributeService(BaseService):
async def get_all(self) -> GetAttributesResponse:
stmt = (
select(Attribute)
.where(Attribute.is_deleted == False)
.order_by(Attribute.label)
)
attrs = (await self.session.scalars(stmt)).all()
return GetAttributesResponse(attributes=attrs)
async def get_types(self) -> GetAttributeTypesResponse:
stmt = (
select(AttributeType)
.where(AttributeType.is_deleted == False)
)
types = (await self.session.scalars(stmt)).all()
return GetAttributeTypesResponse(types=types)
async def get_attr_by_name(self, attr_name: str) -> Optional[Attribute]:
stmt = (
select(Attribute)
.where(
and_(
Attribute.name == attr_name,
Attribute.is_deleted == False,
)
)
)
attribute = (await self.session.scalars(stmt)).first()
return attribute
async def create(self, request: CreateAttributeRequest) -> CreateAttributeResponse:
existing_attr = await self.get_attr_by_name(request.attribute.name)
if existing_attr:
return CreateAttributeResponse(ok=False, message="Атрибут с данным уникальным ключом уже существует")
default_value = pickle.dumps(request.attribute.default_value)
values = request.attribute.model_dump()
del values["default_value"]
attribute = Attribute(
**values,
default_value=default_value,
)
self.session.add(attribute)
await self.session.commit()
return CreateAttributeResponse(ok=True, message="Атрибут успешно создан")
async def update(self, request: UpdateAttributeRequest) -> UpdateAttributeResponse:
attribute = await self.session.get(Attribute, request.attribute.id)
if not attribute:
return UpdateAttributeResponse(ok=False, message=f"Атрибут с ID {request.attribute.id} не найден")
if attribute.name != request.attribute.name:
attr_with_same_name = await self.get_attr_by_name(request.attribute.name)
if attr_with_same_name:
return UpdateAttributeResponse(ok=False, message="Атрибут с данным уникальным ключом уже существует")
default_value = pickle.dumps(request.attribute.default_value) if request.attribute.default_value else None
attribute.name = request.attribute.name
attribute.label = request.attribute.label
attribute.default_value = default_value
attribute.is_applicable_to_group = request.attribute.is_applicable_to_group
attribute.is_shown_on_dashboard = request.attribute.is_shown_on_dashboard
attribute.is_highlight_if_expired = request.attribute.is_highlight_if_expired
attribute.is_nullable = request.attribute.is_nullable
attribute.description = request.attribute.description
await self.session.commit()
return UpdateAttributeResponse(ok=True, message="Атрибут успешно обновлен")
async def delete(self, attribute_id: int) -> DeleteAttributeResponse:
attribute: Optional[Attribute] = await self.session.get(Attribute, attribute_id)
if not attribute:
return DeleteAttributeResponse(ok=False, message=f"Атрибут с ID {attribute_id} не найден")
attribute.is_deleted = True
await self.session.commit()
return DeleteAttributeResponse(ok=True, message=f"Атрибут успешно удален")