32
32
_logger = logging.getLogger(__name__)
35
class res_config_module_installation_mixin(object):
36
def _install_modules(self, cr, uid, modules, context):
37
"""Install the requested modules.
38
return the next action to execute
40
modules is a list of tuples
41
(mod_name, browse_record | None)
43
ir_module = self.pool.get('ir.module.module')
45
to_install_missing_names = []
47
for name, module in modules:
49
to_install_missing_names.append(name)
50
elif module.state == 'uninstalled':
51
to_install_ids.append(module.id)
54
ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
56
if to_install_missing_names:
58
'type': 'ir.actions.client',
60
'params': {'modules': to_install_missing_names},
34
65
class res_config_configurable(osv.osv_memory):
35
66
''' Base classes for new-style configuration items
156
187
res_config_configurable()
158
class res_config_installer(osv.osv_memory):
189
class res_config_installer(osv.osv_memory, res_config_module_installation_mixin):
159
190
""" New-style configuration base specialized for addons selection
160
191
and installation.
355
386
def execute(self, cr, uid, ids, context=None):
356
modules = self.pool['ir.module.module']
357
387
to_install = list(self.modules_to_install(
358
388
cr, uid, ids, context=context))
359
389
_logger.info('Selecting addons %s to install', to_install)
360
modules.state_update(
362
modules.search(cr, uid, [('name','in',to_install)]),
363
'to install', ['uninstalled'], context=context)
365
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
366
openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
391
ir_module = self.pool.get('ir.module.module')
393
for name in to_install:
394
mod_ids = ir_module.search(cr, uid, [('name', '=', name)])
395
record = ir_module.browse(cr, uid, mod_ids[0], context) if mod_ids else None
396
modules.append((name, record))
398
return self._install_modules(cr, uid, modules, context=context)
368
400
res_config_installer()
404
436
ir_actions_configuration_wizard()
408
class res_config_settings(osv.osv_memory):
439
class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
409
440
""" Base configuration wizard for application settings. It provides support for setting
410
441
default values, assigning groups to employee users, and installing modules.
411
442
To make such a 'settings' wizard, define a model like::
529
560
getattr(self, method)(cr, uid, ids, context)
531
562
# module fields: install/uninstall the selected modules
532
to_install_missing_names = []
533
564
to_uninstall_ids = []
535
565
lm = len('module_')
536
566
for name, module in classified['module']:
539
# missing module, will be provided by apps.openerp.com
540
to_install_missing_names.append(name[lm:])
541
elif module.state == 'uninstalled':
542
# local module, to be installed
543
to_install_ids.append(module.id)
568
to_install.append((name[lm:], module))
545
570
if module and module.state in ('installed', 'to upgrade'):
546
571
to_uninstall_ids.append(module.id)
548
573
if to_uninstall_ids:
549
574
ir_module.button_immediate_uninstall(cr, uid, to_uninstall_ids, context=context)
551
ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
553
if to_install_missing_names:
555
'type': 'ir.actions.client',
557
'params': {'modules': to_install_missing_names},
576
action = self._install_modules(cr, uid, to_install, context=context)
560
580
# After the uninstall/install calls, the self.pool is no longer valid.
561
581
# So we reach into the RegistryManager directly.