From 1a16ecf8c23aaf133f1d48036188508538044700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 11 Dec 2013 12:23:04 +0100 Subject: [PATCH] [FIX] http: correctly handle the rollback when an exception is raised. Indeed dispathc serializes the exception, leading to the error being catched before we check and rollback the transaction. This commit fixes this. bzr revid: tde@openerp.com-20131211112304-m2591t7endfetptc --- openerp/http.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/openerp/http.py b/openerp/http.py index 12ca2e28f84..4205c578ba9 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -187,9 +187,16 @@ class WebRequest(object): @service_model.check def checked_call(dbname, *a, **kw): return self.func(*a, **kw) - if self.db: - return checked_call(self.db, *args, **kwargs) - return self.func(*args, **kwargs) + + # FIXME: code and rollback management could be cleaned + try: + if self.db: + return checked_call(self.db, *args, **kwargs) + return self.func(*args, **kwargs) + except Exception: + if self._cr: + self._cr.rollback() + raise @property def debug(self): @@ -401,13 +408,9 @@ class HttpRequest(WebRequest): self.params = params def dispatch(self): - try: - r = self._call_function(**self.params) - except (werkzeug.exceptions.HTTPException), e: - r = e - else: - if not r: - r = werkzeug.wrappers.Response(status=204) # no content + r = self._call_function(**self.params) + if not r: + r = werkzeug.wrappers.Response(status=204) # no content return r def make_response(self, data, headers=None, cookies=None):