diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py new file mode 100644 index 0000000000..d219ff4693 --- /dev/null +++ b/mayan/apps/documents/api_views.py @@ -0,0 +1,123 @@ +from __future__ import absolute_import + +from django.core.exceptions import PermissionDenied + +from converter.exceptions import UnkownConvertError, UnknownFileFormat +from converter.literals import (DEFAULT_FILE_FORMAT_MIMETYPE, DEFAULT_PAGE_NUMBER, + DEFAULT_ROTATION, DEFAULT_ZOOM_LEVEL) +from permissions.models import Permission +from rest_framework import generics +from rest_framework.response import Response + +from .conf.settings import (DISPLAY_SIZE, PREVIEW_SIZE, RECENT_COUNT, + ROTATION_STEP, ZOOM_PERCENT_STEP, ZOOM_MAX_LEVEL, + ZOOM_MIN_LEVEL) +from rest_api.filters import MayanObjectPermissionsFilter +from rest_api.permissions import MayanPermission + +from .permissions import PERMISSION_DOCUMENT_VIEW +from .models import Document, DocumentPage, DocumentVersion +from .serializers import (DocumentImageSerializer, DocumentPageSerializer, + DocumentSerializer, DocumentVersionSerializer) + + +class APIDocumentListView(generics.ListAPIView): + """ + Returns a list of all the documents. + """ + + serializer_class = DocumentSerializer + queryset = Document.objects.all() + + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] + + +class APIDocumentPageView(generics.RetrieveAPIView): + """ + Returns the selected document page details. + """ + + allowed_methods = ['GET'] + serializer_class = DocumentPageSerializer + queryset = DocumentPage.objects.all() + + permission_classes = (MayanPermission,) + mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] + mayan_permission_attribute_check = 'document' + + +class APIDocumentView(generics.RetrieveAPIView): + """ + Returns the selected document details. + """ + + allowed_methods = ['GET'] + serializer_class = DocumentSerializer + queryset = Document.objects.all() + + permission_classes = (MayanPermission,) + mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] + + +class APIDocumentVersionView(generics.RetrieveAPIView): + """ + Returns the selected document version details. + """ + + allowed_methods = ['GET'] + serializer_class = DocumentVersionSerializer + queryset = DocumentVersion.objects.all() + + permission_classes = (MayanPermission,) + mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] + mayan_permission_attribute_check = 'document' + + +class APIDocumentImageView(generics.GenericAPIView): + """ + Returns an image representation of the selected document. + size -- 'x' seprated width and height of the desired image representation. + page -- Page number of the document to be imaged. + zoom -- Zoom level of the image to be generated, numeric value only. + version -- Version number of the document to be imaged. + """ + serializer_class = DocumentImageSerializer + + def get(self, request, pk): + document = get_object_or_404(Document, pk=pk) + + logger.debug('document: %s' % document) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_VIEW, request.user, document) + + size = request.GET.get('size', DISPLAY_SIZE) + + page = int(request.GET.get('page', DEFAULT_PAGE_NUMBER)) + + zoom = int(request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) + + version = int(request.GET.get('version', document.latest_version.pk)) + + if request.GET.get('as_base64', False): + base64_version = True + + if zoom < ZOOM_MIN_LEVEL: + zoom = ZOOM_MIN_LEVEL + + if zoom > ZOOM_MAX_LEVEL: + zoom = ZOOM_MAX_LEVEL + + rotation = int(request.GET.get('rotation', DEFAULT_ROTATION)) % 360 + + try: + return Response({'status': 'success', + 'data': document.get_image(size=size, page=page, zoom=zoom, rotation=rotation, as_base64=True, version=version) + }) + except UnknownFileFormat as exception: + return Response({'status': 'error', 'detail': 'unknown_file_format', 'message': unicode(exception)}) + except UnkownConvertError as exception: + return Response({'status': 'error', 'detail': 'converter_error', 'message': unicode(exception)}) diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 7bb365b542..d3b9030c54 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -2,10 +2,10 @@ from __future__ import absolute_import from django.conf.urls import patterns, url +from .api_views import (APIDocumentView, APIDocumentImageView, APIDocumentListView, + APIDocumentPageView, APIDocumentVersionView) from .conf.settings import (PREVIEW_SIZE, PRINT_SIZE, DISPLAY_SIZE, - MULTIPAGE_PREVIEW_SIZE) -from .views import (APIDocumentView, APIDocumentImageView, APIDocumentListView, - APIDocumentPageView, APIDocumentVersionView) + MULTIPAGE_PREVIEW_SIZE) urlpatterns = patterns('documents.views', url(r'^list/$', 'document_list', (), 'document_list'), diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 38980c89c7..72e8e41599 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -14,8 +14,6 @@ from django.template import RequestContext from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ -from rest_framework import generics -from rest_framework.response import Response import sendfile from acls.models import AccessEntry @@ -34,8 +32,6 @@ from filetransfers.api import serve_file from history.api import create_history from navigation.utils import resolve_to_name from permissions.models import Permission -from rest_api.filters import MayanObjectPermissionsFilter -from rest_api.permissions import MayanPermission from .events import HISTORY_DOCUMENT_EDITED from .conf.settings import (DISPLAY_SIZE, PREVIEW_SIZE, RECENT_COUNT, @@ -57,8 +53,6 @@ from .permissions import (PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_DOCUMENT_TYPE_EDIT, PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_CREATE, PERMISSION_DOCUMENT_TYPE_VIEW) -from .serializers import (DocumentImageSerializer, DocumentPageSerializer, - DocumentSerializer, DocumentVersionSerializer) logger = logging.getLogger(__name__) @@ -1313,108 +1307,3 @@ def document_page_transformation_delete(request, document_page_transformation_id 'previous': previous, 'form_icon': u'pencil_delete.png', }, context_instance=RequestContext(request)) - - -# API views - - -class APIDocumentListView(generics.ListAPIView): - """ - Returns a list of all the documents. - """ - - serializer_class = DocumentSerializer - queryset = Document.objects.all() - - filter_backends = (MayanObjectPermissionsFilter,) - mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] - - -class APIDocumentPageView(generics.RetrieveAPIView): - """ - Returns the selected document page details. - """ - - allowed_methods = ['GET'] - serializer_class = DocumentPageSerializer - queryset = DocumentPage.objects.all() - - permission_classes = (MayanPermission,) - mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] - mayan_permission_attribute_check = 'document' - - -class APIDocumentView(generics.RetrieveAPIView): - """ - Returns the selected document details. - """ - - allowed_methods = ['GET'] - serializer_class = DocumentSerializer - queryset = Document.objects.all() - - permission_classes = (MayanPermission,) - mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] - - -class APIDocumentVersionView(generics.RetrieveAPIView): - """ - Returns the selected document version details. - """ - - allowed_methods = ['GET'] - serializer_class = DocumentVersionSerializer - queryset = DocumentVersion.objects.all() - - permission_classes = (MayanPermission,) - mayan_object_permissions = [PERMISSION_DOCUMENT_VIEW] - mayan_permission_attribute_check = 'document' - - -class APIDocumentImageView(generics.GenericAPIView): - """ - Returns an image representation of the selected document. - size -- 'x' seprated width and height of the desired image representation. - page -- Page number of the document to be imaged. - zoom -- Zoom level of the image to be generated, numeric value only. - version -- Version number of the document to be imaged. - """ - serializer_class = DocumentImageSerializer - - def get(self, request, pk): - document = get_object_or_404(Document, pk=pk) - - logger.debug('document: %s' % document) - - try: - Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) - except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_DOCUMENT_VIEW, request.user, document) - - size = request.GET.get('size', DISPLAY_SIZE) - - page = int(request.GET.get('page', DEFAULT_PAGE_NUMBER)) - - zoom = int(request.GET.get('zoom', DEFAULT_ZOOM_LEVEL)) - - version = int(request.GET.get('version', document.latest_version.pk)) - - if request.GET.get('as_base64', False): - base64_version = True - - if zoom < ZOOM_MIN_LEVEL: - zoom = ZOOM_MIN_LEVEL - - if zoom > ZOOM_MAX_LEVEL: - zoom = ZOOM_MAX_LEVEL - - rotation = int(request.GET.get('rotation', DEFAULT_ROTATION)) % 360 - - try: - return Response({'status': 'success', - 'data': document.get_image(size=size, page=page, zoom=zoom, rotation=rotation, as_base64=True, version=version) - }) - except UnknownFileFormat as exception: - return Response({'status': 'error', 'detail': 'unknown_file_format', 'message': unicode(exception)}) - except UnkownConvertError as exception: - return Response({'status': 'error', 'detail': 'converter_error', 'message': unicode(exception)})