diff options
-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()]) |