예제 #1
0
    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))
예제 #2
0
    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))
예제 #3
0
    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"])
예제 #7
0
 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])
예제 #8
0
 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"])
예제 #9
0
 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"])