Coverage for api/handlers/resources/trailers.py: 43%

59 statements  

« prev     ^ index     » next       coverage.py v7.6.2, created at 2024-10-10 03:02 +0300

1import asyncio 

2from typing import Any 

3 

4from bson import ObjectId 

5from database.entity import update_etag_and_text_search 

6from database.integration_1c.savers import remove_from_1c, update_in_1c 

7from database.updater import update_resource_in_order 

8from exceptions import BadParameterHTTPError, NotFoundHTTPError 

9from handlers.grabbers.resources import trailers_data_grabber 

10from handlers.resources import documents_creation, documents_on_update 

11from handlers.resources.common import assert_resource_manage 

12from handlers.resources.processor import process_final_entity 

13from mongodb import docs_col, trailers_col 

14from pymongo import ReturnDocument 

15from pymongo.errors import DuplicateKeyError 

16from sotrans_models.models.misc.document import DocumentDBModel 

17from sotrans_models.models.resources.trailers import ( 

18 TrailerCreateModel, 

19 TrailerDBModel, 

20 TrailerUpdateModel, 

21) 

22from sotrans_models.models.responses import GenericGetListResponse 

23from sotrans_models.models.users import SotransOIDCUserModel 

24from sotrans_models.utils.text_mappers import get_vehicles_text_search 

25from utils.data_grabber import BaseGetListQueryParams, adjust_search_query 

26from utils.dt_utils import get_current_datetime 

27from utils.helper import EntityHash, get_org_oid 

28 

29 

30async def on_create_trailer( 

31 creation_data: TrailerCreateModel, executor: SotransOIDCUserModel 

32) -> TrailerDBModel | dict[str, Any]: 

33 org_id = get_org_oid(executor) 

34 data = creation_data.model_dump(exclude_unset=True) 

35 if TrailerDBModel.documents[0] in data: 

36 del data["documents"] 

37 db_model = TrailerDBModel( 

38 organization_id=org_id, 

39 created_at=get_current_datetime(), 

40 is_active=True, 

41 **data, 

42 ) 

43 try: 

44 created = await trailers_col.create(db_model.model_dump()) 

45 except DuplicateKeyError: 

46 raise BadParameterHTTPError("номер уже зарегистрирован") 

47 updated = await documents_creation( 

48 creation_data, trailers_col, created, executor 

49 ) 

50 return await process_final_entity( 

51 created if updated is None else updated, trailers_col, TrailerDBModel 

52 ) 

53 

54 

55async def on_get_trailers( 

56 params: BaseGetListQueryParams, 

57) -> GenericGetListResponse[TrailerDBModel]: 

58 return await trailers_data_grabber.get_list(params) 

59 

60 

61async def on_get_trailer( 

62 trailer_id: ObjectId, executor: SotransOIDCUserModel 

63) -> TrailerDBModel: 

64 return await assert_resource_manage(trailer_id, trailers_col, executor) 

65 

66 

67async def on_update_trailer( 

68 trailer_id: ObjectId, 

69 update_data: TrailerUpdateModel, 

70 executor: SotransOIDCUserModel, 

71) -> TrailerDBModel: 

72 await assert_resource_manage( 

73 trailer_id, trailers_col, executor, update_data.etag 

74 ) 

75 data = await documents_on_update( 

76 trailers_col, trailer_id, update_data, executor 

77 ) 

78 etag_q = {"etag": update_data.etag} if update_data.etag else {} 

79 try: 

80 trailer = await trailers_col.collection.find_one_and_update( 

81 {"_id": trailer_id} | etag_q, 

82 {"$set": data}, 

83 return_document=ReturnDocument.AFTER, 

84 ) 

85 except DuplicateKeyError: 

86 raise BadParameterHTTPError("номер уже зарегистрирован") 

87 if trailer is None: 

88 raise NotFoundHTTPError("trailer") 

89 await update_etag_and_text_search( 

90 trailer, 

91 trailers_col, 

92 TrailerDBModel, 

93 get_vehicles_text_search, 

94 ) 

95 tm = TrailerDBModel(**trailer) 

96 asyncio.create_task( 

97 update_in_1c(trailer_id, trailers_col.collection_name, tm) 

98 ) 

99 await update_resource_in_order(trailer_id, trailer, "trailer") 

100 return tm 

101 

102 

103async def on_delete_trailer( 

104 trailer_id: ObjectId, 

105 executor: SotransOIDCUserModel, 

106 etag: EntityHash | None, 

107): 

108 await assert_resource_manage(trailer_id, trailers_col, executor, etag) 

109 await trailers_col.delete_by_id(trailer_id) 

110 await docs_col.collection.update_many( 

111 {DocumentDBModel.object_id: trailer_id}, 

112 {"$set": {DocumentDBModel.deleted_at: get_current_datetime()}}, 

113 ) 

114 await update_resource_in_order(trailer_id, None, "trailer") 

115 asyncio.create_task( 

116 remove_from_1c(trailer_id, trailers_col.collection_name) 

117 )