From 9430e3af8605337e508618a0783626592d0fa2ed Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Mon, 17 Mar 2025 14:27:12 +0100 Subject: [PATCH] fix: respect `override_whitelisted_method` in `map_docs` (#31718) * refactor: override_whitelisted_method * fix: respect `override_whitelisted_method` in `map_docs` * refactor: override_whitelisted_method --- frappe/__init__.py | 6 ++++++ frappe/api/v2.py | 5 +---- frappe/handler.py | 5 +---- frappe/model/mapper.py | 10 ++-------- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index f323f58f39..742f07f9a6 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -2050,6 +2050,12 @@ def validate_and_sanitize_search_inputs(fn): return wrapper +def override_whitelisted_method(original_method: str) -> str: + """Return the last override or the original whitelisted method.""" + overrides = frappe.get_hooks("override_whitelisted_methods", {}).get(original_method, []) + return overrides[-1] if overrides else original_method + + # Backward compatibility from frappe.utils.messages import * # noqa: I001 diff --git a/frappe/api/v2.py b/frappe/api/v2.py index 13253e7599..7908dba210 100644 --- a/frappe/api/v2.py +++ b/frappe/api/v2.py @@ -33,10 +33,7 @@ def handle_rpc_call(method: str, doctype: str | None = None): module = load_doctype_module(doctype) method = module.__name__ + "." + method - for hook in reversed(frappe.get_hooks("override_whitelisted_methods", {}).get(method, [])): - # override using the last hook - method = hook - break + method = frappe.override_whitelisted_method(method) # via server script server_script = get_server_script_map().get("_api", {}).get(method) diff --git a/frappe/handler.py b/frappe/handler.py index 6fe96e62a9..1ecf8b3703 100644 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -62,10 +62,7 @@ def handle(): def execute_cmd(cmd, from_async=False): """execute a request as python module""" - for hook in reversed(frappe.get_hooks("override_whitelisted_methods", {}).get(cmd, [])): - # override using the last hook - cmd = hook - break + cmd = frappe.override_whitelisted_method(cmd) # via server script server_script = get_server_script_map().get("_api", {}).get(cmd) diff --git a/frappe/model/mapper.py b/frappe/model/mapper.py index 8aca4c4380..f337fce529 100644 --- a/frappe/model/mapper.py +++ b/frappe/model/mapper.py @@ -15,13 +15,7 @@ def make_mapped_doc(method, source_name, selected_children=None, args=None): Set `selected_children` as flags for the `get_mapped_doc` method. Called from `open_mapped_doc` from create_new.js""" - - for hook in reversed(frappe.get_hooks("override_whitelisted_methods", {}).get(method, [])): - # override using the last hook - method = hook - break - - method = frappe.get_attr(method) + method = frappe.get_attr(frappe.override_whitelisted_method(method)) frappe.is_whitelisted(method) @@ -45,8 +39,8 @@ def map_docs(method, source_names, target_doc, args=None): e.g. args: "{ 'supplier': 'XYZ' }" """ + method = frappe.get_attr(frappe.override_whitelisted_method(method)) - method = frappe.get_attr(method) frappe.is_whitelisted(method) for src in json.loads(source_names):