def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=None, report=None):
"""Migrates+Updates or Installs all module nodes from ``graph``
:param graph: graph of module nodes to load
- :param status: status dictionary for keeping track of progress
+ :param status: deprecated parameter, unused, left to avoid changing signature in 8.0
:param perform_checks: whether module descriptors should be checked for validity (prints warnings
for same cases)
:param skip_modules: optional list of module names (packages) which have previously been loaded and can be skipped
if kind in ('demo', 'test'):
threading.currentThread().testing = False
- if status is None:
- status = {}
-
processed_modules = []
loaded_modules = []
registry = openerp.registry(cr.dbname)
if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'):
registry.setup_models(cr)
init_module_models(cr, package.name, models)
- 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.
_load_data(cr, module_name, idref, mode, kind='data')
has_demo = hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed')
if has_demo:
- status['progress'] = (index + 0.75) / len(graph)
_load_data(cr, module_name, idref, mode, kind='demo')
cr.execute('update ir_module_module set demo=%s where id=%s', (True, module_id))
modobj.invalidate_cache(cr, SUPERUSER_ID, ['demo'], [module_id])
return processed_modules
def load_modules(db, force_demo=False, status=None, update_module=False):
- # TODO status['progress'] reporting is broken: used twice (and reset each
- # time to zero) in load_module_graph, not fine-grained enough.
- # It should be a method exposed by the registry.
initialize_sys_path()
force = []
_logger = logging.getLogger(__name__)
-self_actions = {}
-self_id = 0
-self_id_protect = threading.Semaphore()
-
class DatabaseExists(Warning):
pass
# This should be moved to openerp.modules.db, along side initialize().
def _initialize_db(id, db_name, demo, lang, user_password):
try:
- self_actions[id]['progress'] = 0
db = openerp.sql_db.db_connect(db_name)
with closing(db.cursor()) as cr:
# TODO this should be removed as it is done by RegistryManager.new().
cr.commit()
registry = openerp.modules.registry.RegistryManager.new(
- db_name, demo, self_actions[id], update_module=True)
+ db_name, demo, None, update_module=True)
with closing(db.cursor()) as cr:
if lang:
registry['res.users'].write(cr, SUPERUSER_ID, [SUPERUSER_ID], values)
cr.execute('SELECT login, password FROM res_users ORDER BY login')
- self_actions[id].update(users=cr.dictfetchall(), clean=True)
cr.commit()
-
except Exception, e:
- self_actions[id].update(clean=False, exception=e)
_logger.exception('CREATE DATABASE failed:')
- self_actions[id]['traceback'] = traceback.format_exc()
def dispatch(method, params):
if method in ['create', 'get_progress', 'drop', 'dump', 'restore', 'rename',
cr.autocommit(True) # avoid transaction block
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (name, chosen_template))
-def exp_create(db_name, demo, lang, user_password='admin'):
- self_id_protect.acquire()
- global self_id
- self_id += 1
- id = self_id
- self_id_protect.release()
-
- self_actions[id] = {'clean': False}
-
- _create_empty_database(db_name)
-
- _logger.info('CREATE DATABASE %s', db_name.lower())
- create_thread = threading.Thread(target=_initialize_db,
- args=(id, db_name, demo, lang, user_password))
- create_thread.start()
- self_actions[id]['thread'] = create_thread
- return id
-
def exp_create_database(db_name, demo, lang, user_password='admin'):
""" Similar to exp_create but blocking."""
- self_id_protect.acquire()
- global self_id
- self_id += 1
- id = self_id
- self_id_protect.release()
-
- self_actions[id] = {'clean': False}
-
_logger.info('Create database `%s`.', db_name)
_create_empty_database(db_name)
_initialize_db(id, db_name, demo, lang, user_password)
shutil.copytree(from_fs, to_fs)
return True
-def exp_get_progress(id):
- if self_actions[id]['thread'].isAlive():
-# return openerp.modules.init_progress[db_name]
- return min(self_actions[id].get('progress', 0), 0.95), []
- else:
- clean = self_actions[id]['clean']
- if clean:
- users = self_actions[id]['users']
- for user in users:
- # Remove the None passwords as they can't be marshalled by XML-RPC.
- if user['password'] is None:
- user['password'] = ''
- self_actions.pop(id)
- return 1.0, users
- else:
- a = self_actions.pop(id)
- exc, tb = a['exception'], a['traceback']
- raise Exception, exc, tb
-
-
def _drop_conn(cr, db_name):
# Try to terminate all other connections that might prevent
# dropping the database