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
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1import asyncio
2from typing import Any
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
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 )
55async def on_get_trailers(
56 params: BaseGetListQueryParams,
57) -> GenericGetListResponse[TrailerDBModel]:
58 return await trailers_data_grabber.get_list(params)
61async def on_get_trailer(
62 trailer_id: ObjectId, executor: SotransOIDCUserModel
63) -> TrailerDBModel:
64 return await assert_resource_manage(trailer_id, trailers_col, executor)
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
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 )