Support apscheduler cron expressions

This commit is contained in:
JonnyWong16 2024-09-25 11:54:55 -07:00
parent 9ca8d59372
commit 3cf6560de3
No known key found for this signature in database
GPG key ID: B1F1F9807184697A
2 changed files with 28 additions and 13 deletions

View file

@ -50,7 +50,10 @@
</div> </div>
<p class="help-block"> <p class="help-block">
<span id="simple_cron_message">Set the schedule for the newsletter.</span> <span id="simple_cron_message">Set the schedule for the newsletter.</span>
<span id="custom_cron_message">Set the schedule for the newsletter using a <a href="${anon_url('https://crontab.guru')}" target="_blank" rel="noreferrer">custom crontab</a>. Only standard cron values are valid.</span> <span id="custom_cron_message">
Set the schedule for the newsletter using a <a href="${anon_url('https://crontab.guru')}" target="_blank" rel="noreferrer">custom crontab</a>.
<a href="${anon_url('https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html#expression-types')}" target="_blank" rel="noreferrer">Click here</a> for a list of supported expressions.
</span>
</p> </p>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -481,7 +484,7 @@
}); });
if (${newsletter['config']['custom_cron']}) { if (${newsletter['config']['custom_cron']}) {
$('#cron_value').val('${newsletter['cron']}'); $('#cron_value').val('${newsletter['cron'] | n}');
} else { } else {
try { try {
cron_widget.cron('value', '${newsletter['cron']}'); cron_widget.cron('value', '${newsletter['cron']}');

View file

@ -17,6 +17,7 @@
from io import open from io import open
import os import os
import shlex
from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.cron import CronTrigger
import email.utils import email.utils
@ -58,25 +59,36 @@ def schedule_newsletters(newsletter_id=None):
def schedule_newsletter_job(newsletter_job_id, name='', func=None, remove_job=False, args=None, cron=None): def schedule_newsletter_job(newsletter_job_id, name='', func=None, remove_job=False, args=None, cron=None):
# apscheduler day_of_week uses 0-6 = mon-sun
if cron: if cron:
cron = cron.split(' ') values = shlex.split(cron)
cron[4] = str((int(cron[4]) - 1) % 7) if cron[4].isdigit() else cron[4] # apscheduler day_of_week uses 0-6 = mon-sun
cron = ' '.join(cron) values[4] = str((int(values[4]) - 1) % 7) if values[4].isdigit() else values[4]
if NEWSLETTER_SCHED.get_job(newsletter_job_id): if NEWSLETTER_SCHED.get_job(newsletter_job_id):
if remove_job: if remove_job:
NEWSLETTER_SCHED.remove_job(newsletter_job_id) NEWSLETTER_SCHED.remove_job(newsletter_job_id)
logger.info("Tautulli NewsletterHandler :: Removed scheduled newsletter: %s" % name) logger.info("Tautulli NewsletterHandler :: Removed scheduled newsletter: %s" % name)
else: else:
NEWSLETTER_SCHED.reschedule_job( try:
newsletter_job_id, args=args, trigger=CronTrigger.from_crontab(cron)) NEWSLETTER_SCHED.reschedule_job(
logger.info("Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name) newsletter_job_id, args=args, trigger=CronTrigger(
minute=values[0], hour=values[1], day=values[2], month=values[3], day_of_week=values[4]
)
)
logger.info("Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name)
except ValueError as e:
logger.error("Tautulli NewsletterHandler :: Failed to re-schedule newsletter: %s" % e)
elif not remove_job: elif not remove_job:
NEWSLETTER_SCHED.add_job( try:
func, args=args, id=newsletter_job_id, trigger=CronTrigger.from_crontab(cron), NEWSLETTER_SCHED.add_job(
misfire_grace_time=None) func, args=args, id=newsletter_job_id, trigger=CronTrigger(
logger.info("Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name) minute=values[0], hour=values[1], day=values[2], month=values[3], day_of_week=values[4]
),
misfire_grace_time=None
)
logger.info("Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name)
except ValueError as e:
logger.error("Tautulli NewsletterHandler :: Failed to schedule newsletter: %s" % e)
def notify(newsletter_id=None, notify_action=None, **kwargs): def notify(newsletter_id=None, notify_action=None, **kwargs):