Skip to content

Commit ac1bdb0

Browse files
Revert "Pass paging off to the fhir data-server (#683)" (#688)
This reverts commit f846cd1.
1 parent 8605fe6 commit ac1bdb0

File tree

2 files changed

+44
-26
lines changed

2 files changed

+44
-26
lines changed

apps/fhir/bluebutton/tests/test_read.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,17 @@ def catchall(url, req):
277277

278278
self.assertEqual(response.status_code, 200)
279279
self.assertEqual(response.json()['entry'], expected_response['entry'])
280+
self.assertTrue(len(response.json()['link']) > 0)
281+
self.assertIn("_count=5", response.json()['link'][0]['url'])
282+
283+
response = self.client.get(
284+
reverse(
285+
'bb_oauth_fhir_search',
286+
kwargs={'resource_type': 'Patient'}),
287+
{'_count': 6},
288+
Authorization="Bearer %s" % (first_access_token))
289+
290+
self.assertIn("_count=6", response.json()['link'][0]['url'])
280291

281292
def test_search_request_unauthorized(self):
282293
response = self.client.get(

apps/fhir/bluebutton/views/search.py

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,43 +44,50 @@ class SearchView(FhirDataView):
4444
]
4545

4646
def get(self, request, resource_type, *args, **kwargs):
47+
serializer = ParamSerializer(data=request.query_params)
48+
serializer.is_valid(raise_exception=True)
49+
query_params = serializer.data
50+
51+
# Verify paging inputs. Casting an invalid int will throw a ValueError
52+
try:
53+
start_index = int(query_params.get(START_PARAMETER, 0))
54+
except ValueError:
55+
raise exceptions.ParseError(detail='%s must be an integer between zero and the number of results' % START_PARAMETER)
56+
57+
if start_index < 0:
58+
raise exceptions.ParseError()
59+
60+
try:
61+
page_size = int(query_params.get(SIZE_PARAMETER, DEFAULT_PAGE_SIZE))
62+
except ValueError:
63+
raise exceptions.ParseError(detail='%s must be an integer between 1 and %s' % (SIZE_PARAMETER, MAX_PAGE_SIZE))
64+
65+
if page_size <= 0 or page_size > MAX_PAGE_SIZE:
66+
raise exceptions.ParseError()
67+
4768
data = self.fetch_data(request, resource_type, *args, **kwargs)
69+
70+
if data.get('total', 0) > 0:
71+
# TODO update to pagination class
72+
data['entry'] = data['entry'][start_index:start_index + page_size]
73+
replay_parameters = self.build_parameters(request)
74+
data['link'] = get_paging_links(request.build_absolute_uri('?'),
75+
start_index,
76+
page_size,
77+
data['total'],
78+
replay_parameters)
79+
4880
return Response(data)
4981

5082
def build_parameters(self, request, *args, **kwargs):
5183
patient_id = request.crosswalk.fhir_id
5284
resource_type = request.resource_type
53-
5485
get_parameters = {
55-
'_format': 'application/json+fhir',
86+
'_format': 'application/json+fhir'
5687
}
5788

5889
if resource_type == 'ExplanationOfBenefit':
59-
serializer = ParamSerializer(data=request.query_params)
60-
serializer.is_valid(raise_exception=True)
61-
query_params = serializer.data
62-
63-
# Verify paging inputs. Casting an invalid int will throw a ValueError
64-
try:
65-
start_index = int(query_params.get(START_PARAMETER, 0))
66-
except ValueError:
67-
raise exceptions.ParseError(
68-
detail='%s must be an integer between zero and the number of results' % START_PARAMETER)
69-
70-
if start_index < 0:
71-
raise exceptions.ParseError()
72-
73-
try:
74-
page_size = int(query_params.get(SIZE_PARAMETER, DEFAULT_PAGE_SIZE))
75-
except ValueError:
76-
raise exceptions.ParseError(detail='%s must be an integer between 1 and %s' % (SIZE_PARAMETER, MAX_PAGE_SIZE))
77-
78-
if page_size <= 0 or page_size > MAX_PAGE_SIZE:
79-
raise exceptions.ParseError()
80-
8190
get_parameters['patient'] = patient_id
82-
get_parameters['startIndex'] = start_index
83-
get_parameters['_count'] = page_size
8491
elif resource_type == 'Coverage':
8592
get_parameters['beneficiary'] = 'Patient/' + patient_id
8693
elif resource_type == 'Patient':

0 commit comments

Comments
 (0)