Update the document app API endpoints.

Use resource/<pk>/subresource/<pk> scheme.
This commit is contained in:
Roberto Rosario
2017-02-14 02:42:40 -04:00
parent f67443f0d5
commit 81e090f375
7 changed files with 308 additions and 134 deletions

View File

@@ -15,25 +15,24 @@ from rest_api.permissions import MayanPermission
from .literals import DOCUMENT_IMAGE_TASK_TIMEOUT
from .models import (
Document, DocumentPage, DocumentType, DocumentVersion, RecentDocument
Document, DocumentType, RecentDocument
)
from .permissions import (
permission_document_create, permission_document_delete,
permission_document_download, permission_document_edit,
permission_document_new_version, permission_document_properties_edit,
permission_document_restore, permission_document_trash,
permission_document_version_revert, permission_document_view,
permission_document_type_create, permission_document_type_delete,
permission_document_type_edit, permission_document_type_view
permission_document_view, permission_document_type_create,
permission_document_type_delete, permission_document_type_edit,
permission_document_type_view
)
from .runtime import cache_storage_backend
from .serializers import (
DeletedDocumentSerializer, DocumentPageSerializer, DocumentSerializer,
DocumentTypeSerializer, DocumentVersionSerializer,
DocumentVersionRevertSerializer, NewDocumentSerializer,
NewDocumentVersionSerializer, RecentDocumentSerializer,
WritableDocumentSerializer, WritableDocumentTypeSerializer,
WritableDocumentVersionSerializer
NewDocumentSerializer, NewDocumentVersionSerializer,
RecentDocumentSerializer, WritableDocumentSerializer,
WritableDocumentTypeSerializer, WritableDocumentVersionSerializer
)
from .tasks import task_generate_document_page_image
@@ -158,12 +157,15 @@ class APIDocumentVersionDownloadView(DownloadMixin, generics.RetrieveAPIView):
paramType: path
type: number
"""
lookup_url_kwarg = 'version_pk'
mayan_object_permissions = {
'GET': (permission_document_download,)
}
permission_classes = (MayanPermission,)
queryset = DocumentVersion.objects.all()
def get_document(self):
document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permission_document_view, self.request.user, document
)
return document
def get_file(self):
instance = self.get_object()
@@ -172,6 +174,9 @@ class APIDocumentVersionDownloadView(DownloadMixin, generics.RetrieveAPIView):
def get_serializer_class(self):
return None
def get_queryset(self):
return self.get_document().versions.all()
def retrieve(self, request, *args, **kwargs):
return self.render_to_response()
@@ -204,6 +209,13 @@ class APIDocumentView(generics.RetrieveUpdateDestroyAPIView):
return super(APIDocumentView, self).get(*args, **kwargs)
def get_serializer_context(self):
return {
'format': self.format_kwarg,
'request': self.request,
'view': self
}
def get_serializer_class(self):
if self.request.method == 'GET':
return DocumentSerializer
@@ -242,12 +254,28 @@ class APIDocumentPageImageView(generics.RetrieveAPIView):
type: number
"""
mayan_object_permissions = {
'GET': (permission_document_view,),
}
mayan_permission_attribute_check = 'document'
permission_classes = (MayanPermission,)
queryset = DocumentPage.objects.all()
lookup_url_kwarg = 'page_pk'
def get_document(self):
if self.request.method == 'GET':
permission_required = permission_document_view
else:
permission_required = permission_document_edit
document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permission_required, self.request.user, document
)
return document
def get_document_version(self):
return get_object_or_404(
self.get_document().versions.all(), pk=self.kwargs['version_pk']
)
def get_queryset(self):
return self.get_document_version().pages.all()
def get_serializer_class(self):
return None
@@ -281,14 +309,7 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView):
Returns the selected document page details.
"""
mayan_object_permissions = {
'GET': (permission_document_view,),
'PUT': (permission_document_edit,),
'PATCH': (permission_document_edit,)
}
mayan_permission_attribute_check = 'document'
permission_classes = (MayanPermission,)
queryset = DocumentPage.objects.all()
lookup_url_kwarg = 'page_pk'
serializer_class = DocumentPageSerializer
def get(self, *args, **kwargs):
@@ -298,6 +319,27 @@ class APIDocumentPageView(generics.RetrieveUpdateAPIView):
return super(APIDocumentPageView, self).get(*args, **kwargs)
def get_document(self):
if self.request.method == 'GET':
permission_required = permission_document_view
else:
permission_required = permission_document_edit
document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permission_required, self.request.user, document
)
return document
def get_document_version(self):
return get_object_or_404(
self.get_document().versions.all(), pk=self.kwargs['version_pk']
)
def get_queryset(self):
return self.get_document_version().pages.all()
def patch(self, *args, **kwargs):
"""
Edit the selected document page.
@@ -424,6 +466,33 @@ class APIRecentDocumentListView(generics.ListAPIView):
return super(APIRecentDocumentListView, self).get(*args, **kwargs)
class APIDocumentVersionPageListView(generics.ListAPIView):
serializer_class = DocumentPageSerializer
def get_document(self):
document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permission_document_view, self.request.user, document
)
return document
def get_document_version(self):
return get_object_or_404(
self.get_document().versions.all(), pk=self.kwargs['version_pk']
)
def get_queryset(self):
return self.get_document_version().pages.all()
def get_serializer_context(self):
return {
'format': self.format_kwarg,
'request': self.request,
'view': self
}
class APIDocumentVersionsListView(generics.ListCreateAPIView):
"""
Return a list of the selected document's versions.
@@ -468,19 +537,35 @@ class APIDocumentVersionsListView(generics.ListCreateAPIView):
return Response(status=status.HTTP_202_ACCEPTED, headers=headers)
class APIDocumentVersionView(generics.RetrieveUpdateAPIView):
class APIDocumentVersionView(generics.RetrieveUpdateDestroyAPIView):
"""
Returns the selected document version details.
"""
mayan_object_permissions = {
'GET': (permission_document_view,),
'PATCH': (permission_document_edit,),
'PUT': (permission_document_edit,),
}
mayan_permission_attribute_check = 'document'
permission_classes = (MayanPermission,)
queryset = DocumentVersion.objects.all()
lookup_url_kwarg = 'version_pk'
def delete(self, *args, **kwargs):
"""
Delete the selected document version.
"""
return super(APIDocumentVersionView, self).delete(*args, **kwargs)
def get_document(self):
if self.request.method == 'GET':
permission_required = permission_document_view
else:
permission_required = permission_document_edit
document = get_object_or_404(Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access(
permission_required, self.request.user, document
)
return document
def get_queryset(self):
return self.get_document().versions.all()
def get_serializer_class(self):
if self.request.method == 'GET':
@@ -488,6 +573,13 @@ class APIDocumentVersionView(generics.RetrieveUpdateAPIView):
else:
return WritableDocumentVersionSerializer
def get_serializer_context(self):
return {
'format': self.format_kwarg,
'request': self.request,
'view': self
}
def patch(self, *args, **kwargs):
"""
Edit the selected document version.
@@ -501,21 +593,3 @@ class APIDocumentVersionView(generics.RetrieveUpdateAPIView):
"""
return super(APIDocumentVersionView, self).put(*args, **kwargs)
class APIDocumentVersionRevertView(generics.GenericAPIView):
"""
Revert to an earlier document version.
"""
mayan_object_permissions = {
'POST': (permission_document_version_revert,)
}
mayan_permission_attribute_check = 'document'
permission_classes = (MayanPermission,)
queryset = DocumentVersion.objects.all()
serializer_class = DocumentVersionRevertSerializer
def post(self, *args, **kwargs):
self.get_object().revert(_user=self.request.user)
return Response(status=status.HTTP_200_OK)