Skip to content

Commit 613a8e5

Browse files
committed
Country lookup based on organisation name
1 parent 1946817 commit 613a8e5

1 file changed

Lines changed: 67 additions & 15 deletions

File tree

api/management/commands/sync_molnix_appraisals.py

Lines changed: 67 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
from django.utils.dateparse import parse_datetime
88

99
from api.logger import logger
10+
from api.models import Country
1011
from api.molnix_utils import MolnixApi
1112
from deployments.models import (
1213
MolnixAppraisal,
1314
MolnixAppraiser,
15+
Personnel,
1416
RrmsEventParticipation,
1517
RrmsPersonSnapshot,
1618
)
@@ -19,6 +21,7 @@
1921
OUTPUT = 2 # 0=print only, 1=print + DB, 2=DB only
2022
APPRAISALS_PER_PAGE = 15
2123
EVENTS_PER_PAGE = 15
24+
EVENTS_LAST_PAGE_DEFAULT = 13000
2225

2326

2427
def 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+
263305
def 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

Comments
 (0)