summaryrefslogtreecommitdiff
path: root/ishtar_common/forms.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-04-07 12:16:37 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-04-07 12:16:37 +0200
commit6b87dae76d931ead9838db1f66a6ff1fe1cc1dd1 (patch)
tree0a2273d9db0499214e18a041987339eac9d20ac9 /ishtar_common/forms.py
parent75730c0ac55c935c03e58977405b4b8a2233595d (diff)
parent3d8b8d86f01ecb9b37e24e25fd15500b8f4fb2a0 (diff)
downloadIshtar-6b87dae76d931ead9838db1f66a6ff1fe1cc1dd1.tar.bz2
Ishtar-6b87dae76d931ead9838db1f66a6ff1fe1cc1dd1.zip
Merge branch 'master' into v0.9
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):