[FIX] mail: reset template translation
Before this commit: when reset template, the strategy is 1. write the template value from the data file with_context(lang=None) (some legacy translations may be kept, if their en_US values were not changed) 2. use the translations in the po file to override current translations But when a term is not translated in the po file (for example, all en_UK terms, since we don't have en.po), the old translation of the term cannot be overridden and reset After this commit: Thanks to the new feature introduced in #109858, the translation for a term can be voided before the step 2 As a result, translations for model translated fields can be correctly reset opw-3241014 closes odoo/odoo#121201 X-original-commit: 43afdc20d2fc01668ae2665240fc2be26b45ebf5 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com> Signed-off-by: Wang Chong (cwg) <cwg@odoo.com>
This commit is contained in:
@@ -89,11 +89,15 @@ class TemplateResetMixin(models.AbstractModel):
|
||||
user lang (all langs are not supported due to costly file operation). """
|
||||
expr = "//*[local-name() = $tag and (@id = $xml_id or @id = $external_id)]"
|
||||
templates_with_missing_source = []
|
||||
lang_false = {code: False for code, _ in self.env['res.lang'].get_installed() if code != 'en_US'}
|
||||
for template in self.filtered('template_fs'):
|
||||
external_id = template.get_external_id().get(template.id)
|
||||
module, xml_id = external_id.split('.')
|
||||
fullpath = get_resource_path(*template.template_fs.split('/'))
|
||||
if fullpath:
|
||||
for field_name, field in template._fields.items():
|
||||
if field.translate is True:
|
||||
template.update_field_translations(field_name, lang_false)
|
||||
doc = etree.parse(fullpath)
|
||||
for rec in doc.xpath(expr, tag='record', xml_id=xml_id, external_id=external_id):
|
||||
# We don't have a way to pass context while loading record from a file, so we use this hack
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
from markupsafe import Markup
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo.addons.mail.tests.common import MailCommon
|
||||
from odoo.exceptions import AccessError, ValidationError, UserError
|
||||
@@ -209,6 +210,50 @@ class TestMailTemplateReset(MailCommon):
|
||||
# subject is not there in the data file template, so it should be set to False
|
||||
self.assertFalse(mail_template.subject, "Subject should be set to False")
|
||||
|
||||
def test_mail_template_reset_translation(self):
|
||||
""" Test if a translated value can be reset correctly when its translation exists/doesn't exist in the po file of the directory """
|
||||
self._load('mail', 'tests', 'test_mail_template.xml')
|
||||
|
||||
self.env['res.lang']._activate_lang('en_UK')
|
||||
self.env['res.lang']._activate_lang('fr_FR')
|
||||
mail_template = self.env.ref('mail.mail_template_test').with_context(lang='en_US')
|
||||
mail_template.write({
|
||||
'body_html': '<div>Hello</div>',
|
||||
'name': 'Mail: Mail Template',
|
||||
})
|
||||
|
||||
mail_template.with_context(lang='en_UK').write({
|
||||
'body_html': '<div>Hello UK</div>',
|
||||
'name': 'Mail: Mail Template UK',
|
||||
})
|
||||
|
||||
context = {'default_template_ids': mail_template.ids, 'lang': 'fr_FR'}
|
||||
|
||||
def fake_load_file(translation_importer, filepath, lang, xmlids=None):
|
||||
""" a fake load file to mimic the use case when
|
||||
translations for fr_FR exist in the fr.po of the directory and
|
||||
no en.po in the directory
|
||||
"""
|
||||
if lang == 'fr_FR': # fr_FR has translations
|
||||
translation_importer.model_translations['mail.template'] = {
|
||||
'body_html': {'mail.mail_template_test': {'fr_FR': '<div>Hello Odoo FR</div>'}},
|
||||
'name': {'mail.mail_template_test': {'fr_FR': "Mail: Test Mail Template FR"}},
|
||||
}
|
||||
|
||||
with patch('odoo.tools.translate.TranslationImporter.load_file', fake_load_file):
|
||||
mail_template_reset = self.env['mail.template.reset'].with_context(context).create({})
|
||||
reset_action = mail_template_reset.reset_template()
|
||||
self.assertTrue(reset_action)
|
||||
|
||||
self.assertEqual(mail_template.body_html.strip(), Markup('<div>Hello Odoo</div>'))
|
||||
self.assertEqual(mail_template.with_context(lang='en_UK').body_html.strip(), Markup('<div>Hello Odoo</div>'))
|
||||
self.assertEqual(mail_template.with_context(lang='fr_FR').body_html.strip(), Markup('<div>Hello Odoo FR</div>'))
|
||||
|
||||
self.assertEqual(mail_template.name, 'Mail: Test Mail Template')
|
||||
self.assertEqual(mail_template.with_context(lang='en_UK').name, 'Mail: Test Mail Template')
|
||||
self.assertEqual(mail_template.with_context(lang='fr_FR').name, 'Mail: Test Mail Template FR')
|
||||
|
||||
|
||||
@tagged('-at_install', 'post_install')
|
||||
class TestConfigRestrictEditor(MailCommon):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user