summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ishtar_common/forms.py28
-rw-r--r--ishtar_common/forms_common.py8
2 files changed, 35 insertions, 1 deletions
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index 07d1ac417..1416dd464 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -308,9 +308,21 @@ class CustomForm(BSForm):
c_field.order_number = idx
fields[key] = c_field
# custom field after classic fields
+ instance = getattr(self, "instance", None)
for k in sorted(new_fields.keys()):
alt_key, alt_field = new_fields.pop(k)
alt_field.order_number = k
+ # manage initial data
+ if instance:
+ data = instance.data
+ nok = False
+ for k_part in alt_key[len("data__"):].split("__"):
+ if k_part not in data:
+ nok = True
+ break
+ data = data[k_part]
+ if not nok:
+ alt_field.initial = data
fields[alt_key] = alt_field
self.fields = fields
self._post_init()
@@ -464,6 +476,22 @@ class CustomForm(BSForm):
customs.append((key, field.label))
return sorted(customs, key=lambda x: x[1])
+ def save_json_fields(self, item):
+ """
+ Edit JSON fields of an item after form validation.
+ Do not save. Return if item has been changed.
+ """
+ changed = False
+ for key in self.cleaned_data:
+ if not key.startswith("data__"):
+ continue
+ item.data = update_data(
+ item.data,
+ generate_dict_from_data_string(key, self.cleaned_data[key])
+ )
+ changed = True
+ return changed
+
class CustomFormSearch(FormPermissionForm, forms.Form):
"""
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index 11649a078..e6428fa86 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -2437,10 +2437,16 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
except models.Organization.DoesNotExist:
return
+
def save(self, commit=True):
if not self.cleaned_data.get("authors", None):
self.cleaned_data["authors"] = []
- item = super(DocumentForm, self).save(commit=commit)
+ item = super().save(commit=commit)
+ if self.save_json_fields(item):
+ item.history_modifier = self.user
+ item.skip_history_when_saving = True
+ item.save()
+
for related_key in models.Document.RELATED_MODELS:
related = getattr(item, related_key)
initial = dict([(rel.pk, rel) for rel in related.all()])