Add persistent job run queue
This commit is contained in:
parent
2bd0651478
commit
0b3b1b2731
8 changed files with 1047 additions and 27 deletions
|
|
@ -87,7 +87,7 @@ def _running_row(execution: Mapping[str, object]) -> tuple[Node, ...]:
|
|||
tone="amber",
|
||||
),
|
||||
_action_button(
|
||||
label="Stop",
|
||||
label=_text(execution, "cancel_label"),
|
||||
tone="danger",
|
||||
post_path=_maybe_text(execution, "cancel_post_path"),
|
||||
),
|
||||
|
|
@ -95,6 +95,54 @@ def _running_row(execution: Mapping[str, object]) -> tuple[Node, ...]:
|
|||
)
|
||||
|
||||
|
||||
def _queued_row(execution: Mapping[str, object]) -> tuple[Node, ...]:
|
||||
queued_at = _maybe_text(execution, "queued_at_iso")
|
||||
queued_label: Node = h.p(class_="font-medium text-slate-900")[
|
||||
_text(execution, "queued_at")
|
||||
]
|
||||
if queued_at is not None:
|
||||
queued_label = h.time(
|
||||
{
|
||||
"data-queued-at": queued_at,
|
||||
"title": queued_at,
|
||||
},
|
||||
datetime=queued_at,
|
||||
class_="font-medium text-slate-900",
|
||||
)[_text(execution, "queued_at")]
|
||||
|
||||
return (
|
||||
h.div[
|
||||
h.div(class_="font-semibold text-slate-950")[_text(execution, "source")],
|
||||
h.p(class_="mt-1 font-mono text-xs text-slate-500")[
|
||||
_text(execution, "slug")
|
||||
],
|
||||
],
|
||||
h.div[
|
||||
h.p(class_="font-medium text-slate-900")[
|
||||
f"#{_text(execution, 'execution_id')}"
|
||||
],
|
||||
],
|
||||
queued_label,
|
||||
h.div[
|
||||
h.p(class_="font-medium text-slate-900")[
|
||||
f"#{_text(execution, 'queue_position')}"
|
||||
],
|
||||
],
|
||||
_action_button(
|
||||
label=_text(execution, "run_label"),
|
||||
disabled=_flag(execution, "run_disabled"),
|
||||
post_path=_maybe_text(execution, "run_post_path"),
|
||||
),
|
||||
h.div(class_="flex flex-nowrap items-center gap-2")[
|
||||
_action_button(
|
||||
label="Cancel",
|
||||
tone="danger",
|
||||
post_path=_maybe_text(execution, "cancel_post_path"),
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def _upcoming_row(job: Mapping[str, object]) -> tuple[Node, ...]:
|
||||
next_run_at = _maybe_text(job, "next_run_at")
|
||||
next_run_label: Node = h.p(class_="font-medium text-slate-900")[
|
||||
|
|
@ -192,14 +240,17 @@ def _completed_row(execution: Mapping[str, object]) -> tuple[Node, ...]:
|
|||
def runs_page(
|
||||
*,
|
||||
running_executions: tuple[Mapping[str, object], ...] | None = None,
|
||||
queued_executions: tuple[Mapping[str, object], ...] | None = None,
|
||||
upcoming_jobs: tuple[Mapping[str, object], ...] | None = None,
|
||||
completed_executions: tuple[Mapping[str, object], ...] | None = None,
|
||||
source_count: int = 0,
|
||||
) -> Renderable:
|
||||
running_items = running_executions or ()
|
||||
queued_items = queued_executions or ()
|
||||
upcoming_items = upcoming_jobs or ()
|
||||
completed_items = completed_executions or ()
|
||||
running_rows = tuple(_running_row(execution) for execution in running_items)
|
||||
queued_rows = tuple(_queued_row(execution) for execution in queued_items)
|
||||
upcoming_rows = tuple(_upcoming_row(job) for job in upcoming_items)
|
||||
completed_rows = tuple(_completed_row(execution) for execution in completed_items)
|
||||
|
||||
|
|
@ -227,7 +278,21 @@ def runs_page(
|
|||
),
|
||||
table_section(
|
||||
eyebrow="Queue",
|
||||
title="Upcoming jobs",
|
||||
title="Queued job executions",
|
||||
empty_message="No queued executions are waiting.",
|
||||
headers=(
|
||||
"Source",
|
||||
"Execution",
|
||||
"Queued",
|
||||
"Position",
|
||||
"Run now",
|
||||
"Actions",
|
||||
),
|
||||
rows=queued_rows,
|
||||
),
|
||||
table_section(
|
||||
eyebrow="Schedule",
|
||||
title="Scheduled jobs",
|
||||
empty_message="No jobs are scheduled.",
|
||||
headers=(
|
||||
"Source",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue