paperless-ngx/src/documents/views.py

169 lines
5.3 KiB
Python
Raw Normal View History

2020-10-21 12:53:14 +02:00
from django.db.models import Count, Max
from django.http import HttpResponse, HttpResponseBadRequest
from django.views.generic import DetailView, FormView, TemplateView
from django_filters.rest_framework import DjangoFilterBackend
from django.conf import settings
from django.utils import cache
from paperless.db import GnuPG
from paperless.mixins import SessionOrBasicAuthMixin
from paperless.views import StandardPagination
from rest_framework.filters import OrderingFilter, SearchFilter
2016-03-01 18:57:12 +00:00
from rest_framework.mixins import (
DestroyModelMixin,
ListModelMixin,
RetrieveModelMixin,
UpdateModelMixin
)
2016-03-01 18:57:12 +00:00
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import (
GenericViewSet,
ModelViewSet,
ReadOnlyModelViewSet
)
2018-09-26 10:51:42 +02:00
from .filters import (
CorrespondentFilterSet,
DocumentFilterSet,
TagFilterSet,
DocumentTypeFilterSet
)
2016-02-08 23:46:16 +00:00
from .forms import UploadForm
2018-09-05 15:25:14 +02:00
from .models import Correspondent, Document, Log, Tag, DocumentType
2016-03-01 18:57:12 +00:00
from .serialisers import (
CorrespondentSerializer,
DocumentSerializer,
LogSerializer,
2018-09-05 15:25:14 +02:00
TagSerializer,
2018-09-25 16:09:33 +02:00
DocumentTypeSerializer
)
2016-01-01 16:13:59 +00:00
2016-03-03 18:09:10 +00:00
class IndexView(TemplateView):
template_name = "documents/index.html"
class FetchView(SessionOrBasicAuthMixin, DetailView):
2016-01-01 16:13:59 +00:00
model = Document
def render_to_response(self, context, **response_kwargs):
"""
Override the default to return the unencrypted image/PDF as raw data.
2016-01-01 16:13:59 +00:00
"""
2016-01-29 23:18:03 +00:00
content_types = {
Document.TYPE_PDF: "application/pdf",
Document.TYPE_PNG: "image/png",
Document.TYPE_JPG: "image/jpeg",
Document.TYPE_GIF: "image/gif",
Document.TYPE_TIF: "image/tiff",
Document.TYPE_CSV: "text/csv",
Document.TYPE_MD: "text/markdown",
Document.TYPE_TXT: "text/plain"
2016-01-29 23:18:03 +00:00
}
if self.kwargs["kind"] == "thumb":
response = HttpResponse(
self._get_raw_data(self.object.thumbnail_file),
content_type=content_types[Document.TYPE_PNG]
)
cache.patch_cache_control(response, max_age=31536000, private=True)
return response
response = HttpResponse(
self._get_raw_data(self.object.source_file),
2016-01-29 23:18:03 +00:00
content_type=content_types[self.object.file_type]
)
2020-01-04 00:33:24 +01:00
DISPOSITION = (
'inline' if settings.INLINE_DOC or self.kwargs["kind"] == 'preview'
else 'attachment'
)
response["Content-Disposition"] = '{}; filename="{}"'.format(
DISPOSITION, self.object.file_name)
2016-01-01 16:13:59 +00:00
return response
2016-02-08 23:46:16 +00:00
def _get_raw_data(self, file_handle):
if self.object.storage_type == Document.STORAGE_TYPE_UNENCRYPTED:
return file_handle
return GnuPG.decrypted(file_handle)
2016-02-08 23:46:16 +00:00
class PushView(SessionOrBasicAuthMixin, FormView):
2016-02-08 23:46:16 +00:00
"""
2016-03-01 18:57:12 +00:00
A crude REST-ish API for creating documents.
2016-02-08 23:46:16 +00:00
"""
form_class = UploadForm
def form_valid(self, form):
form.save()
return HttpResponse("1", status=202)
2016-02-08 23:46:16 +00:00
def form_invalid(self, form):
return HttpResponseBadRequest(str(form.errors))
2016-02-16 09:28:34 +00:00
class CorrespondentViewSet(ModelViewSet):
model = Correspondent
2020-10-21 12:53:14 +02:00
queryset = Correspondent.objects.annotate(document_count=Count('documents'), last_correspondence=Max('documents__created'))
serializer_class = CorrespondentSerializer
2016-02-21 00:55:38 +00:00
pagination_class = StandardPagination
2016-03-01 18:57:12 +00:00
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_class = CorrespondentFilterSet
2020-10-21 12:53:14 +02:00
ordering_fields = ("name", "document_count", "last_correspondence")
2016-02-16 09:28:34 +00:00
class TagViewSet(ModelViewSet):
model = Tag
2020-10-21 12:53:14 +02:00
queryset = Tag.objects.annotate(document_count=Count('documents'))
2016-02-16 09:28:34 +00:00
serializer_class = TagSerializer
2016-02-21 00:55:38 +00:00
pagination_class = StandardPagination
2016-03-01 18:57:12 +00:00
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_class = TagFilterSet
2020-10-21 12:53:14 +02:00
ordering_fields = ("name", "document_count")
2016-02-16 09:28:34 +00:00
2018-09-05 15:25:14 +02:00
class DocumentTypeViewSet(ModelViewSet):
model = DocumentType
2020-10-21 12:53:14 +02:00
queryset = DocumentType.objects.annotate(document_count=Count('documents'))
2018-09-05 15:25:14 +02:00
serializer_class = DocumentTypeSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, OrderingFilter)
filter_class = DocumentTypeFilterSet
2020-10-21 12:53:14 +02:00
ordering_fields = ("name", "document_count")
2018-09-05 15:25:14 +02:00
2016-03-01 18:57:12 +00:00
class DocumentViewSet(RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
ListModelMixin,
GenericViewSet):
2016-02-16 09:28:34 +00:00
model = Document
2016-02-21 00:55:38 +00:00
queryset = Document.objects.all()
2016-02-16 09:28:34 +00:00
serializer_class = DocumentSerializer
2016-02-21 00:55:38 +00:00
pagination_class = StandardPagination
2016-03-01 18:57:12 +00:00
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_class = DocumentFilterSet
2016-03-09 01:05:46 +00:00
search_fields = ("title", "correspondent__name", "content")
2016-03-13 16:45:12 +00:00
ordering_fields = (
"id", "title", "correspondent__name", "created", "modified", "added")
2016-03-01 18:57:12 +00:00
class LogViewSet(ReadOnlyModelViewSet):
model = Log
queryset = Log.objects.all().by_group()
serializer_class = LogSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering_fields = ("time",)