summaryrefslogtreecommitdiff
path: root/ishtar_common/wizards.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r--ishtar_common/wizards.py155
1 files changed, 91 insertions, 64 deletions
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 4fb1222c3..5e23d469a 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -687,19 +687,29 @@ class Wizard(IshtarWizard):
dct = self.get_extra_model(dct, m2m, form_list)
obj = self.get_current_saved_object()
data = {}
+ base_find_data = {}
if obj and hasattr(obj, "data"):
data = obj.data
-
+ if obj and hasattr(obj, "get_first_base_find"):
+ bf = obj.get_first_base_find()
+ if bf:
+ base_find_data = bf.data
# manage dependant items and json fields
other_objs = {}
for k in list(dct.keys()):
if "__" not in k:
continue
+ vals = k.split("__")
# manage json field
- if k.startswith("data__"):
- data_keys = k[len("data__") :].split("__")
+ if "data" in vals:
+ data_keys = vals[vals.index("data") + 1:]
# tree
- current_data = data
+ if vals[0] == "get_first_base_find":
+ if "get_first_base_find" not in other_objs:
+ other_objs["get_first_base_find"] = {}
+ current_data = base_find_data
+ else:
+ current_data = data
for data_key in data_keys[:-1]:
if data_key not in current_data:
current_data[data_key] = {}
@@ -714,13 +724,14 @@ class Wizard(IshtarWizard):
current_data[data_keys[-1]] = value
continue
- vals = k.split("__")
if len(vals) != 2:
raise NotImplementedError("Only one level of dependant item is managed")
dependant_item, key = vals
if dependant_item not in other_objs:
other_objs[dependant_item] = {}
other_objs[dependant_item][key] = dct.pop(k)
+ if "get_first_base_find" in other_objs and base_find_data:
+ other_objs["get_first_base_find"]["data"] = base_find_data
if obj:
for k in list(dct.keys()):
if k.startswith("pk"):
@@ -1517,6 +1528,78 @@ class Wizard(IshtarWizard):
obj_name = prefixes[-2]
return obj_name
+ def __instanced_json_data(self, initial, c_form, obj):
+ """
+ Get initial data for JSON fields
+ """
+ for key in self.json_fields[c_form.form_slug]:
+ data_key = "data__"
+ current_obj = obj
+ if not key.startswith("data__"):
+ if not key.startswith("get_first_base_find__data__") \
+ or not hasattr(obj, "get_first_base_find"):
+ continue
+ data_key = "get_first_base_find__data__"
+ current_obj = obj.get_first_base_find()
+ if not current_obj:
+ continue
+ json_keys = key[len(data_key):].split("__")
+ value = current_obj.data
+ for json_key in json_keys:
+ if json_key not in value:
+ value = None
+ break
+ value = value[json_key]
+ if value:
+ initial[key] = value
+ elif value is False:
+ initial[key] = "False"
+
+ def __instanced_data(self, initial, c_form, obj, base_field):
+ """
+ Get initial data for standard fields
+ """
+ value = obj
+ base_model = None
+ if (hasattr(c_form, "base_model") and base_field == c_form.base_model) or (
+ hasattr(c_form, "base_models") and base_field in c_form.base_models):
+ base_model = base_field
+ try:
+ getattr(obj, base_model + "s")
+ key = base_model + "s"
+ except AttributeError:
+ getattr(obj, base_model)
+ key = base_model
+ initial.setlist(
+ base_field, [str(val.pk) for val in getattr(value, key).all()]
+ )
+ else:
+ fields = base_field.split("__")
+ for field in fields:
+ if callable(value):
+ value = value()
+ if not hasattr(value, field) or getattr(value, field) is None:
+ value = obj
+ break
+ value = getattr(value, field)
+ if hasattr(value, "all") and callable(value.all):
+ if not value.count():
+ return
+ initial.setlist(base_field, [str(v.pk) for v in value.all()])
+ return
+ if value == obj:
+ return
+ if hasattr(value, "pk"):
+ value = value.pk
+ if (
+ value in (True, False)
+ or isinstance(value, ImageFieldFile)
+ or isinstance(value, FileField)
+ ):
+ initial[base_field] = value
+ elif value is not None:
+ initial[base_field] = str(value)
+
def _get_instanced_init_for_form(self, obj, c_form):
"""
Get initial data from an object: simple form
@@ -1525,71 +1608,15 @@ class Wizard(IshtarWizard):
# manage json field
if (
- hasattr(obj, "data")
- and obj.data
+ getattr(obj, "data", None)
and hasattr(self, "json_fields")
and getattr(c_form, "form_slug", None)
and c_form.form_slug in self.json_fields
- and obj.data
):
- for key in self.json_fields[c_form.form_slug]:
- if not key.startswith("data__"):
- continue
- json_keys = key[len("data__") :].split("__")
- value = obj.data
- for json_key in json_keys:
- if json_key not in value:
- value = None
- break
- value = value[json_key]
- if value:
- initial[key] = value
- elif value is False:
- initial[key] = "False"
+ self.__instanced_json_data(initial, c_form, obj)
for base_field in c_form.base_fields.keys():
- value = obj
- base_model = None
- if hasattr(c_form, "base_model") and base_field == c_form.base_model:
- base_model = base_field
- if hasattr(c_form, "base_models") and base_field in c_form.base_models:
- base_model = base_field
- if base_model:
- try:
- __ = getattr(obj, base_model + "s")
- key = base_model + "s"
- except AttributeError:
- __ = getattr(obj, base_model)
- key = base_model
- initial.setlist(
- base_field, [str(val.pk) for val in getattr(value, key).all()]
- )
- else:
- fields = base_field.split("__")
- for field in fields:
- if callable(value):
- value = value()
- if not hasattr(value, field) or getattr(value, field) is None:
- value = obj
- break
- value = getattr(value, field)
- if hasattr(value, "all") and callable(value.all):
- if not value.count():
- continue
- initial.setlist(base_field, [str(v.pk) for v in value.all()])
- continue
- if value == obj:
- continue
- if hasattr(value, "pk"):
- value = value.pk
- if (
- value in (True, False)
- or isinstance(value, ImageFieldFile)
- or isinstance(value, FileField)
- ):
- initial[base_field] = value
- elif value is not None:
- initial[base_field] = str(value)
+ self.__instanced_data(initial, c_form, obj, base_field)
return initial
@staticmethod