diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index bb7c22e40a2..64aad94c83e 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -40,27 +40,24 @@ class QWeb(orm.AbstractModel): URL_ATTRS = { 'form': 'action', 'a': 'href', - 'link': 'href', - 'frame': 'src', - 'iframe': 'src', - 'script': 'src', } - def add_template(self, into, name, node, context): + def add_template(self, qcontext, name, node): # preprocessing for multilang static urls - if request and 'url_for' in context: - router = request.httprequest.app.get_db_router(request.db).bind('') + if request.website: for tag, attr in self.URL_ATTRS.items(): for e in node.getElementsByTagName(tag): url = e.getAttribute(attr) if url: - try: - func = router.match(url)[0] - if func.multilang: - e.setAttribute(attr, context['url_for'](url)) - except Exception, e: - pass - super(QWeb, self).add_template(into, name, node, context) + e.setAttribute(attr, qcontext.get('url_for')(url)) + super(QWeb, self).add_template(qcontext, name, node) + + def render_att_att(self, element, attribute_name, attribute_value, qwebcontext): + att, val = super(QWeb, self).render_att_att(element, attribute_name, attribute_value, qwebcontext) + + if request.website and att == self.URL_ATTRS.get(element.nodeName) and isinstance(val, basestring): + val = qwebcontext.get('url_for')(val) + return att, val def get_converter_for(self, field_type): return self.pool.get( diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 7bed60d4300..8c291bcb1a4 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -25,34 +25,44 @@ from openerp.addons.web.http import request, LazyResponse logger = logging.getLogger(__name__) -def url_for(path_or_uri, lang=None, keep_query=None): +def keep_query(*args, **kw): + if not args and not kw: + args = ('*',) + params = kw.copy() + query_params = frozenset(werkzeug.url_decode(request.httprequest.query_string).keys()) + for keep_param in args: + for param in fnmatch.filter(query_params, keep_param): + if param not in params and param in request.params: + params[param] = request.params[param] + return werkzeug.urls.url_encode(params) + +def url_for(path_or_uri, lang=None): location = path_or_uri.strip() url = urlparse.urlparse(location) if request and not url.netloc and not url.scheme: location = urlparse.urljoin(request.httprequest.path, location) + force_lang = lang is not None lang = lang or request.context.get('lang') langs = [lg[0] for lg in request.website.get_languages()] - if location[0] == '/' and len(langs) > 1 and lang != request.website.default_lang_code: - ps = location.split('/') - if ps[1] in langs: - ps[1] = lang - else: - ps.insert(1, lang) - location = '/'.join(ps) - if keep_query: - url = urlparse.urlparse(location) - location = url.path - params = werkzeug.url_decode(url.query) - query_params = frozenset(werkzeug.url_decode(request.httprequest.query_string).keys()) - for kq in keep_query: - for param in fnmatch.filter(query_params, kq): - params[param] = request.params[param] - params = werkzeug.urls.url_encode(params) - if params: - location += '?%s' % params + if lang != request.website.default_lang_code and (force_lang or (location[0] == '/' and len(langs) > 1)): + if is_multilang_url(location): + ps = location.split('/') + if ps[1] in langs: + ps[1] = lang + else: + ps.insert(1, lang) + location = '/'.join(ps) return location +def is_multilang_url(path): + try: + router = request.httprequest.app.get_db_router(request.db).bind('') + func = router.match(path)[0] + return func.routing.get('multilang', False) + except Exception: + return False + def slugify(s, max_length=None): if slugify_lib: return slugify_lib.slugify(s, max_length) @@ -229,6 +239,7 @@ class website(osv.osv): json=simplejson, website=request.website, url_for=url_for, + keep_query=keep_query, slug=slug, res_company=request.website.company_id, user_id=user.browse(cr, uid, uid), diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 97e1c1d9fdb..8288f887938 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -114,7 +114,7 @@ @@ -171,13 +171,13 @@