From 140a01e2cf66d38a2daa9ae6b23bf9f220f3a54d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 12 Feb 2024 11:32:38 +0530 Subject: [PATCH] perf: cache permission results For each transition, we end up redoing perm check. Nothing has really changed there though. --- .../workflow_action/workflow_action.py | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/frappe/workflow/doctype/workflow_action/workflow_action.py b/frappe/workflow/doctype/workflow_action/workflow_action.py index 9abac0bc3b..1506e9311b 100644 --- a/frappe/workflow/doctype/workflow_action/workflow_action.py +++ b/frappe/workflow/doctype/workflow_action/workflow_action.py @@ -324,9 +324,19 @@ def get_next_possible_transitions(workflow_name, state, doc=None): def get_users_next_action_data(transitions, doc): user_data_map = {} + + @frappe.request_cache + def user_has_permission(user: str) -> bool: + from frappe.permissions import has_permission + + return has_permission(doctype=doc, user=user, print_logs=False) + for transition in transitions: users = get_users_with_role(transition.allowed) - filtered_users = filter_allowed_users(users, doc, transition) + filtered_users = [ + user for user in users if has_approval_access(user, doc, transition) and user_has_permission(user) + ] + for user in filtered_users: if not user_data_map.get(user): user_data_map[user] = frappe._dict( @@ -454,20 +464,6 @@ def get_doc_workflow_state(doc): return doc.get(workflow_state_field) -def filter_allowed_users(users, doc, transition): - """Filters list of users by checking if user has access to doc and - if the user satisfies 'workflow transision self approval' condition - """ - from frappe.permissions import has_permission - - return [ - user - for user in users - if has_approval_access(user, doc, transition) - and has_permission(doctype=doc, user=user, print_logs=False) - ] - - def get_common_email_args(doc): doctype = doc.get("doctype") docname = doc.get("name")