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:
commit
9c481cfd68
3 changed files with 32 additions and 14 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue