From 9503e7788a6578e14cd4fb4f66e2fe8e6ea592b6 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Wed, 10 Nov 2021 22:51:12 +0530 Subject: [PATCH] fix: restore `validate_link` --- frappe/client.py | 17 ++++++++ frappe/public/js/frappe/form/controls/link.js | 42 ++++++++++--------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/frappe/client.py b/frappe/client.py index 0e9be0a7ee..01991e1b51 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -405,3 +405,20 @@ def is_document_amended(doctype, docname): pass return False + +@frappe.whitelist() +def validate_link(doctype: str, docname): + if not isinstance(doctype, str): + frappe.throw(_("DocType must be a string")) + + if doctype != "DocType" and not ( + frappe.has_permission(doctype, "select") + or frappe.has_permission(doctype, "read") + ): + frappe.throw( + _("You do not have Read or Select Permissions for {}") + .format(frappe.bold(doctype)), + frappe.PermissionError + ) + + return frappe.db.get_value(doctype, docname, cache=True) diff --git a/frappe/public/js/frappe/form/controls/link.js b/frappe/public/js/frappe/form/controls/link.js index e7339372b3..a7a201b414 100644 --- a/frappe/public/js/frappe/form/controls/link.js +++ b/frappe/public/js/frappe/form/controls/link.js @@ -454,38 +454,40 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat validate_link_and_fetch(df, options, docname, value) { if (!value) return; - return new Promise((resolve) => { + return new Promise(async (resolve) => { const fetch_map = this.fetch_map; + const columns_to_fetch = Object.values(fetch_map); // if default and no fetch, no need to validate - if ($.isEmptyObject(fetch_map) && df.__default_value === value) { + if (!columns_to_fetch.length && df.__default_value === value) { return resolve(value); } + const name = await frappe.xcall("frappe.client.validate_link", { + doctype: options, + docname: value + }); + + if (!name) return resolve(""); + if (!docname || !columns_to_fetch.length) return resolve(name); + + console.log(columns_to_fetch); frappe.db.get_value( options, value, - ["name", ...Object.values(fetch_map)], + columns_to_fetch, (response) => { - if (!response.name) { - return resolve(""); + for (const [target_field, source_field] of Object.entries(fetch_map)) { + frappe.model.set_value( + df.parent, + docname, + target_field, + response[source_field], + df.fieldtype, + ); } - - if (docname) { - for (const [target_field, source_field] of Object.entries(fetch_map)) { - frappe.model.set_value( - df.parent, - docname, - target_field, - response[source_field], - df.fieldtype, - ); - } - } - - return resolve(response.name); } - ) + ).always(() => resolve(name)); }); }