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
|
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.'
|
||||||
|
})
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|||||||
Reference in New Issue
Block a user