diff options
| -rw-r--r-- | ishtar_common/forms.py | 39 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 2 | 
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 {} | 
