diff --git a/frappe/__init__.py b/frappe/__init__.py index cd662cd6cb..21a90069c5 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -339,6 +339,10 @@ def msgprint(msg, title=None, raise_exception=0, as_table=False, indicator=None, out.alert = 1 message_log.append(json.dumps(out)) + + if raise_exception: + local.response['exc_type'] = raise_exception.__name__ + _raise_exception() def clear_messages(): diff --git a/frappe/public/js/frappe/request.js b/frappe/public/js/frappe/request.js index eab9b41ae3..150ed2b2cf 100644 --- a/frappe/public/js/frappe/request.js +++ b/frappe/public/js/frappe/request.js @@ -4,6 +4,7 @@ // My HTTP Request frappe.provide('frappe.request'); +frappe.provide('frappe.request.error_handlers'); frappe.request.url = '/'; frappe.request.ajax_count = 0; frappe.request.waiting_for_ajax = []; @@ -318,11 +319,23 @@ frappe.request.cleanup = function(opts, r) { return; } + // global error handlers + if (r.exc_type) { + let handlers = frappe.request.error_handlers[r.exc_type] || []; + handlers.forEach(handler => { + handler(r); + }); + } + // show messages if(r._server_messages && !opts.silent) { - r._server_messages = JSON.parse(r._server_messages); - frappe.hide_msgprint(); - frappe.msgprint(r._server_messages); + let handlers = frappe.request.error_handlers[r.exc_type] || []; + // dont show server messages if their handlers exist + if (!handlers.length) { + r._server_messages = JSON.parse(r._server_messages); + frappe.hide_msgprint(); + frappe.msgprint(r._server_messages); + } } // show errors @@ -477,6 +490,11 @@ frappe.request.cleanup_request_opts = function(request_opts) { return request_opts; }; +frappe.request.on_error = function(error_type, handler) { + frappe.request.error_handlers[error_type] = frappe.request.error_handlers[error_type] || []; + frappe.request.error_handlers[error_type].push(handler); +} + $(document).ajaxSend(function() { frappe.request.ajax_count++; });