[MERGE] some cleaning in module loading code, especially logging.
bzr revid: vmt@openerp.com-20110809120057-h5x68x1gd1ykeu36
This commit is contained in:
+39
-51
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user