summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-03-24 17:47:33 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-03-24 17:47:33 +0100
commitefd503d99267332b49011d1127d1819592f64101 (patch)
tree51b3e4fb0bb94b8355544f9903d5b46af321a250
parent373169f3fa7682f8d260080a39261fc6216b9a21 (diff)
downloadIshtar-efd503d99267332b49011d1127d1819592f64101.tar.bz2
Ishtar-efd503d99267332b49011d1127d1819592f64101.zip
Wizard: manage readonly forms (refs #3563)
-rw-r--r--ishtar_common/forms.py39
-rw-r--r--ishtar_common/wizards.py2
2 files changed, 39 insertions, 2 deletions
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 {}