22import xmltodict
33from django .conf import settings
44from django .core .management .base import BaseCommand
5+ from django .db import transaction
56from requests .auth import HTTPBasicAuth
67from sentry_sdk .crons import monitor
78
1011from main .sentry import SentryMonitor
1112
1213
13- @monitor (monitor_slug = SentryMonitor .INGEST_NS_DIRECTORY )
1414class Command (BaseCommand ):
1515 help = "Add ns contact details"
1616
17+ @monitor (monitor_slug = SentryMonitor .INGEST_NS_DIRECTORY )
18+ @transaction .atomic
1719 def handle (self , * args , ** kwargs ):
1820 def postprocessor (path , key , value ):
1921 if key == "@i:nil" :
@@ -41,6 +43,7 @@ def postprocessor(path, key, value):
4143 raise Exception ("Error querying NationalSocietiesContacts" )
4244
4345 added = 0
46+ created_country_directory_ids = []
4447 dict_data = xmltodict .parse (response .content , postprocessor = postprocessor )
4548 for data in dict_data ["ArrayOfNationalSocietiesContacts" ]["NationalSocietiesContacts" ]:
4649 country_name = data ["CON_country" ] if isinstance (data ["CON_country" ], str ) else None
@@ -62,14 +65,15 @@ def postprocessor(path, key, value):
6265 "position" : data ["CON_title" ],
6366 "country" : country ,
6467 }
65- existing_qs = CountryDirectory .objects .filter (
68+ country_directory , _ = CountryDirectory .objects .get_or_create (
6669 country = country ,
6770 first_name__iexact = data ["first_name" ],
6871 last_name__iexact = data ["last_name" ],
6972 position__iexact = data ["position" ],
7073 )
71- if not existing_qs .exists ():
72- CountryDirectory .objects .create (** data )
74+ created_country_directory_ids .append (country_directory .pk )
75+ # NOTE: Deleting the country directory which are not available in the source
76+ CountryDirectory .objects .exclude (id__in = created_country_directory_ids ).delete ()
7377 text_to_log = "%s Ns Directory added" % added
7478 logger .info (text_to_log )
7579 body = {"name" : "ingest_ns_directory" , "message" : text_to_log , "num_result" : added , "status" : CronJobStatus .SUCCESSFUL }
0 commit comments