6 month visit - Completness rate
This commit is contained in:
@@ -73,6 +73,7 @@ from eb_dashboard_constants import (
|
||||
API_RC_SEARCH_INCLUSIONS_ENDPOINT,
|
||||
API_RC_GET_RECORD_BY_PATIENT_ENDPOINT,
|
||||
API_RC_GET_SURVEYS_ENDPOINT,
|
||||
API_RC_GET_VISIT_ENDPOINT,
|
||||
API_GDD_GET_REQUEST_BY_TUBE_ID_ENDPOINT
|
||||
)
|
||||
|
||||
@@ -347,6 +348,9 @@ def load_inclusions_mapping_config():
|
||||
elif source_id_raw == "request":
|
||||
field_config["source_type"] = "request"
|
||||
field_config["source_value"] = None
|
||||
elif source_id_raw == "6_month_visit":
|
||||
field_config["source_type"] = "6_month_visit"
|
||||
field_config["source_value"] = None
|
||||
else:
|
||||
field_config["source_type"] = None
|
||||
field_config["source_value"] = source_id_raw
|
||||
@@ -684,7 +688,7 @@ def _execute_custom_function(function_name, args, output_inclusion):
|
||||
return f"$$$$ Unknown Custom Function: {function_name}"
|
||||
|
||||
|
||||
def process_inclusions_mapping(output_inclusion, inclusion_data, record_data, request_data, all_questionnaires):
|
||||
def process_inclusions_mapping(output_inclusion, inclusion_data, record_data, request_data, all_questionnaires, six_month_visit_data):
|
||||
"""Processes and adds the inclusions mapping fields to the inclusion dictionary."""
|
||||
for field in inclusions_mapping_config:
|
||||
field_name = field["field_name"]
|
||||
@@ -722,9 +726,18 @@ def process_inclusions_mapping(output_inclusion, inclusion_data, record_data, re
|
||||
final_value = get_nested_value(inclusion_data, field_path, default="undefined")
|
||||
elif source_type == "request":
|
||||
final_value = get_nested_value(request_data, field_path, default="undefined")
|
||||
elif source_type == "6_month_visit":
|
||||
final_value = get_nested_value(six_month_visit_data, field_path, default="undefined")
|
||||
else:
|
||||
final_value = f"$$$$ Unknown Source Type: {source_type}"
|
||||
|
||||
# If the source data itself is missing (e.g., 6-month visit not created), log a warning but continue
|
||||
if final_value == "$$$$ No Data":
|
||||
patient_id = inclusion_data.get("id", "Unknown")
|
||||
pseudo = inclusion_data.get("pseudo", "Unknown")
|
||||
logging.warning(f"No '{source_type}' data source found for Patient {patient_id} / {pseudo} (Field: {field_name})")
|
||||
final_value = "undefined"
|
||||
|
||||
# Post-processing: Apply true_if_any and value_labels transformations (for all sources)
|
||||
if final_value not in ["undefined", "$$$$ No Data"]:
|
||||
# Check if any value matches
|
||||
@@ -843,6 +856,18 @@ def get_request_by_tube_id(tube_id):
|
||||
return response.json()
|
||||
|
||||
|
||||
@api_call_with_retry
|
||||
def get_visit_by_id(visit_id):
|
||||
"""Fetches a full visit object by its ID."""
|
||||
client = get_httpx_client()
|
||||
client.base_url = RC_URL
|
||||
response = client.get(API_RC_GET_VISIT_ENDPOINT.format(visit_id=visit_id),
|
||||
headers={"Authorization": f"Bearer {access_token}"},
|
||||
timeout=API_TIMEOUT)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
|
||||
@api_call_with_retry
|
||||
def get_all_questionnaires_by_patient(patient_id, record_data):
|
||||
"""Fetches all questionnaires for a patient with a single API call."""
|
||||
@@ -1052,11 +1077,30 @@ def _process_inclusion_data(inclusion, organization):
|
||||
request_future = subtasks_thread_pool.submit(get_request_by_tube_id, tube_id)
|
||||
all_questionnaires = get_all_questionnaires_by_patient(patient_id, record_data)
|
||||
|
||||
# --- Fetch 6-month visit data if it exists ---
|
||||
six_month_visit_id = None
|
||||
six_month_visit_data = None
|
||||
|
||||
# Record -> protocol_inclusions --> 0 --> visits[] (order == 2)
|
||||
protocol_inclusions = get_nested_value(record_data, ["record", "protocol_inclusions"], default=[])
|
||||
if protocol_inclusions:
|
||||
visits = protocol_inclusions[0].get("visits", [])
|
||||
for v in visits:
|
||||
if v.get("order") == 2:
|
||||
six_month_visit_id = v.get("id")
|
||||
break
|
||||
|
||||
if six_month_visit_id:
|
||||
try:
|
||||
six_month_visit_data = get_visit_by_id(six_month_visit_id)
|
||||
except Exception as e:
|
||||
logging.error(f"Error fetching 6-month visit {six_month_visit_id} for patient {patient_id}: {e}")
|
||||
|
||||
# Wait for request to complete
|
||||
request_data = request_future.result()
|
||||
|
||||
# --- Process all fields from configuration ---
|
||||
process_inclusions_mapping(output_inclusion, inclusion_data, record_data, request_data, all_questionnaires)
|
||||
process_inclusions_mapping(output_inclusion, inclusion_data, record_data, request_data, all_questionnaires, six_month_visit_data)
|
||||
|
||||
return output_inclusion
|
||||
|
||||
|
||||
Reference in New Issue
Block a user