Add document type change API endpoint

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-11-18 02:20:48 -04:00
parent cd72a3bab4
commit e281607ca6
5 changed files with 97 additions and 15 deletions
+1
View File
@@ -166,6 +166,7 @@
- Add support for setting migrations. - Add support for setting migrations.
- Add setting migrations for the common, converter, documents, - Add setting migrations for the common, converter, documents,
file metadata, and document signatures app. file metadata, and document signatures app.
- Add document type change API endpoint.
3.2.10 (2019-XX-XX) 3.2.10 (2019-XX-XX)
=================== ===================
+24 -3
View File
@@ -30,9 +30,10 @@ from .permissions import (
from .serializers import ( from .serializers import (
DeletedDocumentSerializer, DocumentPageSerializer, DocumentSerializer, DeletedDocumentSerializer, DocumentPageSerializer, DocumentSerializer,
DocumentTypeSerializer, DocumentVersionSerializer, DocumentTypeSerializer, DocumentVersionSerializer,
NewDocumentSerializer, NewDocumentVersionSerializer, NewDocumentDocumentTypeSerializer, NewDocumentSerializer,
RecentDocumentSerializer, WritableDocumentSerializer, NewDocumentVersionSerializer, RecentDocumentSerializer,
WritableDocumentTypeSerializer, WritableDocumentVersionSerializer WritableDocumentSerializer, WritableDocumentTypeSerializer,
WritableDocumentVersionSerializer
) )
from .settings import settings_document_page_image_cache_time from .settings import settings_document_page_image_cache_time
from .tasks import task_generate_document_page_image from .tasks import task_generate_document_page_image
@@ -83,6 +84,26 @@ class APIDeletedDocumentRestoreView(generics.GenericAPIView):
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
class APIDocumentDocumentTypeChangeView(generics.GenericAPIView):
"""
post: Change the type of the selected document.
"""
mayan_object_permissions = {
'POST': (permission_document_properties_edit,),
}
queryset = Document.objects.all()
serializer_class = NewDocumentDocumentTypeSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
document_type = DocumentType.objects.get(pk=request.data['new_document_type'])
self.get_object().set_document_type(
document_type=document_type, _user=self.request.user
)
return Response(status=status.HTTP_200_OK)
class APIDocumentDownloadView(DownloadMixin, generics.RetrieveAPIView): class APIDocumentDownloadView(DownloadMixin, generics.RetrieveAPIView):
""" """
get: Download the latest version of a document. get: Download the latest version of a document.
+18 -4
View File
@@ -237,7 +237,10 @@ class DeletedDocumentSerializer(serializers.HyperlinkedModelSerializer):
class DocumentSerializer(serializers.HyperlinkedModelSerializer): class DocumentSerializer(serializers.HyperlinkedModelSerializer):
document_type = DocumentTypeSerializer() document_type = DocumentTypeSerializer(read_only=True)
document_type_change_url = serializers.HyperlinkedIdentityField(
view_name='rest_api:document-type-change',
)
latest_version = DocumentVersionSerializer(many=False, read_only=True) latest_version = DocumentVersionSerializer(many=False, read_only=True)
versions_url = serializers.HyperlinkedIdentityField( versions_url = serializers.HyperlinkedIdentityField(
view_name='rest_api:document-version-list', view_name='rest_api:document-version-list',
@@ -246,16 +249,27 @@ class DocumentSerializer(serializers.HyperlinkedModelSerializer):
class Meta: class Meta:
extra_kwargs = { extra_kwargs = {
'document_type': {'view_name': 'rest_api:documenttype-detail'}, 'document_type': {'view_name': 'rest_api:documenttype-detail'},
'url': {'view_name': 'rest_api:document-detail'} 'url': {'view_name': 'rest_api:document-detail'},
} }
fields = ( fields = (
'date_added', 'description', 'document_type', 'id', 'label', 'date_added', 'description', 'document_type',
'language', 'latest_version', 'url', 'uuid', 'versions_url', 'document_type_change_url', 'id', 'label', 'language',
'latest_version', 'url', 'uuid', 'pk', 'versions_url',
) )
model = Document model = Document
read_only_fields = ('document_type',) read_only_fields = ('document_type',)
class NewDocumentDocumentTypeSerializer(serializers.ModelSerializer):
new_document_type = serializers.PrimaryKeyRelatedField(
queryset=DocumentType.objects.all(), write_only=True
)
class Meta:
fields = ('new_document_type',)
model = Document
class WritableDocumentSerializer(serializers.ModelSerializer): class WritableDocumentSerializer(serializers.ModelSerializer):
document_type = DocumentTypeSerializer(read_only=True) document_type = DocumentTypeSerializer(read_only=True)
latest_version = DocumentVersionSerializer(many=False, read_only=True) latest_version = DocumentVersionSerializer(many=False, read_only=True)
+42 -1
View File
@@ -22,7 +22,7 @@ from ..permissions import (
from .literals import ( from .literals import (
TEST_DOCUMENT_DESCRIPTION_EDITED, TEST_PDF_DOCUMENT_FILENAME, TEST_DOCUMENT_DESCRIPTION_EDITED, TEST_PDF_DOCUMENT_FILENAME,
TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_TYPE_2_LABEL,
TEST_DOCUMENT_TYPE_LABEL_EDITED, TEST_DOCUMENT_VERSION_COMMENT_EDITED, TEST_DOCUMENT_TYPE_LABEL_EDITED, TEST_DOCUMENT_VERSION_COMMENT_EDITED,
TEST_SMALL_DOCUMENT_FILENAME TEST_SMALL_DOCUMENT_FILENAME
) )
@@ -184,6 +184,13 @@ class DocumentAPIViewTestMixin(object):
}, data={'description': TEST_DOCUMENT_DESCRIPTION_EDITED} }, data={'description': TEST_DOCUMENT_DESCRIPTION_EDITED}
) )
def _request_test_document_document_type_change_api_view(self):
return self.post(
viewname='rest_api:document-type-change', kwargs={
'pk': self.test_document.pk
}, data={'new_document_type': self.test_document_type_2.pk}
)
class DocumentAPIViewTestCase( class DocumentAPIViewTestCase(
DocumentAPIViewTestMixin, DocumentTestMixin, BaseAPITestCase DocumentAPIViewTestMixin, DocumentTestMixin, BaseAPITestCase
@@ -254,6 +261,40 @@ class DocumentAPIViewTestCase(
) )
self.assertEqual(document.page_count, 47) self.assertEqual(document.page_count, 47)
def test_document_document_type_change_api_via_no_permission(self):
self.upload_document()
self.test_document_type_2 = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_2_LABEL
)
response = self._request_test_document_document_type_change_api_view()
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.test_document.refresh_from_db()
self.assertEqual(
self.test_document.document_type,
self.test_document_type
)
def test_document_document_type_change_api_via_with_access(self):
self.upload_document()
self.grant_access(
obj=self.test_document,
permission=permission_document_properties_edit
)
self.test_document_type_2 = DocumentType.objects.create(
label=TEST_DOCUMENT_TYPE_2_LABEL
)
response = self._request_test_document_document_type_change_api_view()
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.test_document.refresh_from_db()
self.assertEqual(
self.test_document.document_type,
self.test_document_type_2
)
def test_document_description_api_edit_via_patch_view_no_permission(self): def test_document_description_api_edit_via_patch_view_no_permission(self):
self.upload_document() self.upload_document()
+12 -7
View File
@@ -4,13 +4,13 @@ from django.conf.urls import url
from .api_views import ( from .api_views import (
APITrashedDocumentListView, APIDeletedDocumentRestoreView, APITrashedDocumentListView, APIDeletedDocumentRestoreView,
APIDeletedDocumentView, APIDocumentDownloadView, APIDocumentView, APIDeletedDocumentView, APIDocumentDocumentTypeChangeView,
APIDocumentListView, APIDocumentVersionDownloadView, APIDocumentDownloadView, APIDocumentView, APIDocumentListView,
APIDocumentPageImageView, APIDocumentPageView, APIDocumentVersionDownloadView, APIDocumentPageImageView,
APIDocumentTypeDocumentListView, APIDocumentTypeListView, APIDocumentPageView, APIDocumentTypeDocumentListView,
APIDocumentTypeView, APIDocumentVersionsListView, APIDocumentTypeListView, APIDocumentTypeView,
APIDocumentVersionPageListView, APIDocumentVersionView, APIDocumentVersionsListView, APIDocumentVersionPageListView,
APIRecentDocumentListView APIDocumentVersionView, APIRecentDocumentListView
) )
from .views.document_page_views import ( from .views.document_page_views import (
DocumentPageDisable, DocumentPageEnable, DocumentPageListView, DocumentPageDisable, DocumentPageEnable, DocumentPageListView,
@@ -393,6 +393,11 @@ api_urls = [
regex=r'^documents/(?P<pk>[0-9]+)/download/$', regex=r'^documents/(?P<pk>[0-9]+)/download/$',
view=APIDocumentDownloadView.as_view(), name='document-download' view=APIDocumentDownloadView.as_view(), name='document-download'
), ),
url(
regex=r'^documents/(?P<pk>[0-9]+)/type/change/$',
view=APIDocumentDocumentTypeChangeView.as_view(),
name='document-type-change'
),
url( url(
regex=r'^documents/(?P<pk>[0-9]+)/versions/$', regex=r'^documents/(?P<pk>[0-9]+)/versions/$',
view=APIDocumentVersionsListView.as_view(), view=APIDocumentVersionsListView.as_view(),