Move the document upload wizard to the sources app
This commit is contained in:
@@ -8,6 +8,7 @@ from common.utils import encapsulate
|
||||
from project_setup.api import register_setup
|
||||
from documents.permissions import (PERMISSION_DOCUMENT_NEW_VERSION,
|
||||
PERMISSION_DOCUMENT_CREATE)
|
||||
from documents.models import Document
|
||||
|
||||
from .staging import StagingFile
|
||||
from .models import (WebForm, StagingFolder, SourceTransformation,
|
||||
@@ -17,6 +18,8 @@ from .permissions import (PERMISSION_SOURCES_SETUP_VIEW,
|
||||
PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_DELETE,
|
||||
PERMISSION_SOURCES_SETUP_CREATE)
|
||||
|
||||
document_create_multiple = {'text': _(u'upload new documents'), 'view': 'document_create_multiple', 'famfam': 'page_add', 'permissions': [PERMISSION_DOCUMENT_CREATE], 'children_view_regex': [r'upload_interactive']}
|
||||
|
||||
staging_file_preview = {'text': _(u'preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'zoom', 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
|
||||
staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
|
||||
|
||||
@@ -72,3 +75,5 @@ register_model_list_columns(StagingFile, [
|
||||
])
|
||||
|
||||
register_setup(setup_sources)
|
||||
register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], [document_create_multiple], menu_name='secondary_menu')
|
||||
register_links(Document, [document_create_multiple], menu_name='secondary_menu')
|
||||
|
||||
@@ -6,6 +6,8 @@ from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING,
|
||||
SOURCE_CHOICE_WATCH)
|
||||
|
||||
urlpatterns = patterns('sources.views',
|
||||
url(r'^create/from/local/multiple/$', 'document_create', (), 'document_create_multiple'),
|
||||
|
||||
url(r'^staging_file/type/(?P<source_type>\w+)/(?P<source_id>\d+)/(?P<staging_file_id>\w+)/preview/$', 'staging_file_preview', (), 'staging_file_preview'),
|
||||
url(r'^staging_file/type/(?P<source_type>\w+)/(?P<source_id>\d+)/(?P<staging_file_id>\w+)/delete/$', 'staging_file_delete', (), 'staging_file_delete'),
|
||||
url(r'^staging_file/type/staging_folder/(?P<source_id>\d+)/(?P<staging_file_id>\w+)/thumbnail/$', 'staging_file_thumbnail', (), 'staging_file_thumbnail'),
|
||||
|
||||
@@ -16,26 +16,29 @@ from documents.permissions import (PERMISSION_DOCUMENT_CREATE,
|
||||
from documents.models import DocumentType, Document
|
||||
from documents.conf.settings import THUMBNAIL_SIZE
|
||||
from documents.exceptions import NewDocumentVersionNotAllowed
|
||||
from documents.forms import DocumentTypeSelectForm
|
||||
from metadata.forms import MetadataFormSet, MetadataSelectionForm
|
||||
from metadata.api import decode_metadata_from_url, metadata_repr_as_list
|
||||
from permissions.models import Permission
|
||||
from common.utils import encapsulate
|
||||
import sendfile
|
||||
from acls.models import AccessEntry
|
||||
|
||||
from sources.models import (WebForm, StagingFolder, SourceTransformation,
|
||||
from .models import (WebForm, StagingFolder, SourceTransformation,
|
||||
WatchFolder)
|
||||
from sources.literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING,
|
||||
from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING,
|
||||
SOURCE_CHOICE_WATCH)
|
||||
from sources.literals import (SOURCE_UNCOMPRESS_CHOICE_Y,
|
||||
from .literals import (SOURCE_UNCOMPRESS_CHOICE_Y,
|
||||
SOURCE_UNCOMPRESS_CHOICE_ASK)
|
||||
from sources.staging import create_staging_file_class
|
||||
from sources.forms import (StagingDocumentForm, WebFormForm,
|
||||
from .forms import (StagingDocumentForm, WebFormForm,
|
||||
WatchFolderSetupForm)
|
||||
from sources.forms import WebFormSetupForm, StagingFolderSetupForm
|
||||
from sources.forms import SourceTransformationForm, SourceTransformationForm_create
|
||||
from .forms import WebFormSetupForm, StagingFolderSetupForm
|
||||
from .forms import SourceTransformationForm, SourceTransformationForm_create
|
||||
from .permissions import (PERMISSION_SOURCES_SETUP_VIEW,
|
||||
PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_DELETE,
|
||||
PERMISSION_SOURCES_SETUP_CREATE)
|
||||
from .wizards import DocumentCreateWizard
|
||||
|
||||
|
||||
def return_function(obj):
|
||||
@@ -706,3 +709,11 @@ def setup_source_transformation_create(request, source_type, source_id):
|
||||
'navigation_object_name': 'source',
|
||||
'title': _(u'Create new transformation for source: %s') % source,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_create(request):
|
||||
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE])
|
||||
|
||||
wizard = DocumentCreateWizard(form_list=[DocumentTypeSelectForm, MetadataSelectionForm, MetadataFormSet])
|
||||
|
||||
return wizard(request)
|
||||
|
||||
81
apps/sources/wizards.py
Normal file
81
apps/sources/wizards.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.utils.http import urlencode
|
||||
|
||||
from common.wizard import BoundFormWizard
|
||||
from metadata.forms import MetadataSelectionForm, MetadataFormSet
|
||||
from documents.forms import DocumentTypeSelectForm
|
||||
|
||||
|
||||
class DocumentCreateWizard(BoundFormWizard):
|
||||
def generate_metadata_initial_values(self):
|
||||
initial = []
|
||||
for metadata_type in self.metadata_types:
|
||||
initial.append({
|
||||
'metadata_type': metadata_type,
|
||||
})
|
||||
|
||||
for metadata_set in self.metadata_sets:
|
||||
for metadata_set_item in metadata_set.metadatasetitem_set.all():
|
||||
data = {
|
||||
'metadata_type': metadata_set_item.metadata_type,
|
||||
}
|
||||
if data not in initial:
|
||||
initial.append(data)
|
||||
|
||||
return initial
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.query_dict = {}
|
||||
self.step_titles = kwargs.pop('step_titles', [
|
||||
_(u'step 1 of 3: Document type'),
|
||||
_(u'step 2 of 3: Metadata selection'),
|
||||
_(u'step 3 of 3: Document metadata'),
|
||||
])
|
||||
|
||||
super(DocumentCreateWizard, self).__init__(*args, **kwargs)
|
||||
|
||||
def render_template(self, request, form, previous_fields, step, context=None):
|
||||
context = {
|
||||
'step_title': self.extra_context['step_titles'][step],
|
||||
'submit_label': _(u'Next step'),
|
||||
'submit_icon_famfam': 'arrow_right',
|
||||
}
|
||||
return super(DocumentCreateWizard, self).render_template(
|
||||
request, form, previous_fields, step, context
|
||||
)
|
||||
|
||||
def parse_params(self, request, *args, **kwargs):
|
||||
self.extra_context = {'step_titles': self.step_titles}
|
||||
|
||||
def process_step(self, request, form, step):
|
||||
if isinstance(form, DocumentTypeSelectForm):
|
||||
self.document_type = form.cleaned_data['document_type']
|
||||
self.initial = {1: {'document_type': self.document_type}}
|
||||
|
||||
if isinstance(form, MetadataSelectionForm):
|
||||
self.metadata_sets = form.cleaned_data['metadata_sets']
|
||||
self.metadata_types = form.cleaned_data['metadata_types']
|
||||
initial_data = self.generate_metadata_initial_values()
|
||||
self.initial = {2: initial_data}
|
||||
if not initial_data:
|
||||
# If there is no metadata selected, finish wizard
|
||||
self.form_list = [DocumentTypeSelectForm, MetadataSelectionForm]
|
||||
|
||||
if isinstance(form, MetadataFormSet):
|
||||
for identifier, metadata in enumerate(form.cleaned_data):
|
||||
self.query_dict['metadata%s_id' % identifier] = metadata['id']
|
||||
self.query_dict['metadata%s_value' % identifier] = metadata['value']
|
||||
|
||||
def get_template(self, step):
|
||||
return 'generic_wizard.html'
|
||||
|
||||
def done(self, request, form_list):
|
||||
if self.document_type:
|
||||
self.query_dict['document_type_id'] = self.document_type.pk
|
||||
|
||||
url = '?'.join([reverse('upload_interactive'), urlencode(self.query_dict, doseq=True)])
|
||||
return HttpResponseRedirect(url)
|
||||
Reference in New Issue
Block a user