diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 6bb45e77598..45a466e5462 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -24,36 +24,34 @@ """ -import os, sys, imp -from os.path import join as opj +import base64 +import imp import itertools +import logging +import os +import re +import sys +import zipfile import zipimport -import openerp - -import openerp.osv as osv -import openerp.tools as tools -import openerp.tools.osutil as osutil -from openerp.tools.safe_eval import safe_eval as eval -import openerp.pooler as pooler -from openerp.tools.translate import _ - -import openerp.netsvc as netsvc - -import zipfile -import openerp.release as release - -import re -import base64 -from zipfile import PyZipFile, ZIP_DEFLATED from cStringIO import StringIO +from os.path import join as opj +from zipfile import PyZipFile, ZIP_DEFLATED -import logging +import openerp import openerp.modules.db import openerp.modules.graph import openerp.modules.migration +import openerp.netsvc as netsvc +import openerp.osv as osv +import openerp.pooler as pooler +import openerp.release as release +import openerp.tools as tools +import openerp.tools.osutil as osutil +from openerp.tools.safe_eval import safe_eval as eval +from openerp.tools.translate import _ from openerp.modules.module import \ get_modules, get_modules_with_version, \ load_information_from_description_file, \ @@ -81,6 +79,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= :param skip_modules: optional list of module names (packages) which have previously been loaded and can be skipped :return: list of modules that were installed or updated """ + logger = logging.getLogger('init.load') def process_sql_file(cr, fp): queries = fp.read().split(';') for query in queries: @@ -88,28 +87,20 @@ 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, module_name, idref, mode): - _load_data(cr, module_name, idref, mode, 'init_xml') + load_init_xml = lambda *args: _load_data(cr, *args, kind='init_xml') + load_update_xml = lambda *args: _load_data(cr, *args, kind='update_xml') + load_demo_xml = lambda *args: _load_data(cr, *args, kind='demo_xml') + load_data = lambda *args: _load_data(cr, *args, kind='data') + load_demo = lambda *args: _load_data(cr, *args, kind='demo') - def load_update_xml(cr, module_name, idref, mode): - _load_data(cr, module_name, idref, mode, 'update_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') - - def load_demo(cr, module_name, idref, mode): - _load_data(cr, module_name, idref, mode, 'demo') - - def load_test(cr, module_name, idref, mode): + def load_test(module_name, idref, mode): cr.commit() if not tools.config.options['test_disable']: try: _load_data(cr, module_name, idref, mode, 'test') except Exception, e: - logging.getLogger('test').exception('Tests failed to execute in module %s', module_name) + logging.getLogger('init.test').exception( + 'Tests failed to execute in module %s', module_name) finally: if tools.config.options['test_commit']: cr.commit() @@ -126,8 +117,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= """ for filename in package.data[kind]: - log = logging.getLogger('init') - log.info("module %s: loading %s", module_name, filename) + logger.info("module %s: loading %s", module_name, filename) _, ext = os.path.splitext(filename) pathname = os.path.join(module_name, filename) fp = tools.file_open(pathname) @@ -153,20 +143,19 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= processed_modules = [] loaded_modules = [] - statusi = 0 pool = pooler.get_pool(cr.dbname) migrations = openerp.modules.migration.MigrationManager(cr, graph) - logger.notifyChannel('init', netsvc.LOG_DEBUG, 'loading %d packages..' % len(graph)) + logger.debug('loading %d packages...', len(graph)) # register, instantiate and initialize models for each modules - for package in graph: + for index, package in enumerate(graph): 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) + logger.info('module %s: loading objects', package.name) migrations.migrate_module(package, 'pre') register_module_classes(package.name) models = pool.instanciate(package.name, cr) @@ -174,7 +163,7 @@ 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'): init_module_models(cr, package.name, models) - status['progress'] = float(statusi) / len(graph) + status['progress'] = float(index) / len(graph) # Can't put this line out of the loop: ir.module.module will be # registered by init_module_models() above. @@ -193,20 +182,20 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= if package.state=='to upgrade': # upgrading the module information 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) + load_init_xml(module_name, idref, mode) + load_update_xml(module_name, idref, mode) + load_data(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, module_name, idref, mode) - load_demo(cr, module_name, idref, mode) + status['progress'] = (index + 0.75) / len(graph) + load_demo_xml(module_name, idref, mode) + load_demo(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, module_name, idref, mode) + load_test(module_name, idref, mode) processed_modules.append(package.name) @@ -224,7 +213,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules= delattr(package, kind) cr.commit() - statusi += 1 cr.commit() diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 40e7ccf1d69..c3b23a4dbb7 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -20,13 +20,17 @@ ############################################################################## import base64 +import locale +import logging import os +import platform import security +import sys import thread import threading import time -import sys -import platform +import traceback +from cStringIO import StringIO from openerp.tools.translate import _ import openerp.netsvc as netsvc import openerp.pooler as pooler @@ -34,9 +38,6 @@ import openerp.release as release import openerp.sql_db as sql_db import openerp.tools as tools import openerp.modules -import locale -import logging -from cStringIO import StringIO #.apidoc title: Exported Service methods #.apidoc module-mods: member-order: bysource @@ -47,6 +48,42 @@ from cStringIO import StringIO procedures to be called. Each method has its own arguments footprint. """ +# This should be moved to openerp.modules.db, along side initialize(). +def _initialize_db(serv, id, db_name, demo, lang, user_password): + cr = None + try: + serv.actions[id]['progress'] = 0 + cr = sql_db.db_connect(db_name).cursor() + openerp.modules.db.initialize(cr) # TODO this should be removed as it is done by pooler.restart_pool. + tools.config['lang'] = lang + cr.commit() + cr.close() + + pool = pooler.restart_pool(db_name, demo, serv.actions[id], + update_module=True)[1] + + cr = sql_db.db_connect(db_name).cursor() + + if lang: + modobj = pool.get('ir.module.module') + mids = modobj.search(cr, 1, [('state', '=', 'installed')]) + modobj.update_translations(cr, 1, mids, lang) + + cr.execute('UPDATE res_users SET password=%s, context_lang=%s, active=True WHERE login=%s', ( + user_password, lang, 'admin')) + cr.execute('SELECT login, password, name ' \ + ' FROM res_users ' \ + ' ORDER BY login') + serv.actions[id].update(users=cr.dictfetchall(), clean=True) + cr.commit() + cr.close() + except Exception, e: + serv.actions[id].update(clean=False, exception=e) + logging.getLogger('db.create').exception('CREATE DATABASE failed:') + serv.actions[id]['traceback'] = traceback.format_exc() + if cr: + cr.close() + class db(netsvc.ExportService): def __init__(self, name="db"): netsvc.ExportService.__init__(self, name) @@ -94,52 +131,8 @@ class db(netsvc.ExportService): self._create_empty_database(db_name) - class DBInitialize(object): - def __call__(self, serv, id, db_name, demo, lang, user_password='admin'): - cr = None - try: - serv.actions[id]['progress'] = 0 - cr = sql_db.db_connect(db_name).cursor() - openerp.modules.db.initialize(cr) # TODO this should be removed as it is done by pooler.restart_pool. - tools.config['lang'] = lang - cr.commit() - cr.close() - - pool = pooler.restart_pool(db_name, demo, serv.actions[id], - update_module=True)[1] - - cr = sql_db.db_connect(db_name).cursor() - - if lang: - modobj = pool.get('ir.module.module') - mids = modobj.search(cr, 1, [('state', '=', 'installed')]) - modobj.update_translations(cr, 1, mids, lang) - - cr.execute('UPDATE res_users SET password=%s, context_lang=%s, active=True WHERE login=%s', ( - user_password, lang, 'admin')) - cr.execute('SELECT login, password, name ' \ - ' FROM res_users ' \ - ' ORDER BY login') - serv.actions[id]['users'] = cr.dictfetchall() - serv.actions[id]['clean'] = True - cr.commit() - cr.close() - except Exception, e: - serv.actions[id]['clean'] = False - serv.actions[id]['exception'] = e - import traceback - e_str = StringIO() - traceback.print_exc(file=e_str) - traceback_str = e_str.getvalue() - e_str.close() - netsvc.Logger().notifyChannel('web-services', netsvc.LOG_ERROR, 'CREATE DATABASE\n%s' % (traceback_str)) - serv.actions[id]['traceback'] = traceback_str - if cr: - cr.close() - logger = netsvc.Logger() - logger.notifyChannel("web-services", netsvc.LOG_INFO, 'CREATE DATABASE: %s' % (db_name.lower())) - dbi = DBInitialize() - create_thread = threading.Thread(target=dbi, + logging.getLogger('db.create').info('CREATE DATABASE %s', db_name.lower()) + create_thread = threading.Thread(target=_initialize_db, args=(self, id, db_name, demo, lang, user_password)) create_thread.start() self.actions[id]['thread'] = create_thread