summaryrefslogtreecommitdiff
path: root/addons/website/models
diff options
context:
space:
mode:
authorRomain Derie <rde@odoo.com>2020-03-13 15:16:04 +0000
committerRomain Derie <rde@odoo.com>2020-03-19 15:37:44 +0000
commitf95af92ae3bc6bd7d7d4a9e09042bcca9f35ffec (patch)
treec7450ce70b88a7b0243206775b826c3afcb42d32 /addons/website/models
parent96486de1c140511aa6b09fa37d2b911c822d8c3d (diff)
[FIX] website: perf - prefetch every website menus in one go
Without this commit, the website menus would not be prefetch all in once. Thus, every call to `submenu` template (called recursively) would do SQL queries. One when accessing website.menu_id, then for every access on menu's child_ids. It would also make an extra request for groups since the menus have an ir.rule for that. with following structure, 13 SQL queries will be avoided, regardless if there is a group or not on the menus: - Top menu - Home - Contact us - Sub Contact us - Sub Sub Contact us Related to #47257 task-2211013 X-original-commit: 7fb016f9966bb5e2289ba17eacafb8887626514e
Diffstat (limited to 'addons/website/models')
-rw-r--r--addons/website/models/website.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index c8dd03d8107..270a6199c95 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -133,9 +133,18 @@ class Website(models.Model):
self.default_lang_id = language_ids[0]
def _compute_menu(self):
- Menu = self.env['website.menu']
for website in self:
- website.menu_id = Menu.search([('parent_id', '=', False), ('website_id', '=', website.id)], order='id', limit=1).id
+ menus = self.env['website.menu'].search([('website_id', '=', website.id)])
+
+ # use field parent_id (1 query) to determine field child_id (2 queries by level)"
+ for menu in menus:
+ menu._cache['child_id'] = ()
+ for menu in menus:
+ # don't add child menu if parent is forbidden
+ if menu.parent_id and menu.parent_id in menus:
+ menu.parent_id._cache['child_id'] += (menu.id,)
+
+ website.menu_id = menus and menus.filtered(lambda m: not m.parent_id)[0].id or False
@api.model
def create(self, vals):