def set_object_list_and_total_count(self, query, fields, sort, start, limit, is_public_request): try: if not is_public_request: xform = self.get_object() where, where_params = get_where_clause(query) if where: self.object_list = self.object_list.extra(where=where, params=where_params) if (start and limit or limit) and (not sort and not fields): start = start if start is not None else 0 limit = limit if start is None or start == 0 else start + limit self.object_list = filter_queryset_xform_meta_perms( self.get_object(), self.request.user, self.object_list) self.object_list = \ self.object_list.order_by('pk')[start: limit] self.total_count = self.object_list.count() elif (sort or limit or start or fields) and not is_public_request: try: query = \ filter_queryset_xform_meta_perms_sql(self.get_object(), self.request.user, query) self.object_list = query_data(xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields) self.total_count = query_data(xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields, count=True)[0].get('count') except NoRecordsPermission: self.object_list = [] self.total_count = 0 else: self.total_count = self.object_list.count() if self.total_count and isinstance(self.object_list, QuerySet): self.etag_hash = get_etag_hash_from_query(self.object_list) elif self.total_count: sql, params, records = get_sql_with_params(xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields) self.etag_hash = get_etag_hash_from_query(records, sql, params) except ValueError as e: raise ParseError(unicode(e)) except DataError as e: raise ParseError(unicode(e))
def set_object_list(self, query, fields, sort, start, limit, is_public_request): try: enable_etag = True if not is_public_request: xform = self.get_object() self.data_count = xform.num_of_submissions enable_etag = self.data_count <\ SUBMISSION_RETRIEVAL_THRESHOLD where, where_params = get_where_clause(query) if where: self.object_list = self.object_list.extra(where=where, params=where_params) if (start and limit or limit) and (not sort and not fields): start = start if start is not None else 0 limit = limit if start is None or start == 0 else start + limit self.object_list = filter_queryset_xform_meta_perms( self.get_object(), self.request.user, self.object_list) self.object_list = self.object_list[start:limit] elif (sort or limit or start or fields) and not is_public_request: try: query = \ filter_queryset_xform_meta_perms_sql(self.get_object(), self.request.user, query) self.object_list = query_data( xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields, json_only=not self.kwargs.get('format') == 'xml') except NoRecordsPermission: self.object_list = [] # ETags are Disabled for XForms with Submissions that surpass # the configured SUBMISSION_RETRIEVAL_THRESHOLD setting if enable_etag: if isinstance(self.object_list, QuerySet): self.etag_hash = get_etag_hash_from_query(self.object_list) else: sql, params, records = get_sql_with_params( xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields) self.etag_hash = get_etag_hash_from_query( records, sql, params) except ValueError as e: raise ParseError(text(e)) except DataError as e: raise ParseError(text(e))
def set_object_list( self, query, fields, sort, start, limit, is_public_request): try: if not is_public_request: xform = self.get_object() where, where_params = get_where_clause(query) if where: self.object_list = self.object_list.extra(where=where, params=where_params) if (start and limit or limit) and (not sort and not fields): start = start if start is not None else 0 limit = limit if start is None or start == 0 else start + limit self.object_list = filter_queryset_xform_meta_perms( self.get_object(), self.request.user, self.object_list) self.object_list = self.object_list[start:limit] elif (sort or limit or start or fields) and not is_public_request: try: query = \ filter_queryset_xform_meta_perms_sql(self.get_object(), self.request.user, query) self.object_list = query_data(xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields) except NoRecordsPermission: self.object_list = [] if isinstance(self.object_list, QuerySet): self.etag_hash = get_etag_hash_from_query(self.object_list) else: sql, params, records = get_sql_with_params( xform, query=query, sort=sort, start_index=start, limit=limit, fields=fields ) self.etag_hash = get_etag_hash_from_query(records, sql, params) except ValueError as e: raise ParseError(text(e)) except DataError as e: raise ParseError(text(e))
def test_get_where_clause_with_json_query(self): query = '{"name": "bla"}' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json->>%s = %s"]) self.assertEqual(where_params, ["name", "bla"])
def test_get_where_clause_with_integer(self): query = '11' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json::text ~* cast(%s as text)"]) self.assertEqual(where_params, [11])
def test_get_where_clause_with_string_query(self): query = 'bla' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json::text ~* cast(%s as text)"]) self.assertEqual(where_params, ["bla"])
def test_get_where_clause_with_integer(self): query = '11' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json::text ~* cast(%s as text)"]) self.assertEqual(where_params, [11])
def test_get_where_clause_with_string_query(self): query = 'bla' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json::text ~* cast(%s as text)"]) self.assertEqual(where_params, ["bla"])
def test_get_where_clause_with_json_query(self): query = '{"name": "bla"}' where, where_params = get_where_clause(query) self.assertEqual(where, [u"json->>%s = %s"]) self.assertEqual(where_params, ["name", "bla"])