[FIX] website: perf - ormcache the website menus

To avoid a SQL Query on hot state, the website menus ids are now prefetch.

Related to #47257
task-2211013

X-original-commit: 73421c27f01e7100403eaa72e027c34dbdf9f720
This commit is contained in:
Romain Derie
2020-03-19 15:37:48 +00:00
parent 9430dd1287
commit b98d9c968c
2 changed files with 14 additions and 1 deletions
+6 -1
View File
@@ -134,7 +134,7 @@ class Website(models.Model):
def _compute_menu(self):
for website in self:
menus = self.env['website.menu'].search([('website_id', '=', website.id)])
menus = self.env['website.menu'].browse(website._get_menu_ids())
# use field parent_id (1 query) to determine field child_id (2 queries by level)"
for menu in menus:
@@ -146,6 +146,11 @@ class Website(models.Model):
website.menu_id = menus and menus.filtered(lambda m: not m.parent_id)[0].id or False
# self.env.uid for ir.rule groups on menu
@tools.ormcache('self.env.uid', 'self.id')
def _get_menu_ids(self):
return self.env['website.menu'].search([('website_id', '=', self.id)]).ids
@api.model
def create(self, vals):
self._handle_favicon(vals)
+8
View File
@@ -68,6 +68,7 @@ class Menu(models.Model):
Be careful to return correct record for ir.model.data xml_id in case
of default main menus creation.
'''
self.clear_caches()
# Only used when creating website_data.xml default menu
if vals.get('url') == '/default-main-menu':
return super(Menu, self).create(vals)
@@ -91,7 +92,14 @@ class Menu(models.Model):
res = super(Menu, self).create(vals)
return res # Only one record is returned but multiple could have been created
def write(self, values):
res = super().write(values)
if 'website_id' in values:
self.clear_caches()
return res
def unlink(self):
self.clear_caches()
default_menu = self.env.ref('website.main_menu', raise_if_not_found=False)
menus_to_remove = self
for menu in self.filtered(lambda m: default_menu and m.parent_id.id == default_menu.id):