81 lines
2.0 KiB
Python
81 lines
2.0 KiB
Python
"""Job queries."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
from sqlmodel import Session, select
|
|
|
|
from .models import Job
|
|
|
|
|
|
def create_job(
|
|
session: Session,
|
|
source_asset_id: UUID,
|
|
video_path: str,
|
|
timeline_id: UUID,
|
|
profile_name: str = "soccer_broadcast",
|
|
run_type: str = "initial",
|
|
parent_id: UUID | None = None,
|
|
config_overrides: dict | None = None,
|
|
) -> Job:
|
|
job = Job(
|
|
source_asset_id=source_asset_id,
|
|
video_path=video_path,
|
|
timeline_id=timeline_id,
|
|
profile_name=profile_name,
|
|
run_type=run_type,
|
|
parent_id=parent_id,
|
|
config_overrides=config_overrides or {},
|
|
status="pending",
|
|
)
|
|
session.add(job)
|
|
session.commit()
|
|
session.refresh(job)
|
|
return job
|
|
|
|
|
|
def update_job_status(
|
|
session: Session,
|
|
job_id: UUID,
|
|
status: str,
|
|
current_stage: str | None = None,
|
|
error_message: str | None = None,
|
|
):
|
|
job = session.get(Job, job_id)
|
|
if not job:
|
|
return
|
|
job.status = status
|
|
if current_stage is not None:
|
|
job.current_stage = current_stage
|
|
if error_message is not None:
|
|
job.error_message = error_message
|
|
if status == "running" and not job.started_at:
|
|
job.started_at = datetime.utcnow()
|
|
if status in ("completed", "failed", "cancelled"):
|
|
job.completed_at = datetime.utcnow()
|
|
session.commit()
|
|
|
|
|
|
def get_job(session: Session, job_id: UUID) -> Job | None:
|
|
return session.get(Job, job_id)
|
|
|
|
|
|
def list_jobs(
|
|
session: Session,
|
|
timeline_id: UUID | None = None,
|
|
parent_id: UUID | None = None,
|
|
status: str | None = None,
|
|
) -> list[Job]:
|
|
stmt = select(Job)
|
|
if timeline_id:
|
|
stmt = stmt.where(Job.timeline_id == timeline_id)
|
|
if parent_id:
|
|
stmt = stmt.where(Job.parent_id == parent_id)
|
|
if status:
|
|
stmt = stmt.where(Job.status == status)
|
|
stmt = stmt.order_by(Job.created_at.desc())
|
|
return list(session.exec(stmt).all())
|