From 0105cbbcf9754fee3ec349a9e0bcb028d59e914f Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 1 Dec 2016 11:24:06 +0100 Subject: [PATCH] [FIX] website: make website default language required The website `default_lang_id` was not required, while the algorithm choosing the website language expects it to be required. This solves the below issue, when your browser language is en_US: - add a second language to the website (e.g. fr_BE or es_VE), - in the website settings, remove English from the languages - in the website settings, unset the default language - try to go on the website You will have a crash: ``` File "/home/odoo/src/odoo/saas-11/addons/website/models/ir_http.py", line 193, in _dispatch resp.set_cookie('website_lang', request.lang) File "/usr/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 992, in set_cookie self.charset)) File "/usr/lib/python2.7/dist-packages/werkzeug/http.py", line 905, in dump_cookie value = to_bytes(value, charset) File "/usr/lib/python2.7/dist-packages/werkzeug/_compat.py", line 106, in to_bytes raise TypeError('Expected bytes') TypeError: Expected bytes ``` This is because the `request.lang` is set to `False` because of the below algorithm in `ir_http.py`: ``` nearest_lang = not func and self.get_nearest_lang(path[1]) url_lang = nearest_lang and path[1] preferred_lang = ((cook_lang if cook_lang in langs else False) or self.get_nearest_lang(request.lang) or request.website.default_lang_code) is_a_bot = self.is_a_bot() request.lang = request.context['lang'] = nearest_lang or preferred_lang ``` `nearest_lang` is `False`, because there is no nearest language available for the browser lang (`en_US`) `cook_lang` is `False` for users who never went on the website `request.website.default_lang_code`, which is the last feedback, is also `False` because you removed the default language in the website settings. opw-695621 --- addons/website/models/res_config.py | 2 +- addons/website/models/website.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website/models/res_config.py b/addons/website/models/res_config.py index 1a85d66bd35..848b96f76c6 100644 --- a/addons/website/models/res_config.py +++ b/addons/website/models/res_config.py @@ -10,7 +10,7 @@ class website_config_settings(osv.osv_memory): 'website_name': fields.related('website_id', 'name', type="char", string="Website Name"), 'language_ids': fields.related('website_id', 'language_ids', type='many2many', relation='res.lang', string='Languages'), - 'default_lang_id': fields.related('website_id', 'default_lang_id', type='many2one', relation='res.lang', string='Default language'), + 'default_lang_id': fields.related('website_id', 'default_lang_id', type='many2one', relation='res.lang', string='Default language', required=True), 'default_lang_code': fields.related('website_id', 'default_lang_code', type="char", string="Default language code"), 'google_analytics_key': fields.related('website_id', 'google_analytics_key', type="char", string='Google Analytics Key'), diff --git a/addons/website/models/website.py b/addons/website/models/website.py index deb9eecce9c..03cce6fe927 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -154,7 +154,7 @@ class website(osv.osv): 'name': fields.char('Domain'), 'company_id': fields.many2one('res.company', string="Company"), 'language_ids': fields.many2many('res.lang', 'website_lang_rel', 'website_id', 'lang_id', 'Languages'), - 'default_lang_id': fields.many2one('res.lang', string="Default language"), + 'default_lang_id': fields.many2one('res.lang', string="Default language", required=True), 'default_lang_code': fields.related('default_lang_id', 'code', type="char", string="Default language code", store=True), 'social_twitter': fields.char('Twitter Account'), 'social_facebook': fields.char('Facebook Account'),