Add a cron_setup task to initialize code-defined cron tasks.

This commit is contained in:
Ben Rog-Wilhelm 2023-04-22 04:34:40 -05:00
parent b4fecddf7b
commit 7ea3c81967
5 changed files with 88 additions and 1 deletions

View file

@ -13,7 +13,7 @@ import redis
from sqlalchemy.orm import relationship, Session
from sqlalchemy.schema import Column, ForeignKey
from sqlalchemy.sql.sqltypes import (Boolean, DateTime, Integer, SmallInteger,
Text, Time)
Text, Time, String)
from files.classes.base import CreatedBase
from files.helpers.time import format_age, format_datetime
@ -247,6 +247,9 @@ class RepeatableTask(CreatedBase):
frequency_day = Column(SmallInteger, nullable=False)
time_of_day_utc = Column(Time, nullable=False)
# used for the cron hardcoding system
label = Column(String, nullable=True, unique=True)
runs = relationship("RepeatableTaskRun", back_populates="task")
@property

View file

@ -4,6 +4,7 @@ from flask_sqlalchemy import SQLAlchemy
from files.__main__ import app
from files.commands.cron import cron_app_worker
from files.commands.seed_db import seed_db
from files.commands.cron_setup import cron_setup
import files.classes
db = SQLAlchemy(app)

View file

@ -0,0 +1,52 @@
from typing import Optional
import datetime
import sqlalchemy
from sqlalchemy.orm import Session
from files.__main__ import app, db_session
from files.classes.cron.pycallable import PythonCodeTask
from files.classes.cron.tasks import DayOfWeek
from files.helpers.config.const import AUTOJANNY_ID
@app.cli.command('cron_setup')
def cron_setup():
db: Session = db_session()
tasklist = db.query(PythonCodeTask)
# I guess in theory we should load this from a file or something, but, ehhhh
hardcoded_cron_jobs = {
#'testjob': {
#'frequency_day': DayOfWeek.ALL,
#'time_of_day_utc': datetime.time(0, 0),
#'import_path': 'files.commands.debug_printout',
#'callable': 'printstuff',
#},
}
print(f"{tasklist.count()} tasks")
for task in tasklist:
if task.label and task.label in hardcoded_cron_jobs:
print(f"Cron: Updating {task.label}")
ref = hardcoded_cron_jobs[task.label]
task.frequency_day = ref["frequency_day"]
task.time_of_day_utc = ref["time_of_day_utc"]
task.import_path = ref["import_path"]
task.callable = ref["callable"]
del hardcoded_cron_jobs[task.label]
for label, ref in hardcoded_cron_jobs.items():
print(f"Cron: Creating {label}")
task = PythonCodeTask()
task.label = label
task.author_id = AUTOJANNY_ID
task.frequency_day = ref["frequency_day"]
task.time_of_day_utc = ref["time_of_day_utc"]
task.import_path = ref["import_path"]
task.callable = ref["callable"]
db.add(task)
db.commit()