Setup and register ir and res modules earlier

This commit is contained in:
Cédric Krier committed 2024-11-09 15:42:58 +01:00
1 parent a82b9d35d0
commit ceb299a96a
1 file changed
+34 -15
+34 -15
View File
@@ -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__)