diff options
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r-- | ishtar_common/forms.py | 39 |
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): |