When a view is: - a specific view (duplicated for a specific website) - inherited by a new view that is translated the inheriting view will also be duplicated, but the translation will only be created for the generic version and not the specific ones. With this changeset, we duplicate translation of arch_db terms of the generic view onto matching specific views. Without the change, added test fails with: AssertionError: '<div>hello</div>' != '<div>hi</div>' loading module translation copy translation from base to specific view fixes #51579 opw-2261278 closes #52451 closes odoo/odoo#53012 X-original-commit: 989d58d26f8803b40c1411cb97b0171b05d274d7 Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
64 lines
3.0 KiB
Python
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)
|
|
|
|
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
|