diff --git a/addons/web_planner/models/web_planner.py b/addons/web_planner/models/web_planner.py index 2236486c0f1..15e462428c6 100644 --- a/addons/web_planner/models/web_planner.py +++ b/addons/web_planner/models/web_planner.py @@ -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() diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 2b19be7c479..ba2d4097f95 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -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'), diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py index 50331d0f1e6..db4cbe82069 100644 --- a/openerp/addons/base/module/module.py +++ b/openerp/addons/base/module/module.py @@ -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'),