diff options
| author | wan <wan@odoo.com> | 2019-10-01 08:28:42 +0000 |
|---|---|---|
| committer | Martin Trigaux <mat@odoo.com> | 2019-10-01 10:05:17 +0000 |
| commit | 63de98b9b4a329705a5faaab74bc641e6b29eb54 (patch) | |
| tree | fff61ab5fb72d1059190e069c0e0d137e09e40a8 /odoo/tools/misc.py | |
| parent | f28f787c10ad320b562610952f9e26279872f8b7 (diff) | |
[FIX] *: remove en_US as fallback for lang code
en_US may not be activated as it is possible to create a database in
another language using the database manager.
When trying to install a chart of account, the tax return entry tried
to format a date at the installation of the module, with no lang in
the context. The fallback was made on en_US but an error is raised if
that language is not activated.
As it is a very common scenario to retrieve a language from the
context, add a generic tool method to do it.
Replace and closes odoo/odoo#37629
closes odoo/odoo#37568
Signed-off-by: Martin Trigaux (mat) <mat@odoo.com>
Diffstat (limited to 'odoo/tools/misc.py')
| -rw-r--r-- | odoo/tools/misc.py | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py index a9268db1eed..b65cd23cf6f 100644 --- a/odoo/tools/misc.py +++ b/odoo/tools/misc.py @@ -1162,6 +1162,21 @@ else: def html_escape(text): return werkzeug.utils.escape(text) + +def get_lang(env, lang_code=False): + """ + Retrieve the first lang object installed, by checking the parameter lang_code, + the context and then the company. If no lang is installed from those variables, + fallback on the first lang installed in the system. + :param str lang_code: the locale (i.e. en_US) + :return res.lang: the first lang found that is installed on the system. + """ + langs = [code for code, _ in env['res.lang'].get_installed()] + for code in [lang_code, env.context.get('lang'), env.user.company_id.partner_id.lang, langs[0]]: + if code in langs: + return env['res.lang']._lang_get(code) + + def formatLang(env, value, digits=None, grouping=True, monetary=False, dp=False, currency_obj=False): """ Assuming 'Account' decimal.precision=3: @@ -1182,9 +1197,7 @@ def formatLang(env, value, digits=None, grouping=True, monetary=False, dp=False, if isinstance(value, str) and not value: return '' - langs = [code for code, _ in env['res.lang'].get_installed()] - lang_code = env.context['lang'] if env.context.get('lang') in langs else (env.user.company_id.partner_id.lang or langs[0]) - lang_obj = env['res.lang']._lang_get(lang_code) + lang_obj = get_lang(env) res = lang_obj.format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary) @@ -1221,7 +1234,7 @@ def format_date(env, value, lang_code=False, date_format=False): else: value = odoo.fields.Datetime.from_string(value) - lang = env['res.lang']._lang_get(lang_code or env.context.get('lang') or 'en_US') + lang = get_lang(env, lang_code) locale = babel.Locale.parse(lang.code) if not date_format: date_format = posix_to_ldml(lang.date_format, locale=locale) @@ -1240,7 +1253,7 @@ def parse_date(env, value, lang_code=False): :return: date object from the localized string :rtype: datetime.date ''' - lang = env['res.lang']._lang_get(lang_code or env.context.get('lang') or 'en_US') + lang = get_lang(env, lang_code) locale = babel.Locale.parse(lang.code) try: return babel.dates.parse_date(value, locale=locale) @@ -1271,8 +1284,7 @@ def format_datetime(env, value, tz=False, dt_format='medium', lang_code=False): except Exception: localized_datetime = utc_datetime - lang_code = lang_code or env.context.get('lang') or 'en_US' - lang = env['res.lang']._lang_get(lang_code) + lang = get_lang(env, lang_code) locale = babel.Locale.parse(lang.code or lang_code) # lang can be inactive, so `lang`is empty if not dt_format: @@ -1302,7 +1314,7 @@ def format_time(env, value, tz=False, time_format='medium', lang_code=False): if not value: return '' - lang = env['res.lang']._lang_get(lang_code or env.context.get('lang') or 'en_US') + lang = get_lang(env, lang_code) locale = babel.Locale.parse(lang.code) if not time_format: time_format = posix_to_ldml(lang.time_format, locale=locale) @@ -1320,7 +1332,7 @@ def _format_time_ago(env, time_delta, lang_code=False, add_direction=True): def format_amount(env, amount, currency, lang_code=False): fmt = "%.{0}f".format(currency.decimal_places) - lang = env['res.lang']._lang_get(lang_code or env.context.get('lang') or 'en_US') + lang = get_lang(env, lang_code) formatted_amount = lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}') |
