feat: deal product services

This commit is contained in:
2024-05-13 07:46:13 +03:00
parent e9aec10feb
commit be650aca74
10 changed files with 136 additions and 10 deletions

View File

@@ -1,7 +1,7 @@
from sqlalchemy import select, update
from sqlalchemy.orm import joinedload
from models import Service, ServiceCategory
from models import Service, ServiceCategory, ServicePriceRange
from services.base import BaseService
from schemas.service import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \
ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \
@@ -27,8 +27,18 @@ class ServiceService(BaseService):
service_dict['category_id'] = raw_service.category.id
del service_dict['id']
del service_dict['category']
del service_dict['price_ranges']
service = Service(**service_dict)
self.session.add(service)
await self.session.flush()
price_ranges = request.service.price_ranges
for price_range in price_ranges:
price_range_dict = price_range.model_dump()
price_range_dict['service_id'] = service.id
del price_range_dict['id']
price_range_obj = ServicePriceRange(**price_range_dict)
self.session.add(price_range_obj)
await self.session.commit()
return ServiceCreateResponse(ok=True, message="Услуга успешно создана")
except Exception as e:
@@ -37,21 +47,41 @@ class ServiceService(BaseService):
async def update(self, request: ServiceUpdateRequest) -> ServiceUpdateResponse:
try:
raw_service = request.data
service = await (self.session
.scalars(select(Service)
.filter(Service.id == raw_service.id)))
service = await (self.session.get(Service, raw_service.id))
if not service:
return ServiceUpdateResponse(ok=False, message="Услуга не найдена")
service_dict = raw_service.dict()
service_dict['category_id'] = raw_service.category.id
del service_dict['category']
del service_dict['price_ranges']
await self.session.execute(
update(Service)
.where(Service.id == raw_service.id)
.values(**service_dict)
)
# checking if old price ranges are still in the request
request_price_range_ids = [price_range.id for price_range in raw_service.price_ranges if price_range.id]
price_ranges_to_delete = []
for price_range in service.price_ranges:
if price_range.id not in request_price_range_ids:
price_ranges_to_delete.append(price_range)
for price_range in price_ranges_to_delete:
await self.session.delete(price_range)
await self.session.flush()
for price_range in raw_service.price_ranges:
price_range_dict = price_range.dict()
price_range_dict['service_id'] = raw_service.id
if price_range.id:
await self.session.execute(
update(ServicePriceRange)
.where(ServicePriceRange.id == price_range.id)
.values(**price_range_dict)
)
else:
del price_range_dict['id']
price_range_obj = ServicePriceRange(**price_range_dict)
self.session.add(price_range_obj)
await self.session.commit()
return ServiceUpdateResponse(ok=True, message="Услуга успешно обновлена")
except Exception as e: