Add API endpoint to create a document based off a document source
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
import tempfile
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
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.response import Response
|
||||
|
||||
from documents.permissions import PERMISSION_DOCUMENT_CREATE
|
||||
from documents.settings import (DISPLAY_SIZE, ZOOM_MAX_LEVEL,
|
||||
ZOOM_MIN_LEVEL)
|
||||
from rest_api.permissions import MayanPermission
|
||||
|
||||
from .models import StagingFolderSource
|
||||
from .serializers import (StagingFolderFileSerializer, StagingFolderSerializer,
|
||||
StagingSourceFileImageSerializer)
|
||||
from .models import StagingFolderSource, WatchFolderSource
|
||||
from .serializers import (NewDocumentSerializer, StagingFolderFileSerializer,
|
||||
StagingFolderSerializer,
|
||||
StagingSourceFileImageSerializer,
|
||||
WebFormSourceSerializer)
|
||||
from .tasks import task_upload_document
|
||||
|
||||
|
||||
class APIStagingSourceFileView(generics.GenericAPIView):
|
||||
@@ -84,3 +91,54 @@ class APIStagingSourceFileImageView(generics.GenericAPIView):
|
||||
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)})
|
||||
|
||||
|
||||
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.'
|
||||
})
|
||||
|
||||
@@ -138,6 +138,9 @@ class Source(models.Model):
|
||||
if metadata_dict_list and new_document:
|
||||
# Only do for new documents
|
||||
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)
|
||||
|
||||
class Meta:
|
||||
|
||||
@@ -5,7 +5,7 @@ import logging
|
||||
from rest_framework import serializers
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from .models import StagingFolderSource
|
||||
from .models import StagingFolderSource, WebFormSource
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -39,3 +39,18 @@ class StagingFolderSerializer(serializers.HyperlinkedModelSerializer):
|
||||
class StagingSourceFileImageSerializer(serializers.Serializer):
|
||||
status = 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)
|
||||
|
||||
@@ -2,8 +2,9 @@ from __future__ import absolute_import
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
from .api_views import (APIStagingSourceFileView, APIStagingSourceFileImageView,
|
||||
APIStagingSourceListView, APIStagingSourceView)
|
||||
from .api_views import (APIDocumentCreateView, APIStagingSourceFileView,
|
||||
APIStagingSourceFileImageView, APIStagingSourceListView,
|
||||
APIStagingSourceView)
|
||||
from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WATCH,
|
||||
SOURCE_CHOICE_WEB_FORM)
|
||||
from .wizards import DocumentCreateWizard
|
||||
@@ -40,6 +41,7 @@ urlpatterns = patterns('sources.views',
|
||||
)
|
||||
|
||||
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>.+)/$', APIStagingSourceFileView.as_view(), name='stagingfolderfile-detail'),
|
||||
url(r'^staging_folders/$', APIStagingSourceListView.as_view(), name='stagingfolder-list'),
|
||||
|
||||
Reference in New Issue
Block a user