diff --git a/addons/web/http.py b/addons/web/http.py index 15a569a9225..67d71ac7d37 100644 --- a/addons/web/http.py +++ b/addons/web/http.py @@ -34,6 +34,9 @@ import openerp import session +import inspect +import functools + _logger = logging.getLogger(__name__) #---------------------------------------------------------- @@ -197,10 +200,10 @@ class JsonRequest(WebRequest): else: self.jsonrequest = simplejson.loads(request, object_hook=reject_nonliteral) self.init(self.jsonrequest.get("params", {})) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug("--> %s.%s\n%s", method.im_class.__name__, method.__name__, pprint.pformat(self.jsonrequest)) + #if _logger.isEnabledFor(logging.DEBUG): + # _logger.debug("--> %s.%s\n%s", method.im_class.__name__, method.__name__, pprint.pformat(self.jsonrequest)) response['id'] = self.jsonrequest.get('id') - response["result"] = method(self, **self.params) + response["result"] = method(**self.params) except session.AuthenticationError, e: se = serialize_exception(e) error = { @@ -292,9 +295,9 @@ class HttpRequest(WebRequest): akw[key] = value else: akw[key] = type(value) - _logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw) + #_logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw) try: - r = method(self, **self.params) + r = method(**self.params) except Exception, e: _logger.exception("An exception occured during an http request") se = serialize_exception(e) @@ -380,6 +383,19 @@ controllers_path = {} class ControllerType(type): def __init__(cls, name, bases, attrs): super(ControllerType, cls).__init__(name, bases, attrs) + + # create wrappers for old-style methods with req as first argument + cls._methods_wrapper = {} + for k, v in attrs.items(): + if inspect.isfunction(v): + spec = inspect.getargspec(v) + first_arg = spec.args[1] if len(spec.args) >= 2 else None + if first_arg in ["req", "request"]: + def build_new(nv): + return lambda self, *args, **kwargs: nv(self, request, *args, **kwargs) + cls._methods_wrapper[k] = build_new(v) + + # store the controller in the controllers list name_class = ("%s.%s" % (cls.__module__, cls.__name__), cls) controllers_class.append(name_class) path = attrs.get('_cp_path') @@ -397,6 +413,12 @@ class Controller(object): return object.__new__(cls) + def get_wrapped_method(self, name): + if name in self.__class__._methods_wrapper: + return functools.partial(self.__class__._methods_wrapper[name], self) + else: + return getattr(self, name) + #---------------------------------------------------------- # Session context manager #---------------------------------------------------------- @@ -625,6 +647,7 @@ class Root(object): method = getattr(c, method_name, None) if method: exposed = getattr(method, 'exposed', False) + method = c.get_wrapped_method(method_name) if exposed == 'json': _logger.debug("Dispatch json to %s %s %s", ps, c, method_name) def fct(_request): diff --git a/addons/web/tests/test_dataset.py b/addons/web/tests/test_dataset.py index b2879a70a5f..98c2f95447c 100644 --- a/addons/web/tests/test_dataset.py +++ b/addons/web/tests/test_dataset.py @@ -21,17 +21,17 @@ class TestDataSetController(unittest2.TestCase): self.read.return_value = [] self.assertEqual( - self.dataset.do_search_read(self.request, 'fake.model'), + self.dataset.do_search_read('fake.model'), {'records': [], 'length': 0}) self.read.assert_called_once_with( - [], False, self.request.context) + [], False, req.context) def test_regular_find(self): self.search.return_value = [1, 2, 3] - self.dataset.do_search_read(self.request, 'fake.model') + self.dataset.do_search_read('fake.model') self.read.assert_called_once_with( - [1, 2, 3], False,self.request.context) + [1, 2, 3], False, req.context) def test_ids_shortcut(self): self.search.return_value = [1, 2, 3] @@ -42,6 +42,6 @@ class TestDataSetController(unittest2.TestCase): ] self.assertEqual( - self.dataset.do_search_read(self.request, 'fake.model', ['id']), + self.dataset.do_search_read('fake.model', ['id']), {'records': [{'id': 1}, {'id': 2}, {'id': 3}], 'length': 3}) self.assertFalse(self.read.called) diff --git a/addons/web/tests/test_menu.py b/addons/web/tests/test_menu.py index 7a445740912..6c86efe2fc6 100644 --- a/addons/web/tests/test_menu.py +++ b/addons/web/tests/test_menu.py @@ -21,7 +21,7 @@ class LoadTest(unittest2.TestCase): # Have self.request.session.model() return a different mock object for # each model (but always the same mock for a given model name) models = collections.defaultdict(mock.Mock) - model = self.request.session.model.side_effect = \ + model = req.session.model.side_effect = \ lambda model_name: models[model_name] self.MockMenus = model('ir.ui.menu') @@ -31,7 +31,7 @@ class LoadTest(unittest2.TestCase): }] def tearDown(self): - del self.request + self.tmp_req.__exit__() del self.MockMenus del self.menu @@ -39,11 +39,11 @@ class LoadTest(unittest2.TestCase): self.MockMenus.search.return_value = [] self.MockMenus.read.return_value = [] - root = self.menu.load(self.request) + root = self.menu.load() self.MockMenus.search.assert_called_with( [('parent_id','=', False)], 0, False, False, - self.request.context) + req.context) self.assertEqual(root['all_menu_ids'], []) @@ -59,16 +59,16 @@ class LoadTest(unittest2.TestCase): {'id': 2, 'sequence': 3, 'parent_id': False}, ] - root = self.menu.load(self.request) + root = self.menu.load() self.MockMenus.search.assert_called_with( [('id','child_of', [1, 2, 3])], 0, False, False, - self.request.context) + req.context) self.MockMenus.read.assert_called_with( [1, 2, 3], ['name', 'sequence', 'parent_id', 'action'], - self.request.context) + req.context) self.assertEqual(root['all_menu_ids'], [1, 2, 3]) @@ -98,11 +98,11 @@ class LoadTest(unittest2.TestCase): {'id': 4, 'sequence': 2, 'parent_id': [2, '']}, ]) - root = self.menu.load(self.request) + root = self.menu.load() self.MockMenus.search.assert_called_with( [('id','child_of', [1])], 0, False, False, - self.request.context) + req.context) self.assertEqual(root['all_menu_ids'], [1, 2, 3, 4])