1- import logging
2- import json
3- import ast
1+ from common .clients import logger
42from typing import Dict , Any
5-
6- from common .clients import logger as clients_logger
73from pds_details import pds_get_patient_id , pds_get_patient_details
84from ieds_db_operations import (
95 ieds_update_patient_id ,
106 extract_patient_resource_from_item ,
117 get_items_from_patient_id ,
128)
139from utils import make_status
14-
15- # Module-local logger for records processing. Use this for logs local to this module
16- # so they can be managed separately from the shared clients logger.
17- module_logger = logging .getLogger (__name__ )
18- # Keep a module-level `logger` symbol for backwards compatibility with tests
19- # and other modules that patch or import `record_processor.logger`.
20- logger = module_logger
10+ import json
11+ import ast
2112
2213
2314def process_record (event_record : Dict [str , Any ]) -> Dict [str , Any ]:
2415
25- module_logger .info ("process_record. Processing record: %s" , event_record )
26- # Probe logger configuration to help debug missing logs in CloudWatch.
27- # Log both the module-local logger and the shared clients logger so it's
28- # possible to compare their handlers/levels in CloudWatch.
29- try :
30- module_logger .info (
31- "probe: module_logger id=%s module=%s level=%d handlers=%d" ,
32- hex (id (module_logger )), getattr (module_logger , "__module__" , None ),
33- module_logger .getEffectiveLevel (), len (module_logger .handlers ),
34- )
35- module_logger .info (
36- "probe: clients_logger id=%s module=%s level=%d handlers=%d" ,
37- hex (id (clients_logger )), getattr (clients_logger , "__module__" , None ),
38- clients_logger .getEffectiveLevel (), len (clients_logger .handlers ),
39- )
40- except Exception :
41- # Keep probe non-fatal in production
42- pass
16+ logger .info ("process_record. Processing record: %s" , event_record )
4317 body_text = event_record .get ('body' , '' )
4418
4519 # convert body to json (try JSON first, then fall back to Python literal)
@@ -50,18 +24,18 @@ def process_record(event_record: Dict[str, Any]) -> Dict[str, Any]:
5024 try :
5125 body = ast .literal_eval (body_text )
5226 except (ValueError , SyntaxError ):
53- module_logger .error ("Failed to parse body: %s" , body_text )
27+ logger .error ("Failed to parse body: %s" , body_text )
5428 return {"status" : "error" , "message" : "Invalid body format" }
5529 else :
5630 body = body_text
5731
5832 nhs_number = body .get ("subject" )
5933 # Reached
60- module_logger .info ("process record NHS number: %s" , nhs_number )
34+ logger .info ("process record NHS number: %s" , nhs_number )
6135 if nhs_number :
6236 return process_nhs_number (nhs_number )
6337
64- module_logger .info ("No NHS number found in event record" )
38+ logger .info ("No NHS number found in event record" )
6539 return {"status" : "error" , "message" : "No NHS number found in event record" }
6640
6741
@@ -75,21 +49,20 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
7549 if new_nhs_number == nhs_number :
7650 return make_status ("No update required" , nhs_number )
7751
78- module_logger .info ("Update patient ID from %s to %s" , nhs_number , new_nhs_number )
52+ logger .info ("Update patient ID from %s to %s" , nhs_number , new_nhs_number )
7953
8054 try :
8155 # Fetch PDS Patient resource and IEDS resources for the old NHS number
8256 pds_patient_resource , ieds_resources = fetch_pds_and_ieds_resources (nhs_number )
8357 except Exception as e :
84- module_logger .exception ("process_nhs_number: failed to fetch demographic details: %s" , e )
58+ logger .exception ("process_nhs_number: failed to fetch demographic details: %s" , e )
8559 return make_status (str (e ), nhs_number , "error" )
8660
87- module_logger .info ("Fetched PDS details: %s" , pds_patient_resource )
88- module_logger .info ("Fetched IEDS resources. IEDS count: %d" , len (ieds_resources ),
89- ieds_resources if ieds_resources else 0 )
61+ logger .info ("Fetched PDS details: %s" , pds_patient_resource )
62+ logger .info ("Fetched IEDS resources. IEDS count: %d" , len (ieds_resources ), ieds_resources if ieds_resources else 0 )
9063
9164 if not ieds_resources :
92- module_logger .info ("No IEDS records returned for NHS number: %s" , nhs_number )
65+ logger .info ("No IEDS records returned for NHS number: %s" , nhs_number )
9366 return make_status (f"No records returned for ID: { nhs_number } " , nhs_number )
9467
9568 # Compare demographics from PDS to each IEDS item, keep only matching records
@@ -104,7 +77,7 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
10477 discarded_records .append (detail )
10578
10679 if not matching_records :
107- module_logger .info ("No records matched PDS demographics: %d %s " , discarded_count , discarded_records )
80+ logger .info ("No records matched PDS demographics: %d" , discarded_count , discarded_records )
10881 return make_status ("No records matched PDS demographics; update skipped" , nhs_number )
10982
11083 response = ieds_update_patient_id (
@@ -119,26 +92,22 @@ def process_nhs_number(nhs_number: str) -> Dict[str, Any]:
11992
12093# Function to fetch PDS Patient details and IEDS Immunisation records
12194def fetch_pds_and_ieds_resources (nhs_number : str ):
122- module_logger .info ("fetch_pds_and_ieds_resources: fetching for %s" , nhs_number )
95+ logger .info ("fetch_pds_and_ieds_resources: fetching for %s" , nhs_number )
12396 try :
12497 pds = pds_get_patient_details (nhs_number )
125- module_logger .info ("fetch_pds_resources: fetching for %s" , pds )
98+ logger .info ("fetch_pds_resources: fetching for %s" , pds )
12699 except Exception as e :
127- module_logger .exception (
128- "fetch_pds_and_ieds_resources: failed to fetch PDS details for %s" , nhs_number
129- )
100+ logger .exception ("fetch_pds_and_ieds_resources: failed to fetch PDS details for %s" , nhs_number )
130101 raise RuntimeError ("Failed to fetch PDS details" ) from e
131102
132103 try :
133104 ieds = get_items_from_patient_id (nhs_number )
134105 except Exception as e :
135- module_logger .exception (
136- "fetch_pds_and_ieds_resources: failed to fetch IEDS items for %s" , nhs_number
137- )
106+ logger .exception ("fetch_pds_and_ieds_resources: failed to fetch IEDS items for %s" , nhs_number )
138107 raise RuntimeError ("Failed to fetch IEDS items" ) from e
139108
140109 count = len (ieds )
141- module_logger .info ("fetch_pds_and_ieds_resources: fetched PDS and %d IEDS items for %s" , count , nhs_number )
110+ logger .info ("fetch_pds_and_ieds_resources: fetched PDS and %d IEDS items for %s" , count , nhs_number )
142111 return pds , ieds
143112
144113
@@ -177,45 +146,40 @@ def normalize_strings(item: Any) -> str | None:
177146 pds_name = normalize_strings (extract_normalized_name_from_patient (pds_details ))
178147 pds_gender = normalize_strings (pds_details .get ("gender" ))
179148 pds_birth = normalize_strings (pds_details .get ("birthDate" ))
180- module_logger .info (
181- "demographics_match: demographics from PDS: %s %s %s" ,
182- pds_name ,
183- pds_gender ,
184- pds_birth ,
185- )
149+ logger .info ("demographics_match: demographics match for %s" , pds_name , pds_gender , pds_birth )
186150
187151 # Retrieve patient resource from IEDS item
188152 patient = extract_patient_resource_from_item (ieds_item )
189153 if not patient :
190- module_logger .info ("demographics_match: no patient resource in IEDS table item" )
154+ logger .info ("demographics_match: no patient resource in IEDS table item" )
191155 return False
192156
193157 # normalize patient fields from IEDS
194158 ieds_name = normalize_strings (extract_normalized_name_from_patient (patient ))
195159 ieds_gender = normalize_strings (patient .get ("gender" ))
196160 ieds_birth = normalize_strings (patient .get ("birthDate" ))
197- module_logger .info ("demographics_match: demographics from IEDS: %s" , patient )
161+ logger .info ("demographics_match: demographics match for %s" , patient )
198162
199163 # All required fields must be present
200164 if not all ([pds_name , pds_gender , pds_birth , ieds_name , ieds_gender , ieds_birth ]):
201- module_logger .info ("demographics_match: missing required demographics" )
165+ logger .info ("demographics_match: missing required demographics" )
202166 return False
203167
204168 # Compare fields
205169 if pds_birth != ieds_birth :
206- module_logger .info ("demographics_match: birthDate mismatch %s != %s" , pds_birth , ieds_birth )
170+ logger .info ("demographics_match: birthDate mismatch %s != %s" , pds_birth , ieds_birth )
207171 return False
208172
209173 if pds_gender != ieds_gender :
210- module_logger .info ("demographics_match: gender mismatch %s != %s" , pds_gender , ieds_gender )
174+ logger .info ("demographics_match: gender mismatch %s != %s" , pds_gender , ieds_gender )
211175 return False
212176
213177 if pds_name != ieds_name :
214- module_logger .info ("demographics_match: name mismatch %s != %s" , pds_name , ieds_name )
178+ logger .info ("demographics_match: name mismatch %s != %s" , pds_name , ieds_name )
215179 return False
216180
217- module_logger .info ("demographics_match: demographics match for %s" , patient )
181+ logger .info ("demographics_match: demographics match for %s" , patient )
218182 return True
219183 except Exception :
220- module_logger .exception ("demographics_match: comparison failed with exception" )
184+ logger .exception ("demographics_match: comparison failed with exception" )
221185 return False
0 commit comments