diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 56097594be7..28c0a0f8e85 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -1,17 +1,22 @@ - - My Website - - - - - - + - Top Menu - + Default Main Menu + /default-main-menu + + + Home + / + + 10 + + + Contact us + /contactus + + 60 @@ -35,16 +40,6 @@ / - - - - - Home - / - - 10 - - @@ -103,14 +98,6 @@ True - - Contact us - /contactus - - 60 - - - @@ -164,6 +151,15 @@ + + My Website + + + + + + + Website diff --git a/addons/website/data/website_demo.xml b/addons/website/data/website_demo.xml index 6eeab11eb95..cd7ab09f522 100644 --- a/addons/website/data/website_demo.xml +++ b/addons/website/data/website_demo.xml @@ -6,15 +6,6 @@ - - Contact us - /contactus - - 60 - - - - diff --git a/addons/website/models/website.py b/addons/website/models/website.py index caccec635fd..048e3aabc05 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -158,19 +158,27 @@ class Website(models.Model): self.homepage_id = self.env['website.page'].search([('website_id', '=', self.id), ('key', '=', standard_homepage.key)]) - top_menu = self.env['website.menu'].create({ - 'name': _('Top Menu for website %s') % self.id, - 'website_id': self.id, - 'sequence': 0 - }) - self.menu_id = top_menu.id - self.env['website.menu'].create({ - 'name': _('Home'), - 'url': '/', - 'website_id': self.id, - 'parent_id': top_menu.id, - 'sequence': 10 - }) + + # Bootstrap default menu hierarchy, create a new minimalist one if no default + default_menu = self.env.ref('website.main_menu') + self.copy_menu_hierarchy(default_menu) + + @api.model + def copy_menu_hierarchy(self, top_menu): + def copy_menu(menu, t_menu): + new_menu = menu.copy({ + 'parent_id': t_menu.id, + 'website_id': self.id, + }) + for submenu in menu.child_id: + copy_menu(submenu, new_menu) + for website in self: + new_top_menu = top_menu.copy({ + 'name': _('Top Menu for Website %s') % website.id, + 'website_id': website.id, + }) + for submenu in top_menu.child_id: + copy_menu(submenu, new_top_menu) @api.model def new_page(self, name=False, add_menu=False, template='website.default_page', ispage=True, namespace=None): @@ -383,7 +391,6 @@ class Website(models.Model): return dependencies - # ---------------------------------------------------------- # Languages # ---------------------------------------------------------- @@ -1071,7 +1078,13 @@ class Menu(models.Model): it for every website. Note: Particulary useful when installing a module that adds a menu like /shop. So every website has the shop menu. + Be careful to return correct record for ir.model.data xml_id in case + of default main menus creation. ''' + # Only used when creating website_data.xml default menu + if vals.get('url') == '/default-main-menu': + return super(Menu, self).create(vals) + if vals.get('website_id'): return super(Menu, self).create(vals) elif self._context.get('website_id'): @@ -1080,10 +1093,14 @@ class Menu(models.Model): else: # create for every site for website in self.env['website'].search([]): - vals.update({ + w_vals = dict(vals, **{ 'website_id': website.id, 'parent_id': website.menu_id.id, }) + res = super(Menu, self).create(w_vals) + # if creating a default menu, we should also save it as such + default_menu = self.env.ref('website.main_menu', raise_if_not_found=False) + if default_menu and vals.get('parent_id') == default_menu.id: res = super(Menu, self).create(vals) return res # Only one record is returned but multiple could have been created diff --git a/addons/website/tests/test_menu.py b/addons/website/tests/test_menu.py index 8ceab5b6bf5..c907b986171 100644 --- a/addons/website/tests/test_menu.py +++ b/addons/website/tests/test_menu.py @@ -4,14 +4,6 @@ from odoo.tests import common class TestMenu(common.TransactionCase): - def test_website_own_menu_container(self): - Website = self.env['website'] - Menu = self.env['website.menu'] - - total_menus = Menu.search_count([]) - Website.create({'name': 'new website'}) - self.assertEqual(total_menus + 2, Menu.search_count([]), "New website's bootstraping should have created a container menu and home menu") - def test_menu_got_duplicated(self): Menu = self.env['website.menu'] total_menu_items = Menu.search_count([]) @@ -49,3 +41,21 @@ class TestMenu(common.TransactionCase): 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 + 3, 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)")