summaryrefslogtreecommitdiff
path: root/addons/website/controllers/main.py
diff options
context:
space:
mode:
authorXavier Morel <xmo@odoo.com>2017-05-26 17:25:04 +0200
committerXavier Morel <xmo@odoo.com>2017-06-12 11:04:23 +0200
commita5283f90ce2cc8145ce536ab29984e1ea02a085c (patch)
tree667240c3654530b3627651abc20b856405b3406c /addons/website/controllers/main.py
parentb62ba7ee1adc8e3c41040cafde30c2c93154ce69 (diff)
[FIX] P3: QueryURL relying on kw iteration order
Diffstat (limited to 'addons/website/controllers/main.py')
-rw-r--r--addons/website/controllers/main.py18
1 files changed, 10 insertions, 8 deletions
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 2f97218ce72..e0eb3c34c3a 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -20,7 +20,7 @@ from odoo.http import request
from odoo.addons.website.models.website import slug
from odoo.addons.web.controllers.main import WebClient, Binary, Home
-from odoo.tools import pycompat
+from odoo.tools import pycompat, OrderedSet
logger = logging.getLogger(__name__)
@@ -34,27 +34,29 @@ class QueryURL(object):
def __init__(self, path='', path_args=None, **args):
self.path = path
self.args = args
- self.path_args = set(path_args or [])
+ self.path_args = OrderedSet(path_args or [])
def __call__(self, path=None, path_args=None, **kw):
path = path or self.path
for key, value in pycompat.items(self.args):
kw.setdefault(key, value)
- path_args = set(path_args or []).union(self.path_args)
- paths, fragments = [], []
+ path_args = OrderedSet(path_args or []) | self.path_args
+ paths, fragments = {}, []
for key, value in pycompat.items(kw):
if value and key in path_args:
if isinstance(value, models.BaseModel):
- paths.append((key, slug(value)))
+ paths[key] = slug(value)
else:
- paths.append((key, value))
+ paths[key] = u"%s" % value
elif value:
if isinstance(value, list) or isinstance(value, set):
fragments.append(werkzeug.url_encode([(key, item) for item in value]))
else:
fragments.append(werkzeug.url_encode([(key, value)]))
- for key, value in paths:
- path += '/' + key + '/%s' % value
+ for key in path_args:
+ value = paths.get(key)
+ if value is not None:
+ path += '/' + key + '/' + value
if fragments:
path += '?' + '&'.join(fragments)
return path