[FIX] http: force rolleback for failed http request
authorMartin Trigaux <mat@openerp.com>
Wed, 21 May 2014 17:12:37 +0000 (19:12 +0200)
committerMartin Trigaux <mat@openerp.com>
Wed, 21 May 2014 17:12:37 +0000 (19:12 +0200)
1st issue:
When an exception was raised, it was badly handled by the website in case of
website_enabled key. The response page was generated without calling super.
The WebRequest object being responsible to rollback the transaction in case
of errors.

2sd issue:
The _failed attribute is required to rollback the transaction in an WebRequest
object. Previously it was only set in the JsonRequest object (which inherit
from WebRequest), replace by call to super. The attribute _failed is now set
in the WebRequest object.

addons/website/models/ir_http.py
openerp/http.py

index 696734b..f724eb2 100644 (file)
@@ -99,6 +99,7 @@ class ir_http(orm.AbstractModel):
             werkzeug.exceptions.abort(werkzeug.utils.redirect(url))
 
     def _handle_exception(self, exception=None, code=500):
+        res = super(ir_http, self)._handle_exception(exception)
         if isinstance(exception, werkzeug.exceptions.HTTPException) and hasattr(exception, 'response') and exception.response:
             return exception.response
         if getattr(request, 'website_enabled', False) and request.website:
@@ -136,7 +137,7 @@ class ir_http(orm.AbstractModel):
                 html = request.website._render('website.http_error', values)
             return werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8')
 
-        return super(ir_http, self)._handle_exception(exception)
+        return res
 
 class ModelConverter(ir.ir_http.ModelConverter):
     def __init__(self, url_map, model=False):
index 24f538f..68c2067 100644 (file)
@@ -207,7 +207,7 @@ class WebRequest(object):
         """Called within an except block to allow converting exceptions
            to abitrary responses. Anything returned (except None) will
            be used as response.""" 
-        raise 
+        self._failed = exception # prevent tx commit
 
     def _call_function(self, *args, **kwargs):
         request = self
@@ -374,8 +374,8 @@ class JsonRequest(WebRequest):
         """Called within an except block to allow converting exceptions
            to abitrary responses. Anything returned (except None) will
            be used as response.""" 
+        super(JsonRequest, self)._handle_exception(exception)
         _logger.exception("Exception during JSON request handling.")
-        self._failed = exception # prevent tx commit            
         error = {
                 'code': 200,
                 'message': "OpenERP Server Error",