Coverage for api/handlers/misc/verification.py: 19%
36 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
3from database.integration_1c.savers import (
4 save_entity_to_updates,
5 save_resource_updates_1c_for_organization,
6)
7from database.verification import check_full_verification
8from exceptions import BadParameterHTTPError, NotFoundHTTPError
9from mongodb import (
10 db,
11 docs_col,
12 drivers_col,
13 orders_col,
14 orgs_col,
15 trailers_col,
16 trucks_col,
17 verifications_col,
18)
19from services.notifications.director import notification_api
20from sotrans_models.models.misc.verification import (
21 VerificationCreateModel,
22 VerificationDBModel,
23 VerificationStatus,
24)
25from sotrans_models.models.organizations import OrganizationDBModel
26from sotrans_models.models.users import SotransOIDCUserModel
29async def on_verify(
30 user: SotransOIDCUserModel, verification: VerificationCreateModel
31):
32 if verification.collection not in (
33 orgs_col.collection_name,
34 drivers_col.collection_name,
35 trucks_col.collection_name,
36 docs_col.collection_name,
37 trailers_col.collection_name,
38 ):
39 raise BadParameterHTTPError("коллекция")
40 related = await db[verification.collection].find_single(
41 "_id", verification.object_id
42 )
43 if not related:
44 raise NotFoundHTTPError
45 verification_to_db = VerificationDBModel(
46 **verification.model_dump(), owner_id=user.sub
47 )
48 created = await verifications_col.create(verification_to_db.model_dump())
49 await db[verification.collection].update_by_id(
50 verification.object_id, {"verification": created}
51 )
52 if verification.collection == docs_col.collection_name:
53 await orders_col.collection.update_many(
54 {"documents._id": verification.object_id},
55 {"$set": {"documents.$.verification": created}},
56 )
57 if verification.collection == orgs_col.collection_name:
58 org = OrganizationDBModel(**related)
59 await save_entity_to_updates(verification.collection, related)
60 else:
61 org_found = await orgs_col.find_single(
62 "_id", related.get("organization_id")
63 )
64 if org_found is None:
65 raise NotFoundHTTPError("организация")
66 org = OrganizationDBModel(**org_found)
68 asyncio.create_task(
69 notification_api.verification_result(
70 org, verification.collection, related, verification.status
71 )
72 )
73 # todo can be optimized by check of that collection resource
74 if verification.collection == docs_col.collection_name:
75 return created
77 if (
78 org.full_verification
79 and verification.status == VerificationStatus.declined
80 and not await check_full_verification(org)
81 ):
82 await orgs_col.update_by_id(org.id, {"full_verification": False})
83 elif (
84 not org.full_verification
85 and verification.status == VerificationStatus.accepted
86 and await check_full_verification(org)
87 ):
88 await orgs_col.update_by_id(org.id, {"full_verification": True})
89 await save_resource_updates_1c_for_organization(org.id)
90 return created