diff --git a/trytond/trytond/modules/__init__.py b/trytond/trytond/modules/__init__.py index 3291d25a14..ce071a13ac 100644 --- a/trytond/trytond/modules/__init__.py +++ b/trytond/trytond/modules/__init__.py @@ -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__)