diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-23 17:13:35 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:49:06 +0200 |
commit | c80d0b8b3571b1055951ee8e387ec6ee56d5c55b (patch) | |
tree | 427ba1a5c67ec7d578549f64dbd3496d72ec37ca /ishtar_common/forms.py | |
parent | 743b514bb132752ef87a21e759d35988ffd25229 (diff) | |
download | Ishtar-c80d0b8b3571b1055951ee8e387ec6ee56d5c55b.tar.bz2 Ishtar-c80d0b8b3571b1055951ee8e387ec6ee56d5c55b.zip |
Wizards - JSON fields: Manage field display in forms - management in wizards save and form init (refs #4089)
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: |