paperless-ngx/src/paperless/views.py

109 lines
3.6 KiB
Python
Raw Normal View History

import os
2023-05-06 09:54:45 -07:00
from collections import OrderedDict
2022-11-12 18:46:52 +00:00
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
2022-11-12 18:46:52 +00:00
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
2023-05-06 09:54:45 -07:00
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
2022-12-05 22:56:03 -08:00
from documents.permissions import PaperlessObjectPermissions
2022-11-12 18:46:52 +00:00
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
2020-10-21 12:16:25 +02:00
page_size_query_param = "page_size"
max_page_size = 100000
2023-05-06 09:54:45 -07:00
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(len(results_page.results.docs())):
2023-05-06 09:54:45 -07:00
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")
2022-11-12 18:46:52 +00:00
class UserViewSet(ModelViewSet):
model = User
queryset = User.objects.exclude(
username__in=["consumer", "AnonymousUser"],
).order_by(Lower("username"))
2022-11-12 18:46:52 +00:00
serializer_class = UserSerializer
pagination_class = StandardPagination
2022-12-05 22:56:03 -08:00
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
2022-11-12 18:46:52 +00:00
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
2022-12-05 22:56:03 -08:00
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
2022-11-12 18:46:52 +00:00
filter_backends = (DjangoFilterBackend, OrderingFilter)
filterset_class = GroupFilterSet
ordering_fields = ("name",)