Files
odoo_source/addons/website/models/ir_translation.py
T
Olivier Dony 2ded82920e [FIX] website: repair "overwrite" mode for translation wizard
In the context of bug #43365, the fix merged in #48031 introduced an
override of `ir.translation._load_module_terms()`, which calls `super()`
then does some extra stuff.

This was forward-ported to later versions, unfortunately the
forward-ports missed the fact that the method signature changed at some
point (circa saas-13.2) and the `overwrite` flag which used to be passed
in the `context` had become an explicit method argument.

As a result, that argument is lost in the `super()` call and the
`website` module entirely disables the "overwrite" mode for the
translation loading wizard.

The fwd-port that seems to introduce the issue is odoo/odoo#50477 (998987f8ee148235f4025eb97a424e838ac6fc9f)

closes odoo/odoo#64251

X-original-commit: 26355a6bf83a194c2e398e859e49920da1f415b8
Signed-off-by: Olivier Dony (odo) <odo@openerp.com>
2021-01-08 10:40:26 +00:00

64 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class IrTranslation(models.Model):
_inherit = "ir.translation"
def _load_module_terms(self, modules, langs, overwrite=False):
""" Add missing website specific translation """
res = super()._load_module_terms(modules, langs, overwrite=overwrite)
if not langs or not modules:
return res
if overwrite:
conflict_clause = """
ON CONFLICT {}
DO UPDATE SET (name, lang, res_id, src, type, value, module, state, comments) =
(EXCLUDED.name, EXCLUDED.lang, EXCLUDED.res_id, EXCLUDED.src, EXCLUDED.type,
EXCLUDED.value, EXCLUDED.module, EXCLUDED.state, EXCLUDED.comments)
WHERE EXCLUDED.value IS NOT NULL AND EXCLUDED.value != ''
""";
else:
conflict_clause = " ON CONFLICT DO NOTHING"
# Add specific view translations
self.env.cr.execute("""
INSERT INTO ir_translation(name, lang, res_id, src, type, value, module, state, comments)
SELECT DISTINCT ON (specific.id, t.lang, md5(src)) t.name, t.lang, specific.id, t.src, t.type, t.value, t.module, t.state, t.comments
FROM ir_translation t
INNER JOIN ir_ui_view generic
ON t.type = 'model_terms' AND t.name = 'ir.ui.view,arch_db' AND t.res_id = generic.id
INNER JOIN ir_ui_view specific
ON generic.key = specific.key
WHERE t.lang IN %s and t.module IN %s
AND generic.website_id IS NULL AND generic.type = 'qweb'
AND specific.website_id IS NOT NULL""" + conflict_clause.format(
"(type, name, lang, res_id, md5(src))"
), (tuple(langs), tuple(modules)))
default_menu = self.env.ref('website.main_menu', raise_if_not_found=False)
if not default_menu:
return res
# Add specific menu translations
self.env.cr.execute("""
INSERT INTO ir_translation(name, lang, res_id, src, type, value, module, state, comments)
SELECT DISTINCT ON (s_menu.id, t.lang) t.name, t.lang, s_menu.id, t.src, t.type, t.value, t.module, t.state, t.comments
FROM ir_translation t
INNER JOIN website_menu o_menu
ON t.type = 'model' AND t.name = 'website.menu,name' AND t.res_id = o_menu.id
INNER JOIN website_menu s_menu
ON o_menu.name = s_menu.name AND o_menu.url = s_menu.url
INNER JOIN website_menu root_menu
ON s_menu.parent_id = root_menu.id AND root_menu.parent_id IS NULL
WHERE t.lang IN %s and t.module IN %s
AND o_menu.website_id IS NULL AND o_menu.parent_id = %s
AND s_menu.website_id IS NOT NULL""" + conflict_clause.format(
"(type, lang, name, res_id) WHERE type = 'model'"
), (tuple(langs), tuple(modules), default_menu.id))
return res