diff --git a/addons/base_setup/base_setup.py b/addons/base_setup/base_setup.py
index 38edf7accbf..1bafa7b6b9a 100644
--- a/addons/base_setup/base_setup.py
+++ b/addons/base_setup/base_setup.py
@@ -70,7 +70,7 @@ class base_setup_installer2(osv.osv_memory):
module_proxy = self.pool.get('ir.module.module')
module_ids = module_proxy.search(cr, uid, [], context=context)
for module in module_proxy.browse(cr, uid, module_ids, context=context):
- module_name = 'module_%s' % (module.name,)
+ module_name = 'module_%d' % (module.id,)
module_is_installed = module.state == 'installed'
fields[module_name] = {
'type' : 'boolean',
@@ -93,7 +93,7 @@ class base_setup_installer2(osv.osv_memory):
module_proxy = self.pool.get('ir.module.module')
module_ids = module_proxy.search(cr, uid, [], context=context)
for module in module_proxy.browse(cr, uid, module_ids, context=context):
- result['module_%s' % (module.name,)] = module.state == 'installed'
+ result['module_%d' % (module.id,)] = module.state == 'installed'
category_name = 'category_%d' % (module.category_id.id,)
if not result.get('category_name'):
result[category_name] = module.state == 'installed'
@@ -116,10 +116,16 @@ class base_setup_installer2(osv.osv_memory):
if module.state == 'installed':
readonly=True
+
+ attributes = {
+ 'name' : 'category_%d' % (module_category.id,),
+ 'on_change' : 'on_change_selection("category_%d")' % (module_category.id,),
+ }
if readonly:
- arch.append("""""" % (module_category.id, simplejson.dumps({'readonly' : True}),))
- else:
- arch.append('' % (module_category.id,))
+ attributes['modifiers'] = simplejson.dumps({'readonly' : True})
+
+ arch.append("""""" % (" ".join(["%s='%s'" % (key, value,)
+ for key, value in attributes.iteritems()]),))
# Compute the module to show
for module_category in module_category_proxy.browse(cr, uid, module_category_ids, context=context):
@@ -132,8 +138,8 @@ class base_setup_installer2(osv.osv_memory):
}
modifiers = simplejson.dumps(modifiers)
arch.append("""""" % (cgi.escape(module_category.name), modifiers))
- for module in module_category.module_ids:
- arch.append("""""" % (module.name, modifiers))
+ for module in module_category.module_ids:
+ arch.append("""""" % (module.id, modifiers))
arch.append(
''
@@ -146,24 +152,93 @@ class base_setup_installer2(osv.osv_memory):
arch.append('')
result['arch'] = ''.join(arch)
+ from pprint import pprint as pp
+ pp(result['arch'])
return result
+ def on_change_selection(self, cr, uid, ids, item, context=None):
+ if not isinstance(item, basestring):
+ return {}
+
+ if item.startswith('category_') or item.startswith('module_'):
+ object_name, identifier = item.split('_')
+ else:
+ return {}
+
+ values = {
+ }
+
+ #if object_name == 'category':
+ # module_ids = self.pool.get('ir.module.module').search(cr, uid, [('category_id', '=', int(identifier))], context=context)
+ # for module_id in module_ids:
+ # values['module_%d' % module_id] = 1
+
+ return {'value': values}
+
def create(self, cr, uid, values, context=None):
- modules_to_install = [ key[len('module_'):] for key, value in values.iteritems() if value == 1 and key.startswith('module_')]
+ module_ids_to_install = [
+ key.split('_')[1]
+ for key, value in values.iteritems()
+ if value == 1 and key.startswith('module_')
+ ]
+
values = {
'modules' : simplejson.dumps(modules_to_install),
}
- print "values: %r" % (values,)
context.update(dont_compute_virtual_attributes=True)
return super(base_setup_installer2, self).create(cr, uid, values, context=context)
- def apply_cb(self, cr, uid, ids, context=None):
+ def _get_modules_to_install(self, cr, uid, selected_modules, context=None):
+ STATES = ('installed',)
+
+ module_proxy = self.pool.get('ir.module.module')
+ module_ids = module_proxy.search(cr, uid, [], context=context)
+
+ modules = {}
+ for module in module_proxy.browse(cr, uid, module_ids, context=context):
+ modules[module.name] = {
+ 'state' : module.state,
+ 'depends' : module.depends,
+ }
+
+ installed_modules = []
+ for module, info in modules.iteritems():
+ info.setdefault('depends', [] if module == 'base' else ['base',])
+
+ if info['state'] in STATES:
+ installed_modules.append(module)
+ info['counter'] = 0
+ else:
+ info['counter'] = - len(set(info['depends']))
+
+ selected_modules = set(selected_modules + installed_modules) - set(['base'])
+
+ for selected_module in selected_modules:
+ for module, info in modules.iteritems():
+ if info['state'] not in STATES and \
+ (selected_module in info['depends'] or selected_module == module):
+ info['counter'] += 1
+
+ to_install_modules = set(module
+ for module, info in modules.iteritems()
+ if info['counter'] == 0 and
+ info['state'] not in STATES)
+
+ return to_install_modules
+
+ def apply_cb(self, cr, uid, ids, context=None):
for installer in self.browse(cr, uid, ids, context=context):
modules_to_install = simplejson.loads(installer.modules)
proxy = self.pool.get('ir.module.module')
- module_ids = proxy.search(cr, uid, [('name', 'in', modules_to_install)], context=context)
+ module_ids = proxy.search(cr, uid, [('id', 'in', modules_to_install)], context=context)
+ modules = set(record['name']
+ for record in proxy.read(cr, uid, module_ids, ['name'], context=context))
+
+ modules = self._get_modules_to_install(cr, uid, modules, context=context)
+
+ module_ids = proxy.search(cr, uid, [('name', 'in', modules)], context=context)
need_update = False
for module in proxy.browse(cr, uid, module_ids, context=context):