diff --git a/frappe/__init__.py b/frappe/__init__.py index fd3c45753c..fe99f00382 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -818,23 +818,30 @@ def write_only(): return innfn -def only_for(roles: list[str] | str, message=False): - """Raise `frappe.PermissionError` if the user does not have any of the given **Roles**. +def only_for(roles: list[str] | tuple[str] | str, message=False): + """ + Raises `frappe.PermissionError` if the user does not have any of the permitted roles. + + :param roles: Permitted role(s) + """ - :param roles: List of roles to check.""" - if local.flags.in_test: + if local.flags.in_test or local.session.user == "Administrator": return - if not isinstance(roles, (tuple, list)): + if isinstance(roles, str): roles = (roles,) - roles = set(roles) - myroles = set(get_roles()) - if not roles.intersection(myroles): - if message: - msgprint( - _("This action is only allowed for {}").format(bold(", ".join(roles))), _("Not Permitted") - ) - raise PermissionError + + if not set(roles).intersection(get_roles()): + if not message: + raise PermissionError + + throw( + _("This action is only allowed for {}").format( + ", ".join(bold(_(role)) for role in roles), + ), + PermissionError, + _("Not Permitted"), + ) def get_domain_data(module): diff --git a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py index 362cc6b105..a7eff77ed0 100644 --- a/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py +++ b/frappe/core/report/permitted_documents_for_user/permitted_documents_for_user.py @@ -4,19 +4,18 @@ import frappe import frappe.utils.user from frappe.model import data_fieldtypes -from frappe.permissions import check_admin_or_system_manager, rights +from frappe.permissions import rights def execute(filters=None): + frappe.only_for("System Manager") + user, doctype, show_permissions = ( filters.get("user"), filters.get("doctype"), filters.get("show_permissions"), ) - if not validate(user, doctype): - return [], [] - columns, fields = get_columns_and_fields(doctype) data = frappe.get_list(doctype, fields=fields, as_list=True, user=user) @@ -30,12 +29,6 @@ def execute(filters=None): return columns, data -def validate(user, doctype): - # check if current user is System Manager - check_admin_or_system_manager() - return user and doctype - - def get_columns_and_fields(doctype): columns = [f"Name:Link/{doctype}:200"] fields = ["`name`"] diff --git a/frappe/permissions.py b/frappe/permissions.py index acbdf76989..50d7366626 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -28,6 +28,14 @@ rights = ( def check_admin_or_system_manager(user=None): + from frappe.utils.commands import warn + + warn( + "The function check_admin_or_system_manager will be deprecated in version 15." + 'Please use frappe.only_for("System Manager") instead.', + category=PendingDeprecationWarning, + ) + if not user: user = frappe.session.user