diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py
index 988a50000cc..983761c8b8f 100644
--- a/addons/http_routing/models/ir_http.py
+++ b/addons/http_routing/models/ir_http.py
@@ -222,23 +222,29 @@ def is_multilang_url(local_url, lang_url_codes=None):
if spath[1] in lang_url_codes:
spath.pop(1)
local_url = '/'.join(spath)
- try:
- # Try to match an endpoint in werkzeug's routing table
- url = local_url.partition('#')[0].split('?')
- path = url[0]
- query_string = url[1] if len(url) > 1 else None
- router = request.httprequest.app.get_db_router(request.db).bind('')
- # Force to check method to POST. Odoo uses methods : ['POST'] and ['GET', 'POST']
- func = router.match(path, method='POST', query_args=query_string)[0]
- return (func.routing.get('website', False) and
+
+ url = local_url.partition('#')[0].split('?')
+ path = url[0]
+ query_string = url[1] if len(url) > 1 else None
+ router = request.httprequest.app.get_db_router(request.db).bind('')
+
+ def is_multilang_func(func):
+ return (func and func.routing.get('website', False) and
func.routing.get('multilang', func.routing['type'] == 'http'))
+ # Try to match an endpoint in werkzeug's routing table
+ try:
+ func = router.match(path, method='POST', query_args=query_string)[0]
+ return is_multilang_func(func)
+ except werkzeug.exceptions.MethodNotAllowed:
+ func = router.match(path, method='GET', query_args=query_string)[0]
+ return is_multilang_func(func)
except werkzeug.exceptions.NotFound:
# Consider /static/ files as non-multilang
static_index = path.find('/static/', 1)
if static_index != -1 and static_index == path.find('/', 1):
return False
return True
- except Exception as e:
+ except Exception:
return False
diff --git a/addons/test_website/controllers/main.py b/addons/test_website/controllers/main.py
index b95dfddd2a1..1973e363653 100644
--- a/addons/test_website/controllers/main.py
+++ b/addons/test_website/controllers/main.py
@@ -103,3 +103,19 @@ class WebsiteTest(Home):
@http.route('/test_access_denied_http', type='http', auth='public', website=True, sitemap=False)
def test_denied_error_http(self, **kwargs):
raise AccessDenied("This is an access denied http test")
+
+ @http.route(['/get'], type='http', auth="public", methods=['GET'], website=True, sitemap=False)
+ def get_method(self, **kw):
+ return request.make_response('get')
+
+ @http.route(['/post'], type='http', auth="public", methods=['POST'], website=True, sitemap=False)
+ def post_method(self, **kw):
+ return request.make_response('post')
+
+ @http.route(['/get_post'], type='http', auth="public", methods=['GET', 'POST'], website=True, sitemap=False)
+ def get_post_method(self, **kw):
+ return request.make_response('get_post')
+
+ @http.route(['/get_post_nomultilang'], type='http', auth="public", methods=['GET', 'POST'], website=True, multilang=False, sitemap=False)
+ def get_post_method_no_multilang(self, **kw):
+ return request.make_response('get_post_nomultilang')
diff --git a/addons/test_website/tests/__init__.py b/addons/test_website/tests/__init__.py
index 4fab1ec9b68..b7044f07875 100644
--- a/addons/test_website/tests/__init__.py
+++ b/addons/test_website/tests/__init__.py
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_controller_args
+from . import test_is_multilang
from . import test_reset_views
from . import test_error
from . import test_views_during_module_operation
diff --git a/addons/test_website/tests/test_is_multilang.py b/addons/test_website/tests/test_is_multilang.py
new file mode 100644
index 00000000000..69259f32054
--- /dev/null
+++ b/addons/test_website/tests/test_is_multilang.py
@@ -0,0 +1,26 @@
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+import odoo.tests
+import lxml
+
+
+@odoo.tests.common.tagged('post_install', '-at_install')
+class TestIsMultiLang(odoo.tests.HttpCase):
+
+ def test_01_is_multilang_url(self):
+ website = self.env['website'].search([], limit=1)
+ fr = self.env.ref('base.lang_fr').sudo()
+ en = self.env.ref('base.lang_en').sudo()
+
+ fr.active = True
+ fr_prefix = "/" + fr.iso_code
+
+ website.default_lang_id = en
+ website.language_ids = en + fr
+
+ for data in [None, {'post': True}]: # GET / POST
+ body = lxml.html.fromstring(self.url_open('/fr/multi_url', data=data).content)
+
+ self.assertEqual(fr_prefix + '/get', body.find('./a[@id="get"]').get('href'))
+ self.assertEqual(fr_prefix + '/post', body.find('./form[@id="post"]').get('action'))
+ self.assertEqual(fr_prefix + '/get_post', body.find('./a[@id="get_post"]').get('href'))
+ self.assertEqual('/get_post_nomultilang', body.find('./a[@id="get_post_nomultilang"]').get('href'))
diff --git a/addons/test_website/views/templates.xml b/addons/test_website/views/templates.xml
index 23e71565a55..9d12bd612a6 100644
--- a/addons/test_website/views/templates.xml
+++ b/addons/test_website/views/templates.xml
@@ -13,4 +13,23 @@
+
+
+ Multi URL test
+ /multi_url
+ False
+ qweb
+ test_website.multi_url
+ True
+
+
+
+
+
+