Source code for pretalx.event.domain.plugins

# SPDX-FileCopyrightText: 2026-present Tobias Kunze
# SPDX-License-Identifier: AGPL-3.0-only WITH LicenseRef-Pretalx-AGPL-3.0-Terms

from pretalx.common.plugins import get_all_plugins


def apply_plugin_changes(event, modules) -> None:
    """Fire install/uninstall hooks and persist ``modules`` as ``event.plugins``."""
    plugins_active = set(event.plugin_list)
    available = {plugin.module: plugin for plugin in get_all_plugins(event)}
    target = set(modules) & (available.keys() | plugins_active)
    if target == plugins_active:
        return

    for module in target - plugins_active:
        if hasattr(available[module].app, "installed"):
            available[module].app.installed(event)
    for module in plugins_active - target:
        if module in available and hasattr(available[module].app, "uninstalled"):
            available[module].app.uninstalled(event)

    event.plugins = ",".join(target)
    event.save(update_fields=["plugins"])


[docs] def enable_plugin(event, module: str, *, user=None) -> None: """Activate ``module`` on ``event`` (no-op if already active).""" if module in event.plugin_list: return apply_plugin_changes(event, [*event.plugin_list, module]) event.log_action( "pretalx.event.plugins.enabled", person=user, data={"plugin": module}, orga=True )
[docs] def disable_plugin(event, module: str, *, user=None) -> None: """Deactivate ``module`` on ``event`` (no-op if not currently active).""" if module not in event.plugin_list: return apply_plugin_changes(event, [m for m in event.plugin_list if m != module]) event.log_action( "pretalx.event.plugins.disabled", person=user, data={"plugin": module}, orga=True, )