From f9cbad5bf6ea947c66d6057d44bf31f42577bd44 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 19 Jan 2012 15:48:37 +0100 Subject: [PATCH] [FIX] correctly display crash manager in case of report error lp bug: https://launchpad.net/bugs/917227 fixed bzr revid: xmo@openerp.com-20120119144837-dp6r7vqx581b4mrt --- addons/web/common/http.py | 26 +++++++++++++++++++++++++- addons/web/controllers/main.py | 21 +++++++++------------ addons/web/static/src/js/chrome.js | 11 ++++------- addons/web/static/src/js/core.js | 11 +++++++++-- addons/web/static/src/js/views.js | 3 ++- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index 931b2181d15..ac9b95dcb26 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -3,6 +3,7 @@ # OpenERP Web HTTP layer #---------------------------------------------------------- import ast +import cgi import contextlib import functools import logging @@ -254,7 +255,30 @@ class HttpRequest(WebRequest): else: akw[key] = type(value) _logger.debug("%s --> %s.%s %r", self.httprequest.method, controller.__class__.__name__, method.__name__, akw) - r = method(controller, self, **self.params) + try: + r = method(controller, self, **self.params) + except xmlrpclib.Fault, e: + r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps({ + 'code': 200, + 'message': "OpenERP Server Error", + 'data': { + 'type': 'server_exception', + 'fault_code': e.faultCode, + 'debug': "Server %s\nClient %s" % ( + e.faultString, traceback.format_exc()) + } + }))) + except Exception: + logging.getLogger(__name__ + '.HttpRequest.dispatch').exception( + "An error occurred while handling a json request") + r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps({ + 'code': 300, + 'message': "OpenERP WebClient Error", + 'data': { + 'type': 'client_exception', + 'debug': "Client %s" % traceback.format_exc() + } + }))) if self.debug or 1: if isinstance(r, (werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException)): _logger.debug('<-- %s', r) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index bb08393cae3..0878ec09725 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -6,6 +6,7 @@ import csv import glob import itertools import operator +import traceback import os import re import simplejson @@ -17,6 +18,7 @@ from xml.etree import ElementTree from cStringIO import StringIO import babel.messages.pofile +import werkzeug.exceptions import werkzeug.utils try: import xlwt @@ -321,18 +323,13 @@ class Database(openerpweb.Controller): @openerpweb.httprequest def backup(self, req, backup_db, backup_pwd, token): - try: - db_dump = base64.b64decode( - req.session.proxy("db").dump(backup_pwd, backup_db)) - return req.make_response(db_dump, - [('Content-Type', 'application/octet-stream; charset=binary'), - ('Content-Disposition', 'attachment; filename="' + backup_db + '.dump"')], - {'fileToken': int(token)} - ) - except xmlrpclib.Fault, e: - if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': - return 'Backup Database|' + e.faultCode - return 'Backup Database|Could not generate database backup' + db_dump = base64.b64decode( + req.session.proxy("db").dump(backup_pwd, backup_db)) + return req.make_response(db_dump, + [('Content-Type', 'application/octet-stream; charset=binary'), + ('Content-Disposition', 'attachment; filename="' + backup_db + '.dump"')], + {'fileToken': int(token)} + ) @openerpweb.httprequest def restore(self, req, db_file, restore_pwd, new_db): diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 6a9e860aadc..06fcf518002 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -472,16 +472,13 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database self.blockUI(); self.session.get_file({ form: form, - error: function (body) { - var error = body.firstChild.data.split('|'); - self.display_error({ - title: error[0], - error: error[1] - }); + success: function () { + self.do_notify(_t("Backed"), + _t("Database backed up successfully")); }, + error: openerp.webclient.crashmanager.on_rpc_error, complete: function() { self.unblockUI(); - self.do_notify(_t("Backed"), _t("Database backed up successfully")); } }); } diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 3005fc80d13..43bd8a0abf7 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -809,8 +809,15 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. .attr({id: id, name: id}) .appendTo(document.body) .load(function () { - if (options.error) { options.error(this.contentDocument.body); } - complete(); + try { + if (options.error) { + options.error(JSON.parse( + this.contentDocument.body.childNodes[1].textContent + )); + } + } finally { + complete(); + } }); if (options.form) { diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 4853eebfab6..1aa76b9a6dd 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -195,7 +195,8 @@ session.web.ActionManager = session.web.Widget.extend({ on_closed(); } self.dialog_stop(); - } + }, + error: session.webclient.crashmanager.on_rpc_error }) }); },