From cc7fae257f08210dca4484a7f62d663a580701c1 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Mon, 11 Jul 2011 14:49:58 +0200 Subject: [PATCH 1/2] [IMP] module.loading: attempt to load each module atomically within load_module_graph (untested, work-in-progress) bzr revid: odo@openerp.com-20110711124958-p91752exwv21sdf8 --- openerp/modules/loading.py | 58 +++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 17ae2dce3ef..5fc849d3248 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -88,14 +88,14 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= if new_query: cr.execute(new_query) - def load_init_xml(cr, m, idref, mode): - _load_data(cr, m, idref, mode, 'init_xml') + def load_init_xml(cr, module_name, idref, mode): + _load_data(cr, module_name, idref, mode, 'init_xml') - def load_update_xml(cr, m, idref, mode): - _load_data(cr, m, idref, mode, 'update_xml') + def load_update_xml(cr, module_name, idref, mode): + _load_data(cr, module_name, idref, mode, 'update_xml') - def load_demo_xml(cr, m, idref, mode): - _load_data(cr, m, idref, mode, 'demo_xml') + def load_demo_xml(cr, module_name, idref, mode): + _load_data(cr, module_name, idref, mode, 'demo_xml') def load_data(cr, module_name, idref, mode): _load_data(cr, module_name, idref, mode, 'data') @@ -156,34 +156,29 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= pool = pooler.get_pool(cr.dbname) migrations = openerp.modules.migration.MigrationManager(cr, graph) logger.notifyChannel('init', netsvc.LOG_DEBUG, 'loading %d packages..' % len(graph)) + modobj = pool.get('ir.module.module') - # register, instanciate and initialize models for each modules + # register, instantiate and initialize models for each modules for package in graph: - if skip_modules and package.name in skip_modules: + module_name = package.name + module_id = package.id + + if skip_modules and module_name in skip_modules: continue + logger.notifyChannel('init', netsvc.LOG_INFO, 'module %s: loading objects' % package.name) migrations.migrate_module(package, 'pre') register_module_classes(package.name) models = pool.instanciate(package.name, cr) if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'): init_module_models(cr, package.name, models) - cr.commit() - # load data for each modules - modobj = pool.get('ir.module.module') - for package in graph: - status['progress'] = (float(statusi)+0.1) / len(graph) - m = package.name - mid = package.id - - if skip_modules and m in skip_modules: - continue + status['progress'] = float(statusi) / len(graph) if perform_checks: - modobj.check(cr, 1, [mid]) + modobj.check(cr, 1, [module_id]) idref = {} - status['progress'] = (float(statusi)+0.4) / len(graph) mode = 'update' if hasattr(package, 'init') or package.state == 'to install': @@ -192,21 +187,21 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'): if package.state=='to upgrade': # upgrading the module information - modobj.write(cr, 1, [mid], modobj.get_values_from_terp(package.data)) - load_init_xml(cr, m, idref, mode) - load_update_xml(cr, m, idref, mode) - load_data(cr, m, idref, mode) + modobj.write(cr, 1, [module_id], modobj.get_values_from_terp(package.data)) + load_init_xml(cr, module_name, idref, mode) + load_update_xml(cr, module_name, idref, mode) + load_data(cr, module_name, idref, mode) if hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed'): status['progress'] = (float(statusi)+0.75) / len(graph) - load_demo_xml(cr, m, idref, mode) - load_demo(cr, m, idref, mode) - cr.execute('update ir_module_module set demo=%s where id=%s', (True, mid)) + load_demo_xml(cr, module_name, idref, mode) + load_demo(cr, module_name, idref, mode) + cr.execute('update ir_module_module set demo=%s where id=%s', (True, module_id)) # launch tests only in demo mode, as most tests will depend # on demo data. Other tests can be added into the regular # 'data' section, but should probably not alter the data, # as there is no rollback. - load_test(cr, m, idref, mode) + load_test(cr, module_name, idref, mode) processed_modules.append(package.name) @@ -214,17 +209,16 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= ver = release.major_version + '.' + package.data['version'] # Set new modules and dependencies - modobj.write(cr, 1, [mid], {'state': 'installed', 'latest_version': ver}) - cr.commit() + modobj.write(cr, 1, [module_id], {'state': 'installed', 'latest_version': ver}) # Update translations for all installed languages - modobj.update_translations(cr, 1, [mid], None) - cr.commit() + modobj.update_translations(cr, 1, [module_id], None) package.state = 'installed' for kind in ('init', 'demo', 'update'): if hasattr(package, kind): delattr(package, kind) + cr.commit() statusi += 1 cr.commit() From 0568b08beab54946452705dc1b82a0ad54747c01 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 11 Jul 2011 16:10:45 +0200 Subject: [PATCH 2/2] [FIX] loading: pool.get("ir.module.module") was done before it was available. bzr revid: vmt@openerp.com-20110711141045-c3pyqe0zuwxlljip --- openerp/modules/loading.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 5fc849d3248..fa17ced6daa 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -156,7 +156,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= pool = pooler.get_pool(cr.dbname) migrations = openerp.modules.migration.MigrationManager(cr, graph) logger.notifyChannel('init', netsvc.LOG_DEBUG, 'loading %d packages..' % len(graph)) - modobj = pool.get('ir.module.module') # register, instantiate and initialize models for each modules for package in graph: @@ -175,6 +174,10 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= status['progress'] = float(statusi) / len(graph) + # Can't put this line out of the loop: ir.module.module will be + # registered by init_module_models() above. + modobj = pool.get('ir.module.module') + if perform_checks: modobj.check(cr, 1, [module_id])