Beispiel #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))
Beispiel #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))
Beispiel #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))
Beispiel #4
0
    def list(self, request, *args, **kwargs):
        fields = request.GET.get("fields")
        query = request.GET.get("query", {})
        sort = request.GET.get("sort")
        start = parse_int(request.GET.get("start"))
        limit = parse_int(request.GET.get("limit"))
        export_type = kwargs.get('format', request.GET.get("format"))
        lookup_field = self.lookup_field
        lookup = self.kwargs.get(lookup_field)
        is_public_request = lookup == self.public_data_endpoint

        if lookup_field not in list(kwargs):
            self.object_list = self.filter_queryset(self.get_queryset())
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        if is_public_request:
            self.object_list = self._get_public_forms_queryset()
        elif lookup:
            qs = self.filter_queryset(self.get_queryset()).values_list(
                'pk', 'is_merged_dataset')
            xform_id, is_merged_dataset = qs[0] if qs else (lookup, False)
            pks = [xform_id]
            if is_merged_dataset:
                merged_form = MergedXForm.objects.get(pk=xform_id)
                qs = merged_form.xforms.filter(
                    deleted_at__isnull=True).values_list(
                        'id', 'num_of_submissions')
                try:
                    pks, num_of_submissions = [
                        list(value) for value in zip(*qs)
                    ]
                    num_of_submissions = sum(num_of_submissions)
                except ValueError:
                    pks, num_of_submissions = [], 0
            else:
                num_of_submissions = XForm.objects.get(
                    id=xform_id).num_of_submissions
            self.object_list = Instance.objects.filter(
                xform_id__in=pks, deleted_at=None).only('json')

            # Enable ordering for XForms with Submissions that are less
            # than the SUBMISSION_RETRIEVAL_THRESHOLD
            if num_of_submissions < SUBMISSION_RETRIEVAL_THRESHOLD:
                self.object_list = self.object_list.order_by('id')

            xform = self.get_object()
            self.object_list = \
                filter_queryset_xform_meta_perms(xform, request.user,
                                                 self.object_list)
            tags = self.request.query_params.get('tags')
            not_tagged = self.request.query_params.get('not_tagged')

            self.object_list = filters.InstanceFilter(
                self.request.query_params,
                queryset=self.object_list,
                request=request).qs

            if tags and isinstance(tags, six.string_types):
                tags = tags.split(',')
                self.object_list = self.object_list.filter(tags__name__in=tags)
            if not_tagged and isinstance(not_tagged, six.string_types):
                not_tagged = not_tagged.split(',')
                self.object_list = \
                    self.object_list.exclude(tags__name__in=not_tagged)

        if (
            export_type is None or
            export_type in ['json', 'jsonp', 'debug', 'xml']) \
                and hasattr(self, 'object_list'):
            return self._get_data(query, fields, sort, start, limit,
                                  is_public_request)

        xform = self.get_object()
        kwargs = {'instance__xform': xform}

        if export_type == Attachment.OSM:
            if request.GET:
                self.set_object_list(query, fields, sort, start, limit,
                                     is_public_request)
                kwargs = {'instance__in': self.object_list}
            osm_list = OsmData.objects.filter(**kwargs).order_by('instance')
            page = self.paginate_queryset(osm_list)
            serializer = self.get_serializer(page)

            return Response(serializer.data)

        elif export_type is None or export_type in ['json']:
            # perform default viewset retrieve, no data export
            return super(DataViewSet, self).list(request, *args, **kwargs)

        elif export_type == 'geojson':
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        return custom_response_handler(request, xform, query, export_type)
    def list(self, request, *args, **kwargs):
        fields = request.GET.get("fields")
        query = request.GET.get("query", {})
        sort = request.GET.get("sort")
        start = parse_int(request.GET.get("start"))
        limit = parse_int(request.GET.get("limit"))
        export_type = kwargs.get('format', request.GET.get("format"))
        lookup_field = self.lookup_field
        lookup = self.kwargs.get(lookup_field)
        is_public_request = lookup == self.public_data_endpoint

        if lookup_field not in kwargs.keys():
            self.object_list = self.filter_queryset(self.get_queryset())
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        if is_public_request:
            self.object_list = self._get_public_forms_queryset()
        elif lookup:
            qs = self.filter_queryset(self.get_queryset()).values_list(
                'pk', flat=True)
            xform_id = qs[0] if qs else lookup
            self.object_list = Instance.objects.filter(
                xform_id=xform_id, deleted_at=None).only('json')
            xform = self.get_object()
            self.object_list = \
                filter_queryset_xform_meta_perms(xform, request.user,
                                                 self.object_list)
            tags = self.request.query_params.get('tags')
            not_tagged = self.request.query_params.get('not_tagged')

            if tags and isinstance(tags, six.string_types):
                tags = tags.split(',')
                self.object_list = self.object_list.filter(tags__name__in=tags)
            if not_tagged and isinstance(not_tagged, six.string_types):
                not_tagged = not_tagged.split(',')
                self.object_list = \
                    self.object_list.exclude(tags__name__in=not_tagged)

        if (export_type is None or export_type in ['json', 'jsonp', 'debug']) \
                and hasattr(self, 'object_list'):
            return self._get_data(query, fields, sort, start, limit,
                                  is_public_request)

        xform = self.get_object()
        kwargs = {'instance__xform': xform}

        if export_type == Attachment.OSM:
            if request.GET:
                self.set_object_list_and_total_count(query, fields, sort,
                                                     start, limit,
                                                     is_public_request)
                kwargs = {'instance__in': self.object_list}
            osm_list = OsmData.objects.filter(**kwargs)
            page = self.paginate_queryset(osm_list)
            serializer = self.get_serializer(page)

            return Response(serializer.data)

        elif export_type is None or export_type in ['json']:
            # perform default viewset retrieve, no data export
            return super(DataViewSet, self).list(request, *args, **kwargs)

        elif export_type == 'geojson':
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        return custom_response_handler(request, xform, query, export_type)
Beispiel #6
0
    def list(self, request, *args, **kwargs):
        fields = request.GET.get("fields")
        query = request.GET.get("query", {})
        sort = request.GET.get("sort")
        start = parse_int(request.GET.get("start"))
        limit = parse_int(request.GET.get("limit"))
        export_type = kwargs.get('format', request.GET.get("format"))
        lookup_field = self.lookup_field
        lookup = self.kwargs.get(lookup_field)
        is_public_request = lookup == self.public_data_endpoint

        if lookup_field not in list(kwargs):
            self.object_list = self.filter_queryset(self.get_queryset())
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        if is_public_request:
            self.object_list = self._get_public_forms_queryset()
        elif lookup:
            qs = self.filter_queryset(
                self.get_queryset()
            ).values_list('pk', 'is_merged_dataset')
            xform_id, is_merged_dataset = qs[0] if qs else (lookup, False)
            pks = [xform_id]
            if is_merged_dataset:
                xforms = MergedXForm.objects.filter(
                    pk=xform_id, xforms__deleted_at__isnull=True)\
                    .values_list('xforms', flat=True)
                pks = [pk for pk in xforms if pk] or [xform_id]
            self.object_list = Instance.objects.filter(
                xform_id__in=pks, deleted_at=None).only('json').order_by('id')
            xform = self.get_object()
            self.object_list = \
                filter_queryset_xform_meta_perms(xform, request.user,
                                                 self.object_list)
            tags = self.request.query_params.get('tags')
            not_tagged = self.request.query_params.get('not_tagged')

            self.object_list = filters.InstanceFilter(
                self.request.query_params,
                queryset=self.object_list,
                request=request
            ).qs

            if tags and isinstance(tags, six.string_types):
                tags = tags.split(',')
                self.object_list = self.object_list.filter(tags__name__in=tags)
            if not_tagged and isinstance(not_tagged, six.string_types):
                not_tagged = not_tagged.split(',')
                self.object_list = \
                    self.object_list.exclude(tags__name__in=not_tagged)

        if (export_type is None or export_type in ['json', 'jsonp', 'debug']) \
                and hasattr(self, 'object_list'):
            return self._get_data(query, fields, sort, start, limit,
                                  is_public_request)

        xform = self.get_object()
        kwargs = {'instance__xform': xform}

        if export_type == Attachment.OSM:
            if request.GET:
                self.set_object_list(
                    query, fields, sort, start, limit, is_public_request)
                kwargs = {'instance__in': self.object_list}
            osm_list = OsmData.objects.filter(**kwargs).order_by('instance')
            page = self.paginate_queryset(osm_list)
            serializer = self.get_serializer(page)

            return Response(serializer.data)

        elif export_type is None or export_type in ['json']:
            # perform default viewset retrieve, no data export
            return super(DataViewSet, self).list(request, *args, **kwargs)

        elif export_type == 'geojson':
            serializer = self.get_serializer(self.object_list, many=True)

            return Response(serializer.data)

        return custom_response_handler(request, xform, query, export_type)