diff --git a/mayan/apps/sources/api_views.py b/mayan/apps/sources/api_views.py index 6a6ceed19c..9e598a2c7e 100644 --- a/mayan/apps/sources/api_views.py +++ b/mayan/apps/sources/api_views.py @@ -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.' + }) diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index 187243153f..43f2287902 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -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: diff --git a/mayan/apps/sources/serializers.py b/mayan/apps/sources/serializers.py index 256baec8c6..12f2896bd0 100644 --- a/mayan/apps/sources/serializers.py +++ b/mayan/apps/sources/serializers.py @@ -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) diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index 9a3334ed42..34adabb6a5 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -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[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'),