From 313431ead8166a26e9b9f62b09b4c5fe179d6b6c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:12:56 -0800 Subject: [PATCH] Better document endpoints --- src/documents/views.py | 227 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) diff --git a/src/documents/views.py b/src/documents/views.py index b04aa0c85..6a8a60c7e 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -53,6 +53,7 @@ from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import OpenApiParameter from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema_view +from drf_spectacular.utils import inline_serializer from langdetect import detect from packaging import version as packaging_version from redis import Redis @@ -338,6 +339,167 @@ class DocumentTypeViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): ordering_fields = ("name", "matching_algorithm", "match", "document_count") +@extend_schema_view( + download=extend_schema( + description="Download the document", + parameters=[ + OpenApiParameter( + name="original", + type=OpenApiTypes.BOOL, + location=OpenApiParameter.QUERY, + ), + ], + responses={200: OpenApiTypes.BINARY}, + ), + history=extend_schema( + description="View the document history", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + ), + ], + responses={ + 200: inline_serializer( + name="LogEntry", + fields={ + "id": serializers.IntegerField(), + "timestamp": serializers.DateTimeField(), + "action": serializers.CharField(), + "changes": serializers.DictField(), + "actor": inline_serializer( + name="Actor", + fields={ + "id": serializers.IntegerField(), + "username": serializers.CharField(), + }, + ), + }, + ), + 400: None, + 403: None, + 404: None, + }, + ), + metadata=extend_schema( + description="View the document metadata", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + ), + ], + responses={ + 200: inline_serializer( + name="Metadata", + fields={ + "original_checksum": serializers.CharField(), + "original_size": serializers.IntegerField(), + "original_mime_type": serializers.CharField(), + "media_filename": serializers.CharField(), + "has_archive_version": serializers.BooleanField(), + "original_metadata": serializers.DictField(), + "archive_checksum": serializers.CharField(), + "archive_media_filename": serializers.CharField(), + "original_filename": serializers.CharField(), + "archive_size": serializers.IntegerField(), + "archive_metadata": serializers.DictField(), + "lang": serializers.CharField(), + }, + ), + 400: None, + 403: None, + 404: None, + }, + ), + notes=extend_schema( + description="View, add, or delete notes for the document", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.QUERY, + ), + ], + responses={ + 200: inline_serializer( + name="Note", + fields={ + "id": serializers.IntegerField(), + "note": serializers.CharField(), + "created": serializers.DateTimeField(), + "user": inline_serializer( + name="User", + fields={ + "id": serializers.IntegerField(), + "username": serializers.CharField(), + "first_name": serializers.CharField(), + "last_name": serializers.CharField(), + }, + ), + }, + ), + 400: None, + 403: None, + 404: None, + }, + ), + suggestions=extend_schema( + description="View suggestions for the document", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + ), + ], + responses={ + 200: inline_serializer( + name="Suggestions", + fields={ + "correspondents": serializers.ListField( + child=serializers.IntegerField(), + ), + "tags": serializers.ListField(child=serializers.IntegerField()), + "document_types": serializers.ListField( + child=serializers.IntegerField(), + ), + "storage_paths": serializers.ListField( + child=serializers.IntegerField(), + ), + "dates": serializers.ListField(child=serializers.CharField()), + }, + ), + 400: None, + 403: None, + 404: None, + }, + ), + thumb=extend_schema( + description="View the document thumbnail", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + ), + ], + responses={200: OpenApiTypes.BINARY}, + ), + preview=extend_schema( + description="View the document preview", + parameters=[ + OpenApiParameter( + name="id", + type=OpenApiTypes.STR, + location=OpenApiParameter.PATH, + ), + ], + responses={200: OpenApiTypes.BINARY}, + ), +) class DocumentViewSet( PassUserMixin, RetrieveModelMixin, @@ -1146,6 +1308,14 @@ class BulkEditView(PassUserMixin): ) +@extend_schema_view( + get=extend_schema( + description="Upload a document via the API", + responses={ + (200, "application/json"): serializers.CharField(), + }, + ), +) class PostDocumentView(GenericAPIView): permission_classes = (IsAuthenticated,) serializer_class = PostDocumentSerializer @@ -1202,6 +1372,63 @@ class PostDocumentView(GenericAPIView): return Response(async_task.id) +@extend_schema_view( + post=extend_schema( + description="Get selection data for the selected documents", + responses={ + (200, "application/json"): inline_serializer( + name="SelectionData", + fields={ + "selected_correspondents": serializers.ListSerializer( + child=inline_serializer( + name="Correspondent Counts", + fields={ + "id": serializers.IntegerField(), + "document_count": serializers.IntegerField(), + }, + ), + ), + "selected_tags": serializers.ListSerializer( + child=inline_serializer( + name="Tag Counts", + fields={ + "id": serializers.IntegerField(), + "document_count": serializers.IntegerField(), + }, + ), + ), + "selected_document_types": serializers.ListSerializer( + child=inline_serializer( + name="DocumentType Counts", + fields={ + "id": serializers.IntegerField(), + "document_count": serializers.IntegerField(), + }, + ), + ), + "selected_storage_paths": serializers.ListSerializer( + child=inline_serializer( + name="StoragePath Counts", + fields={ + "id": serializers.IntegerField(), + "document_count": serializers.IntegerField(), + }, + ), + ), + "selected_custom_fields": serializers.ListSerializer( + child=inline_serializer( + name="CustomField Counts", + fields={ + "id": serializers.IntegerField(), + "document_count": serializers.IntegerField(), + }, + ), + ), + }, + ), + }, + ), +) class SelectionDataView(GenericAPIView): permission_classes = (IsAuthenticated,) serializer_class = DocumentListSerializer