Manual merge of the new document preview code from the unstable branch
This commit is contained in:
30
mayan/apps/rest_api/classes.py
Normal file
30
mayan/apps/rest_api/classes.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
|
||||
class EndPoint(object):
|
||||
_registry = {}
|
||||
|
||||
@classmethod
|
||||
def get_all(cls):
|
||||
return cls._registry.values()
|
||||
|
||||
@classmethod
|
||||
def get(cls, name):
|
||||
return cls._registry[name]
|
||||
|
||||
def __unicode__(self):
|
||||
return unicode(self.name)
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.services = []
|
||||
self.__class__._registry[name] = self
|
||||
|
||||
def add_service(self, urlpattern, url=None, description=None):
|
||||
self.services.append(
|
||||
{
|
||||
'description': description,
|
||||
'url': url,
|
||||
'urlpattern': urlpattern,
|
||||
}
|
||||
)
|
||||
@@ -1,42 +0,0 @@
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from documents.models import Document
|
||||
|
||||
|
||||
class DocumentResourceSimple(serializers.HyperlinkedModelSerializer):
|
||||
def versions(self, instance):
|
||||
return [
|
||||
{
|
||||
'version': version.get_formated_version(),
|
||||
'major': version.major,
|
||||
'minor': version.minor,
|
||||
'micro': version.micro,
|
||||
'release_level': version.release_level,
|
||||
'serial': version.serial,
|
||||
'timestamp': version.timestamp,
|
||||
'comment': version.comment,
|
||||
'mimetype': version.mimetype,
|
||||
'encoding': version.encoding,
|
||||
'filename': version.filename,
|
||||
'checksum': version.checksum,
|
||||
'download': reverse('document_version_download', args=[version.pk]),
|
||||
'stored_filename': version.file.name,
|
||||
# TODO: Add transformations
|
||||
'pages': [
|
||||
{
|
||||
'content': page.content,
|
||||
'page_label': page.page_label,
|
||||
'page_number': page.page_number,
|
||||
}
|
||||
for page in version.pages.all()
|
||||
]
|
||||
|
||||
}
|
||||
for version in instance.versions.all()
|
||||
]
|
||||
|
||||
class Meta:
|
||||
model = Document
|
||||
fields = ('url', 'uuid', 'date_added', 'description')
|
||||
@@ -1,14 +1,24 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
from django.conf.urls import include, patterns, url
|
||||
|
||||
from .views import APIBase, Version_1, DocumentDetailView, IsZoomable
|
||||
from .classes import EndPoint
|
||||
from .views import APIBase, Version_0, EndPointView
|
||||
|
||||
version_0_endpoints_urlpatterns = patterns('',
|
||||
url(r'^$', Version_0.as_view(), name='api-version-0'),
|
||||
url(r'^(?P<endpoint_name>\w+)$', EndPointView.as_view(), name='api-version-0-endpoint'),
|
||||
)
|
||||
|
||||
for endpoint in EndPoint.get_all():
|
||||
endpoint_urlpatterns = patterns('')
|
||||
|
||||
for service in endpoint.services:
|
||||
endpoint_urlpatterns += patterns('', service['urlpattern'])
|
||||
|
||||
version_0_endpoints_urlpatterns += patterns('', url(r'^%s/' % endpoint.name, include(endpoint_urlpatterns)))
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^$', APIBase.as_view(), name='api-root'),
|
||||
url(r'^v1/$', Version_1.as_view(), name='api-version-1'),
|
||||
|
||||
# Version 1 API calls
|
||||
url(r'^v1/document/(?P<pk>[0-9]+)/$', DocumentDetailView.as_view(), name='document-detail'),
|
||||
url(r'^v1/document/(?P<pk>[0-9]+)/version/(?P<version_pk>[0-9]+)/page/(?P<page_number>[0-9]+)/expensive/is_zoomable/$', IsZoomable.as_view(), name='documents-expensive-is_zoomable'),
|
||||
url(r'^v0/', include(version_0_endpoints_urlpatterns)),
|
||||
)
|
||||
|
||||
@@ -1,62 +1,52 @@
|
||||
"""Views file for the rest_api app"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
import logging
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from converter.exceptions import UnknownFileFormat, UnkownConvertError
|
||||
from documents.models import Document, DocumentVersion, DocumentPage
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from rest_framework import generics
|
||||
from rest_framework.generics import RetrieveAPIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from .resources import DocumentResourceSimple
|
||||
from .classes import EndPoint
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
registered_version_0_endpoints = [
|
||||
]
|
||||
|
||||
|
||||
class APIBase(generics.GenericAPIView):
|
||||
"""This is the REST API for Mayan EDMS (https://github.com/mayan-edms/mayan-edms).
|
||||
|
||||
All the API calls can be navigated either through the browser or from the command line...
|
||||
|
||||
bash: curl -X GET http://127.0.0.1:8000/api/ # (Use default renderer)
|
||||
bash: curl -X GET http://127.0.0.1:8000/api/ -H 'Accept: text/plain' # (Use plaintext documentation renderer)
|
||||
|
||||
"""
|
||||
|
||||
def get(self, request, format=None):
|
||||
return Response(
|
||||
{'versions': [
|
||||
{'name': 'Version 1', 'url': reverse('api-version-1', request=request, format=format), 'number': 1}
|
||||
]}
|
||||
)
|
||||
return Response([
|
||||
{'name': 'Version 0', 'url': reverse('api-version-0', request=request, format=format)}
|
||||
])
|
||||
|
||||
|
||||
class Version_1(generics.GenericAPIView):
|
||||
class Version_0(generics.GenericAPIView):
|
||||
def get(self, request, format=None):
|
||||
return Response(
|
||||
[
|
||||
{'name': 'Resources', 'resources': ['document/<pk>']}
|
||||
]
|
||||
)
|
||||
return Response({
|
||||
'endpoints': [
|
||||
{'name': unicode(endpoint), 'url': reverse('api-version-0-endpoint', args=[unicode(endpoint)], request=request, format=format)} for endpoint in EndPoint.get_all()
|
||||
],
|
||||
})
|
||||
|
||||
class EndPointView(generics.GenericAPIView):
|
||||
def get(self, request, endpoint_name, format=None):
|
||||
result = []
|
||||
|
||||
class DocumentDetailView(generics.RetrieveAPIView):
|
||||
allowed_methods = ['GET']
|
||||
serializer_class = DocumentResourceSimple
|
||||
queryset = Document.objects.all()
|
||||
endpoint = EndPoint.get(endpoint_name)
|
||||
for service in endpoint.services:
|
||||
result.append(
|
||||
{
|
||||
'description': service['description'],
|
||||
'name': service['urlpattern'].name,
|
||||
'url': service['url'],
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class IsZoomable(generics.GenericAPIView):
|
||||
def get(self, request, pk, page_number, version_pk):
|
||||
logger.info('received is_zoomable call from: %s' % (request.META['REMOTE_ADDR']))
|
||||
document_version = get_object_or_404(DocumentVersion, pk=version_pk)
|
||||
try:
|
||||
document_version.document.get_image_cache_name(int(page_number), version_pk)
|
||||
return Response({'result': True})
|
||||
except (UnknownFileFormat, UnkownConvertError,
|
||||
DocumentPage.DoesNotExist, Document.DoesNotExist,
|
||||
DocumentVersion.DoesNotExist):
|
||||
return Response({'result': False})
|
||||
return Response({
|
||||
'services': result
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user