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

1import asyncio 

2 

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 

27 

28 

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) 

67 

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 

76 

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