summaryrefslogtreecommitdiff
path: root/ishtar/furnitures/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar/furnitures/forms.py')
-rw-r--r--ishtar/furnitures/forms.py98
1 files changed, 84 insertions, 14 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index de221da70..91c9370bc 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -39,7 +39,18 @@ from django.utils.functional import lazy
reverse_lazy = lazy(reverse, unicode)
+class FinalForm(forms.Form):
+ final = True
+ form_label = _("Confirm")
+
class Wizard(NamedUrlSessionFormWizard):
+ def get_template(self, request, storage):
+ templates = ['default_wizard.html']
+ current_step = storage.get_current_step() or '0'
+ if current_step == self.get_last_step(request, storage):
+ templates = ['confirm_wizard.html'] + templates
+ return templates
+
def get_template_context(self, request, storage, form=None):
"""
Add previous and current steps to manage the wizard path
@@ -54,27 +65,82 @@ class Wizard(NamedUrlSessionFormWizard):
previous_steps = []
while step:
if step == current_step:
- context.update({'previous_steps':previous_steps})
- return context
- else:
- previous_steps.append(self.form_list[step])
+ break
+ previous_steps.append(self.form_list[step])
step = self.get_next_step(request, storage, step)
context.update({'previous_steps':previous_steps})
+ # not last step: validation
+ if step != self.get_last_step(request, storage):
+ return context
+ final_form_list = []
+ for form_key in self.get_form_list(request, storage).keys():
+ form_obj = self.get_form(request, storage, step=form_key,
+ data=storage.get_step_data(form_key),
+ files=storage.get_step_files(form_key))
+ form_obj.is_valid()
+ final_form_list.append(form_obj)
+ context.update({'datas':self.get_formated_datas(final_form_list)})
return context
-class FileWizard(Wizard):
- def get_template(self, request, form):
- return ['file_wizard.html']
+ def get_formated_datas(self, forms):
+ datas = []
+ for form in forms:
+ base_form = hasattr(form, 'forms') and form.forms[0] or form
+ associated_models = hasattr(base_form, 'associated_models') and \
+ base_form.associated_models or {}
+ if not hasattr(form, 'cleaned_data'):
+ continue
+ cleaned_datas = type(form.cleaned_data) == list and \
+ form.cleaned_data \
+ or [form.cleaned_data]
+ for cleaned_data in cleaned_datas:
+ for key in cleaned_data:
+ lbl = key
+ if hasattr(base_form, 'fields') and key in base_form.fields:
+ lbl = base_form.fields[key].label
+ value = cleaned_data[key]
+ if key in associated_models:
+ value = unicode(associated_models[key].objects.get(
+ pk=value))
+ datas.append((lbl, value))
+ return datas
+
+ def done(self, request, storage, form_list, **kwargs):
+ dct, m2m = {}, []
+ for form in form_list:
+ base_form = hasattr(form, 'forms') and form.forms[0] or form
+ associated_models = hasattr(base_form, 'associated_models') and \
+ base_form.associated_models or {}
+ if type(form.cleaned_data) == dict:
+ for key in form.cleaned_data:
+ value = form.cleaned_data[key]
+ if key in associated_models:
+ value = associated_models[key].objects.get(pk=value)
+ dct[key] = value
+ elif type(form.cleaned_data) == list:
+ for item in form.cleaned_data:
+ for key in item:
+ if key not in associated_models:
+ # datas not managed
+ continue
+ value = item[key]
+ value = associated_models[key].objects.get(pk=value)
+ m2m.append((key, value))
+ dct['history_modifier'] = request.user
+ fle = models.File(**dct)
+ fle.save()
+ for key, value in m2m:
+ getattr(fle, key+'s').add(value)
+ return render_to_response('wizard_done.html', {},
+ context_instance=RequestContext(request))
- def done(self, request, storage, form_list):
- return render_to_response(
- 'file_done.html',
- {'form_list': [form.cleaned_data for form in form_list]},
- context_instance=RequestContext(request)
- )
+class FileWizard(Wizard):
+ pass
class FileForm1(forms.Form):
form_label = _("General")
+ associated_models = {'in_charge':models.Person,
+ 'file_type':models.FileType}
in_charge = forms.IntegerField(label=_("Person in charge"),
widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'),
associated_model=models.Person),
@@ -97,6 +163,7 @@ class FileForm2(forms.Form):
class TownForm(forms.Form):
form_label = _("Towns")
+ associated_models = {'town':models.Town}
# !FIXME hard_link, reverse_lazy doen't seem to work with formsets
town = forms.IntegerField(label=_(u"Town"),
widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \
@@ -108,6 +175,8 @@ TownFormSet.form_label = _("Towns")
class FileForm3(forms.Form):
form_label = _("Preventive informations")
+ associated_models = {'general_contractor':models.Organization,
+ 'saisine_type':models.SaisineType}
general_contractor = forms.IntegerField(label=_(u"General contractor"),
widget=widgets.JQueryAutoComplete(
reverse_lazy('autocomplete-organization'),
@@ -133,6 +202,7 @@ def is_preventive(self, request, storage):
except ValueError:
return False
-file_creation_wizard = FileWizard([FileForm1, FileForm2, TownFormSet, FileForm3],
+file_creation_wizard = FileWizard([FileForm1, FileForm2, TownFormSet, FileForm3,
+ FinalForm],
url_name='file_creation', condition_list={'3':is_preventive})