From 4c45774b6d87eafa7b5c1b006894b5f3339d64b2 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Tue, 3 Dec 2013 20:16:21 +0100 Subject: [PATCH] [IMP] manual exception handling for non-json controllers bzr revid: al@openerp.com-20131203191621-xu2350cw0u3izn3s --- addons/web/controllers/main.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 41bb6ccfca7..8f7c5d4f70d 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -3,6 +3,7 @@ import ast import base64 import csv +import functools import glob import itertools import logging @@ -35,7 +36,9 @@ from openerp.tools.translate import _ from openerp.tools import config from openerp import http -from openerp.http import request +from openerp.http import request, serialize_exception as _serialize_exception + +_logger = logging.getLogger(__name__) #---------------------------------------------------------- # OpenERP Web helpers @@ -89,6 +92,22 @@ db_list = http.db_list db_monodb = http.db_monodb +def serialize_exception(f): + @functools.wraps(f) + def wrap(*args, **kwargs): + try: + return f(*args, **kwargs) + except Exception, e: + _logger.exception("An exception occured during an http request") + se = _serialize_exception(e) + error = { + 'code': 200, + 'message': "OpenERP Server Error", + 'data': se + } + return werkzeug.exceptions.InternalServerError(simplejson.dumps(error)) + return wrap + def redirect_with_hash(url, code=303): if request.httprequest.user_agent.browser in ('msie', 'safari'): # Most IE and Safari versions decided not to preserve location.hash upon @@ -542,14 +561,14 @@ class Home(http.Controller): def redirect(db): query = dict(urlparse.parse_qsl(request.httprequest.query_string, keep_blank_values=True)) - query.update({'db': db}) + query['db'] = db redirect = request.httprequest.path + '?' + urllib.urlencode(query) return redirect_with_hash(redirect) if db is None and guessed_db is not None: return redirect(guessed_db) - if db is not None and db != guessed_db: + if db is not None and db != request.session.db: request.session.logout() request.session.db = db guessed_db = db @@ -1220,6 +1239,7 @@ class Binary(http.Controller): return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', image), 'rb').read() @http.route('/web/binary/saveas', type='http', auth="user") + @serialize_exception def saveas(self, model, field, id=None, filename_field=None, **kw): """ Download link for files stored as binary fields. @@ -1253,6 +1273,7 @@ class Binary(http.Controller): ('Content-Disposition', content_disposition(filename))]) @http.route('/web/binary/saveas_ajax', type='http', auth="user") + @serialize_exception def saveas_ajax(self, data, token): jdata = simplejson.loads(data) model = jdata['model'] @@ -1286,6 +1307,7 @@ class Binary(http.Controller): cookies={'fileToken': token}) @http.route('/web/binary/upload', type='http', auth="user") + @serialize_exception def upload(self, callback, ufile): # TODO: might be useful to have a configuration flag for max-length file uploads out = """