Coverage for api/handlers/orders/to_appointment.py: 37%
51 statements
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1import asyncio
2import datetime
4from bson import ObjectId
5from database.orders import move_order_and_return, update_status_and_return
6from exceptions import BadParameterHTTPError, NotFoundHTTPError
7from handlers.authorization.company_employee_access import (
8 assigned_subsidiary_or_logistician_for_order_query,
9)
10from handlers.grabbers.orders import orders_data_grabber
11from mongodb import buf_col, orders_col, trash_orders_col
12from operations.assignment import data_from_assigned, notify_if_assigned
13from operations.orders import pre_process_to_exchange_auction_end_time
14from services.notifications.director import notification_api
15from services.recommendations import suggestion_api
16from sotrans_models.models.orders.order import (
17 OrderDBModel,
18 OrderStatus,
19 OrderUpdateModel,
20)
21from sotrans_models.models.responses import GenericGetListResponse
22from sotrans_models.models.users import SotransOIDCUserModel
23from utils.data_grabber import BaseGetListQueryParams, adjust_search_query
24from utils.helper import add_prices_to_update, etag_detalizer
27async def on_put_to_trash(order_id: ObjectId, user: SotransOIDCUserModel):
28 restriction_q = assigned_subsidiary_or_logistician_for_order_query(user)
29 await move_order_and_return(
30 order_id,
31 orders_col,
32 trash_orders_col,
33 OrderStatus.archived,
34 {OrderDBModel.status: OrderStatus.appointment.value} | restriction_q,
35 {OrderDBModel.deleted_at: datetime.datetime.utcnow()},
36 )
39async def on_put_appointment_to_buffer(
40 order_id: ObjectId,
41 user: SotransOIDCUserModel,
42 order: OrderUpdateModel | None,
43):
44 update_data = await data_from_assigned(order)
45 restriction_q = assigned_subsidiary_or_logistician_for_order_query(user)
46 up_data = await move_order_and_return(
47 order_id,
48 orders_col,
49 buf_col,
50 OrderStatus.buffer,
51 restrictions_query=restriction_q
52 | {OrderDBModel.status: OrderStatus.appointment.value},
53 updates=update_data,
54 )
55 upm = OrderDBModel(**up_data)
56 notify_if_assigned(order, upm)
57 asyncio.create_task(notification_api.new_in_buffer(upm))
58 return upm
61async def on_appointment_to_exchange(
62 order_id: ObjectId, user: SotransOIDCUserModel, order: OrderUpdateModel
63) -> OrderDBModel:
64 if not (order and order.start_price):
65 raise BadParameterHTTPError("нет начальной цены")
66 etag_q = {"etag": order.etag} if order.etag else {}
67 update_data = await data_from_assigned(order)
68 restriction_q = assigned_subsidiary_or_logistician_for_order_query(user)
69 order_data = await orders_col.collection.find_one(
70 {"id": order_id} | restriction_q | etag_q
71 )
72 if order_data is None:
73 await etag_detalizer(
74 orders_col, etag_q, {"id": order_id} | restriction_q
75 )
76 raise NotFoundHTTPError("заказ")
78 pre_process_to_exchange_auction_end_time(order_data, order, update_data)
80 add_prices_to_update(
81 order_data, update_data, order.start_price, order.end_price
82 )
83 etag_q = {"etag": order.etag} if order.etag else {}
84 order_up = await update_status_and_return(
85 order_id,
86 OrderStatus.exchange,
87 set_=update_data | {OrderDBModel.start_price: order.start_price},
88 restriction=restriction_q | etag_q,
89 )
90 if not order_up:
91 raise NotFoundHTTPError("заказ")
92 order_model = OrderDBModel(**order_up)
93 notify_if_assigned(order, order_model)
94 asyncio.create_task(
95 suggestion_api.create_target_and_recommendation_order(order_model)
96 )
97 return order_model
100async def on_get_whole_appointment(
101 user: SotransOIDCUserModel, params: BaseGetListQueryParams
102) -> GenericGetListResponse[OrderDBModel]:
103 params.where = adjust_search_query(
104 params.where, "status", {OrderStatus.appointment.value}
105 )
106 return await orders_data_grabber.get_list(params, user)