Files
mayan-edms/apps/documents/forms.py
2011-02-09 13:55:01 -04:00

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)))