root: simplify task signal imports (#8454)
* *: deduplicate boilerplate for importing related models Signed-off-by: Jens Langhammer <jens@goauthentik.io> * also auto-import .checks Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix error during prometheus metrics from #8435 Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
		@ -15,7 +15,3 @@ class AuthentikAdminConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_admin"
 | 
			
		||||
    verbose_name = "authentik Admin"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_admin_signals(self):
 | 
			
		||||
        """Load admin signals"""
 | 
			
		||||
        self.import_module("authentik.admin.signals")
 | 
			
		||||
 | 
			
		||||
@ -21,10 +21,27 @@ class ManagedAppConfig(AppConfig):
 | 
			
		||||
        self.logger = get_logger().bind(app_name=app_name)
 | 
			
		||||
 | 
			
		||||
    def ready(self) -> None:
 | 
			
		||||
        self.import_related()
 | 
			
		||||
        self.reconcile_global()
 | 
			
		||||
        self.reconcile_tenant()
 | 
			
		||||
        return super().ready()
 | 
			
		||||
 | 
			
		||||
    def import_related(self):
 | 
			
		||||
        """Automatically import related modules which rely on just being imported
 | 
			
		||||
        to register themselves (mainly django signals and celery tasks)"""
 | 
			
		||||
 | 
			
		||||
        def import_relative(rel_module: str):
 | 
			
		||||
            try:
 | 
			
		||||
                module_name = f"{self.name}.{rel_module}"
 | 
			
		||||
                import_module(module_name)
 | 
			
		||||
                self.logger.info("Imported related module", module=module_name)
 | 
			
		||||
            except ModuleNotFoundError:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
        import_relative("checks")
 | 
			
		||||
        import_relative("tasks")
 | 
			
		||||
        import_relative("signals")
 | 
			
		||||
 | 
			
		||||
    def import_module(self, path: str):
 | 
			
		||||
        """Load module"""
 | 
			
		||||
        import_module(path)
 | 
			
		||||
 | 
			
		||||
@ -14,10 +14,6 @@ class AuthentikCoreConfig(ManagedAppConfig):
 | 
			
		||||
    mountpoint = ""
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_core_signals(self):
 | 
			
		||||
        """Load core signals"""
 | 
			
		||||
        self.import_module("authentik.core.signals")
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_debug_worker_hook(self):
 | 
			
		||||
        """Dispatch startup tasks inline when debugging"""
 | 
			
		||||
        if settings.DEBUG:
 | 
			
		||||
 | 
			
		||||
@ -17,10 +17,6 @@ class AuthentikCryptoConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Crypto"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_crypto_tasks(self):
 | 
			
		||||
        """Load crypto tasks"""
 | 
			
		||||
        self.import_module("authentik.crypto.tasks")
 | 
			
		||||
 | 
			
		||||
    def _create_update_cert(self):
 | 
			
		||||
        from authentik.crypto.builder import CertificateBuilder
 | 
			
		||||
        from authentik.crypto.models import CertificateKeyPair
 | 
			
		||||
 | 
			
		||||
@ -17,10 +17,6 @@ class AuthentikEnterpriseConfig(EnterpriseConfig):
 | 
			
		||||
    verbose_name = "authentik Enterprise"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_enterprise_signals(self):
 | 
			
		||||
        """Load enterprise signals"""
 | 
			
		||||
        self.import_module("authentik.enterprise.signals")
 | 
			
		||||
 | 
			
		||||
    def enabled(self):
 | 
			
		||||
        """Return true if enterprise is enabled and valid"""
 | 
			
		||||
        return self.check_enabled() or settings.TEST
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,3 @@ class AuthentikEnterpriseProviderRAC(EnterpriseConfig):
 | 
			
		||||
    default = True
 | 
			
		||||
    mountpoint = ""
 | 
			
		||||
    ws_mountpoint = "authentik.enterprise.providers.rac.urls"
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_rac_signals(self):
 | 
			
		||||
        """Load rac signals"""
 | 
			
		||||
        self.import_module("authentik.enterprise.providers.rac.signals")
 | 
			
		||||
 | 
			
		||||
@ -5,9 +5,9 @@ from celery.schedules import crontab
 | 
			
		||||
from authentik.lib.utils.time import fqdn_rand
 | 
			
		||||
 | 
			
		||||
CELERY_BEAT_SCHEDULE = {
 | 
			
		||||
    "enterprise_calculate_license": {
 | 
			
		||||
        "task": "authentik.enterprise.tasks.calculate_license",
 | 
			
		||||
        "schedule": crontab(minute=fqdn_rand("calculate_license"), hour="*/2"),
 | 
			
		||||
    "enterprise_update_usage": {
 | 
			
		||||
        "task": "authentik.enterprise.tasks.enterprise_update_usage",
 | 
			
		||||
        "schedule": crontab(minute=fqdn_rand("enterprise_update_usage"), hour="*/2"),
 | 
			
		||||
        "options": {"queue": "authentik_scheduled"},
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,12 @@
 | 
			
		||||
"""Enterprise tasks"""
 | 
			
		||||
 | 
			
		||||
from authentik.enterprise.models import LicenseKey
 | 
			
		||||
from authentik.events.system_tasks import SystemTask
 | 
			
		||||
from authentik.events.system_tasks import SystemTask, prefill_task
 | 
			
		||||
from authentik.root.celery import CELERY_APP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@CELERY_APP.task(base=SystemTask)
 | 
			
		||||
def calculate_license():
 | 
			
		||||
    """Calculate licensing status"""
 | 
			
		||||
@CELERY_APP.task(bind=True, base=SystemTask)
 | 
			
		||||
@prefill_task
 | 
			
		||||
def enterprise_update_usage(self: SystemTask):
 | 
			
		||||
    """Update enterprise license status"""
 | 
			
		||||
    LicenseKey.get_total().record_usage()
 | 
			
		||||
 | 
			
		||||
@ -35,10 +35,6 @@ class AuthentikEventsConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Events"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_events_signals(self):
 | 
			
		||||
        """Load events signals"""
 | 
			
		||||
        self.import_module("authentik.events.signals")
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_check_deprecations(self):
 | 
			
		||||
        """Check for config deprecations"""
 | 
			
		||||
        from authentik.events.models import Event, EventAction
 | 
			
		||||
 | 
			
		||||
@ -642,17 +642,16 @@ class SystemTask(SerializerModel, ExpiringModel):
 | 
			
		||||
 | 
			
		||||
    def update_metrics(self):
 | 
			
		||||
        """Update prometheus metrics"""
 | 
			
		||||
        duration = max(self.finish_timestamp - self.start_timestamp, 0)
 | 
			
		||||
        # TODO: Deprecated metric - remove in 2024.2 or later
 | 
			
		||||
        GAUGE_TASKS.labels(
 | 
			
		||||
            tenant=connection.schema_name,
 | 
			
		||||
            task_name=self.name,
 | 
			
		||||
            task_uid=self.uid or "",
 | 
			
		||||
            status=self.status.lower(),
 | 
			
		||||
        ).set(duration)
 | 
			
		||||
        ).set(self.duration)
 | 
			
		||||
        SYSTEM_TASK_TIME.labels(
 | 
			
		||||
            tenant=connection.schema_name,
 | 
			
		||||
        ).observe(duration)
 | 
			
		||||
        ).observe(self.duration)
 | 
			
		||||
        SYSTEM_TASK_STATUS.labels(
 | 
			
		||||
            tenant=connection.schema_name,
 | 
			
		||||
            task_name=self.name,
 | 
			
		||||
 | 
			
		||||
@ -31,10 +31,6 @@ class AuthentikFlowsConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Flows"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_flows_signals(self):
 | 
			
		||||
        """Load flows signals"""
 | 
			
		||||
        self.import_module("authentik.flows.signals")
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_stages(self):
 | 
			
		||||
        """Ensure all stages are loaded"""
 | 
			
		||||
        from authentik.flows.models import Stage
 | 
			
		||||
 | 
			
		||||
@ -30,10 +30,6 @@ class AuthentikOutpostConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Outpost"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_outposts_signals(self):
 | 
			
		||||
        """Load outposts signals"""
 | 
			
		||||
        self.import_module("authentik.outposts.signals")
 | 
			
		||||
 | 
			
		||||
    def reconcile_tenant_embedded_outpost(self):
 | 
			
		||||
        """Ensure embedded outpost"""
 | 
			
		||||
        from authentik.outposts.models import (
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,3 @@ class AuthentikPoliciesConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_policies"
 | 
			
		||||
    verbose_name = "authentik Policies"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_policies_signals(self):
 | 
			
		||||
        """Load policies signals"""
 | 
			
		||||
        self.import_module("authentik.policies.signals")
 | 
			
		||||
 | 
			
		||||
@ -12,11 +12,3 @@ class AuthentikPolicyReputationConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_policies_reputation"
 | 
			
		||||
    verbose_name = "authentik Policies.Reputation"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_policies_reputation_signals(self):
 | 
			
		||||
        """Load policies.reputation signals"""
 | 
			
		||||
        self.import_module("authentik.policies.reputation.signals")
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_policies_reputation_tasks(self):
 | 
			
		||||
        """Load policies.reputation tasks"""
 | 
			
		||||
        self.import_module("authentik.policies.reputation.tasks")
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikProviderProxyConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_providers_proxy"
 | 
			
		||||
    verbose_name = "authentik Providers.Proxy"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_providers_proxy_signals(self):
 | 
			
		||||
        """Load proxy signals"""
 | 
			
		||||
        self.import_module("authentik.providers.proxy.signals")
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikProviderSCIMConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_providers_scim"
 | 
			
		||||
    verbose_name = "authentik Providers.SCIM"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_signals(self):
 | 
			
		||||
        """Load signals"""
 | 
			
		||||
        self.import_module("authentik.providers.scim.signals")
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikRBACConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_rbac"
 | 
			
		||||
    verbose_name = "authentik RBAC"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_rbac_signals(self):
 | 
			
		||||
        """Load rbac signals"""
 | 
			
		||||
        self.import_module("authentik.rbac.signals")
 | 
			
		||||
 | 
			
		||||
@ -69,7 +69,6 @@ TENANT_APPS = [
 | 
			
		||||
    "authentik.admin",
 | 
			
		||||
    "authentik.api",
 | 
			
		||||
    "authentik.crypto",
 | 
			
		||||
    "authentik.events",
 | 
			
		||||
    "authentik.flows",
 | 
			
		||||
    "authentik.outposts",
 | 
			
		||||
    "authentik.policies.dummy",
 | 
			
		||||
@ -509,5 +508,9 @@ try:
 | 
			
		||||
except ImportError:
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
# Import events after other apps since it relies on tasks and other things from all apps
 | 
			
		||||
# being imported for @prefill_task
 | 
			
		||||
TENANT_APPS.append("authentik.events")
 | 
			
		||||
 | 
			
		||||
SHARED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
 | 
			
		||||
INSTALLED_APPS = list(OrderedDict.fromkeys(SHARED_APPS + TENANT_APPS))
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikSourceLDAPConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_sources_ldap"
 | 
			
		||||
    verbose_name = "authentik Sources.LDAP"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_sources_ldap_signals(self):
 | 
			
		||||
        """Load sources.ldap signals"""
 | 
			
		||||
        self.import_module("authentik.sources.ldap.signals")
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,3 @@ class AuthentikSourceSAMLConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Sources.SAML"
 | 
			
		||||
    mountpoint = "source/saml/"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_sources_saml_signals(self):
 | 
			
		||||
        """Load sources.saml signals"""
 | 
			
		||||
        self.import_module("authentik.sources.saml.signals")
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorDuoConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_stages_authenticator_duo"
 | 
			
		||||
    verbose_name = "authentik Stages.Authenticator.Duo"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_tasks(self):
 | 
			
		||||
        """Load tasks"""
 | 
			
		||||
        self.import_module("authentik.stages.authenticator_duo.tasks")
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,3 @@ class AuthentikStageAuthenticatorStaticConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_stages_authenticator_static"
 | 
			
		||||
    verbose_name = "authentik Stages.Authenticator.Static"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_stages_authenticator_static_signals(self):
 | 
			
		||||
        """Load stages.authenticator_static signals"""
 | 
			
		||||
        self.import_module("authentik.stages.authenticator_static.signals")
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,7 @@
 | 
			
		||||
"""authentik email stage config"""
 | 
			
		||||
 | 
			
		||||
from structlog.stdlib import get_logger
 | 
			
		||||
 | 
			
		||||
from authentik.blueprints.apps import ManagedAppConfig
 | 
			
		||||
 | 
			
		||||
LOGGER = get_logger()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AuthentikStageEmailConfig(ManagedAppConfig):
 | 
			
		||||
    """authentik email stage config"""
 | 
			
		||||
@ -14,7 +10,3 @@ class AuthentikStageEmailConfig(ManagedAppConfig):
 | 
			
		||||
    label = "authentik_stages_email"
 | 
			
		||||
    verbose_name = "authentik Stages.Email"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_stages_emails_tasks(self):
 | 
			
		||||
        """Load stages.emails tasks"""
 | 
			
		||||
        self.import_module("authentik.stages.email.tasks")
 | 
			
		||||
 | 
			
		||||
@ -28,10 +28,6 @@ class AuthentikTenantsConfig(ManagedAppConfig):
 | 
			
		||||
    verbose_name = "authentik Tenants"
 | 
			
		||||
    default = True
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_load_checks(self):
 | 
			
		||||
        """Load tenant checks"""
 | 
			
		||||
        self.import_module("authentik.tenants.checks")
 | 
			
		||||
 | 
			
		||||
    def reconcile_global_default_tenant(self):
 | 
			
		||||
        """Make sure default tenant exists, especially after a migration"""
 | 
			
		||||
        post_migrate.connect(ensure_default_tenant)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user