diff --git a/docs/releases/2.1.8.rst b/docs/releases/2.1.8.rst index b315527f7e..f3b89980fa 100644 --- a/docs/releases/2.1.8.rst +++ b/docs/releases/2.1.8.rst @@ -21,6 +21,7 @@ Changes - Add API endpoints for the document states app. - Add API endpoints for the messsage of the day (MOTD) app. - Add Smart link API endpoints. +- Add writable versions of the Document and Document Type serializers (GitLab issues #348 and #349). Removals -------- @@ -75,6 +76,7 @@ Backward incompatible changes Bugs fixed or issues closed =========================== -* None +* `GitLab issue #348 `_ REST API: Document version comments are not getting updated +* `GitLab issue #349 `_ REST API: Document Label, Description are not able to update .. _PyPI: https://pypi.python.org/pypi/mayan-edms/ diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index c33ecfd8e7..a21d20278e 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -31,7 +31,9 @@ from .serializers import ( DocumentPageSerializer, DocumentSerializer, DocumentTypeSerializer, DocumentVersionSerializer, DocumentVersionRevertSerializer, NewDocumentSerializer, - NewDocumentVersionSerializer, RecentDocumentSerializer + NewDocumentVersionSerializer, RecentDocumentSerializer, + WritableDocumentSerializer, WritableDocumentTypeSerializer, + WritableDocumentVersionSerializer ) logger = logging.getLogger(__name__) @@ -190,7 +192,6 @@ class APIDocumentView(generics.RetrieveUpdateDestroyAPIView): } permission_classes = (MayanPermission,) queryset = Document.objects.all() - serializer_class = DocumentSerializer def delete(self, *args, **kwargs): """ @@ -206,6 +207,12 @@ class APIDocumentView(generics.RetrieveUpdateDestroyAPIView): return super(APIDocumentView, self).get(*args, **kwargs) + def get_serializer_class(self): + if self.request.method == 'GET': + return DocumentSerializer + else: + return WritableDocumentSerializer + def patch(self, *args, **kwargs): """ Edit the properties of the selected document. @@ -289,6 +296,12 @@ class APIDocumentTypeListView(generics.ListCreateAPIView): return super(APIDocumentTypeListView, self).get(*args, **kwargs) + def get_serializer_class(self): + if self.request.method == 'GET': + return DocumentTypeSerializer + else: + return WritableDocumentTypeSerializer + def post(self, *args, **kwargs): """ Create a new document type. @@ -310,7 +323,6 @@ class APIDocumentTypeView(generics.RetrieveUpdateDestroyAPIView): } permission_classes = (MayanPermission,) queryset = DocumentType.objects.all() - serializer_class = DocumentTypeSerializer def delete(self, *args, **kwargs): """ @@ -326,6 +338,12 @@ class APIDocumentTypeView(generics.RetrieveUpdateDestroyAPIView): return super(APIDocumentTypeView, self).get(*args, **kwargs) + def get_serializer_class(self): + if self.request.method == 'GET': + return DocumentTypeSerializer + else: + return WritableDocumentTypeSerializer + def patch(self, *args, **kwargs): """ Edit the properties of the selected document type. @@ -436,7 +454,12 @@ class APIDocumentVersionView(generics.RetrieveUpdateAPIView): mayan_permission_attribute_check = 'document' permission_classes = (MayanPermission,) queryset = DocumentVersion.objects.all() - serializer_class = DocumentVersionSerializer + + def get_serializer_class(self): + if self.request.method == 'GET': + return DocumentVersionSerializer + else: + return WritableDocumentVersionSerializer def patch(self, *args, **kwargs): """ diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index 4a4a729e46..fd3a80e022 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -51,9 +51,27 @@ class DocumentTypeSerializer(serializers.HyperlinkedModelSerializer): ) documents_count = serializers.SerializerMethodField() + class Meta: + extra_kwargs = { + 'url': {'view_name': 'rest_api:documenttype-detail'}, + } + fields = ( + 'delete_time_period', 'delete_time_unit', 'documents_url', + 'documents_count', 'id', 'label', 'trash_time_period', + 'trash_time_unit', 'url' + ) + model = DocumentType + def get_documents_count(self, obj): return obj.documents.count() + +class WritableDocumentTypeSerializer(serializers.ModelSerializer): + documents_url = serializers.HyperlinkedIdentityField( + view_name='rest_api:documenttype-document-list', + ) + documents_count = serializers.SerializerMethodField() + class Meta: extra_kwargs = { 'url': {'view_name': 'rest_api:documenttype-detail'}, @@ -65,6 +83,9 @@ class DocumentTypeSerializer(serializers.HyperlinkedModelSerializer): ) model = DocumentType + def get_documents_count(self, obj): + return obj.documents.count() + class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer): pages = DocumentPageSerializer(many=True, required=False, read_only=True) @@ -82,6 +103,26 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer): read_only_fields = ('document', 'file') +class WritableDocumentVersionSerializer(serializers.ModelSerializer): + document = serializers.HyperlinkedIdentityField( + view_name='rest_api:document-detail' + ) + pages = DocumentPageSerializer(many=True, required=False, read_only=True) + revert = serializers.HyperlinkedIdentityField( + view_name='rest_api:documentversion-revert' + ) + url = serializers.HyperlinkedIdentityField( + view_name='rest_api:documentversion-detail' + ) + + class Meta: + extra_kwargs = { + 'file': {'use_url': False}, + } + model = DocumentVersion + read_only_fields = ('document', 'file') + + class DocumentVersionRevertSerializer(DocumentVersionSerializer): class Meta(DocumentVersionSerializer.Meta): read_only_fields = ('comment', 'document',) @@ -136,9 +177,6 @@ class DocumentSerializer(serializers.HyperlinkedModelSerializer): view_name='rest_api:document-version-list', ) - def get_document_type_label(self, instance): - return instance.document_type.label - class Meta: extra_kwargs = { 'document_type': {'view_name': 'rest_api:documenttype-detail'}, @@ -152,6 +190,32 @@ class DocumentSerializer(serializers.HyperlinkedModelSerializer): model = Document read_only_fields = ('document_type',) + def get_document_type_label(self, instance): + return instance.document_type.label + + +class WritableDocumentSerializer(serializers.ModelSerializer): + document_type_label = serializers.SerializerMethodField() + latest_version = DocumentVersionSerializer(many=False, read_only=True) + versions = serializers.HyperlinkedIdentityField( + view_name='rest_api:document-version-list', + ) + url = serializers.HyperlinkedIdentityField( + view_name='rest_api:document-detail', + ) + + class Meta: + fields = ( + 'date_added', 'description', 'document_type', + 'document_type_label', 'id', 'label', 'language', + 'latest_version', 'url', 'uuid', 'versions', + ) + model = Document + read_only_fields = ('document_type',) + + def get_document_type_label(self, instance): + return instance.document_type.label + class NewDocumentSerializer(serializers.ModelSerializer): file = serializers.FileField(write_only=True) diff --git a/mayan/apps/documents/tests/test_api.py b/mayan/apps/documents/tests/test_api.py index fc1a8225c0..ce77b8a6ae 100644 --- a/mayan/apps/documents/tests/test_api.py +++ b/mayan/apps/documents/tests/test_api.py @@ -49,12 +49,13 @@ class DocumentTypeAPITestCase(APITestCase): def test_document_type_create(self): self.assertEqual(DocumentType.objects.all().count(), 0) - self.client.post( + response = self.client.post( reverse('rest_api:documenttype-list'), data={ 'label': TEST_DOCUMENT_TYPE } ) + self.assertEqual(response.status_code, 201) self.assertEqual(DocumentType.objects.all().count(), 1) self.assertEqual( DocumentType.objects.all().first().label, TEST_DOCUMENT_TYPE