Rejigging async jobs

This commit is contained in:
Ian Roddis committed 2026-08-05 16:21:31 -03:00
1 parent 2a0b8fcab2
commit 2e7976e382
7 files changed
+225 -86

No files matched your search

+45 -33
View File
@@ -1511,13 +1511,12 @@ async def upload_scope_import(
data = await file.read()
actor_id = actor.id
async def _run(job: jobs.Job) -> None:
async def _run(job_id: str) -> None:
async with AsyncSessionLocal() as db:
try:
result = await scope_import_service.import_from_bytes(db, data)
except Exception as exc: # noqa: BLE001
job.status = "error"
job.message = f"Could not read spreadsheet: {exc}"
await jobs.mark_error(job_id, f"Could not read spreadsheet: {exc}")
return
actor_row = await user_crud.get(db, actor_id)
await audit_crud.log(
@@ -1532,10 +1531,16 @@ async def upload_scope_import(
f"{result.errors} errors"
),
)
job.status = "done"
job.result = result
await jobs.mark_done(
job_id,
message=(
f"Scope import complete: {result.created} created, "
f"{result.updated} updated."
),
result=result.model_dump(mode="json"),
)
job = jobs.start("scope_import", _run)
job = await jobs.start("scope_import", _run)
return templates.TemplateResponse(
request, "admin/_job_progress.html", _scope_import_progress_ctx(job)
)
@@ -1545,9 +1550,10 @@ async def upload_scope_import(
async def scope_import_job_status(
request: Request,
job_id: str,
db: AsyncSession = Depends(get_db),
_: User = Depends(web_require("augmented_parts:write")),
):
job = jobs.get(job_id)
job = await jobs.get(db, job_id)
if job is None:
return templates.TemplateResponse(
request,
@@ -1718,13 +1724,12 @@ async def sync_augmented_parts(
):
actor_id = actor.id
async def _run(job: jobs.Job) -> None:
async def _run(job_id: str) -> None:
async with AsyncSessionLocal() as db:
try:
result = await augmented_part_sync_service.sync(db)
except Exception as exc:
job.status = "error"
job.message = f"Sync failed: {exc}"
await jobs.mark_error(job_id, f"Sync failed: {exc}")
return
actor_row = await user_crud.get(db, actor_id)
await audit_crud.log(
@@ -1738,18 +1743,21 @@ async def sync_augmented_parts(
f"{result.skipped} skipped (no type match)"
),
)
job.status = "done"
job.message = (
f"Sync complete: {result.created} created, {result.deleted} deleted"
+ (
f", {result.skipped} skipped (type not recognised)"
if result.skipped
else ""
)
+ "."
await jobs.mark_done(
job_id,
message=(
f"Sync complete: {result.created} created, "
f"{result.deleted} deleted"
+ (
f", {result.skipped} skipped (type not recognised)"
if result.skipped
else ""
)
+ "."
),
)
job = jobs.start("augmented_part_sync", _run)
job = await jobs.start("augmented_part_sync", _run)
return templates.TemplateResponse(
request,
"admin/_job_progress.html",
@@ -1768,7 +1776,7 @@ async def augmented_parts_sync_job_status(
db: AsyncSession = Depends(get_db),
_: User = Depends(web_require("augmented_parts:write")),
):
job = jobs.get(job_id)
job = await jobs.get(db, job_id)
if job is None:
form_ctx = await _augmented_part_form_ctx(db)
return templates.TemplateResponse(
@@ -2483,7 +2491,7 @@ async def recompute_augmented_part_fits(
):
actor_id = actor.id
async def _run(job: jobs.Job) -> None:
async def _run(job_id: str) -> None:
async with AsyncSessionLocal() as db:
result = await fit_matching_service.recompute_for_part(
db, augmented_part_id
@@ -2500,10 +2508,11 @@ async def recompute_augmented_part_fits(
f"{result.created} created, {result.removed} removed"
),
)
job.status = "done"
job.message = f"{result.created} created, {result.removed} removed."
await jobs.mark_done(
job_id, f"{result.created} created, {result.removed} removed."
)
job = jobs.start("fit_recompute_part", _run)
job = await jobs.start("fit_recompute_part", _run)
return templates.TemplateResponse(
request,
"admin/_job_progress.html",
@@ -2527,7 +2536,7 @@ async def augmented_part_fits_recompute_job_status(
db: AsyncSession = Depends(get_db),
actor: User = Depends(web_require("fits:write")),
):
job = jobs.get(job_id)
job = await jobs.get(db, job_id)
if job is None:
ctx = await _augmented_part_fits_ctx(
db,
@@ -2774,7 +2783,7 @@ async def recompute_all_fits(
):
actor_id = actor.id
async def _run(job: jobs.Job) -> None:
async def _run(job_id: str) -> None:
async with AsyncSessionLocal() as db:
result = await fit_matching_service.recompute_all(db)
actor_row = await user_crud.get(db, actor_id)
@@ -2789,13 +2798,15 @@ async def recompute_all_fits(
f"{result.removed} removed"
),
)
job.status = "done"
job.message = (
f"Recompute complete: {result.created} created, "
f"{result.removed} removed."
await jobs.mark_done(
job_id,
message=(
f"Recompute complete: {result.created} created, "
f"{result.removed} removed."
),
)
job = jobs.start("fit_recompute_all", _run)
job = await jobs.start("fit_recompute_all", _run)
return templates.TemplateResponse(
request,
"admin/_job_progress_inline.html",
@@ -2813,9 +2824,10 @@ async def recompute_all_fits(
async def recompute_all_fits_job_status(
request: Request,
job_id: str,
db: AsyncSession = Depends(get_db),
_: User = Depends(web_require("fits:write")),
):
job = jobs.get(job_id)
job = await jobs.get(db, job_id)
if job is None:
return HTMLResponse("Recompute job not found — it may have expired.")
if job.status == "running":