Add typed task input forms
This commit is contained in:
+32
-4
@@ -10,6 +10,7 @@ from flask import Flask, abort, redirect, render_template, request, url_for
|
||||
|
||||
from .config import Settings
|
||||
from .discovery import TaskCatalog
|
||||
from .inputs import validate_inputs
|
||||
from .runner import RunManager
|
||||
from .store import RunStore
|
||||
|
||||
@@ -53,8 +54,12 @@ def create_app(settings: Settings | None = None) -> Flask:
|
||||
return "—"
|
||||
return datetime.fromisoformat(value).astimezone().strftime("%Y-%m-%d %H:%M:%S %Z")
|
||||
|
||||
@app.get("/")
|
||||
def index():
|
||||
def render_index(
|
||||
*,
|
||||
form_values: dict[str, dict[str, list[str]]] | None = None,
|
||||
input_errors: dict[str, dict[str, str]] | None = None,
|
||||
status: int = 200,
|
||||
):
|
||||
groups = catalog.groups()
|
||||
latest = {
|
||||
("group", group.id): store.last_run("group", group.id) for group in groups
|
||||
@@ -62,14 +67,37 @@ def create_app(settings: Settings | None = None) -> Flask:
|
||||
for group in groups:
|
||||
for task in group.tasks:
|
||||
latest[("task", task.id)] = store.last_run("task", task.id)
|
||||
return render_template("index.html", groups=groups, latest=latest)
|
||||
return (
|
||||
render_template(
|
||||
"index.html",
|
||||
groups=groups,
|
||||
latest=latest,
|
||||
form_values=form_values or {},
|
||||
input_errors=input_errors or {},
|
||||
),
|
||||
status,
|
||||
)
|
||||
|
||||
@app.get("/")
|
||||
def index():
|
||||
return render_index()
|
||||
|
||||
@app.post("/tasks/<path:task_id>/run")
|
||||
def run_task(task_id: str):
|
||||
task = catalog.task(task_id)
|
||||
if task is None:
|
||||
abort(404)
|
||||
run, _ = manager.run_task(task)
|
||||
submitted_values = {
|
||||
field.name: request.form.getlist(field.name) for field in task.inputs
|
||||
}
|
||||
input_data, errors = validate_inputs(task.inputs, submitted_values)
|
||||
if errors:
|
||||
return render_index(
|
||||
form_values={task.id: submitted_values},
|
||||
input_errors={task.id: errors},
|
||||
status=400,
|
||||
)
|
||||
run, _ = manager.run_task(task, input_data)
|
||||
return redirect(url_for("run_detail", run_id=run.id))
|
||||
|
||||
@app.post("/groups/<path:group_id>/run")
|
||||
|
||||
Reference in New Issue
Block a user