diff --git a/mayan/apps/documents/forms.py b/mayan/apps/documents/forms.py index 6d5dc52df0..00a4eead63 100644 --- a/mayan/apps/documents/forms.py +++ b/mayan/apps/documents/forms.py @@ -219,36 +219,3 @@ class DocumentDownloadForm(forms.Form): if len(self.document_versions) > 1: self.fields['compressed'].initial = True self.fields['compressed'].widget.attrs.update({'disabled': True}) - - -class NewVersionForm(forms.ModelForm): - class Meta: - model = DocumentVersion - - ''' - def version_fields(self, document): - self.fields['version_update'] = forms.ChoiceField( - label=_(u'Version update'), - choices=DocumentVersion.get_version_update_choices(document.latest_version) - ) - - self.fields['comment'] = forms.CharField( - label=_(u'Comment'), - required=False, - widget=forms.widgets.Textarea(attrs={'rows': 4}), - ) - - new_filename = forms.CharField( - label=_('New document filename'), required=False - ) - - def clean(self): - cleaned_data = self.cleaned_data - cleaned_data['new_version_data'] = { - 'comment': self.cleaned_data.get('comment'), - 'version_update': self.cleaned_data.get('version_update'), - } - - # Always return the full collection of cleaned data. - return cleaned_data - ''' diff --git a/mayan/apps/sources/forms.py b/mayan/apps/sources/forms.py index 780d5b92a5..fee7360104 100644 --- a/mayan/apps/sources/forms.py +++ b/mayan/apps/sources/forms.py @@ -7,6 +7,7 @@ from django.utils.translation import ugettext from django.utils.translation import ugettext_lazy as _ from documents.forms import DocumentForm +from documents.models import DocumentVersion from .models import (IMAPEmail, POP3Email, SourceTransformation, StagingFolderSource, WebFormSource, WatchFolderSource) @@ -19,6 +20,31 @@ class NewDocumentForm(DocumentForm): exclude = ('label',) +class NewVersionForm(forms.Form): + def __init__(self, *args, **kwargs): + document = kwargs.pop('document') + super(NewVersionForm, self).__init__(*args, **kwargs) + self.fields['version_update'] = forms.ChoiceField( + label=_(u'Version update'), + choices=DocumentVersion.get_version_update_choices(document.latest_version) + ) + + self.fields['comment'] = forms.CharField( + label=_(u'Comment'), + required=False, + widget=forms.widgets.Textarea(attrs={'rows': 4}), + ) + + #def clean(self): + # cleaned_data = self.cleaned_data + # cleaned_data['new_version_data'] = { + # 'comment': self.cleaned_data.get('comment'), + # 'version_update': self.cleaned_data.get('version_update'), + # } + # Always return the full collection of cleaned data. + #return cleaned_data + + class UploadBaseForm(forms.Form): def __init__(self, *args, **kwargs): show_expand = kwargs.pop('show_expand', False) diff --git a/mayan/apps/sources/urls.py b/mayan/apps/sources/urls.py index d9d0f9175e..ac225c9393 100644 --- a/mayan/apps/sources/urls.py +++ b/mayan/apps/sources/urls.py @@ -5,7 +5,7 @@ from django.conf.urls import patterns, url from .api_views import (APIDocumentCreateView, APIStagingSourceFileView, APIStagingSourceFileImageView, APIStagingSourceListView, APIStagingSourceView) -from .views import UploadInteractiveView +from .views import UploadInteractiveVersionView, UploadInteractiveView from .wizards import DocumentCreateWizard urlpatterns = patterns('sources.views', @@ -14,8 +14,8 @@ urlpatterns = patterns('sources.views', url(r'^upload/document/new/interactive/(?P\d+)/$', UploadInteractiveView.as_view(), name='upload_interactive'), url(r'^upload/document/new/interactive/$', UploadInteractiveView.as_view(), name='upload_interactive'), - url(r'^upload/document/(?P\d+)/version/interactive/(?P\d+)/$', 'upload_new_version', (), 'upload_version'), - url(r'^upload/document/(?P\d+)/version/interactive/$', 'upload_new_version', (), 'upload_version'), + url(r'^upload/document/(?P\d+)/version/interactive/(?P\d+)/$', UploadInteractiveVersionView.as_view(), name='upload_version'), + url(r'^upload/document/(?P\d+)/version/interactive/$', UploadInteractiveVersionView.as_view(), name='upload_version'), # Setup views diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index f64545e0b7..dfd2e86c9b 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -24,7 +24,7 @@ from documents.permissions import (PERMISSION_DOCUMENT_CREATE, from metadata.api import decode_metadata_from_url, metadata_repr_as_list from permissions.models import Permission -from .forms import (NewDocumentForm, SourceTransformationForm, +from .forms import (NewDocumentForm, NewVersionForm, SourceTransformationForm, SourceTransformationForm_create) from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WEB_FORM, SOURCE_UNCOMPRESS_CHOICE_ASK, SOURCE_UNCOMPRESS_CHOICE_Y) @@ -92,10 +92,87 @@ def get_active_tab_links(document=None): } -class UploadInteractiveView(MultiFormView): +class UploadBaseView(MultiFormView): template_name = 'main/generic_form.html' prefixes = {'source_form': 'source', 'document_form': 'document'} + def dispatch(self, request, *args, **kwargs): + if 'source_id' in kwargs: + self.source = get_object_or_404(Source.objects.filter(enabled=True).select_subclasses(), pk=kwargs['source_id']) + else: + self.source = InteractiveSource.objects.filter(enabled=True).select_subclasses().first() + + return super(UploadBaseView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(UploadBaseView, self).get_context_data(**kwargs) + subtemplates_list = [] + + context['source'] = self.source + + if InteractiveSource.objects.filter(enabled=True).count() == 0: + subtemplates_list.append( + { + 'name': 'main/generic_subtemplate.html', + 'context': { + 'title': _(u'Upload sources'), + 'paragraphs': [ + _(u'No interactive document sources have been defined or none have been enabled.'), + ], + } + }) + + if isinstance(self.source, StagingFolderSource): + try: + staging_filelist = list(self.source.get_files()) + except Exception as exception: + messages.error(request, exception) + staging_filelist = [] + finally: + subtemplates_list = [ + { + 'name': 'main/generic_multiform_subtemplate.html', + 'context': { + 'forms': context['forms'], + } + }, + { + 'name': 'main/generic_list_subtemplate.html', + 'context': { + 'title': _(u'Files in staging path'), + 'object_list': staging_filelist, + 'hide_link': True, + } + }, + ] + else: + subtemplates_list.append({ + 'name': 'main/generic_multiform_subtemplate.html', + 'context': { + 'forms': context['forms'], + 'is_multipart': True + }, + }) + + context.update({ + 'subtemplates_list': subtemplates_list, + 'temporary_navigation_links': { + 'form_header': { + 'sources:upload_version': { + 'links': self.tab_links['tab_links'] + }, + 'sources:upload_interactive': { + 'links': self.tab_links['tab_links'] + } + } + }, + }) + + return context + + +class UploadInteractiveView(UploadBaseView): + def dispatch(self, request, *args, **kwargs): self.subtemplates_list = [] @@ -103,10 +180,7 @@ class UploadInteractiveView(MultiFormView): self.document_type = get_object_or_404(DocumentType, pk=self.request.GET['document_type_id']) - if 'source_id' in kwargs: - self.source = get_object_or_404(Source.objects.filter(enabled=True).select_subclasses(), pk=kwargs['source_id']) - else: - self.source = InteractiveSource.objects.filter(enabled=True).select_subclasses().first() + self.tab_links = get_active_tab_links() return super(UploadInteractiveView, self).dispatch(request, *args, **kwargs) @@ -158,7 +232,6 @@ class UploadInteractiveView(MultiFormView): messages.success(self.request, _(u'New document queued for uploaded and will be available shortly.')) return HttpResponseRedirect(self.request.get_full_path()) - def create_source_form_form(self, **kwargs): return self.get_form_classes()['source_form']( prefix=kwargs['prefix'], @@ -181,72 +254,7 @@ class UploadInteractiveView(MultiFormView): def get_context_data(self, **kwargs): context = super(UploadInteractiveView, self).get_context_data(**kwargs) - subtemplates_list = [] - results = get_active_tab_links() - context['source'] = self.source - - if InteractiveSource.objects.filter(enabled=True).count() == 0: - subtemplates_list.append( - { - 'name': 'main/generic_subtemplate.html', - 'context': { - 'title': _(u'Upload sources'), - 'paragraphs': [ - _(u'No interactive document sources have been defined or none have been enabled.'), - ], - } - }) - - title = _(u'Upload a local document from source: %s') % self.source.title - - if isinstance(self.source, StagingFolderSource): - try: - staging_filelist = list(self.source.get_files()) - except Exception as exception: - messages.error(request, exception) - staging_filelist = [] - finally: - subtemplates_list = [ - { - 'name': 'main/generic_multiform_subtemplate.html', - 'context': { - 'forms': context['forms'], - 'title': title, - } - }, - { - 'name': 'main/generic_list_subtemplate.html', - 'context': { - 'title': _(u'Files in staging path'), - 'object_list': staging_filelist, - 'hide_link': True, - } - }, - ] - else: - subtemplates_list.append({ - 'name': 'main/generic_multiform_subtemplate.html', - 'context': { - 'forms': context['forms'], - 'title': title, - 'is_multipart': True - }, - }) - - context.update({ - 'document_type_id': self.document_type.pk, - 'subtemplates_list': subtemplates_list, - 'temporary_navigation_links': { - 'form_header': { - 'sources:upload_version': { - 'links': results['tab_links'] - }, - 'sources:upload_interactive': { - 'links': results['tab_links'] - } - } - }, - }) + context['title'] = _(u'Upload a local document from source: %s') % self.source.title context.update( { @@ -270,29 +278,87 @@ class UploadInteractiveView(MultiFormView): ], } ) - return context -def upload_new_version(request, document_id): - subtemplates_list = [] +class UploadInteractiveVersionView(UploadBaseView): + def dispatch(self, request, *args, **kwargs): - document = get_object_or_404(Document, pk=document_pk) - try: - Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_NEW_VERSION]) - except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_DOCUMENT_NEW_VERSION, request.user, document) + self.subtemplates_list = [] - results = get_active_tab_links(document) + self.document = get_object_or_404(Document, pk=kwargs['document_pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_DOCUMENT_NEW_VERSION]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_NEW_VERSION, self.request.user, self.document) - # messages.success(request, _(u'New document version queued for uploaded and will be available shortly.')) - # return HttpResponseRedirect(reverse('documents:document_version_list', args=[document.pk])) + self.tab_links = get_active_tab_links(self.document) - # title = _(u'Upload a new version from source: %s') % source.title - # TODO: move to version upload - #if document: - #context['object'] = document - pass + return super(UploadInteractiveVersionView, self).dispatch(request, *args, **kwargs) + + def forms_valid(self, forms): + uploaded_file = self.source.get_upload_file_object(self.request, forms['source_form']) + + file_object = uploaded_file.file + temporary_file = tempfile.NamedTemporaryFile(delete=False) + for chunk in file_object.chunks(): + temporary_file.write(chunk) + + temporary_file.close() + file_object.close() + + try: + self.source.clean_up_upload_file(uploaded_file) + except Exception as exception: + messages.error(self.request, exception) + + 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=self.source.pk, + file_path=temporary_file.name, + label=file_object.name, + document_type_id=self.document_type.pk, + expand=expand, + metadata_dict_list=decode_metadata_from_url(self.request.GET), + user_id=user_id, + description=forms['document_form'].cleaned_data.get('description'), + language=forms['document_form'].cleaned_data.get('language') + ), queue='uploads') + ''' + messages.success(self.request, _(u'New document version queued for uploaded and will be available shortly.')) + return HttpResponseRedirect(reverse('documents:document_version_list', args=[self.document.pk])) + + def create_source_form_form(self, **kwargs): + return self.get_form_classes()['source_form']( + prefix=kwargs['prefix'], + source=self.source, + show_expand=False, + data=kwargs.get('data', None), + files=kwargs.get('files', None), + ) + + def create_document_form_form(self, **kwargs): + return self.get_form_classes()['document_form']( + prefix=kwargs['prefix'], + document=self.document, + data=kwargs.get('data', None), + files=kwargs.get('files', None), + ) + + def get_form_classes(self): + return {'document_form': NewVersionForm, 'source_form': get_upload_form_class(self.source.source_type)} + + def get_context_data(self, **kwargs): + context = super(UploadInteractiveVersionView, self).get_context_data(**kwargs) + context['object'] = self.document + context['title'] = _(u'Upload a new version from source: %s') % self.source.title + + return context def staging_file_delete(request, staging_folder_pk, encoded_filename):