summaryrefslogtreecommitdiff
path: root/ishtar_common/forms.py
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
commitd28045d3cd9147942f11c8c063b9f2b756439572 (patch)
tree51b3e4fb0bb94b8355544f9903d5b46af321a250 /ishtar_common/forms.py
parent5107a6f5fe55c7fc3aed52022be8830636b62a96 (diff)
downloadIshtar-d28045d3cd9147942f11c8c063b9f2b756439572.tar.bz2
Ishtar-d28045d3cd9147942f11c8c063b9f2b756439572.zip
Wizard: manage readonly forms (refs #3563)
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r--ishtar_common/forms.py39
1 files changed, 37 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):