38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
|
from django.utils import timezone
|
||
|
|
||
|
from core.models.cron import CronLog
|
||
|
|
||
|
from dbsettings.functions import getValue
|
||
|
|
||
|
from parse_crontab import CronTab
|
||
|
|
||
|
class Cronjob:
|
||
|
def __init__(self, name, crondef, lock=getValue("core.cron.lock", 300)):
|
||
|
self.name = name
|
||
|
self.crondef = crondef
|
||
|
self.lock = lock
|
||
|
|
||
|
@property
|
||
|
def is_running(self):
|
||
|
now = timezone.now()
|
||
|
maxage = now - timezone.timedelta(seconds=self.lock)
|
||
|
CronLog.objects.filter(task=self.name, locked=True, execution__lt=maxage).update(locked=False)
|
||
|
return True if CronLog.objects.filter(task=self.name, locked=True) else False
|
||
|
|
||
|
@property
|
||
|
def next_run(self):
|
||
|
runs = CronLog.objects.filter(task=self.name)
|
||
|
if not runs:
|
||
|
CronLog.objects.create(task=self.name, locked=False)
|
||
|
return self.next_run
|
||
|
|
||
|
lastrun = runs.latest("execution").execution
|
||
|
return lastrun + timezone.timedelta(seconds=CronTab(self.crondef).next(lastrun))
|
||
|
|
||
|
@property
|
||
|
def is_due(self):
|
||
|
return self.next_run <= timezone.now()
|
||
|
|
||
|
def run(self):
|
||
|
from core.tasks.cron import run_cron
|
||
|
run_cron.delay(self.name)
|