Setup and register ir and res modules earlier
This commit is contained in:
1 parent
a82b9d35d0
commit
ceb299a96a
1 file changed
+34
-15
@@ -159,7 +159,7 @@ def load_module_graph(graph, pool, update=None, lang=None, indexes=None):
|
||||
transaction.connection, t)
|
||||
with transaction.connection.cursor() as cursor:
|
||||
modules = [x.name for x in graph]
|
||||
module2state = dict()
|
||||
module2state = defaultdict(lambda: 'not activated')
|
||||
for sub_modules in tools.grouped_slice(modules):
|
||||
cursor.execute(*ir_module.select(ir_module.name, ir_module.state,
|
||||
where=ir_module.name.in_(list(sub_modules))))
|
||||
@@ -172,32 +172,51 @@ def load_module_graph(graph, pool, update=None, lang=None, indexes=None):
|
||||
[ir_module.name, ir_module.state],
|
||||
[[m, 'not activated'] for m in new_modules]))
|
||||
|
||||
def register_classes(classes, module):
|
||||
for type in list(classes.keys()):
|
||||
for cls in classes[type]:
|
||||
logger.info('%s register %s', module, cls.__name__)
|
||||
cls.__register__(module)
|
||||
|
||||
to_install_states = {'to activate', 'to upgrade'}
|
||||
early_modules = ['ir', 'res']
|
||||
early_classes = {}
|
||||
for module in early_modules:
|
||||
early_classes[module] = pool.fill(module, modules)
|
||||
if update:
|
||||
for module in early_modules:
|
||||
pool.setup(early_classes[module])
|
||||
for module in early_modules:
|
||||
if (is_module_to_install(module, update)
|
||||
or module2state[module] in to_install_states):
|
||||
register_classes(early_classes[module], module)
|
||||
|
||||
for node in graph:
|
||||
module = node.name
|
||||
if module not in MODULES:
|
||||
continue
|
||||
logger.info('%s load', module)
|
||||
classes = pool.fill(module, modules)
|
||||
if update:
|
||||
# Clear all caches to prevent _record with wrong schema to
|
||||
# linger
|
||||
transaction.cache.clear()
|
||||
pool.setup(classes)
|
||||
package_state = module2state.get(module, 'not activated')
|
||||
if module in early_modules:
|
||||
classes = early_classes[module]
|
||||
else:
|
||||
classes = pool.fill(module, modules)
|
||||
if update:
|
||||
# Clear all caches to prevent _record with wrong schema to
|
||||
# linger
|
||||
transaction.cache.clear()
|
||||
pool.setup(classes)
|
||||
package_state = module2state[module]
|
||||
if (is_module_to_install(module, update)
|
||||
or (update
|
||||
and package_state in ('to activate', 'to upgrade'))):
|
||||
if package_state not in ('to activate', 'to upgrade'):
|
||||
or (update and package_state in to_install_states)):
|
||||
if package_state not in to_install_states:
|
||||
if package_state == 'activated':
|
||||
package_state = 'to upgrade'
|
||||
elif package_state != 'to remove':
|
||||
package_state = 'to activate'
|
||||
for child in node:
|
||||
module2state[child.name] = package_state
|
||||
for type in list(classes.keys()):
|
||||
for cls in classes[type]:
|
||||
logger.info('%s register %s', module, cls.__name__)
|
||||
cls.__register__(module)
|
||||
if module not in early_modules:
|
||||
register_classes(classes, module)
|
||||
for model in classes['model']:
|
||||
if hasattr(model, '_history'):
|
||||
models_to_update_history.add(model.__name__)
|
||||
|
||||
Reference in new issue
Block a user