diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-04-11 13:29:15 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-04-11 13:29:15 +0200 |
commit | 9ff54c45e09015606754a7fcce824bc78aae9201 (patch) | |
tree | d5af30619dfbf69cd1ec700b8d996109fb511640 | |
parent | 5a298f37a4f87396d5fdd275c23b6589db84c06e (diff) | |
download | Ishtar-9ff54c45e09015606754a7fcce824bc78aae9201.tar.bz2 Ishtar-9ff54c45e09015606754a7fcce824bc78aae9201.zip |
🐛 document form: fix json fields management
-rw-r--r-- | ishtar_common/forms.py | 28 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 8 |
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()]) |