feat: attributes in cards and projects
This commit is contained in:
85
services/attribute.py
Normal file
85
services/attribute.py
Normal file
@@ -0,0 +1,85 @@
|
||||
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 CreateAttributeResponse(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_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"Атрибут успешно удален")
|
||||
Reference in New Issue
Block a user