[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:
@@ -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()
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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'),
|
||||
|
||||
Reference in New Issue
Block a user