scheduler.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from apscheduler.schedulers.background import BackgroundScheduler
  2. from apscheduler.triggers.cron import CronTrigger
  3. _flask_app = None
  4. scheduler = BackgroundScheduler(
  5. job_defaults={"coalesce": True, "max_instances": 1},
  6. timezone="UTC",
  7. )
  8. def init_scheduler(flask_app):
  9. global _flask_app
  10. _flask_app = flask_app
  11. if not scheduler.running:
  12. scheduler.start()
  13. def _execute_job(job_id):
  14. with _flask_app.app_context():
  15. from jobs.ynh_backup import execute_job
  16. execute_job(job_id)
  17. def schedule_job(job):
  18. import logging
  19. job_key = f"job_{job.id}"
  20. try:
  21. trigger = CronTrigger.from_crontab(job.cron_expr)
  22. except Exception:
  23. logging.warning(f"Job #{job.id} « {job.name} » : expression cron invalide « {job.cron_expr} » — job non planifié.")
  24. return
  25. if scheduler.get_job(job_key):
  26. scheduler.reschedule_job(job_key, trigger=trigger)
  27. else:
  28. scheduler.add_job(
  29. func=_execute_job,
  30. trigger=trigger,
  31. id=job_key,
  32. kwargs={"job_id": job.id},
  33. replace_existing=True,
  34. )
  35. def remove_job(job_id):
  36. job_key = f"job_{job_id}"
  37. if scheduler.get_job(job_key):
  38. scheduler.remove_job(job_key)
  39. def get_next_run(job_id):
  40. job_key = f"job_{job_id}"
  41. apsjob = scheduler.get_job(job_key)
  42. if apsjob and apsjob.next_run_time:
  43. return apsjob.next_run_time
  44. return None