import os from collections import OrderedDict from django.contrib.auth.models import Group from django.contrib.auth.models import User from django.db.models.functions import Lower from django.http import HttpResponse from django.views.generic import View from django_filters.rest_framework import DjangoFilterBackend from rest_framework.filters import OrderingFilter from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from documents.permissions import PaperlessObjectPermissions from paperless.filters import GroupFilterSet from paperless.filters import UserFilterSet from paperless.serialisers import GroupSerializer from paperless.serialisers import UserSerializer class StandardPagination(PageNumberPagination): page_size = 25 page_size_query_param = "page_size" max_page_size = 100000 def get_paginated_response(self, data): return Response( OrderedDict( [ ("count", self.page.paginator.count), ("next", self.get_next_link()), ("previous", self.get_previous_link()), ("all", self.get_all_result_ids()), ("results", data), ], ), ) def get_all_result_ids(self): ids = [] if hasattr(self.page.paginator.object_list, "saved_results"): results_page = self.page.paginator.object_list.saved_results[0] if results_page is not None: for i in range(0, len(results_page.results.docs())): try: fields = results_page.results.fields(i) if "id" in fields: ids.append(fields["id"]) except Exception: pass else: for obj in self.page.paginator.object_list: if hasattr(obj, "id"): ids.append(obj.id) elif hasattr(obj, "fields"): ids.append(obj.fields()["id"]) return ids def get_paginated_response_schema(self, schema): response_schema = super().get_paginated_response_schema(schema) response_schema["properties"]["all"] = { "type": "array", "example": "[1, 2, 3]", } return response_schema class FaviconView(View): def get(self, request, *args, **kwargs): # pragma: nocover favicon = os.path.join( os.path.dirname(__file__), "static", "paperless", "img", "favicon.ico", ) with open(favicon, "rb") as f: return HttpResponse(f, content_type="image/x-icon") class UserViewSet(ModelViewSet): model = User queryset = User.objects.exclude( username__in=["consumer", "AnonymousUser"], ).order_by(Lower("username")) serializer_class = UserSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated, PaperlessObjectPermissions) filter_backends = (DjangoFilterBackend, OrderingFilter) filterset_class = UserFilterSet ordering_fields = ("username",) class GroupViewSet(ModelViewSet): model = Group queryset = Group.objects.order_by(Lower("name")) serializer_class = GroupSerializer pagination_class = StandardPagination permission_classes = (IsAuthenticated, PaperlessObjectPermissions) filter_backends = (DjangoFilterBackend, OrderingFilter) filterset_class = GroupFilterSet ordering_fields = ("name",)