feat: services kit and copy

This commit is contained in:
2024-08-06 04:53:50 +03:00
parent 93b0315b4a
commit a7c4fabed0
9 changed files with 442 additions and 28 deletions

View File

@@ -1,12 +1,11 @@
from sqlalchemy import select, update
from typing import Union
from sqlalchemy import select, update, insert, delete
from sqlalchemy.orm import joinedload
from models import Service, ServiceCategory, ServicePriceRange
from models import Service, ServiceCategory, ServicePriceRange, ServicesKit, services_kit_services
from services.base import BaseService
from schemas.service import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \
ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \
ServiceCreateCategoryResponse, ServiceUpdateRequest, ServiceUpdateResponse, ServiceDeleteResponse, \
ServiceDeleteRequest
from schemas.service import *
class ServiceService(BaseService):
@@ -121,3 +120,88 @@ class ServiceService(BaseService):
for category in query.all():
categories.append(ServiceCategorySchema.model_validate(category))
return ServiceGetAllCategoriesResponse(categories=categories)
async def get_kit_by_name(self, name: str) -> Optional[ServicesKit]:
return await self.session.scalar(select(ServicesKit).where(ServicesKit.name == name))
async def get_kit_by_id(self, kit_id: int) -> Optional[ServicesKit]:
return await self.session.scalar(select(ServicesKit).where(ServicesKit.id == kit_id))
async def get_all_kits(self) -> GetAllServicesKitsResponse:
stmt = (
select(
ServicesKit
)
.order_by(
ServicesKit.id.desc()
)
)
kits = (await self.session.scalars(stmt)).all()
kits_schemas = GetServiceKitSchema.from_orm_list(kits)
return GetAllServicesKitsResponse(services_kits=kits_schemas)
async def create_kit(self, request: CreateServicesKitRequest) -> CreateServicesKitResponse:
try:
if await self.get_kit_by_name(request.data.name):
return CreateServicesKitResponse(ok=False, message='Набор услуг с таким названием уже существует')
base_fields = request.data.model_dump_parent()
kit = ServicesKit(**base_fields)
self.session.add(kit)
await self.session.flush()
# Appending services
insert_data = []
for service_id in request.data.services_ids:
insert_data.append({
'service_id': service_id,
'services_kit_id': kit.id
})
if insert_data:
await self.session.execute(
insert(services_kit_services),
insert_data
)
await self.session.flush()
await self.session.commit()
return CreateServicesKitResponse(ok=True, message='Набор услуг успешно создан')
except Exception as e:
return CreateServicesKitResponse(ok=False, message=str(e))
async def update_kit(self, request: UpdateServicesKitRequest) -> UpdateServicesKitResponse:
try:
kit = await self.get_kit_by_id(request.data.id)
if not kit:
return UpdateServicesKitResponse(ok=False, message='Указанный набор услуг не существует')
base_fields = request.data.model_dump_parent()
stmt = update(ServicesKit).values(**base_fields).where(ServicesKit.id == request.data.id)
await self.session.execute(stmt)
await self.session.flush()
# Deleting previous services
stmt = (
delete(
services_kit_services
).where(
services_kit_services.c.services_kit_id == kit.id
)
)
await self.session.execute(stmt)
await self.session.flush()
insert_data = []
for service_id in request.data.services_ids:
insert_data.append({
'service_id': service_id,
'services_kit_id': kit.id
})
if insert_data:
await self.session.execute(
insert(services_kit_services),
insert_data
)
await self.session.flush()
await self.session.commit()
return UpdateServicesKitResponse(ok=True, message='Набор услуг успешно обновлен')
except Exception as e:
return UpdateServicesKitResponse(ok=False, message=str(e))