"""Collection of functionalities with an `includeme()` function to be used by
the Pyramid configurator or in the INI file."""
from __future__ import annotations
from sys import exit as sys_exit
from transaction import manager
from pyramid.config import Configurator
from ..lib.i18n import _, translate
from ..lib.config import settings_get_list
from ..modules import Module
from ..models import get_tm_dbsession
# =============================================================================
[docs]def load_includes(configurator: Configurator, includes: list | None = None):
"""Load modules with an `includeme()` function and fill
``configurator.registry['modules']`` ordered dictionary.
:type configurator: pyramid.config.Configurator
:param configurator:
Object used to do configuration declaration within the application.
:param list includes: (optional)
List of hard coding `includes`.
"""
# Load includes and modules
settings = configurator.get_settings()
if includes is None:
includes = []
includes += [
k for k in settings_get_list(settings, 'chrysalio.includes') if k
]
for include in includes:
try:
configurator.include(include)
except ImportError as error:
sys_exit(translate( # yapf: disable
_('*** Unable to load module "${m}" [${e}]', {
'm': include, 'e': error})))
# Check modules
if configurator.registry.get('modules'):
# Check conflicts
modules = configurator.registry['modules']
implementations, err = Module.check_conflicts(includes, modules)
if err is not None:
sys_exit(translate(err))
# Check dependencies
for module_id in modules:
err = modules[module_id].check_dependencies(implementations)
if err is not None:
sys_exit(translate(err))
# Check activations
activation = True
while activation:
activation = False
for module_id in modules:
activation |= modules[module_id].check_activations(
configurator.registry['modules_off'])
# Activate modules
with manager:
dbsession = get_tm_dbsession(
configurator.registry['dbsession_factory'], manager)
for module_id in modules:
if module_id not in configurator.registry['modules_off']:
configurator.registry['configurator'] = configurator
modules[module_id].activate(
configurator.registry, dbsession)