diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index 657895dc823..94db3fedc60 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -100,7 +100,7 @@ def slug(value): # NOTE: as the pattern is used as it for the ModelConverter (ir_http.py), do not use any flags -_UNSLUG_RE = re.compile(r'(?:(\w{1,2}|\w[A-Za-z0-9-_]+?\w)-)?(-?\d+)(?=$|/)') +_UNSLUG_RE = re.compile(r'(?:(\w{1,2}|\w[A-Za-z0-9-_]+?\w)-)?(-?\d+)(?=$|\/|#|\?)') def unslug(s): diff --git a/addons/website/tests/test_converter.py b/addons/website/tests/test_converter.py index 9a688c74ed9..6dac445cc4a 100644 --- a/addons/website/tests/test_converter.py +++ b/addons/website/tests/test_converter.py @@ -21,10 +21,16 @@ class TestUnslug(BaseCase): '--1': (None, None), 'foo---1': (None, None), 'foo1': (None, None), + # qs & anchor & trailing slash + 'foo-1/': ('foo', 1), + 'foo-1/?qs=1': ('foo', 1), + 'foo-1/#anchor': ('foo', 1), + 'foo-1?qs=1': ('foo', 1), + 'foo-1#anchor': ('foo', 1), } for slug, expected in tests.items(): - self.assertEqual(unslug(slug), expected) + self.assertEqual(unslug(slug), expected, "%r case failed" % slug) class TestTitleToSlug(BaseCase): """