diff options
Diffstat (limited to 'ishtar_common/forms.py')
| -rw-r--r-- | ishtar_common/forms.py | 78 | 
1 files changed, 67 insertions, 11 deletions
| diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index c314e4f13..5de0db91d 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -20,6 +20,7 @@  """  Forms definition  """ +from collections import OrderedDict  import datetime  import re  import types @@ -107,6 +108,16 @@ def get_readonly_clean(key):      return func +JSON_VALUE_TYPES_FIELDS = { +    'T': (forms.CharField, None), +    'LT': (forms.CharField, forms.Textarea), +    'I': (forms.IntegerField, None), +    'F': (forms.FloatField, None), +    'D': (DateField, None), +    'C': (forms.CharField, None), +} + +  class CustomForm(object):      form_admin_name = ""      form_slug = "" @@ -120,8 +131,7 @@ class CustomForm(object):              except AttributeError:                  pass          super(CustomForm, self).__init__(*args, **kwargs) -        available, excluded = self.check_availability_and_excluded_fields( -            current_user) +        available, excluded, json_fields = self.check_custom_form(current_user)          for exc in excluded:              if hasattr(self, 'fields'):                  self.remove_field(exc) @@ -131,6 +141,25 @@ class CustomForm(object):                      if exc in form.fields:                          form.fields.pop(exc) +        new_fields = {} +        for order, key, field in json_fields: +            while order in new_fields:  # json fields with the same number +                order += 1 +            new_fields[order] = (key, field) + +        if not new_fields: +            return + +        # re-order for json fields +        fields = OrderedDict() +        for idx, field in enumerate(self.fields.items()): +            key, c_field = field +            if idx + 1 in new_fields: +                alt_key, alt_field = new_fields[idx + 1] +                fields[alt_key] = alt_field +            fields[key] = c_field +        self.fields = fields +      def are_available(self, keys):          for k in keys:              if k not in self.fields: @@ -142,9 +171,28 @@ class CustomForm(object):              self.fields.pop(key)      @classmethod -    def check_availability_and_excluded_fields(cls, current_user): +    def _get_json_fields(cls, custom_form): +        fields = [] +        for field in custom_form.json_fields.order_by('order').all(): +            key = "data__" + field.json_field.key +            field_cls, widget = forms.CharField, None +            if field.json_field.value_type in JSON_VALUE_TYPES_FIELDS: +                field_cls, widget = JSON_VALUE_TYPES_FIELDS[ +                    field.json_field.value_type] +            attrs = {'label': field.label or field.json_field.name, +                     'required': False} +            if field.help_text: +                attrs['help_text'] = field.help_text +            if widget: +                attrs['widget'] = widget(attrs={"class": "form-control"}) +            f = field_cls(**attrs) +            fields.append((field.order or 1, key, f)) +        return fields + +    @classmethod +    def check_custom_form(cls, current_user):          if not current_user: -            return True, [] +            return True, [], []          base_q = {"form": cls.form_slug, 'available': True}          # order is important : try for user, user type then all          query_dicts = [] @@ -159,23 +207,31 @@ class CustomForm(object):          dct = base_q.copy()          dct.update({'apply_to_all': True})          query_dicts.append(dct) -        excluded_lst = [] +        form = None          for query_dict in query_dicts:              q = models.CustomForm.objects.filter(**query_dict)              if not q.count():                  continue              # todo: prevent multiple result in database              form = q.all()[0] -            if not form.enabled: -                return False, [] -            for excluded in form.excluded_fields.all(): -                # could have be filtered previously -                excluded_lst.append(excluded.field)              break -        return True, excluded_lst +        if not form: +            return True, [], [] +        if not form.enabled: +            return False, [], [] +        excluded_lst = [] +        for excluded in form.excluded_fields.all(): +            # could have be filtered previously +            excluded_lst.append(excluded.field) +        json_fields = cls._get_json_fields(form) +        return True, excluded_lst, json_fields      @classmethod      def get_custom_fields(cls): +        """ +        Get fields than can be customized: excluded, re-ordered (WIP) or +        re-labeled (WIP) +        """          if hasattr(cls, 'base_fields'):              fields = cls.base_fields          else: | 
