[FIX] loading: pool.get("ir.module.module") was done before it was available.
[odoo/odoo.git] / openerp / modules / loading.py
index c370166..fa17ced 100644 (file)
@@ -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')
@@ -157,33 +157,31 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
     migrations = openerp.modules.migration.MigrationManager(cr, graph)
     logger.notifyChannel('init', netsvc.LOG_DEBUG, 'loading %d packages..' % len(graph))
 
-    # 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
+        status['progress'] = float(statusi) / len(graph)
 
-        if skip_modules and m in skip_modules:
-            continue
+        # 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, [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 +190,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 +212,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()
@@ -254,24 +251,23 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
 
     open_openerp_namespace()
 
+    force = []
+    if force_demo:
+        force.append('demo')
+
     cr = db.cursor()
-    if cr:
-        cr.execute("SELECT relname FROM pg_class WHERE relkind='r' AND relname='ir_module_module'")
-        if len(cr.fetchall())==0:
+    try:
+        if not openerp.modules.db.is_initialized(cr):
             logger.notifyChannel("init", netsvc.LOG_INFO, "init db")
             openerp.modules.db.initialize(cr)
             tools.config["init"]["all"] = 1
             tools.config['update']['all'] = 1
             if not tools.config['without_demo']:
                 tools.config["demo"]['all'] = 1
-    force = []
-    if force_demo:
-        force.append('demo')
 
-    # This is a brand new pool, just created in pooler.get_db_and_pool()
-    pool = pooler.get_pool(cr.dbname)
+        # This is a brand new pool, just created in pooler.get_db_and_pool()
+        pool = pooler.get_pool(cr.dbname)
 
-    try:
         processed_modules = []
         report = tools.assertion_report()
         # NOTE: Try to also load the modules that have been marked as uninstallable previously...