diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 97a9e11169e..9412ddce2be 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -649,7 +649,7 @@ class WebsiteSale(http.Controller):
if mode[0] == 'new':
new_values['company_id'] = request.website.company_id.id
- lang = request.lang if request.lang in request.website.mapped('language_ids.code') else None
+ lang = request.lang.code if request.lang.code in request.website.mapped('language_ids.code') else None
if lang:
new_values['lang'] = lang
if mode == ('edit', 'billing') and order.partner_id.type == 'contact':
diff --git a/addons/website_sale_stock/models/product_product.py b/addons/website_sale_stock/models/product_product.py
index 07a873fa1a7..8c33b40d895 100644
--- a/addons/website_sale_stock/models/product_product.py
+++ b/addons/website_sale_stock/models/product_product.py
@@ -2,7 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
-from odoo.http import request
+from odoo.addons.website.models import ir_http
class ProductProduct(models.Model):
@@ -11,7 +11,7 @@ class ProductProduct(models.Model):
cart_qty = fields.Integer(compute='_compute_cart_qty')
def _compute_cart_qty(self):
- website = request and getattr(request, 'website', None)
+ website = ir_http.get_request_website()
if not website:
self.cart_qty = 0
return
diff --git a/odoo/addons/base/models/res_lang.py b/odoo/addons/base/models/res_lang.py
index 22c6221b5c2..eccb6b09c93 100644
--- a/odoo/addons/base/models/res_lang.py
+++ b/odoo/addons/base/models/res_lang.py
@@ -28,6 +28,7 @@ class Lang(models.Model):
name = fields.Char(required=True)
code = fields.Char(string='Locale Code', required=True, help='This field is used to set/get locales for user')
iso_code = fields.Char(string='ISO code', help='This ISO code is the name of po files to use for translations')
+ url_code = fields.Char('URL Code', required=True, help='The Lang Code displayed in the URL')
active = fields.Boolean()
direction = fields.Selection([('ltr', 'Left-to-Right'), ('rtl', 'Right-to-Left')], required=True, default='ltr')
date_format = fields.Char(string='Date Format', required=True, default=DEFAULT_DATE_FORMAT)
@@ -50,6 +51,7 @@ class Lang(models.Model):
_sql_constraints = [
('name_uniq', 'unique(name)', 'The name of the language must be unique !'),
('code_uniq', 'unique(code)', 'The code of the language must be unique !'),
+ ('url_code_uniq', 'unique(url_code)', 'The URL code of the language must be unique !'),
]
@api.constrains('active')
@@ -181,6 +183,10 @@ class Lang(models.Model):
def _lang_get_id(self, code):
return self.with_context(active_test=True).search([('code', '=', code)]).id
+ @tools.ormcache('url_code')
+ def _lang_get_code(self, url_code):
+ return self.with_context(active_test=True).search([('url_code', '=', url_code)]).code or url_code
+
def _lang_get(self, code):
""" Return the language using this code if it is active """
return self.browse(self._lang_get_id(code))
@@ -198,7 +204,7 @@ class Lang(models.Model):
def get_available(self):
""" Return the available languages as a list of (code, name) sorted by name. """
langs = self.with_context(active_test=False).search([])
- return sorted([(lang.code, lang.name) for lang in langs], key=itemgetter(1))
+ return sorted([(lang.code, lang.url_code, lang.name) for lang in langs], key=itemgetter(2))
@api.model
@tools.ormcache()
@@ -218,6 +224,9 @@ class Lang(models.Model):
@api.model_create_multi
def create(self, vals_list):
self.clear_caches()
+ for vals in vals_list:
+ if not vals.get('url_code'):
+ vals['url_code'] = vals.get('iso_code') or vals['code']
return super(Lang, self).create(vals_list)
def write(self, vals):
diff --git a/odoo/addons/base/views/res_lang_views.xml b/odoo/addons/base/views/res_lang_views.xml
index 2f7b4990e90..483f2c1879f 100644
--- a/odoo/addons/base/views/res_lang_views.xml
+++ b/odoo/addons/base/views/res_lang_views.xml
@@ -9,6 +9,7 @@
+