77from django .utils .dateparse import parse_datetime
88
99from api .logger import logger
10+ from api .models import Country
1011from api .molnix_utils import MolnixApi
1112from deployments .models import (
1213 MolnixAppraisal ,
1314 MolnixAppraiser ,
15+ Personnel ,
1416 RrmsEventParticipation ,
1517 RrmsPersonSnapshot ,
1618)
1921OUTPUT = 2 # 0=print only, 1=print + DB, 2=DB only
2022APPRAISALS_PER_PAGE = 15
2123EVENTS_PER_PAGE = 15
24+ EVENTS_LAST_PAGE_DEFAULT = 13000
2225
2326
2427def extract_appraisals (payload ):
@@ -109,6 +112,10 @@ def write_record(record_type, data):
109112 molnix_id = data .get ("molnix_id" )
110113 if molnix_id is None :
111114 return False
115+ personnel = None
116+ target_id = data .get ("target_id" )
117+ if target_id is not None :
118+ personnel = Personnel .objects .filter (molnix_id = target_id ).first ()
112119 MolnixAppraisal .objects .update_or_create (
113120 molnix_id = molnix_id ,
114121 defaults = {
@@ -125,6 +132,7 @@ def write_record(record_type, data):
125132 "receiving_organization_id" : data .get ("receiving_organization_id" ),
126133 "deployment_tags_json" : data .get ("deployment_tags_json" ),
127134 "competencies_json" : data .get ("competencies_json" ),
135+ "personnel" : personnel ,
128136 "created_at" : data .get ("created_at" ),
129137 "updated_at" : data .get ("updated_at" ),
130138 },
@@ -134,12 +142,25 @@ def write_record(record_type, data):
134142 molnix_id = data .get ("molnix_id" )
135143 if molnix_id is None :
136144 return False
145+ appraisal = None
146+ personnel = None
147+ appraisal_molnix_id = data .get ("appraisal_molnix_id" )
148+ if appraisal_molnix_id is not None :
149+ appraisal = MolnixAppraisal .objects .filter (molnix_id = appraisal_molnix_id ).first ()
150+ if appraisal is not None :
151+ personnel = appraisal .personnel
152+ if personnel is None :
153+ person_id = data .get ("person_id" )
154+ if person_id is not None :
155+ personnel = Personnel .objects .filter (molnix_id = person_id ).first ()
137156 MolnixAppraiser .objects .update_or_create (
138157 molnix_id = molnix_id ,
139158 defaults = {
140159 "appraisal_molnix_id" : data .get ("appraisal_molnix_id" ),
160+ "appraisal" : appraisal ,
141161 "appraiser_type" : data .get ("appraiser_type" ),
142162 "person_id" : data .get ("person_id" ),
163+ "personnel" : personnel ,
143164 "required" : data .get ("required" ),
144165 "notified_at" : data .get ("notified_at" ),
145166 "completed_at" : data .get ("completed_at" ),
@@ -152,6 +173,7 @@ def write_record(record_type, data):
152173 person_id = data .get ("person_id" )
153174 if person_id is None :
154175 return False
176+ personnel = Personnel .objects .filter (molnix_id = person_id ).first ()
155177 RrmsPersonSnapshot .objects .update_or_create (
156178 person_id = person_id ,
157179 defaults = {
@@ -164,6 +186,7 @@ def write_record(record_type, data):
164186 "roles_json" : data .get ("roles_json" ),
165187 "languages_json" : data .get ("languages_json" ),
166188 "tags_json" : data .get ("tags_json" ),
189+ "personnel" : personnel ,
167190 "source_updated_at" : data .get ("source_updated_at" ),
168191 },
169192 )
@@ -229,13 +252,19 @@ def extract_org_list(payload):
229252 return []
230253
231254
232- def normalize_org (value , org_lookup ):
255+ def normalize_org (value , org_lookup , country_lookup ):
233256 if isinstance (value , dict ):
234257 org_id = value .get ("id" )
235258 org_name = value .get ("name" ) or org_lookup .get (org_id )
236259 return org_id , org_name
237260 if value is None :
238261 return None , None
262+ if isinstance (value , str ):
263+ key = value .strip ().lower ()
264+ match = country_lookup .get (key )
265+ if match is not None :
266+ return match ["id" ], match ["name" ]
267+ return None , value
239268 org_id = value
240269 org_name = org_lookup .get (org_id )
241270 return org_id , org_name
@@ -260,6 +289,19 @@ def build_org_lookup(molnix):
260289 return lookup
261290
262291
292+ def build_country_lookup ():
293+ lookup = {}
294+ for country in Country .objects .values ("id" , "name" , "society_name" ):
295+ name = country .get ("name" )
296+ if isinstance (name , str ) and name .strip ():
297+ lookup .setdefault (name .strip ().lower (), {"id" : country ["id" ], "name" : name })
298+ society_name = country .get ("society_name" )
299+ if isinstance (society_name , str ) and society_name .strip ():
300+ lookup .setdefault (society_name .strip ().lower (), {"id" : country ["id" ], "name" : society_name })
301+ log_debug (1 , "Loaded %d country name mappings" % len (lookup ))
302+ return lookup
303+
304+
263305def safe_call_api (molnix , path , params = None , label = None ):
264306 try :
265307 return molnix .call_api (path = path , params = params or {})
@@ -270,7 +312,7 @@ def safe_call_api(molnix, path, params=None, label=None):
270312 return None
271313
272314
273- def fetch_deployment_org_ids (molnix , deployment_id , cache ):
315+ def fetch_deployment_org_ids (molnix , deployment_id , cache , org_lookup , country_lookup ):
274316 if deployment_id is None :
275317 return None , None
276318 if deployment_id in cache :
@@ -281,8 +323,8 @@ def fetch_deployment_org_ids(molnix, deployment_id, cache):
281323 return cache [deployment_id ]
282324 sending_org = payload .get ("sending_organization" )
283325 receiving_org = payload .get ("receiving_organization" )
284- sending_id = sending_org . get ( "id" ) if isinstance ( sending_org , dict ) else sending_org
285- receiving_id = receiving_org . get ( "id" ) if isinstance ( receiving_org , dict ) else receiving_org
326+ sending_id , _sending_name = normalize_org ( sending_org , org_lookup , country_lookup )
327+ receiving_id , _receiving_name = normalize_org ( receiving_org , org_lookup , country_lookup )
286328 cache [deployment_id ] = (sending_id , receiving_id )
287329 return cache [deployment_id ]
288330
@@ -316,11 +358,11 @@ def find_person_payload(value):
316358 return None
317359
318360
319- def filter_person_data (person_data , org_lookup ):
361+ def filter_person_data (person_data , org_lookup , country_lookup ):
320362 payload = find_person_payload (person_data )
321363 if not isinstance (payload , dict ):
322364 return {}
323- org_id , org_name = normalize_org (payload .get ("organization" ), org_lookup )
365+ org_id , org_name = normalize_org (payload .get ("organization" ), org_lookup , country_lookup )
324366 return {
325367 "sex" : payload .get ("sex" ),
326368 "organization_id" : org_id ,
@@ -371,10 +413,10 @@ def normalize_appraiser(appraiser):
371413 }
372414
373415
374- def normalize_event_participation (event , org_lookup ):
416+ def normalize_event_participation (event , org_lookup , country_lookup ):
375417 if not isinstance (event , dict ):
376418 return []
377- org_id , org_name = normalize_org (event .get ("organization" ), org_lookup )
419+ org_id , org_name = normalize_org (event .get ("organization" ), org_lookup , country_lookup )
378420 people = event .get ("person" ) if isinstance (event .get ("person" ), list ) else []
379421 records = []
380422 for person in people :
@@ -402,7 +444,7 @@ def normalize_event_participation(event, org_lookup):
402444 return records
403445
404446
405- def handle_person_ids (molnix , person_ids , org_lookup , stdout , db_write_counts ):
447+ def handle_person_ids (molnix , person_ids , org_lookup , country_lookup , stdout , db_write_counts ):
406448 person_snapshot_cache = {}
407449 for person_id in person_ids :
408450 cached_snapshot = person_snapshot_cache .get (person_id )
@@ -419,7 +461,7 @@ def handle_person_ids(molnix, person_ids, org_lookup, stdout, db_write_counts):
419461 roles_payload = safe_call_api (molnix , path = "people/%s/roles" % person_id , label = "people/%s/roles" % person_id )
420462 languages_payload = safe_call_api (molnix , path = "people/%s/languages" % person_id , label = "people/%s/languages" % person_id )
421463 tags_payload = safe_call_api (molnix , path = "people/%s/tags" % person_id , label = "people/%s/tags" % person_id )
422- filtered_person_data = filter_person_data (person_data , org_lookup )
464+ filtered_person_data = filter_person_data (person_data , org_lookup , country_lookup )
423465 if not filtered_person_data :
424466 log_debug (2 , "No person payload found for person_id %s" % person_id )
425467 filtered_person_data = {}
@@ -451,6 +493,7 @@ def handle(self, *args, **options):
451493 return
452494
453495 org_lookup = build_org_lookup (molnix )
496+ country_lookup = build_country_lookup ()
454497
455498 if OUTPUT == 2 :
456499 self .stdout .write ("OUTPUT=2 (DB-only mode) is selected." )
@@ -501,7 +544,13 @@ def handle(self, *args, **options):
501544 continue
502545 appraisal_payload = appraisal .get ("appraisal" )
503546 deployment_id = appraisal_payload .get ("deployment" , {}).get ("id" ) if isinstance (appraisal_payload , dict ) else None
504- sending_org_id , receiving_org_id = fetch_deployment_org_ids (molnix , deployment_id , deployment_org_cache )
547+ sending_org_id , receiving_org_id = fetch_deployment_org_ids (
548+ molnix ,
549+ deployment_id ,
550+ deployment_org_cache ,
551+ org_lookup ,
552+ country_lookup ,
553+ )
505554 appraisal_data = normalize_appraisal (appraisal_payload , sending_org_id , receiving_org_id )
506555 if appraisal_data :
507556 output_record (self .stdout , {"record_type" : "molnix_appraisal" , "data" : appraisal_data })
@@ -534,12 +583,15 @@ def handle(self, *args, **options):
534583 events = extract_events (events_payload )
535584 if isinstance (events_payload , dict ):
536585 original = events_payload .get ("original" ) if isinstance (events_payload .get ("original" ), dict ) else {}
586+ events_last_page = original .get ("last_page" )
587+ if events_last_page is None :
588+ events_last_page = EVENTS_LAST_PAGE_DEFAULT
537589 log_debug (
538590 1 ,
539591 "Events pagination current=%s last=%s next_url=%s count=%d"
540592 % (
541593 original .get ("current_page" ),
542- original . get ( "last_page" ) ,
594+ events_last_page ,
543595 original .get ("next_page_url" ),
544596 len (events ),
545597 ),
@@ -558,7 +610,7 @@ def handle(self, *args, **options):
558610 else :
559611 should_fetch_next = should_continue (events_payload , events )
560612 for event in events :
561- records = normalize_event_participation (event , org_lookup )
613+ records = normalize_event_participation (event , org_lookup , country_lookup )
562614 for record in records :
563615 output_record (self .stdout , {"record_type" : "rrms_event_participation" , "data" : record })
564616 if write_record ("rrms_event_participation" , record ):
@@ -579,8 +631,8 @@ def handle(self, *args, **options):
579631 "Collected %d appraisal person_id values and %d event person_id values"
580632 % (len (appraisal_person_ids ), len (event_person_ids )),
581633 )
582- handle_person_ids (molnix , appraisal_person_ids , org_lookup , self .stdout , db_write_counts )
583- handle_person_ids (molnix , event_person_ids , org_lookup , self .stdout , db_write_counts )
634+ handle_person_ids (molnix , appraisal_person_ids , org_lookup , country_lookup , self .stdout , db_write_counts )
635+ handle_person_ids (molnix , event_person_ids , org_lookup , country_lookup , self .stdout , db_write_counts )
584636 # log_debug(1, "Smoke test: response_capacity endpoint")
585637 # response_capacity_data = molnix.call_api(path="response_capacity")
586638 # self.stdout.write(json.dumps(response_capacity_data, indent=2, sort_keys=True))
0 commit comments