feat: services kit and copy
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user