mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-11 10:00:48 -05:00
109 lines
3.6 KiB
Python
109 lines
3.6 KiB
Python
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",)
|