[IMP] web_planner: optimize method render of web.planner

This method generates many queries on:
 - `ir.module.module`, to known whether a given module is installed;
 - `ir.actions.act_window`, to know whether a given action exists.

Add a cache for both cases.  The number of queries is reduced by 90%.
This commit is contained in:
Raphael Collet
2015-09-15 14:34:31 +02:00
parent 45d53ec465
commit 84ade6a861
3 changed files with 37 additions and 5 deletions
+4 -5
View File
@@ -62,12 +62,11 @@ class Planner(models.Model):
params['model'] = 'ir.module.module'
# setting the module
if module_name:
module = self.env['ir.module.module'].sudo().search([('name', '=', module_name)], limit=1)
if module:
params['id'] = module.id
installed = self.env['ir.module.module']._installed()
if module_name in installed:
params['id'] = installed[module_name]
return "/web#%s" % (urlencode(params),)
@api.model
def is_module_installed(self, module_name=None):
count = self.env['ir.module.module'].sudo().search_count([('state', '=', 'installed'), ('name', '=', module_name)])
return bool(count)
return module_name in self.env['ir.module.module']._installed()
+22
View File
@@ -18,6 +18,7 @@ from openerp.osv import fields, osv
from openerp.osv.orm import browse_record
import openerp.report.interface
from openerp.report.report_sxw import report_sxw, report_rml
from openerp.tools import ormcache
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools.translate import _
import openerp.workflow
@@ -387,6 +388,27 @@ class ir_actions_act_window(osv.osv):
res_id = dataobj.browse(cr, uid, data_id, context).res_id
return self.read(cr, uid, [res_id], [], context)[0]
@openerp.api.model
def create(self, vals):
self.clear_caches()
return super(ir_actions_act_window, self).create(vals)
@openerp.api.multi
def unlink(self):
self.clear_caches()
return super(ir_actions_act_window, self).unlink()
@openerp.api.multi
def exists(self):
ids = self._existing()
return self.filtered(lambda rec: rec.id in ids)
@openerp.api.model
@ormcache()
def _existing(self):
self._cr.execute("SELECT id FROM %s" % self._table)
return set(row[0] for row in self._cr.fetchall())
VIEW_TYPES = [
('tree', 'Tree'),
('form', 'Form'),
+11
View File
@@ -29,6 +29,7 @@ import openerp.exceptions
from openerp import modules, tools
from openerp.modules.db import create_categories
from openerp.modules import get_module_resource
from openerp.tools import ormcache
from openerp.tools.parse_version import parse_version
from openerp.tools.translate import _
from openerp.osv import osv, orm, fields
@@ -328,6 +329,7 @@ class module(osv.osv):
#if ids_meta:
# self.pool.get('ir.model.data').unlink(cr, uid, ids_meta, context)
self.clear_caches()
return super(module, self).unlink(cr, uid, ids, context=context)
@staticmethod
@@ -806,6 +808,15 @@ class module(osv.osv):
if not mod.description:
_logger.warning('module %s: description is empty !', mod.name)
@api.model
@ormcache()
def _installed(self):
""" Return the set of installed modules as a dictionary {name: id} """
return {
module.name: module.id
for module in self.sudo().search([('state', '=', 'installed')])
}
DEP_STATES = [
('uninstallable', 'Uninstallable'),