Support alternate validator / newer validation result property names and do additional aggregations

This commit is contained in:
2026-05-18 15:28:52 +02:00
parent 0ffcfa0ca2
commit 79579ec82a
+59 -12
View File
@@ -29,7 +29,8 @@ class Validator():
def fhir_operation_validate(self, resource_type, resource, send_pretty=False):
headers = {'User-Agent': 'Bulk FHIR validator',
'Content-Type': 'application/fhir+json'}
'Content-Type': 'application/fhir+json',
'Accept': 'application/fhir+json'}
if send_pretty:
data = json.dumps(resource, indent=4)
@@ -55,14 +56,21 @@ class Validator():
df = pd.DataFrame()
for issue in outcome.get('issue'):
diagnostics = issue.get('diagnostics')
diagnostics = issue.get('details').get('text')
if not diagnostics:
# fallback to (old?) HAPI validator properties
diagnostics = issue.get('diagnostics')
diagnostics_aggregated = remove_value_code(diagnostics)
diagnostics_aggregated = remove_array_index(diagnostics_aggregated)
severity = issue.get('severity')
location = issue.get('location')
location = issue.get('expression')
if not location:
# fallback to (old?) HAPI validator properties
location = issue.get('location')
location = location[0]
location_aggregated = remove_array_index(location)
@@ -188,18 +196,45 @@ def get_next_page_url(bundle_dict):
def remove_value_code(diagnostics):
find_value_code = re.search(r"Coding provided \(.+?\#(.+?)\) is not in the value set", diagnostics)
if not find_value_code:
find_value_code = re.search(r"Unknown code in fragment CodeSystem \'.+?\#(.+?)\'", diagnostics)
find_value_code = re.search(r"Coding provided \(.+?\#(.+?)\)", diagnostics)
if find_value_code:
value_code = find_value_code.groups()[0]
diagnostics_removed_valuecode = diagnostics.replace(value_code, "REMOVEDCODE")
else:
diagnostics_removed_valuecode = diagnostics
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
return diagnostics_removed_valuecode
find_value_code = re.search(r"code provided \(.+?\#(.+?)\) was not found", diagnostics)
if find_value_code:
value_code = find_value_code.groups()[0]
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
find_value_code = re.search(r"Unknown code in fragment CodeSystem \'.+?\#(.+?)\'", diagnostics)
if find_value_code:
value_code = find_value_code.groups()[0]
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
find_value_code = re.search(r"code \`(.+?)\` was not found in the code system", diagnostics)
if find_value_code:
value_code = find_value_code.groups()[0]
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
find_value_code = re.search(r"Invalid display \`(.+?)\` for code \`.+?\#(.+?)\`. A valid display is \`(.+?)\`", diagnostics)
if find_value_code:
value_display = find_value_code.groups()[0]
value_code = find_value_code.groups()[1]
valid_display = find_value_code.groups()[2]
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
diagnostics = diagnostics.replace(value_display, "REMOVEDDISPLAY")
diagnostics = diagnostics.replace(valid_display, "REMOVEDVALIDDISPLAY")
find_value_code = re.search(r"Invalid display \`(.+?)\` for code \`.+?\#(.+?)\`", diagnostics)
if find_value_code:
value_display = find_value_code.groups()[0]
value_code = find_value_code.groups()[1]
diagnostics = diagnostics.replace(value_code, "REMOVEDCODE")
diagnostics = diagnostics.replace(value_display, "REMOVEDDISPLAY")
return diagnostics
def remove_array_index(diagnostics):
@@ -256,7 +291,13 @@ def render_validation_outcome(resource, outcome, resource_url=None, do_print_lin
summary_html = ''
for issue in issues_sorted:
location_element = issue['location'][0]
location_element = issue.get('expression')
if not location_element:
# Fallback to old(?) HAPI validator properties
location_element = issue['location'][0]
location_line = select_location_line(issue)
match issue['severity']:
@@ -285,8 +326,14 @@ def render_validation_outcome(resource, outcome, resource_url=None, do_print_lin
issue_html += '</small><br>'
diagnostics = issue.get('details').get('text')
if not diagnostics:
# fallback to (old?) HAPI validator properties
diagnostics = issue.get('diagnostics')
issue_html += f'{issue["severity"]} for element <i><b>{location_element}</b></i> (beginning at line ' + str(
location_line) + f'):<br><b>{issue["diagnostics"]}</b>'
location_line) + f'):<br><b>{diagnostics}</b>'
issue_html += '</li></span>'