diff --git a/frappe/app.py b/frappe/app.py index 2d0931af64..9373689380 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -324,9 +324,8 @@ def make_form_dict(request: Request): frappe.throw(_("Invalid request arguments")) +@handle_does_not_exist_error def handle_exception(e): - e = handle_does_not_exist_error(e) - response = None http_status_code = getattr(e, "http_status_code", 500) accept_header = frappe.get_request_header("Accept") or "" diff --git a/frappe/permissions.py b/frappe/permissions.py index b502470965..a05ba784bd 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -853,12 +853,20 @@ def check_doctype_permission(doctype: str, ptype: str = "read") -> None: frappe.local.message_log = _message_log -def handle_does_not_exist_error(e: Exception) -> Exception: - if isinstance(e, frappe.DoesNotExistError) and (doctype := getattr(e, "doctype", None)): - try: - check_doctype_permission(doctype) +def handle_does_not_exist_error(fn): + """ + Decorator to override DoesNotExistError when handling exceptions. + Requires the first argument to be an Exception. + """ - except frappe.PermissionError as _e: - return _e + @functools.wraps(fn) + def wrapper(e, *args, **kwargs): + if isinstance(e, frappe.DoesNotExistError) and (doctype := getattr(e, "doctype", None)): + try: + check_doctype_permission(doctype) + except frappe.PermissionError as _e: + return fn(_e, *args, **kwargs) - return e + return fn(e, *args, **kwargs) + + return wrapper diff --git a/frappe/website/serve.py b/frappe/website/serve.py index 3df257aa25..61d77e59e6 100644 --- a/frappe/website/serve.py +++ b/frappe/website/serve.py @@ -20,18 +20,21 @@ def get_response(path=None, http_status_code=200) -> Response: return renderer_instance.render() except Exception as e: - e = handle_does_not_exist_error(e) + return handle_exception(e, endpoint, path, http_status_code) - if isinstance(e, frappe.Redirect): - return RedirectPage(endpoint or path, e.http_status_code).render() - if isinstance(e, frappe.PermissionError): - return NotPermittedPage(endpoint, http_status_code, exception=e).render() +@handle_does_not_exist_error +def handle_exception(e, endpoint, path, http_status_code): + if isinstance(e, frappe.Redirect): + return RedirectPage(endpoint or path, e.http_status_code).render() - if isinstance(e, frappe.PageDoesNotExistError): - return NotFoundPage(endpoint, http_status_code).render() + if isinstance(e, frappe.PermissionError): + return NotPermittedPage(endpoint, http_status_code, exception=e).render() - return ErrorPage(exception=e).render() + if isinstance(e, frappe.PageDoesNotExistError): + return NotFoundPage(endpoint, http_status_code).render() + + return ErrorPage(exception=e).render() def get_response_content(path=None, http_status_code=200) -> str: