@@ -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