[MERGE] active becomes auto_install: install this module when its dependencies (that can be empty) are satisfied
bzr revid: al@openerp.com-20120130211001-ytqx759fl920uegc
This commit is contained in:
commit
562fbb3578
|
@ -97,7 +97,7 @@
|
|||
# 'test/test_ir_cron.yml', # <-- These tests perform a roolback.
|
||||
],
|
||||
'installable': True,
|
||||
'active': True,
|
||||
'auto_install': True,
|
||||
'certificate': '0076807797149',
|
||||
"css": [ 'static/src/css/modules.css' ],
|
||||
}
|
||||
|
|
|
@ -302,6 +302,7 @@ CREATE TABLE ir_module_module (
|
|||
web boolean DEFAULT FALSE,
|
||||
license character varying(32),
|
||||
sequence integer DEFAULT 100,
|
||||
auto_install boolean default False,
|
||||
primary key(id)
|
||||
);
|
||||
ALTER TABLE ir_module_module add constraint name_uniq unique (name);
|
||||
|
|
|
@ -192,6 +192,10 @@ class module(osv.osv):
|
|||
'sequence': fields.integer('Sequence'),
|
||||
'dependencies_id': fields.one2many('ir.module.module.dependency',
|
||||
'module_id', 'Dependencies', readonly=True),
|
||||
'auto_install': fields.boolean('Automatic Installation',
|
||||
help='An auto-installable module is automatically installed by the '
|
||||
'system when all its dependencies are satisfied. '
|
||||
'If the module has no dependency, it is always installed.'),
|
||||
'state': fields.selection([
|
||||
('uninstallable','Not Installable'),
|
||||
('uninstalled','Not Installed'),
|
||||
|
@ -318,20 +322,27 @@ class module(osv.osv):
|
|||
return demo
|
||||
|
||||
def button_install(self, cr, uid, ids, context=None):
|
||||
model_obj = self.pool.get('ir.model.data')
|
||||
|
||||
# Mark the given modules to be installed.
|
||||
self.state_update(cr, uid, ids, 'to install', ['uninstalled'], context)
|
||||
|
||||
categ = model_obj.get_object(cr, uid, 'base', 'module_category_hidden_links', context=context)
|
||||
todo = []
|
||||
for mod in categ.module_ids:
|
||||
if mod.state=='uninstalled':
|
||||
ok = True
|
||||
for dep in mod.dependencies_id:
|
||||
ok = ok and (dep.state in ('to install','installed'))
|
||||
if ok:
|
||||
todo.append(mod.id)
|
||||
if todo:
|
||||
self.button_install(cr, uid, todo, context=context)
|
||||
# Mark (recursively) the newly satisfied modules to also be installed:
|
||||
|
||||
# Select all auto-installable (but not yet installed) modules.
|
||||
domain = [('state', '=', 'uninstalled'), ('auto_install', '=', True),]
|
||||
uninstalled_ids = self.search(cr, uid, domain, context=context)
|
||||
uninstalled_modules = self.browse(cr, uid, uninstalled_ids, context=context)
|
||||
|
||||
# Keep those with all their dependencies satisfied.
|
||||
def all_depencies_satisfied(m):
|
||||
return all(x.state in ('to install', 'installed', 'to upgrade') for x in m.dependencies_id)
|
||||
to_install_modules = filter(all_depencies_satisfied, uninstalled_modules)
|
||||
to_install_ids = map(lambda m: m.id, to_install_modules)
|
||||
|
||||
# Mark them to be installed.
|
||||
if to_install_ids:
|
||||
self.button_install(cr, uid, to_install_ids, context=context)
|
||||
|
||||
return dict(ACTION_DICT, name=_('Install'))
|
||||
|
||||
def button_immediate_install(self, cr, uid, ids, context=None):
|
||||
|
@ -439,6 +450,7 @@ class module(osv.osv):
|
|||
'complexity': terp.get('complexity', ''),
|
||||
'sequence': terp.get('sequence', 100),
|
||||
'application': terp.get('application', False),
|
||||
'auto_install': terp.get('auto_install', False),
|
||||
}
|
||||
|
||||
# update the list of available packages
|
||||
|
|
|
@ -7,13 +7,6 @@
|
|||
<field name="visible" eval="0" />
|
||||
</record>
|
||||
|
||||
<record model="ir.module.category" id="module_category_hidden_links">
|
||||
<field name="parent_id" ref="module_category_hidden" />
|
||||
<field name="name">Links</field>
|
||||
<field name="sequence">0</field>
|
||||
<field name="visible" eval="0" />
|
||||
</record>
|
||||
|
||||
<record model="ir.module.category" id="module_category_localization">
|
||||
<field name="name">Localization</field>
|
||||
<field name="visible" eval="0" />
|
||||
|
|
|
@ -66,7 +66,7 @@ def initialize(cr):
|
|||
category_id = create_categories(cr, categories)
|
||||
|
||||
if info['installable']:
|
||||
if info['active']:
|
||||
if info['auto_install'] and not info['depends']:
|
||||
state = 'to install'
|
||||
else:
|
||||
state = 'uninstalled'
|
||||
|
@ -75,11 +75,12 @@ def initialize(cr):
|
|||
|
||||
cr.execute('INSERT INTO ir_module_module \
|
||||
(author, website, name, shortdesc, description, \
|
||||
category_id, state, certificate, web, license, complexity, application, icon, sequence) \
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING id', (
|
||||
category_id, auto_install, state, certificate, web, license, complexity, application, icon, sequence) \
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING id', (
|
||||
info['author'],
|
||||
info['website'], i, info['name'],
|
||||
info['description'], category_id, state, info['certificate'],
|
||||
info['description'], category_id,
|
||||
info['auto_install'], state, info['certificate'],
|
||||
info['web'],
|
||||
info['license'],
|
||||
info['complexity'], info['application'], info['icon'],
|
||||
|
|
|
@ -48,6 +48,8 @@ import logging
|
|||
import openerp.modules.db
|
||||
import openerp.modules.graph
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
_ad = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'addons') # default addons path (base)
|
||||
ad_paths = []
|
||||
|
||||
|
@ -317,9 +319,9 @@ def load_information_from_description_file(module):
|
|||
if os.path.isfile(terp_file) or zipfile.is_zipfile(mod_path+'.zip'):
|
||||
# default values for descriptor
|
||||
info = {
|
||||
'active': False,
|
||||
'application': False,
|
||||
'author': '',
|
||||
'auto_install': False,
|
||||
'category': 'Uncategorized',
|
||||
'certificate': None,
|
||||
'complexity': 'normal',
|
||||
|
@ -327,6 +329,7 @@ def load_information_from_description_file(module):
|
|||
'description': '',
|
||||
'icon': get_module_icon(module),
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'license': 'AGPL-3',
|
||||
'name': False,
|
||||
'post_load': None,
|
||||
|
@ -342,6 +345,10 @@ def load_information_from_description_file(module):
|
|||
with tools.file_open(terp_file) as terp_f:
|
||||
info.update(eval(terp_f.read()))
|
||||
|
||||
if 'active' in info:
|
||||
# 'active' has been renamed 'auto_install'
|
||||
info['auto_install'] = info['active']
|
||||
|
||||
return info
|
||||
|
||||
#TODO: refactor the logger in this file to follow the logging guidelines
|
||||
|
|
|
@ -10,6 +10,6 @@
|
|||
'depends': ['base'],
|
||||
'data': ['view.xml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -10,6 +10,6 @@
|
|||
'depends': ['base'],
|
||||
'data': [],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
Loading…
Reference in New Issue