diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index ec80c4924cb..8f1148f4dfa 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): redirect_code = "
" % url if request.httprequest.user_agent.browser == 'msie': @@ -1225,6 +1244,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. @@ -1258,6 +1278,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'] @@ -1291,6 +1312,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 = """