Tonic commited on
Commit
4bb7d6f
·
unverified ·
1 Parent(s): 3bf8fee

refactor matching algo

Browse files
Files changed (2) hide show
  1. utils/oneclick.py +8 -11
  2. utils/responseparser.py +10 -2
utils/oneclick.py CHANGED
@@ -4,6 +4,7 @@ from .meldrx import MeldRxAPI
4
  from .responseparser import PatientDataExtractor
5
  from .pdfutils import PDFGenerator
6
  import logging
 
7
 
8
  logger = logging.getLogger(__name__)
9
 
@@ -54,12 +55,6 @@ def generate_discharge_paper_one_click(
54
  first_name: str = "",
55
  last_name: str = ""
56
  ) -> Tuple[Optional[str], str, Optional[str], Optional[str]]:
57
- """
58
- Generate a discharge summary PDF with one click using MeldRx API data.
59
-
60
- Returns:
61
- Tuple of (pdf_path, status_message, basic_summary, ai_summary)
62
- """
63
  try:
64
  patients_data = api.get_patients()
65
  if not patients_data or "entry" not in patients_data:
@@ -89,7 +84,7 @@ def generate_discharge_paper_one_click(
89
  last_name_from_data = str(patient_data.get('last_name', '')).strip().lower()
90
 
91
  all_patient_ids.append(patient_id_from_data)
92
- all_patient_names.append(f"{first_name_from_data} {last_name_from_data}")
93
 
94
  patient_id_input = str(patient_id).strip().lower()
95
  first_name_input = str(first_name).strip().lower()
@@ -99,11 +94,13 @@ def generate_discharge_paper_one_click(
99
  logger.debug(f"Comparing - Input: ID={patient_id_input}, First={first_name_input}, Last={last_name_input}")
100
 
101
  matches = True
102
- if patient_id_input and patient_id_input != patient_id_from_data:
 
103
  matches = False
104
- if first_name_input and first_name_input not in first_name_from_data:
 
105
  matches = False
106
- if last_name_input and last_name_input not in last_name_from_data:
107
  matches = False
108
 
109
  if matches:
@@ -119,7 +116,7 @@ def generate_discharge_paper_one_click(
119
  return None, (f"No patients found matching criteria: {search_criteria}\n"
120
  f"Available IDs: {', '.join(all_patient_ids)}\n"
121
  f"Available Names: {', '.join(all_patient_names)}"), None, None
122
-
123
  patient_data = matching_patients[0]
124
  logger.info(f"Selected patient data: {patient_data}")
125
 
 
4
  from .responseparser import PatientDataExtractor
5
  from .pdfutils import PDFGenerator
6
  import logging
7
+ import json
8
 
9
  logger = logging.getLogger(__name__)
10
 
 
55
  first_name: str = "",
56
  last_name: str = ""
57
  ) -> Tuple[Optional[str], str, Optional[str], Optional[str]]:
 
 
 
 
 
 
58
  try:
59
  patients_data = api.get_patients()
60
  if not patients_data or "entry" not in patients_data:
 
84
  last_name_from_data = str(patient_data.get('last_name', '')).strip().lower()
85
 
86
  all_patient_ids.append(patient_id_from_data)
87
+ all_patient_names.append(f"{first_name_from_data} {last_name_from_data}".strip())
88
 
89
  patient_id_input = str(patient_id).strip().lower()
90
  first_name_input = str(first_name).strip().lower()
 
94
  logger.debug(f"Comparing - Input: ID={patient_id_input}, First={first_name_input}, Last={last_name_input}")
95
 
96
  matches = True
97
+ # Only enforce ID match if both input and data have non-empty IDs
98
+ if patient_id_input and patient_id_from_data and patient_id_input != patient_id_from_data:
99
  matches = False
100
+ # Use exact match for names if provided, ignoring case
101
+ if first_name_input and first_name_input != first_name_from_data:
102
  matches = False
103
+ if last_name_input and last_name_input != last_name_from_data:
104
  matches = False
105
 
106
  if matches:
 
116
  return None, (f"No patients found matching criteria: {search_criteria}\n"
117
  f"Available IDs: {', '.join(all_patient_ids)}\n"
118
  f"Available Names: {', '.join(all_patient_names)}"), None, None
119
+ logger.debug(f"Raw patient data from API: {json.dumps(patients_data, indent=2)}")
120
  patient_data = matching_patients[0]
121
  logger.info(f"Selected patient data: {patient_data}")
122
 
utils/responseparser.py CHANGED
@@ -59,14 +59,22 @@ class PatientDataExtractor:
59
  """Get the currently selected patient resource."""
60
  return self.patients[self.current_patient_idx]
61
 
62
- # Basic Identification Fields
63
  def get_id(self) -> str:
64
  patient = self._get_current_patient()
65
  if self.format == "xml":
66
  id_list = patient.xpath("//hl7:recordTarget/hl7:patientRole/hl7:id/@extension", namespaces=self.ns)
67
  return id_list[0] if id_list else ""
68
  elif self.format == "json":
69
- return patient.get("id", "")
 
 
 
 
 
 
 
 
 
70
 
71
  def get_resource_type(self) -> str:
72
  patient = self._get_current_patient()
 
59
  """Get the currently selected patient resource."""
60
  return self.patients[self.current_patient_idx]
61
 
 
62
  def get_id(self) -> str:
63
  patient = self._get_current_patient()
64
  if self.format == "xml":
65
  id_list = patient.xpath("//hl7:recordTarget/hl7:patientRole/hl7:id/@extension", namespaces=self.ns)
66
  return id_list[0] if id_list else ""
67
  elif self.format == "json":
68
+ # Check top-level 'id' first
69
+ patient_id = patient.get("id", "")
70
+ if patient_id:
71
+ return patient_id
72
+ # Fallback to 'identifier' field
73
+ identifiers = patient.get("identifier", [])
74
+ for identifier in identifiers:
75
+ if identifier.get("value"): # Return the first non-empty identifier value
76
+ return identifier["value"]
77
+ return "" # Default to empty string if no ID found
78
 
79
  def get_resource_type(self) -> str:
80
  patient = self._get_current_patient()