feat: crappy reordering

This commit is contained in:
2024-10-07 23:42:37 +03:00
parent e153d4a1c0
commit aae7e96001
10 changed files with 208 additions and 17 deletions

View File

@@ -668,9 +668,15 @@ class DealService(BaseService):
models.DealProductService.deal_id == request.deal_id,
)
)
deal_product_services: list[models.DealProductService] = (
await self.session.scalars(source_services_stmt)).all()
# source_services: list[models.Service] = [dpc.service for dpc in deal_product_services]
deal_product_services = (
(
await self.session.scalars(
source_services_stmt
)
)
.all()
)
destination_deal_products_stmt = (
select(
models.DealProduct

View File

@@ -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}")