(feature) Add live refresh for run detail status
Add a server-rendered run detail partial and a small vanilla JavaScript refresh hook so active backup runs update status, controls, timing, and rsync log output without a full page reload. Document the Django-template-first refresh pattern for future control panel work. Refs #36
This commit is contained in:
@@ -657,6 +657,19 @@ def queue_manual_backup(request, host: str):
|
||||
@staff_member_required
|
||||
def run_detail(request, run_id: int):
|
||||
run = get_object_or_404(BackupRun.objects.select_related("host", "snapshot"), id=run_id)
|
||||
return render(request, "pobsync_backend/run_detail.html", _run_detail_context(run))
|
||||
|
||||
|
||||
@staff_member_required
|
||||
def run_detail_live(request, run_id: int):
|
||||
run = get_object_or_404(BackupRun.objects.select_related("host", "snapshot"), id=run_id)
|
||||
context = _run_detail_context(run)
|
||||
response = render(request, "pobsync_backend/partials/run_detail_live.html", context)
|
||||
response["X-Pobsync-Refresh-Active"] = "true" if context["can_auto_refresh"] else "false"
|
||||
return response
|
||||
|
||||
|
||||
def _run_detail_context(run: BackupRun) -> dict[str, object]:
|
||||
result = run.result if isinstance(run.result, dict) else {}
|
||||
run_stats = result.get("stats") if isinstance(result.get("stats"), dict) else {}
|
||||
rsync_result = result.get("rsync") if isinstance(result.get("rsync"), dict) else {}
|
||||
@@ -666,9 +679,11 @@ def run_detail(request, run_id: int):
|
||||
rsync_log_path = _run_rsync_log_path(run)
|
||||
rsync_log_tail = _run_rsync_log_tail(rsync_result, rsync_log_path)
|
||||
requested = result.get("requested") if isinstance(result.get("requested"), dict) else {}
|
||||
context = {
|
||||
can_cancel = run.status in {BackupRun.Status.QUEUED, BackupRun.Status.RUNNING}
|
||||
return {
|
||||
"run": run,
|
||||
"can_cancel": run.status in {BackupRun.Status.QUEUED, BackupRun.Status.RUNNING},
|
||||
"can_cancel": can_cancel,
|
||||
"can_auto_refresh": can_cancel,
|
||||
"requested": requested,
|
||||
"execution": execution,
|
||||
"stats": run_stats if isinstance(run_stats, dict) else {},
|
||||
@@ -692,7 +707,6 @@ def run_detail(request, run_id: int):
|
||||
),
|
||||
"result_json": _pretty_json(run.result),
|
||||
}
|
||||
return render(request, "pobsync_backend/run_detail.html", context)
|
||||
|
||||
|
||||
@staff_member_required
|
||||
|
||||
Reference in New Issue
Block a user