Add API endpoint to create a document based off a document source

This commit is contained in:
Roberto Rosario
2014-10-08 01:51:15 -04:00
parent 4b6c826574
commit b0d6ccbe89
4 changed files with 84 additions and 6 deletions

View File

@@ -1,5 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import tempfile
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from converter.exceptions import UnkownConvertError, UnknownFileFormat from converter.exceptions import UnkownConvertError, UnknownFileFormat
@@ -8,12 +10,17 @@ from converter.literals import (DEFAULT_PAGE_NUMBER,
from rest_framework import generics from rest_framework import generics
from rest_framework.response import Response from rest_framework.response import Response
from documents.permissions import PERMISSION_DOCUMENT_CREATE
from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL, from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL,
ZOOM_MIN_LEVEL) ZOOM_MIN_LEVEL)
from rest_api.permissions import MayanPermission
from .models import StagingFolderSource from .models import StagingFolderSource, WatchFolderSource
from .serializers import (StagingFolderFileSerializer, StagingFolderSerializer, from .serializers import (NewDocumentSerializer, StagingFolderFileSerializer,
StagingSourceFileImageSerializer) StagingFolderSerializer,
StagingSourceFileImageSerializer,
WebFormSourceSerializer)
from .tasks import task_upload_document
class APIStagingSourceFileView(generics.GenericAPIView): class APIStagingSourceFileView(generics.GenericAPIView):
@@ -84,3 +91,54 @@ class APIStagingSourceFileImageView(generics.GenericAPIView):
return Response({'status': 'error', 'detail': 'unknown_file_format', 'message': unicode(exception)}) return Response({'status': 'error', 'detail': 'unknown_file_format', 'message': unicode(exception)})
except UnkownConvertError as exception: except UnkownConvertError as exception:
return Response({'status': 'error', 'detail': 'converter_error', 'message': unicode(exception)}) return Response({'status': 'error', 'detail': 'converter_error', 'message': unicode(exception)})
class APIDocumentCreateView(generics.CreateAPIView):
"""
Create a new document from an uploaded file.
"""
serializer_class = NewDocumentSerializer
permission_classes = (MayanPermission,)
mayan_view_permissions = {'POST': [PERMISSION_DOCUMENT_CREATE]}
def get_serializer_class(self):
return NewDocumentSerializer
def create(self, request):
# TODO: use serializer instance instead of raw request
request = self.request.POST
if self.request.FILES:
temporary_file = tempfile.NamedTemporaryFile(delete=False)
for chunk in self.request.FILES['file'].chunks():
temporary_file.write(chunk)
temporary_file.close()
else:
return Response({
'status': 'error',
'message': 'No file provided.'
})
if not self.request.user.is_anonymous():
user_id = self.request.user.pk
else:
user_id = None
task_upload_document.apply_async(kwargs=dict(
source_id=int(request.get('source')),
file_path=temporary_file.name, filename=request.get('filename', None),
use_file_name=request.get('use_file_name', False),
document_type_id=int(request.get('document_type', 0)) or None,
expand=request.get('expand', False),
metadata_dict_list={},
user_id=user_id,
description=request.get('description', None),
), queue='uploads')
return Response({
'status': 'success',
'message': 'New document creation queued.'
})

View File

@@ -138,6 +138,9 @@ class Source(models.Model):
if metadata_dict_list and new_document: if metadata_dict_list and new_document:
# Only do for new documents # Only do for new documents
save_metadata_list(metadata_dict_list, document, create=True) save_metadata_list(metadata_dict_list, document, create=True)
# TODO: Might not be required as metadata app registers signal
# handlers for index update
warnings = update_indexes(document) warnings = update_indexes(document)
class Meta: class Meta:

View File

@@ -5,7 +5,7 @@ import logging
from rest_framework import serializers from rest_framework import serializers
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from .models import StagingFolderSource from .models import StagingFolderSource, WebFormSource
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -39,3 +39,18 @@ class StagingFolderSerializer(serializers.HyperlinkedModelSerializer):
class StagingSourceFileImageSerializer(serializers.Serializer): class StagingSourceFileImageSerializer(serializers.Serializer):
status = serializers.CharField() status = serializers.CharField()
data = serializers.CharField() data = serializers.CharField()
class WebFormSourceSerializer(serializers.Serializer):
class Meta:
model = WebFormSource
class NewDocumentSerializer(serializers.Serializer):
source = serializers.IntegerField()
document_type = serializers.IntegerField(required=False)
description = serializers.CharField(required=False)
expand = serializers.BooleanField(default=False)
file = serializers.FileField()
filename = serializers.CharField(required=False)
use_file_name = serializers.BooleanField(default=False)

View File

@@ -2,8 +2,9 @@ from __future__ import absolute_import
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from .api_views import (APIStagingSourceFileView, APIStagingSourceFileImageView, from .api_views import (APIDocumentCreateView, APIStagingSourceFileView,
APIStagingSourceListView, APIStagingSourceView) APIStagingSourceFileImageView, APIStagingSourceListView,
APIStagingSourceView)
from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH, from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH,
SOURCE_CHOICE_WEB_FORM) SOURCE_CHOICE_WEB_FORM)
from .wizards import DocumentCreateWizard from .wizards import DocumentCreateWizard
@@ -40,6 +41,7 @@ urlpatterns = patterns('sources.views',
) )
api_urls = patterns('', api_urls = patterns('',
url(r'^document/create/$', APIDocumentCreateView.as_view(), name='document-create-view'),
url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'), url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/image/$', APIStagingSourceFileImageView.as_view(), name='stagingfolderfile-image-view'),
url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'), url(r'^staging_folders/file/(?P<staging_folder_pk>[0-9]+)/(?P<encoded_filename>.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'),
url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'), url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'),