diff --git a/addons/test_website/controllers/main.py b/addons/test_website/controllers/main.py index fad797d6984..259072c81ff 100644 --- a/addons/test_website/controllers/main.py +++ b/addons/test_website/controllers/main.py @@ -4,6 +4,7 @@ from odoo import http from odoo.http import request from odoo.addons.portal.controllers.web import Home +import json class WebsiteTest(Home): @@ -11,3 +12,27 @@ class WebsiteTest(Home): @http.route('/test_view', type='http', auth="public", website=True) def test_view(self, **kw): return request.render('test_website.test_view') + + @http.route('/ignore_args/converteronly//', type='http', auth="public", website=True) + def test_ignore_args_converter_only(self, a): + return request.make_response(json.dumps(dict(a=a, kw=None))) + + @http.route('/ignore_args/none', type='http', auth="public", website=True) + def test_ignore_args_none(self): + return request.make_response(json.dumps(dict(a=None, kw=None))) + + @http.route('/ignore_args/a', type='http', auth="public", website=True) + def test_ignore_args_a(self, a): + return request.make_response(json.dumps(dict(a=a, kw=None))) + + @http.route('/ignore_args/kw', type='http', auth="public", website=True) + def test_ignore_args_kw(self, a, **kw): + return request.make_response(json.dumps(dict(a=a, kw=kw))) + + @http.route('/ignore_args/converter//', type='http', auth="public", website=True) + def test_ignore_args_converter(self, a, b='youhou', **kw): + return request.make_response(json.dumps(dict(a=a, b=b, kw=kw))) + + @http.route('/ignore_args/converter//nokw', type='http', auth="public", website=True) + def test_ignore_args_converter_nokw(self, a, b='youhou'): + return request.make_response(json.dumps(dict(a=a, b=b))) diff --git a/addons/test_website/tests/__init__.py b/addons/test_website/tests/__init__.py index 57d8fcd0c25..40d4ece53e7 100644 --- a/addons/test_website/tests/__init__.py +++ b/addons/test_website/tests/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import test_controller_args from . import test_reset_views from . import test_views_during_module_operation diff --git a/addons/test_website/tests/test_controller_args.py b/addons/test_website/tests/test_controller_args.py new file mode 100644 index 00000000000..4204cb1e5b4 --- /dev/null +++ b/addons/test_website/tests/test_controller_args.py @@ -0,0 +1,31 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import odoo.tests + + +@odoo.tests.common.tagged('post_install', '-at_install') +class TestWebsiteControllerArgs(odoo.tests.HttpCase): + + def test_crawl_args(self): + req = self.url_open('/ignore_args/converter/valueA/?b=valueB&c=valueC') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': 'valueA', 'b': 'valueB', 'kw': {'c': 'valueC'}}) + + req = self.url_open('/ignore_args/converter/valueA/nokw?b=valueB&c=valueC') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': 'valueA', 'b': 'valueB'}) + + req = self.url_open('/ignore_args/converteronly/valueA/?b=valueB&c=valueC') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': 'valueA', 'kw': None}) + + req = self.url_open('/ignore_args/none?a=valueA&b=valueB') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': None, 'kw': None}) + + req = self.url_open('/ignore_args/a?a=valueA&b=valueB') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': 'valueA', 'kw': None}) + + req = self.url_open('/ignore_args/kw?a=valueA&b=valueB') + self.assertEquals(req.status_code, 200) + self.assertEquals(req.json(), {'a': 'valueA', 'kw': {'b': 'valueB'}}) diff --git a/odoo/http.py b/odoo/http.py index 3f4dd6fad27..d4b1aef8a1a 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -507,8 +507,16 @@ def route(route=None, **kw): else: routes = [route] routing['routes'] = routes + @functools.wraps(f) def response_wrap(*args, **kw): + # if controller cannot be called with extra args (utm, debug, ...), call endpoint ignoring them + spec = inspect.getargspec(f) + if not spec.keywords: + ignored = ['<%s=%s>' % (k, kw.pop(k)) for k in list(kw) if k not in spec.args] + if ignored: + _logger.info(" called ignoring args %s" % (f.__module__, f.__name__, ', '.join(ignored))) + response = f(*args, **kw) if isinstance(response, Response) or f.routing_type == 'json': return response