From b8f77e614a1503fbb1fa9015ec710204065d1d3e Mon Sep 17 00:00:00 2001 From: Bram Oosterlynck Date: Mon, 9 Sep 2024 13:50:45 +0200 Subject: [PATCH] feat: allow configuring background jobs in module --- pyproject.toml | 4 ++++ src/elody/loader.py | 27 +++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0cea339..07d36e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,8 +31,12 @@ dependencies = [ [project.optional-dependencies] loader = [ + "APScheduler>=3.10.4", "cloudevents>=1.9.0", "inuits-policy-based-auth>=9.6.0", + "pytz>=2024.1", + "six>=1.16.0", + "tzlocal>=5.2", ] util = [ "cloudevents>=1.9.0", diff --git a/src/elody/loader.py b/src/elody/loader.py index 777deb1..c2e1874 100644 --- a/src/elody/loader.py +++ b/src/elody/loader.py @@ -2,6 +2,7 @@ import json import os +from apscheduler.triggers.cron import CronTrigger from importlib import import_module from inuits_policy_based_auth.exceptions import ( PolicyFactoryException, @@ -16,6 +17,24 @@ def load_apps(flask_app, logger): flask_app.register_blueprint(api_bp) +def load_jobs(scheduler, logger): + apps = util.read_json_as_dict(os.getenv("APPS_MANIFEST"), logger) + for app in apps: + for job, job_properties in apps[app].get("jobs", {}).items(): + try: + job_class = __get_class_from_module( + import_module(f"apps.{app}.cron_jobs.{job}") + ) + scheduler.add_job( + job_class(), + CronTrigger.from_crontab( + job_properties.get("expression", "0 0 * * *") + ), + ) + except ModuleNotFoundError: + pass + + def load_policies(policy_factory, logger, permissions={}): if permissions: from elody.policies.permission_handler import set_permissions @@ -69,11 +88,15 @@ def __get_class(app, auth_type, policy_module_name): pass else: raise ModuleNotFoundError(f"Policy {policy_module_name} not found") - policy_class_name = module.__name__.split(".")[-1].title().replace("_", "") - policy = getattr(module, policy_class_name) + policy = __get_class_from_module(module) return policy +def __get_class_from_module(module): + class_name = module.__name__.split(".")[-1].title().replace("_", "") + return getattr(module, class_name) + + def __instantiate_authentication_policy(policy_module_name, policy, logger): allow_anonymous_users = os.getenv("ALLOW_ANONYMOUS_USERS", False) in [ "True",