diff --git a/mayan/apps/documents/api.py b/mayan/apps/documents/api.py index 4db45e85fc..8bc2e4b204 100644 --- a/mayan/apps/documents/api.py +++ b/mayan/apps/documents/api.py @@ -17,7 +17,8 @@ from permissions.models import Permission from .conf.settings import DISPLAY_SIZE, ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL from .models import Document, DocumentVersion, DocumentPage from .permissions import PERMISSION_DOCUMENT_VIEW -from .serializers import DocumentSerializer, DocumentVersionSerializer, DocumentPageSerializer +from .serializers import (DocumentImageSerializer, DocumentPageSerializer, + DocumentSerializer, DocumentVersionSerializer) logger = logging.getLogger(__name__) @@ -66,7 +67,12 @@ class APIDocumentVersionView(generics.RetrieveAPIView): 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) diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index e8710a488b..46858f641d 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -1,8 +1,7 @@ from __future__ import absolute_import -from django.core.urlresolvers import reverse - from rest_framework import serializers +from rest_framework.reverse import reverse from .models import Document, DocumentVersion, DocumentPage @@ -19,8 +18,15 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer): model = DocumentVersion +class DocumentImageSerializer(serializers.Serializer): + status = serializers.CharField() + data = serializers.CharField() + + class DocumentSerializer(serializers.HyperlinkedModelSerializer): versions = DocumentVersionSerializer(many=True, read_only=True) + image = serializers.HyperlinkedIdentityField(view_name='document-image') class Meta: model = Document + diff --git a/mayan/apps/rest_api/serializers.py b/mayan/apps/rest_api/serializers.py new file mode 100644 index 0000000000..8e0494f2b0 --- /dev/null +++ b/mayan/apps/rest_api/serializers.py @@ -0,0 +1,21 @@ +from __future__ import absolute_import + +from django.contrib.auth.models import Group, User + +from rest_framework import serializers +from rest_framework.reverse import reverse + + +class APISerializer(serializers.Serializer): + name = serializers.CharField() + url = serializers.URLField() + + +class APIAppSerializer(serializers.Serializer): + name = serializers.CharField() + url = serializers.URLField() + + +class APIVersionSerializer(serializers.Serializer): + apps = APIAppSerializer() + diff --git a/mayan/apps/rest_api/views.py b/mayan/apps/rest_api/views.py index 27a1183a30..7e16349c36 100644 --- a/mayan/apps/rest_api/views.py +++ b/mayan/apps/rest_api/views.py @@ -11,6 +11,7 @@ from rest_framework.response import Response from rest_framework.reverse import reverse from .classes import APIEndPoint +from .serializers import APIAppSerializer, APISerializer, APIVersionSerializer logger = logging.getLogger(__name__) @@ -23,6 +24,8 @@ class APIBase(generics.GenericAPIView): Main entry point of the API. """ + serializer_class = APISerializer + def get(self, request, format=None): return Response([ {'name': 'Version 0', 'url': reverse('api-version-0', request=request, format=format)} @@ -34,6 +37,8 @@ class Version_0(generics.GenericAPIView): API version 0 entry points. """ + serializer_class = APIVersionSerializer + def get(self, request, format=None): return Response({ 'apps': [ @@ -47,6 +52,8 @@ class APIAppView(generics.GenericAPIView): Entry points of the selected app. """ + serializer_class = APIAppSerializer + def get(self, request, app_name, format=None): result = [] diff --git a/mayan/apps/sources/api.py b/mayan/apps/sources/api.py index 89cf5f6067..f82405d116 100644 --- a/mayan/apps/sources/api.py +++ b/mayan/apps/sources/api.py @@ -8,11 +8,13 @@ from rest_framework import generics from rest_framework.response import Response from converter.exceptions import UnkownConvertError, UnknownFileFormat -from converter.literals import DEFAULT_PAGE_NUMBER, DEFAULT_ROTATION, DEFAULT_ZOOM_LEVEL +from converter.literals import (DEFAULT_PAGE_NUMBER, DEFAULT_ROTATION, + DEFAULT_ZOOM_LEVEL) from documents.conf.settings import DISPLAY_SIZE, ZOOM_MAX_LEVEL, ZOOM_MIN_LEVEL from .models import StagingFolder -from .serializers import SerializerStagingFolder, SerializerStagingFolderFile +from .serializers import (StagingFolderSerializer, StagingFolderFileSerializer, + StagingSourceFileImageSerializer) logger = logging.getLogger(__name__) @@ -23,9 +25,11 @@ class APIStagingSourceFileView(generics.GenericAPIView): """ Details of the selected staging file. """ - def get(self, request, staging_folder_pk, filename): + serializer_class = StagingFolderFileSerializer + + def get(self, request, staging_folder_pk, encoded_filename): staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) - return Response(SerializerStagingFolderFile(staging_folder.get_file(encoded_filename=filename), context={'request': request}).data) + return Response(StagingFolderFileSerializer(staging_folder.get_file(encoded_filename=encoded_filename), context={'request': request}).data) class APIStagingSourceListView(generics.ListAPIView): @@ -33,7 +37,7 @@ class APIStagingSourceListView(generics.ListAPIView): Returns a list of all the staging folders and the files they contain. """ - serializer_class = SerializerStagingFolder + serializer_class = StagingFolderSerializer queryset = StagingFolder.objects.all() @@ -41,17 +45,23 @@ class APIStagingSourceView(generics.RetrieveAPIView): """ Details of the selected staging folders and the files it contains. """ - serializer_class = SerializerStagingFolder + serializer_class = StagingFolderSerializer queryset = StagingFolder.objects.all() class APIStagingSourceFileImageView(generics.GenericAPIView): """ Image of the selected staging file. + size -- 'x' seprated width and height of the desired image representation. + page -- Page number of the staging file to be imaged. + zoom -- Zoom level of the image to be generated, numeric value only. """ - def get(self, request, staging_folder_pk, filename): + + serializer_class = StagingSourceFileImageSerializer + + def get(self, request, staging_folder_pk, encoded_filename): staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) - staging_file = staging_folder.get_file(encoded_filename=filename) + staging_file = staging_folder.get_file(encoded_filename=encoded_filename) size = request.GET.get('size', DISPLAY_SIZE) diff --git a/mayan/apps/sources/serializers.py b/mayan/apps/sources/serializers.py index abeeee98a0..625b1e7585 100644 --- a/mayan/apps/sources/serializers.py +++ b/mayan/apps/sources/serializers.py @@ -10,7 +10,7 @@ from .models import StagingFolder logger = logging.getLogger(__name__) -class SerializerStagingFolderFile(serializers.Serializer): +class StagingFolderFileSerializer(serializers.Serializer): url = serializers.SerializerMethodField('get_url') image_url = serializers.SerializerMethodField('get_image_url') filename = serializers.CharField(max_length=255) @@ -22,15 +22,20 @@ class SerializerStagingFolderFile(serializers.Serializer): return reverse('stagingfolderfile-image-view', args=[obj.staging_folder.pk, obj.encoded_filename], request=self.context.get('request')) -class SerializerStagingFolder(serializers.HyperlinkedModelSerializer): +class StagingFolderSerializer(serializers.HyperlinkedModelSerializer): files = serializers.SerializerMethodField('get_files') def get_files(self, obj): try: - return [SerializerStagingFolderFile(entry, context=self.context).data for entry in obj.get_files()] + return [StagingFolderFileSerializer(entry, context=self.context).data for entry in obj.get_files()] except Exception as exception: logger.error('unhandled exception: %s' % exception) return [] class Meta: model = StagingFolder + + +class StagingSourceFileImageSerializer(serializers.Serializer): + status = serializers.CharField() + data = serializers.CharField() diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index d289bc3b64..784a27c254 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -9,7 +9,7 @@ from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING, from .wizards import DocumentCreateWizard urlpatterns = patterns('sources.views', - url(r'^staging_file/(?P\d+)/(?P.+)/delete/$', 'staging_file_delete', name='staging_file_delete'), + url(r'^staging_file/(?P\d+)/(?P.+)/delete/$', 'staging_file_delete', name='staging_file_delete'), url(r'^upload/document/new/interactive/(?P\w+)/(?P\d+)/$', 'upload_interactive', (), 'upload_interactive'), url(r'^upload/document/new/interactive/$', 'upload_interactive', (), 'upload_interactive'), @@ -40,8 +40,8 @@ urlpatterns = patterns('sources.views', ) api_urls = patterns('', - url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'), - url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'), + url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'), + url(r'^staging_folders/file/(?P[0-9]+)/(?P.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'), url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'), url(r'^staging_folders/(?P[0-9]+)/$', APIStagingSourceView.as_view(), name='stagingfolder-detail') ) diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index 7cd9bbfadd..e2f6a4c692 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -368,11 +368,11 @@ def get_form_filename(form): return filename -def staging_file_delete(request, staging_folder_pk, filename): +def staging_file_delete(request, staging_folder_pk, encoded_filename): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION]) staging_folder = get_object_or_404(StagingFolder, pk=staging_folder_pk) - staging_file = staging_folder.get_file(encoded_filename=filename) + staging_file = staging_folder.get_file(encoded_filename=encoded_filename) next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', '/'))) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))