From efd503d99267332b49011d1127d1819592f64101 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 24 Mar 2017 17:47:33 +0100 Subject: Wizard: manage readonly forms (refs #3563) --- ishtar_common/forms.py | 39 +++++++++++++++++++++++++++++++++++++-- ishtar_common/wizards.py | 2 ++ 2 files changed, 39 insertions(+), 2 deletions(-) (limited to 'ishtar_common') diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 42d74f9ef..ecae18c5e 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -22,6 +22,7 @@ Forms definition """ import datetime import re +import types from django import forms from django.core.urlresolvers import reverse @@ -94,7 +95,32 @@ class FinalDeleteForm(FinalForm): confirm_end_msg = _(u"Are you sure you want to delete?") +def get_readonly_clean(key): + def func(self): + instance = getattr(self, 'instance', None) + if instance and getattr(instance, key): + return getattr(instance, key) + else: + return self.cleaned_data[key] + return func + + class FormSet(BaseFormSet): + def __init__(self, *args, **kwargs): + self.readonly = False + if 'readonly' in kwargs: + self.readonly = kwargs.pop('readonly') + self.can_delete = False + # no extra fields + if 'data' in kwargs: + prefix = "" + if "prefix" in kwargs: + prefix = kwargs['prefix'] + if prefix + '-INITIAL_FORMS' in kwargs['data']: + kwargs['data'][prefix + '-TOTAL_FORMS'] = \ + kwargs["data"][prefix + '-INITIAL_FORMS'] + super(FormSet, self).__init__(*args, **kwargs) + def check_duplicate(self, key_names, error_msg=""): """Check for duplicate items in the formset""" if any(self.errors): @@ -117,8 +143,17 @@ class FormSet(BaseFormSet): def add_fields(self, form, index): super(FormSet, self).add_fields(form, index) - form.fields[DELETION_FIELD_NAME].label = '' - form.fields[DELETION_FIELD_NAME].widget = widgets.DeleteWidget() + if self.readonly: + for k in form.fields: + # django 1.9: use disabled + form.fields[k].widget.attrs['readonly'] = True + clean = get_readonly_clean(k) + clean.__name__ = 'clean_' + k + clean.__doc__ = 'autogenerated: clean_' + k + setattr(form, clean.__name__, types.MethodType(clean, form)) + if self.can_delete: + form.fields[DELETION_FIELD_NAME].label = '' + form.fields[DELETION_FIELD_NAME].widget = widgets.DeleteWidget() class TableSelect(forms.Form): diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7950bcc7e..ddb2bc2ac 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -408,6 +408,8 @@ class Wizard(NamedUrlWizardView): for form in form_list: if not form.is_valid(): return self.render(form) + if hasattr(form, 'readonly') and form.readonly: + continue base_form = hasattr(form, 'forms') and form.forms[0] or form associated_models = hasattr(base_form, 'associated_models') and \ base_form.associated_models or {} -- cgit v1.2.3