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

1import asyncio 

2import datetime 

3 

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 

25 

26 

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 ) 

37 

38 

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 

59 

60 

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("заказ") 

77 

78 pre_process_to_exchange_auction_end_time(order_data, order, update_data) 

79 

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 

98 

99 

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)