From 91da5f0363b8fc5f5e9775e8e7d49a98722de9c5 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 23 Feb 2022 17:19:43 +0530 Subject: [PATCH] refactor(rename_doc): update_document_title API * Remove redundant API arguments * Check for permission on specified document * Maintain backwards compatibility - test_update_document_title_api checks for this * Update desk client usage ;) --- frappe/model/rename_doc.py | 31 +++++++++++++++---------- frappe/public/js/frappe/form/toolbar.js | 6 ++--- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index 88752103ae..3f5104540a 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -19,32 +19,39 @@ if TYPE_CHECKING: def update_document_title( doctype: str, docname: str, - title_field: Optional[str] = None, - old_title: Optional[str] = None, - new_title: Optional[str] = None, - new_name: Optional[str] = None, + title: Optional[str] = None, + name: Optional[str] = None, merge: bool = False, + **kwargs ) -> str: """ Update title from header in form view """ + + # to maintain backwards API compatibility + updated_title = kwargs.get("new_title") or title + updated_name = kwargs.get("new_name") or name + # TODO: omit this after runtime type checking (ref: https://github.com/frappe/frappe/pull/14927) - for obj in [docname, new_name, new_title, old_title]: + for obj in [docname, updated_title, updated_name]: if not isinstance(obj, (str, type(None))): - frappe.throw(f"{obj} must be of type str or None") + frappe.throw(f"{obj=} must be of type str or None") - frappe.has_permission(doctype, ptype="write", throw=True) + doc = frappe.get_doc(doctype, docname) + doc.has_permission(permtype="write") - title_updated = old_title and new_title and (old_title != new_title) - name_updated = new_name and docname and (docname != new_name) + title_field = doc.meta.get_title_field() + + title_updated = (title_field != "name") and (updated_title != doc.get(title_field)) + name_updated = updated_name != doc.name if name_updated: - docname = rename_doc(doctype=doctype, old=docname, new=new_name, merge=merge) + docname = rename_doc(doctype=doctype, old=docname, new=updated_name, merge=merge) if title_updated: try: - frappe.db.set_value(doctype, docname, title_field, new_title) - frappe.msgprint(_('Saved'), alert=True, indicator='green') + frappe.db.set_value(doctype, docname, title_field, updated_title) + frappe.msgprint(_("Saved"), alert=True, indicator="green") except Exception as e: if frappe.db.is_duplicate_entry(e): frappe.throw( diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index ffcfc349ef..500ec88068 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -101,10 +101,8 @@ frappe.ui.form.Toolbar = class Toolbar { return frappe.xcall("frappe.model.rename_doc.update_document_title", { doctype, docname, - new_name, - title_field, - old_title: this.frm.doc[title_field], - new_title, + name: new_name, + title: new_title, merge }).then(new_docname => { if (new_name != docname) {