Currently, the menu are only translated for installed language when we create a new website. When we create a new menu (eg. by installing a module) or install a new language we will only translate menu without website_id set, so the menu are not translated. With this changeset, we try to match translation of menu without website_id to menu with website_id when translations are updated: - when a language is installed/updated - when a module is installed/updated Without the changeset, the added test would fail with: - "Menu in english" != "Menu en français" Load translation add missing translation from template menu - "Menu in french" != "Menu en français" Load translation with overwriting update existing menu from template fixes #43365 opw-2209864 closes #48031 closes odoo/odoo#50498 X-original-commit: 998987f8ee148235f4025eb97a424e838ac6fc9f Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com> Signed-off-by: Martin Trigaux (mat) <mat@odoo.com>
116 lines
4.8 KiB
Python
116 lines
4.8 KiB
Python
# coding: utf-8
|
|
from odoo.tests import common
|
|
|
|
|
|
class TestMenu(common.TransactionCase):
|
|
def setUp(self):
|
|
super(TestMenu, self).setUp()
|
|
self.nb_website = self.env['website'].search_count([])
|
|
|
|
def test_menu_got_duplicated(self):
|
|
Menu = self.env['website.menu']
|
|
total_menu_items = Menu.search_count([])
|
|
|
|
self.menu_root = Menu.create({
|
|
'name': 'Root',
|
|
})
|
|
|
|
self.menu_child = Menu.create({
|
|
'name': 'Child',
|
|
'parent_id': self.menu_root.id,
|
|
})
|
|
|
|
self.assertEqual(total_menu_items + self.nb_website * 2, Menu.search_count([]), "Creating a menu without a website_id should create this menu for every website_id")
|
|
|
|
def test_menu_count(self):
|
|
Menu = self.env['website.menu']
|
|
total_menu_items = Menu.search_count([])
|
|
|
|
top_menu = self.env['website'].get_current_website().menu_id
|
|
data = [
|
|
{
|
|
'id': 'new-1',
|
|
'parent_id': top_menu.id,
|
|
'name': 'New Menu Specific 1',
|
|
'url': '/new-specific-1',
|
|
'is_mega_menu': False,
|
|
},
|
|
{
|
|
'id': 'new-2',
|
|
'parent_id': top_menu.id,
|
|
'name': 'New Menu Specific 2',
|
|
'url': '/new-specific-2',
|
|
'is_mega_menu': False,
|
|
}
|
|
]
|
|
Menu.save(1, {'data': data, 'to_delete': []})
|
|
|
|
self.assertEqual(total_menu_items + 2, Menu.search_count([]), "Creating 2 new menus should create only 2 menus records")
|
|
|
|
def test_default_menu_for_new_website(self):
|
|
Website = self.env['website']
|
|
Menu = self.env['website.menu']
|
|
total_menu_items = Menu.search_count([])
|
|
|
|
# Simulating website.menu created on module install (blog, shop, forum..) that will be created on default menu tree
|
|
default_menu = self.env.ref('website.main_menu')
|
|
Menu.create({
|
|
'name': 'Sub Default Menu',
|
|
'parent_id': default_menu.id,
|
|
})
|
|
self.assertEqual(total_menu_items + 1 + self.nb_website, Menu.search_count([]), "Creating a default child menu should create it as such and copy it on every website")
|
|
|
|
# Ensure new website got a top menu
|
|
total_menus = Menu.search_count([])
|
|
Website.create({'name': 'new website'})
|
|
self.assertEqual(total_menus + 4, Menu.search_count([]), "New website's bootstraping should have duplicate default menu tree (Top/Home/Contactus/Sub Default Menu)")
|
|
|
|
def test_specific_menu_translation(self):
|
|
Translation = self.env['ir.translation']
|
|
Website = self.env['website']
|
|
Menu = self.env['website.menu']
|
|
existing_menus = Menu.search([])
|
|
|
|
default_menu = self.env.ref('website.main_menu')
|
|
template_menu = Menu.create({
|
|
'parent_id': default_menu.id,
|
|
'name': 'Menu in english',
|
|
'url': 'turlututu',
|
|
})
|
|
new_menus = Menu.search([]) - existing_menus
|
|
specific1, specific2 = new_menus.with_context(lang='fr_FR') - template_menu
|
|
|
|
# create fr_FR translation for template menu
|
|
self.env.ref('base.lang_fr').active = True
|
|
template_menu.with_context(lang='fr_FR').name = 'Menu en français'
|
|
Translation.search([
|
|
('name', '=', 'website.menu,name'), ('res_id', '=', template_menu.id),
|
|
]).module = 'website'
|
|
self.assertEqual(specific1.name, 'Menu in english',
|
|
'Translating template menu does not translate specific menu')
|
|
|
|
# have different translation for specific website
|
|
specific1.name = 'Menu in french'
|
|
|
|
# loading translation add missing specific translation
|
|
Translation._load_module_terms(['website'], ['fr_FR'])
|
|
Menu.invalidate_cache(['name'])
|
|
self.assertEqual(specific1.name, 'Menu in french',
|
|
'Load translation without overwriting keep existing translation')
|
|
self.assertEqual(specific2.name, 'Menu en français',
|
|
'Load translation add missing translation from template menu')
|
|
|
|
# loading translation with overwrite sync all translations from menu template
|
|
Translation._load_module_terms(['website'], ['fr_FR'], overwrite=True)
|
|
Menu.invalidate_cache(['name'])
|
|
self.assertEqual(specific1.name, 'Menu en français',
|
|
'Load translation with overwriting update existing menu from template')
|
|
|
|
def test_default_menu_unlink(self):
|
|
Menu = self.env['website.menu']
|
|
total_menu_items = Menu.search_count([])
|
|
|
|
default_menu = self.env.ref('website.main_menu')
|
|
default_menu.child_id[0].unlink()
|
|
self.assertEqual(total_menu_items - 1 - self.nb_website, Menu.search_count([]), "Deleting a default menu item should delete its 'copies' (same URL) from website's menu trees. In this case, the default child menu and its copies on website 1 and website 2")
|