feat: crappy reordering
This commit is contained in:
@@ -1,25 +1,40 @@
|
||||
from typing import Union
|
||||
|
||||
from sqlalchemy import select, update, insert, delete
|
||||
import lexorank
|
||||
from lexorank import Bucket, middle
|
||||
from sqlalchemy import select, update, insert, delete, desc
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
from enums.service import ServiceType
|
||||
from models import Service, ServiceCategory, ServicePriceRange, ServicesKit, services_kit_services, \
|
||||
ServiceCategoryPrice, ServicePriceCategory
|
||||
from services.base import BaseService
|
||||
from schemas.service import *
|
||||
from services.base import BaseService
|
||||
from utils.list_utils import previous_current_next
|
||||
|
||||
|
||||
class ServiceService(BaseService):
|
||||
async def get_all(self) -> ServiceGetAllResponse:
|
||||
query = await (self.session
|
||||
.scalars(select(Service)
|
||||
.options(joinedload(Service.category))
|
||||
.order_by(Service.category_id, Service.id)))
|
||||
query = await (
|
||||
self.session
|
||||
.scalars(select(Service)
|
||||
.options(joinedload(Service.category))
|
||||
.order_by(Service.rank)
|
||||
)
|
||||
)
|
||||
services = []
|
||||
for service in query.all():
|
||||
services.append(ServiceSchema.model_validate(service))
|
||||
return ServiceGetAllResponse(services=services)
|
||||
|
||||
async def get_latest_rank_in_category(self, category_id: int, service_type: ServiceType) -> str:
|
||||
stmt = (
|
||||
select(Service.rank)
|
||||
.where(Service.category_id == category_id)
|
||||
.where(Service.service_type == service_type)
|
||||
.order_by(desc(Service.rank))
|
||||
.limit(1)
|
||||
)
|
||||
return await self.session.scalar(stmt) or ''
|
||||
|
||||
async def create(self, request: ServiceCreateRequest) -> ServiceCreateResponse:
|
||||
try:
|
||||
raw_service = request.service
|
||||
@@ -29,6 +44,16 @@ class ServiceService(BaseService):
|
||||
del service_dict['category']
|
||||
del service_dict['price_ranges']
|
||||
del service_dict['category_prices']
|
||||
service_type = ServiceType(raw_service.service_type)
|
||||
category_id = raw_service.category.id
|
||||
|
||||
latest_rank = await self.get_latest_rank_in_category(category_id, service_type)
|
||||
if not latest_rank:
|
||||
latest_rank = middle(Bucket.BUCEKT_0)
|
||||
else:
|
||||
latest_rank = lexorank.parse(latest_rank)
|
||||
service_rank = str(latest_rank.next())
|
||||
service_dict['rank'] = service_rank
|
||||
service = Service(**service_dict)
|
||||
self.session.add(service)
|
||||
await self.session.flush()
|
||||
@@ -293,3 +318,64 @@ class ServiceService(BaseService):
|
||||
return ServiceDeleteResponse(ok=True, message="Категория цен успешно удалена")
|
||||
except Exception as e:
|
||||
return ServiceDeleteResponse(ok=False, message=f"Неудалось удалить категорию цен, ошибка: {e}")
|
||||
|
||||
async def reorder(self, request: ServiceReorderRequest) -> ServiceReorderResponse:
|
||||
try:
|
||||
draining_service = await (self.session.get(Service, request.draining_service_id))
|
||||
hovered_service = await (self.session.get(Service, request.hovered_service_id))
|
||||
if not draining_service or not hovered_service:
|
||||
return ServiceReorderResponse(ok=False, message="Услуга не найдена")
|
||||
if draining_service.category_id == hovered_service.category_id:
|
||||
temp = draining_service.rank
|
||||
draining_service.rank = hovered_service.rank
|
||||
hovered_service.rank = temp
|
||||
else:
|
||||
return ServiceReorderResponse(ok=False, message="Нельзя перемещать услуги между категориями")
|
||||
await self.session.commit()
|
||||
return ServiceReorderResponse(ok=True, message="Услуги успешно пересортированы")
|
||||
except Exception as e:
|
||||
return ServiceReorderResponse(ok=False, message=f"Неудалось найти услугу, ошибка: {e}")
|
||||
|
||||
async def reorder_category(self, request: ServiceCategoryReorderRequest) -> ServiceCategoryReorderResponse:
|
||||
try:
|
||||
if request.move_down and request.move_up:
|
||||
return ServiceCategoryReorderResponse(ok=False,
|
||||
message="Невозможно выполнить два действия одновременно")
|
||||
if not request.move_down and not request.move_up:
|
||||
return ServiceCategoryReorderResponse(ok=False, message="Не указано действие")
|
||||
if request.service_type == ServiceType.DEAL_SERVICE:
|
||||
order_by = ServiceCategory.deal_service_rank
|
||||
rank_field = 'deal_service_rank'
|
||||
else:
|
||||
order_by = ServiceCategory.product_service_rank
|
||||
rank_field = 'product_service_rank'
|
||||
service_categories = await (
|
||||
self.session
|
||||
.scalars(select(ServiceCategory)
|
||||
.order_by(order_by))
|
||||
)
|
||||
service_categories = service_categories.all()
|
||||
for prv, cur, nxt in previous_current_next(service_categories):
|
||||
if request.category_id == cur.id:
|
||||
if request.move_down:
|
||||
if nxt:
|
||||
temp = getattr(cur, rank_field)
|
||||
# cur.rank = nxt.rank
|
||||
setattr(cur, rank_field, getattr(nxt, rank_field))
|
||||
# nxt.rank = temp
|
||||
setattr(nxt, rank_field, temp)
|
||||
else:
|
||||
return ServiceCategoryReorderResponse(ok=False, message="Невозможно переместить вниз")
|
||||
elif request.move_up:
|
||||
if prv:
|
||||
temp = getattr(cur, rank_field)
|
||||
# cur.rank = prv.rank
|
||||
setattr(cur, rank_field, getattr(prv, rank_field))
|
||||
# prv.rank = temp
|
||||
setattr(prv, rank_field, temp)
|
||||
else:
|
||||
return ServiceCategoryReorderResponse(ok=False, message="Невозможно переместить вверх")
|
||||
await self.session.commit()
|
||||
return ServiceCategoryReorderResponse(ok=True, message="Категории успешно пересортированы")
|
||||
except Exception as e:
|
||||
return ServiceCategoryReorderResponse(ok=False, message=f"Неудалось пересортировать категорию, ошибка: {e}")
|
||||
|
||||
Reference in New Issue
Block a user