diff --git a/frappe/core/doctype/version/version.py b/frappe/core/doctype/version/version.py index 05cc102ab9..3a97582376 100644 --- a/frappe/core/doctype/version/version.py +++ b/frappe/core/doctype/version/version.py @@ -45,7 +45,11 @@ def get_diff(old, new, for_child=False): # capture data import if set data_import = new.flags.via_data_import - out = frappe._dict(changed = [], added = [], removed = [], row_changed = [], data_import=data_import) + updater_reference = new.flags.updater_reference + + out = frappe._dict(changed = [], added = [], removed = [], + row_changed = [], data_import=data_import, updater_reference=updater_reference) + for df in new.meta.fields: if df.fieldtype in no_value_fields and df.fieldtype not in table_fields: continue diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index 997aba3069..31a39724ef 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -132,6 +132,10 @@ def get_context(context): try: if allow_update: doc.set(self.set_property_after_alert, self.property_value) + doc.flags.updater_reference = { + 'doctype': self.doctype, + 'docname': self.name + } doc.save() except Exception as e: frappe.log_error(title=_('Document update failed'), message=frappe.get_traceback()) diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index e7f5f4023f..5b02f06728 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -560,12 +560,24 @@ frappe.ui.form.Timeline = class Timeline { return; } - let data_import_link = frappe.utils.get_form_link( - 'Data Import Beta', - data.data_import, - true, - __('via Data Import') - ); + let updater_reference_link = null; + + if (data.data_import) { + updater_reference_link = frappe.utils.get_form_link( + 'Data Import Beta', + data.data_import, + true, + __('via Data Import') + ); + } else if (!$.isEmptyObject(data.updater_reference)) { + let updater_reference = data.updater_reference; + updater_reference_link = frappe.utils.get_form_link( + updater_reference.doctype, + updater_reference.docname, + true, + __('via {0}', [updater_reference.doctype]) + ); + } // value changed in parent if (data.changed && data.changed.length) { @@ -573,13 +585,13 @@ frappe.ui.form.Timeline = class Timeline { data.changed.every(function(p) { if (p[0]==='docstatus') { if (p[2]==1) { - let message = data.data_import - ? __('submitted this document {0}', [data_import_link]) + let message = updater_reference_link + ? __('submitted this document {0}', [updater_reference_link]) : __('submitted this document'); out.push(me.get_version_comment(version, message)); } else if (p[2]==2) { - let message = data.data_import - ? __('cancelled this document {0}', [data_import_link]) + let message = updater_reference_link + ? __('cancelled this document {0}', [updater_reference_link]) : __('cancelled this document'); out.push(me.get_version_comment(version, message)); } @@ -600,10 +612,10 @@ frappe.ui.form.Timeline = class Timeline { } return parts.length < 3; }); - if(parts.length) { + if (parts.length) { let message; - if (data.data_import) { - message = __("changed value of {0} {1}", [parts.join(', ').bold(), data_import_link]); + if (updater_reference_link) { + message = __("changed value of {0} {1}", [parts.join(', ').bold(), updater_reference_link]); } else { message = __("changed value of {0}", [parts.join(', ').bold()]); }