91 lines
3.5 KiB
Python
91 lines
3.5 KiB
Python
from __future__ import absolute_import
|
|
|
|
from django.contrib import messages
|
|
from django.contrib.formtools.wizard.views import SessionWizardView
|
|
from django.core.urlresolvers import reverse
|
|
from django.http import HttpResponseRedirect
|
|
from django.utils.http import urlencode
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from common.views import MayanPermissionCheckMixin
|
|
from documents.forms import DocumentTypeSelectForm
|
|
from documents.permissions import PERMISSION_DOCUMENT_CREATE
|
|
from metadata.forms import MetadataFormSet
|
|
|
|
from .models import InteractiveSource
|
|
|
|
|
|
class DocumentCreateWizard(MayanPermissionCheckMixin, SessionWizardView):
|
|
form_list = [DocumentTypeSelectForm, MetadataFormSet]
|
|
template_name = 'main/generic_wizard.html'
|
|
extra_context = {}
|
|
permissions_required = [PERMISSION_DOCUMENT_CREATE]
|
|
|
|
@staticmethod
|
|
def _has_metadata_types(wizard):
|
|
# Skip the 2nd step if document type has no associated metadata
|
|
try:
|
|
return wizard.get_cleaned_data_for_step('0')['document_type'].metadata_type.all().count()
|
|
except TypeError:
|
|
return False
|
|
|
|
def dispatch(self, request, *args, **kwargs):
|
|
if InteractiveSource.objects.filter(enabled=True).count() == 0:
|
|
messages.error(request, _(u'No interactive document sources have been defined or none have been enabled, create one before proceeding.'))
|
|
return HttpResponseRedirect(reverse('sources:setup_source_list'))
|
|
return super(DocumentCreateWizard, self).dispatch(request, *args, **kwargs)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(DocumentCreateWizard, self).__init__(*args, **kwargs)
|
|
|
|
self.condition_dict = {'1': DocumentCreateWizard._has_metadata_types}
|
|
|
|
self.step_titles = [
|
|
_(u'Step 1 of 2: Select document type'),
|
|
_(u'Step 2 of 2: Enter document metadata'),
|
|
]
|
|
|
|
def get_form_initial(self, step):
|
|
if step == '1':
|
|
initial = []
|
|
|
|
for metadata_type in self.get_cleaned_data_for_step('0')['document_type'].metadata_type.filter(required=True):
|
|
initial.append({
|
|
'metadata_type': metadata_type,
|
|
'required': True,
|
|
})
|
|
|
|
for metadata_type in self.get_cleaned_data_for_step('0')['document_type'].metadata_type.filter(required=False):
|
|
initial.append({
|
|
'metadata_type': metadata_type,
|
|
})
|
|
|
|
return initial
|
|
return self.initial_dict.get(step, {})
|
|
|
|
def get_context_data(self, form, **kwargs):
|
|
context = super(DocumentCreateWizard, self).get_context_data(form=form, **kwargs)
|
|
context.update({
|
|
'step_title': self.step_titles[self.steps.step0],
|
|
'submit_label': _(u'Next step'),
|
|
'submit_icon_famfam': 'arrow_right',
|
|
})
|
|
return context
|
|
|
|
def done(self, form_list):
|
|
query_dict = {}
|
|
try:
|
|
query_dict['document_type_id'] = self.get_cleaned_data_for_step('0')['document_type'].pk
|
|
except AttributeError:
|
|
pass
|
|
|
|
try:
|
|
for identifier, metadata in enumerate(self.get_cleaned_data_for_step('1')):
|
|
query_dict['metadata%s_id' % identifier] = metadata['id']
|
|
query_dict['metadata%s_value' % identifier] = metadata['value']
|
|
except TypeError:
|
|
pass
|
|
|
|
url = '?'.join([reverse('sources:upload_interactive'), urlencode(query_dict, doseq=True)])
|
|
return HttpResponseRedirect(url)
|