170 lines
6.9 KiB
Python
Executable File
170 lines
6.9 KiB
Python
Executable File
|
|
from django import forms
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.utils.translation import ugettext
|
|
from django.http import HttpResponseRedirect
|
|
from django.utils.http import urlencode
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from staging import StagingFile
|
|
|
|
from common.wizard import BoundFormWizard
|
|
from common.utils import urlquote
|
|
from common.forms import DetailForm
|
|
|
|
from models import Document, DocumentType, DocumentTypeMetadataType
|
|
|
|
from documents.conf.settings import AVAILABLE_FUNCTIONS
|
|
from documents.conf.settings import AVAILABLE_MODELS
|
|
|
|
#TODO: Turn this into a base form and let others inherit
|
|
class DocumentForm(forms.ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
super(DocumentForm, self).__init__(*args, **kwargs)
|
|
if 'initial' in kwargs:
|
|
if 'document_type' in kwargs['initial']:
|
|
if 'document_type' in self.fields:
|
|
#To allow merging with DocumentForm_edit
|
|
self.fields['document_type'].widget = forms.HiddenInput()
|
|
filenames_qs = kwargs['initial']['document_type'].documenttypefilename_set.filter(enabled=True)
|
|
if filenames_qs.count() > 0:
|
|
self.fields['document_type_available_filenames'] = forms.ModelChoiceField(
|
|
queryset=filenames_qs,
|
|
required=False,
|
|
label=_(u'Document type available filenames'))
|
|
|
|
class Meta:
|
|
model = Document
|
|
exclude = ('description',)
|
|
|
|
|
|
class DocumentForm_view(DetailForm):
|
|
class Meta:
|
|
model = Document
|
|
exclude = ('file',)
|
|
|
|
|
|
class DocumentForm_edit(DocumentForm):
|
|
class Meta:
|
|
model = Document
|
|
exclude = ('file', 'document_type')
|
|
|
|
new_filename = forms.CharField(label=_(u'New document filename'), required=False)
|
|
|
|
|
|
class StagingDocumentForm(forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
super(StagingDocumentForm, self).__init__(*args, **kwargs)
|
|
try:
|
|
self.fields['staging_file_id'].choices=[(staging_file.id, staging_file) for staging_file in StagingFile.get_all()]
|
|
except:
|
|
pass
|
|
|
|
if 'initial' in kwargs:
|
|
if 'document_type' in kwargs['initial']:
|
|
filenames_qs = kwargs['initial']['document_type'].documenttypefilename_set.filter(enabled=True)
|
|
if filenames_qs.count() > 0:
|
|
self.fields['document_type_available_filenames'] = forms.ModelChoiceField(
|
|
queryset=filenames_qs,
|
|
required=False,
|
|
label=_(u'Document type available filenames'))
|
|
|
|
staging_file_id = forms.ChoiceField(label=_(u'Staging file'))
|
|
|
|
|
|
class DocumentTypeSelectForm(forms.Form):
|
|
document_type = forms.ModelChoiceField(queryset=DocumentType.objects.all())
|
|
|
|
|
|
class MetadataForm(forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
super(MetadataForm, self).__init__(*args, **kwargs)
|
|
|
|
#Set form fields initial values
|
|
if 'initial' in kwargs:
|
|
self.metadata_type = kwargs['initial'].pop('metadata_type', None)
|
|
self.document_type = kwargs['initial'].pop('document_type', None)
|
|
self.metadata_options = kwargs['initial'].pop('metadata_options', None)
|
|
|
|
|
|
required=self.document_type.documenttypemetadatatype_set.get(metadata_type=self.metadata_type).required
|
|
required_string = u''
|
|
if required:
|
|
self.fields['value'].required=True
|
|
required_string = ' (%s)' % ugettext(u'required')
|
|
else:
|
|
#TODO: FIXME: not working correctly
|
|
self.fields['value'].required=False
|
|
|
|
self.fields['name'].initial='%s%s' % ((self.metadata_type.title if self.metadata_type.title else self.metadata_type.name), required_string)
|
|
self.fields['id'].initial=self.metadata_type.id
|
|
if self.metadata_type.default:
|
|
try:
|
|
self.fields['value'].initial = eval(self.metadata_type.default, AVAILABLE_FUNCTIONS)
|
|
except Exception, err:
|
|
self.fields['value'].initial = err
|
|
|
|
if self.metadata_type.lookup:
|
|
try:
|
|
choices = eval(self.metadata_type.lookup, AVAILABLE_MODELS)
|
|
self.fields['value'] = forms.ChoiceField(label=self.fields['value'].label)
|
|
self.fields['value'].choices = zip(choices, choices)
|
|
self.fields['value'].required = False
|
|
except Exception, err:
|
|
self.fields['value'].initial = err
|
|
self.fields['value'].widget=forms.TextInput(attrs={'readonly':'readonly'})
|
|
|
|
id = forms.CharField(label=_(u'id'), widget=forms.HiddenInput)
|
|
name = forms.CharField(label=_(u'Name'),
|
|
required=False, widget=forms.TextInput(attrs={'readonly':'readonly'}))
|
|
value = forms.CharField(label=_(u'Value'), required=False)
|
|
|
|
|
|
class DocumentCreateWizard(BoundFormWizard):
|
|
def __init__(self, *args, **kwargs):
|
|
self.multiple = kwargs.pop('multiple', True)
|
|
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]}
|
|
return super(DocumentCreateWizard, self).render_template(request, form, previous_fields, step, context)
|
|
|
|
def parse_params(self, request, *args, **kwargs):
|
|
self.extra_context={'step_titles':[
|
|
_(u'step 1 of 2: Document type'),
|
|
_(u'step 2 of 2: Document metadata'),
|
|
]}
|
|
|
|
def process_step(self, request, form, step):
|
|
if step == 0:
|
|
self.document_type = form.cleaned_data['document_type']
|
|
|
|
initial=[]
|
|
for item in DocumentTypeMetadataType.objects.filter(document_type=self.document_type):
|
|
initial.append({
|
|
'metadata_type':item.metadata_type,
|
|
'document_type':self.document_type,
|
|
'metadata_options':item,
|
|
})
|
|
self.initial = {1:initial}
|
|
if step == 1:
|
|
self.urldata = []
|
|
for id, metadata in enumerate(form.cleaned_data):
|
|
if metadata['value']:
|
|
self.urldata.append(('metadata%s_id' % id,metadata['id']))
|
|
self.urldata.append(('metadata%s_value' % id,metadata['value']))
|
|
|
|
|
|
def get_template(self, step):
|
|
return 'generic_wizard.html'
|
|
|
|
def done(self, request, form_list):
|
|
if self.multiple:
|
|
view = 'upload_multiple_documents_with_type'
|
|
else:
|
|
view = 'upload_document_with_type'
|
|
|
|
url = reverse(view, args=[self.document_type.id])
|
|
return HttpResponseRedirect('%s?%s' % (url, urlencode(self.urldata)))
|