webapp/reports: trim list to Serial/Model/Date/Result

Drops the filename, type, and size columns from the Blancco Reports
list - operators want bay-identification fields, not file metadata.
Filename moves to a row hover tooltip (title attribute) so it is still
recoverable for ad-hoc lookups.

Adds a Result column derived from each XML report's overall erasure
state:
  * Successful  -> green badge (all erasure entries report Successful)
  * Failed      -> red badge   (any erasure entry reports a non-Successful state)
  * other       -> grey badge with the verbatim state
  * blank/non-XML -> dash

The state roll-up lives in the blancco_reports route's per-file parse
loop next to the existing serial/model extraction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-05-13 11:13:09 -04:00
parent 4e018feaa0
commit 6de19fd250
2 changed files with 21 additions and 13 deletions

View File

@@ -373,12 +373,24 @@ def blancco_reports():
# negligible at fleet sizes).
serial = ""
model = ""
state = ""
if ext == ".xml":
try:
data = blancco_report.parse(fpath)
sysinfo = (data.get("hardware") or {}).get("system") or {}
serial = sysinfo.get("serial", "") or ""
model = sysinfo.get("model", "") or ""
# Overall erasure result: each erasure entry has its own
# 'state' (Successful / Failed / ...). If any drive failed
# the report rolls up to Failed; otherwise Successful.
erasures = data.get("erasures") or []
states = [(e.get("state") or "").strip() for e in erasures if e.get("state")]
if not states:
state = ""
elif any(s.lower() != "successful" for s in states):
state = "Failed"
else:
state = "Successful"
except Exception:
pass
reports.append({
@@ -388,6 +400,7 @@ def blancco_reports():
"type": ext.lstrip(".").upper() or "FILE",
"serial": serial,
"model": model,
"state": state,
})
return render_template(
"reports.html",