Coverage for api/handlers/resources/drivers.py: 45%
61 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.authorization.check_role import has_role
10from handlers.grabbers.resources import drivers_data_grabber
11from handlers.resources import documents_creation, documents_on_update
12from handlers.resources.common import assert_resource_manage
13from handlers.resources.processor import process_final_entity
14from mongodb import docs_col, drivers_col
15from pymongo import ReturnDocument
16from pymongo.errors import DuplicateKeyError
17from sotrans_models.models.misc.document import DocumentDBModel
18from sotrans_models.models.resources.drivers import (
19 DriverCreateModel,
20 DriverDBModel,
21 DriverUpdateModel,
22)
23from sotrans_models.models.responses import GenericGetListResponse
24from sotrans_models.models.roles import SotransRole
25from sotrans_models.models.users import SotransOIDCUserModel
26from sotrans_models.utils.text_mappers import get_drivers_text_search
27from utils.data_grabber import BaseGetListQueryParams, adjust_search_query
28from utils.dt_utils import get_current_datetime
29from utils.helper import EntityHash, get_org_oid
32async def on_create_driver(
33 creation_data: DriverCreateModel, executor: SotransOIDCUserModel
34) -> DriverDBModel | dict[str, Any]:
35 org_id = get_org_oid(executor)
36 data = creation_data.model_dump(exclude_unset=True)
37 if DriverDBModel.documents[0] in data:
38 del data["documents"]
39 db_model = DriverDBModel(
40 organization_id=org_id,
41 created_at=get_current_datetime(),
42 is_active=True,
43 **data,
44 )
45 try:
46 created = await drivers_col.create(db_model.model_dump())
47 except DuplicateKeyError:
48 raise BadParameterHTTPError("паспорт уже зарегистрирован")
49 updated = await documents_creation(
50 creation_data, drivers_col, created, executor
51 )
52 return await process_final_entity(
53 created if updated is None else updated,
54 drivers_col,
55 DriverDBModel,
56 get_drivers_text_search,
57 )
60async def on_get_drivers(
61 params: BaseGetListQueryParams,
62) -> GenericGetListResponse[DriverDBModel]:
63 return await drivers_data_grabber.get_list(params)
66async def on_get_driver(
67 driver_id: ObjectId, executor: SotransOIDCUserModel
68) -> DriverDBModel:
69 return await assert_resource_manage(driver_id, drivers_col, executor)
72async def on_update_driver(
73 driver_id: ObjectId,
74 update_data: DriverUpdateModel,
75 executor: SotransOIDCUserModel,
76) -> DriverDBModel:
77 await assert_resource_manage(
78 driver_id, drivers_col, executor, update_data.etag
79 )
80 data = await documents_on_update(
81 drivers_col, driver_id, update_data, executor
82 )
83 etag_q = {"etag": update_data.etag} if update_data.etag is not None else {}
84 try:
85 driver = await drivers_col.collection.find_one_and_update(
86 {"_id": driver_id} | etag_q,
87 {"$set": data},
88 return_document=ReturnDocument.AFTER,
89 )
90 except DuplicateKeyError:
91 raise BadParameterHTTPError(
92 "паспорт уже зарегистрирован в организации"
93 )
94 if driver is None:
95 raise NotFoundHTTPError("driver")
96 await update_etag_and_text_search(
97 driver, drivers_col, DriverDBModel, get_drivers_text_search
98 )
99 dm = DriverDBModel(**driver)
100 asyncio.create_task(
101 update_in_1c(driver_id, drivers_col.collection_name, dm)
102 )
103 await update_resource_in_order(driver_id, driver, "driver")
104 return dm
107async def on_delete_driver(
108 driver_id: ObjectId,
109 executor: SotransOIDCUserModel,
110 etag: EntityHash | None,
111):
112 await assert_resource_manage(driver_id, drivers_col, executor, etag)
113 await drivers_col.delete_by_id(driver_id)
114 await docs_col.collection.update_many(
115 {DocumentDBModel.object_id: driver_id},
116 {"$set": {DocumentDBModel.deleted_at: get_current_datetime()}},
117 )
118 await update_resource_in_order(driver_id, None, "driver")
119 asyncio.create_task(remove_from_1c(driver_id, drivers_col.collection_name))