Source code for fhiry.fhirsearch
import pandas as pd
import requests
from .base_fhiry import BaseFhiry
[docs]class Fhirsearch(BaseFhiry):
def __init__(self, fhir_base_url, config_json=None):
self.fhir_base_url = fhir_base_url
# Batch size (entries per page)
self.page_size = 500
# Keyword arguments for HTTP(s) requests (f.e. for auth)
# Example parameters:
# Authentication: https://requests.readthedocs.io/en/latest/user/authentication/#basic-authentication
# Proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
# SSL Certificates: https://requests.readthedocs.io/en/latest/user/advanced/#ssl-cert-verification
self.requests_kwargs = {}
super().__init__(config_json=config_json)
[docs] def search(self, resource_type="Patient", search_parameters={}):
headers = {"Content-Type": "application/fhir+json"}
if '_count' not in search_parameters:
search_parameters['_count'] = self.page_size
search_url = f'{self.fhir_base_url}/{resource_type}'
r = requests.get(search_url, params=search_parameters, headers=headers, **self.requests_kwargs)
r.raise_for_status()
bundle_dict = r.json()
if 'entry' in bundle_dict:
df = super().process_bundle_dict(bundle_dict)
next_page_url = get_next_page_url(bundle_dict)
while next_page_url:
r = requests.get(next_page_url, headers=headers, **self.requests_kwargs)
r.raise_for_status()
bundle_dict = r.json()
df_page = super().process_bundle_dict(bundle_dict)
df = pd.concat([df, df_page])
next_page_url = get_next_page_url(bundle_dict)
else:
df = pd.DataFrame(columns=[])
return df
[docs]def get_next_page_url(bundle_dict):
links = bundle_dict.get('link')
if links:
for link in links:
relation = link.get('relation')
if relation == 'next':
return link.get('url')
return None