Merge pull request #21680 from resilient-tech/compare-amended-from

fix: compare with `doc.amended_from` while saving version for newly amended doc
This commit is contained in:
mergify[bot] 2023-07-18 04:22:32 +00:00 committed by GitHub
commit 9c481cfd68
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 14 deletions

View file

@ -80,24 +80,30 @@ def get_diff(old, new, for_child=False):
updater_reference=updater_reference, updater_reference=updater_reference,
) )
if not for_child:
amended_from = new.get("amended_from")
old_row_name_field = "_amended_from" if (amended_from and amended_from == old.name) else "name"
for df in new.meta.fields: for df in new.meta.fields:
if df.fieldtype in no_value_fields and df.fieldtype not in table_fields: if df.fieldtype in no_value_fields and df.fieldtype not in table_fields:
continue continue
old_value, new_value = old.get(df.fieldname), new.get(df.fieldname) old_value, new_value = old.get(df.fieldname), new.get(df.fieldname)
if df.fieldtype in table_fields: if not for_child and df.fieldtype in table_fields:
# make maps old_rows_by_name = {}
old_row_by_name, new_row_by_name = {}, {}
for d in old_value: for d in old_value:
old_row_by_name[d.name] = d old_rows_by_name[d.name] = d
for d in new_value:
new_row_by_name[d.name] = d found_rows = set()
# check rows for additions, changes # check rows for additions, changes
for i, d in enumerate(new_value): for i, d in enumerate(new_value):
if d.name in old_row_by_name: old_row_name = getattr(d, old_row_name_field, None)
diff = get_diff(old_row_by_name[d.name], d, for_child=True) if old_row_name and old_row_name in old_rows_by_name:
found_rows.add(old_row_name)
diff = get_diff(old_rows_by_name[old_row_name], d, for_child=True)
if diff and diff.changed: if diff and diff.changed:
out.row_changed.append((df.fieldname, i, d.name, diff.changed)) out.row_changed.append((df.fieldname, i, d.name, diff.changed))
else: else:
@ -105,7 +111,7 @@ def get_diff(old, new, for_child=False):
# check for deletions # check for deletions
for d in old_value: for d in old_value:
if not d.name in new_row_by_name: if d.name not in found_rows:
out.removed.append([df.fieldname, d.as_dict()]) out.removed.append([df.fieldname, d.as_dict()])
elif old_value != new_value: elif old_value != new_value:
@ -116,9 +122,14 @@ def get_diff(old, new, for_child=False):
if old_value != new_value: if old_value != new_value:
out.changed.append((df.fieldname, old_value, new_value)) out.changed.append((df.fieldname, old_value, new_value))
# docstatus # name & docstatus
if not for_child and old.docstatus != new.docstatus: if not for_child:
out.changed.append(["docstatus", old.docstatus, new.docstatus]) for key in ("name", "docstatus"):
old_value = getattr(old, key)
new_value = getattr(new, key)
if old_value != new_value:
out.changed.append([key, old_value, new_value])
if any((out.changed, out.added, out.removed, out.row_changed)): if any((out.changed, out.added, out.removed, out.row_changed)):
return out return out

View file

@ -1236,9 +1236,12 @@ class Document(BaseDocument):
): ):
return return
version = frappe.new_doc("Version") doc_to_compare = self._doc_before_save
if not doc_to_compare and (amended_from := self.get("amended_from")):
doc_to_compare = frappe.get_doc(self.doctype, amended_from)
if is_useful_diff := version.update_version_info(self._doc_before_save, self): version = frappe.new_doc("Version")
if is_useful_diff := version.update_version_info(doc_to_compare, self):
version.insert(ignore_permissions=True) version.insert(ignore_permissions=True)
if not frappe.flags.in_migrate: if not frappe.flags.in_migrate:

View file

@ -309,6 +309,10 @@ $.extend(frappe.model, {
newdoc.lft = null; newdoc.lft = null;
newdoc.rgt = null; newdoc.rgt = null;
if (from_amend && parent_doc) {
newdoc._amended_from = doc.name;
}
return newdoc; return newdoc;
}, },