imaging dashboard: add Clear all button + endpoint

New /imaging/delete_all endpoint wipes every per-bay JSON in IMAGING_DIR
via imaging_status.delete_all_sessions(). Template adds "Clear all"
outline-danger button next to the count badge, gated on sessions list
non-empty, with confirm() prompt naming the count.

Deployed via scp + systemctl restart pxe-webapp on 172.16.9.1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-05-16 15:58:31 -04:00
parent 7f097013fc
commit 3aabd47571
3 changed files with 33 additions and 1 deletions

View File

@@ -496,6 +496,14 @@ def imaging_delete_session(serial):
return redirect(url_for("imaging_dashboard"))
@app.route("/imaging/delete_all", methods=["POST"])
def imaging_delete_all():
n = imaging_status.delete_all_sessions()
audit("IMAGING_DELETE_ALL", str(n))
flash(f"Cleared {n} imaging session(s).", "success")
return redirect(url_for("imaging_dashboard"))
@app.route("/imaging/<serial>/laps", methods=["POST"])
def imaging_set_laps(serial):
"""Save (or clear with empty value) the LAPS password for a bay so it

View File

@@ -169,3 +169,18 @@ def delete_session(serial: str) -> bool:
return True
except OSError:
return False
def delete_all_sessions() -> int:
"""Wipe every per-bay JSON in IMAGING_DIR. Returns count removed."""
_ensure_dir()
removed = 0
for fn in os.listdir(config.IMAGING_DIR):
if not fn.endswith(".json"):
continue
try:
os.unlink(os.path.join(config.IMAGING_DIR, fn))
removed += 1
except OSError:
pass
return removed

View File

@@ -23,7 +23,16 @@ window.addEventListener('DOMContentLoaded', scheduleImagingReload);
<h2 class="mb-0">Imaging Progress</h2>
<small class="text-muted">Auto-refresh 15s. POST updates from imaging clients arrive at <code>/imaging/status</code>.</small>
</div>
<span class="badge bg-secondary fs-6"><span id="visible-count">{{ sessions|length }}</span>/{{ sessions|length }}</span>
<div class="d-flex align-items-center gap-2">
<span class="badge bg-secondary fs-6"><span id="visible-count">{{ sessions|length }}</span>/{{ sessions|length }}</span>
{% if sessions %}
<form method="post" action="{{ url_for('imaging_delete_all') }}"
onsubmit="return confirm('Clear all {{ sessions|length }} imaging session(s)? This wipes every tile from the dashboard. Live re-images will repopulate on next status push.');"
style="display:inline;">
<button type="submit" class="btn btn-sm btn-outline-danger">Clear all</button>
</form>
{% endif %}
</div>
</div>
<div class="mb-3">