6 month visit - Completness rate

This commit is contained in:
2026-01-30 23:06:35 +01:00
parent 57821a06cc
commit 8478604103
7 changed files with 5080 additions and 2510 deletions

View File

@@ -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