TaskWeaver / services /schedule_service.py
PocketSkye's picture
Initial deployment
0242ab2
Raw
History Blame Contribute Delete
2.47 kB
from datetime import datetime, timedelta
from sqlalchemy.orm import Session
from models.workflow_schedule import (
WorkflowSchedule
)
class ScheduleService:
def calculate_next_run(
self,
schedule_type: str,
run_time: str,
day_of_week: str = None
):
now = datetime.utcnow()
hour, minute = map(
int,
run_time.split(":")
)
if schedule_type == "daily":
next_run = now.replace(
hour=hour,
minute=minute,
second=0,
microsecond=0
)
if next_run <= now:
next_run += timedelta(days=1)
return next_run
if schedule_type == "weekly":
days = {
"monday": 0,
"tuesday": 1,
"wednesday": 2,
"thursday": 3,
"friday": 4,
"saturday": 5,
"sunday": 6
}
target_day = days[
day_of_week.lower()
]
current_day = now.weekday()
days_ahead = (
target_day - current_day
) % 7
next_run = now.replace(
hour=hour,
minute=minute,
second=0,
microsecond=0
) + timedelta(
days=days_ahead
)
if next_run <= now:
next_run += timedelta(days=7)
return next_run
def get_due_schedules(
self,
db: Session
):
return db.query(
WorkflowSchedule
).filter(
WorkflowSchedule.is_active == True,
WorkflowSchedule.next_run_at <= datetime.utcnow()
).all()
def update_next_run(
self,
schedule: WorkflowSchedule,
db: Session
):
schedule.next_run_at = (
self.calculate_next_run(
schedule.schedule_type,
schedule.run_time,
schedule.day_of_week
)
)
db.commit()
def pause_schedule(
self,
schedule: WorkflowSchedule,
db: Session
):
schedule.is_active = False
db.commit()
def resume_schedule(
self,
schedule: WorkflowSchedule,
db: Session
):
schedule.is_active = True
db.commit()