Skip to content

Commit

Permalink
fix numerous pagination issues.
Browse files Browse the repository at this point in the history
  • Loading branch information
JFU-NAVA-PBC committed Feb 26, 2025
1 parent f8c26c1 commit 173b703
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 25 deletions.
9 changes: 7 additions & 2 deletions apps/fhir/bluebutton/views/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,16 @@ def fetch_data(self, request, post_call, resource_type, *args, **kwargs):
# - `excludeSAMHSA=true`

payload = request.data if request.data else {}
# override mbi with user_mbi from corsswalk
# override samhsa to always exclude
# override includeTaxNumbers to always not to include
payload['mbi'] = request.crosswalk.user_mbi
payload['excludeSAMHSA'] = 'true'
payload['includeTaxNumbers'] = 'false'
payload['isHashed'] = 'false'
payload['startIndex'] = 0
payload['_count'] = 10
# chunk load the search result bundle to avoid large payload unless caller explicitly specified page size etc.
payload['startIndex'] = payload.get('startIndex', 0)
payload['_count'] = payload.get('_count', 10)
req = Request('POST',
target_url,
headers=backend_connection.headers(request, url=target_url),
Expand Down
82 changes: 59 additions & 23 deletions apps/testclient/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from oauthlib.oauth2.rfc6749.errors import MissingTokenError
from requests_oauthlib import OAuth2Session
from rest_framework import status
from urllib.parse import urlparse, parse_qs, urlunparse, urlencode
from waffle.decorators import waffle_switch

from .utils import test_setup, get_client_secret
Expand Down Expand Up @@ -39,18 +40,42 @@

def _get_page_loc(request, fhir_json):
total = fhir_json.get('total', 0)
index = int(request.GET.get('startIndex', 0))

index = 0

if 'startIndex' not in request.GET and request.GET.get('nav_link'):
# hack here for quick POC
# for PACA claim and claim response pagination:
# some how startIndex ends up as part of nav_link, so hack it to extract startIndex
nav_link_parsed = urlparse(request.GET.get('nav_link'))
nav_qps = parse_qs(nav_link_parsed.query)
start_index = nav_qps.get('startIndex', 0)
if isinstance(start_index, list):
start_index = start_index[0] if start_index else 0
index = int(start_index)
else:
index = int(request.GET.get('startIndex', 0))

count = int(request.GET.get('_count', 10))

return "{}/{}".format(index // count + 1, math.ceil(total / count))


def _extract_page_nav(request, fhir_json):
# strip off PHI if any that appears in url as q-param
link = fhir_json.get('link', None)
nav_list = []
if link is not None:
for lnk in link:
if lnk.get('url', None) is not None and lnk.get('relation', None) is not None:
nav_list.append({'relation': lnk['relation'], 'nav_link': lnk['url']})
parsed_url = urlparse(lnk.get('url', None))
query_params = parse_qs(parsed_url.query)
# for now check mbi (because BFD PACA Claim / ClaimResponse search result nav links contains mbi)
if 'mbi' in query_params:
del query_params['mbi']
parsed_url = parsed_url._replace(query=urlencode(query_params, doseq=True))
nav_link_regen = urlunparse(parsed_url)
nav_list.append({'relation': lnk['relation'], 'nav_link': nav_link_regen})
else:
nav_list = []
break
Expand All @@ -65,35 +90,46 @@ def _get_data_json(request, name, params):

uri = ENDPOINT_URL_FMT[name].format(*params)

if nav_link is not None:
q_params = [uri]
q_params.append(request.GET.get('_count', 10))
q_params.append(request.GET.get('startIndex', 0))

# for now it's either EOB or Coverage, make this more generic later
patient = request.GET.get('patient')

if patient is not None:
q_params.append('patient')
q_params.append(patient)

beneficiary = request.GET.get('beneficiary')

if beneficiary is not None:
q_params.append('beneficiary')
q_params.append(beneficiary)

resp = None

if name == 'claim' or name == 'claimresponse':
# need to handle query parameters to body convert here for claim and claim response
qps = request.GET
nav_link = qps.get('nav_link')
# some how startIndex ends up as part of nav_link, so hack it to extract startIndex
nav_link_parsed = urlparse(nav_link)
nav_qps = parse_qs(nav_link_parsed.query)
start_index = nav_qps.get('startIndex', 0)

if isinstance(start_index, list):
start_index = start_index[0]

json = {
'_count': request.GET.get('_count', 10),
'startIndex': request.GET.get('startIndex', 0),
'_count': qps.get('_count', 10),
'startIndex': start_index
}
resp = oas.post(uri, json=json)
else:
uri = NAV_URI_FMT.format(*q_params)
if nav_link is not None:
q_params = [uri]
q_params.append(request.GET.get('_count', 10))
q_params.append(request.GET.get('startIndex', 0))

# for now it's either EOB or Coverage, make this more generic later
patient = request.GET.get('patient')

if patient is not None:
q_params.append('patient')
q_params.append(patient)

beneficiary = request.GET.get('beneficiary')

if beneficiary is not None:
q_params.append('beneficiary')
q_params.append(beneficiary)

uri = NAV_URI_FMT.format(*q_params)

resp = oas.get(uri)

return resp.json()
Expand Down

0 comments on commit 173b703

Please sign in to comment.