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:
@@ -496,6 +496,14 @@ def imaging_delete_session(serial):
|
|||||||
return redirect(url_for("imaging_dashboard"))
|
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"])
|
@app.route("/imaging/<serial>/laps", methods=["POST"])
|
||||||
def imaging_set_laps(serial):
|
def imaging_set_laps(serial):
|
||||||
"""Save (or clear with empty value) the LAPS password for a bay so it
|
"""Save (or clear with empty value) the LAPS password for a bay so it
|
||||||
|
|||||||
@@ -169,3 +169,18 @@ def delete_session(serial: str) -> bool:
|
|||||||
return True
|
return True
|
||||||
except OSError:
|
except OSError:
|
||||||
return False
|
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
|
||||||
|
|||||||
@@ -23,7 +23,16 @@ window.addEventListener('DOMContentLoaded', scheduleImagingReload);
|
|||||||
<h2 class="mb-0">Imaging Progress</h2>
|
<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>
|
<small class="text-muted">Auto-refresh 15s. POST updates from imaging clients arrive at <code>/imaging/status</code>.</small>
|
||||||
</div>
|
</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>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
|
|||||||
Reference in New Issue
Block a user