summaryrefslogtreecommitdiff
path: root/ishtar_common/forms.py
diff options
context:
space:
mode:
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
commitd807e2b7b96935174135bc76b6a22f3a0100bd95 (patch)
tree427ba1a5c67ec7d578549f64dbd3496d72ec37ca /ishtar_common/forms.py
parent88c9aeaeafd9bc77decbf0982be0fd9d20fd3993 (diff)
downloadIshtar-d807e2b7b96935174135bc76b6a22f3a0100bd95.tar.bz2
Ishtar-d807e2b7b96935174135bc76b6a22f3a0100bd95.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.py78
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: