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:
@@ -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",
|
||||
|
||||
@@ -16,30 +16,25 @@
|
||||
<table class="table table-hover mb-0">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Filename</th>
|
||||
<th>Serial</th>
|
||||
<th>Model</th>
|
||||
<th>Type</th>
|
||||
<th>Size</th>
|
||||
<th>Date</th>
|
||||
<th>Result</th>
|
||||
<th class="text-end">Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for r in reports %}
|
||||
<tr>
|
||||
<td><code>{{ r.filename }}</code></td>
|
||||
<tr title="{{ r.filename }}">
|
||||
<td>{% if r.serial %}<code>{{ r.serial }}</code>{% else %}<span class="text-muted small">-</span>{% endif %}</td>
|
||||
<td class="small">{{ r.model or '-' }}</td>
|
||||
<td><span class="badge bg-info text-dark">{{ r.type }}</span></td>
|
||||
<td>
|
||||
{% if r.size > 1048576 %}
|
||||
{{ "%.1f"|format(r.size / 1048576) }} MB
|
||||
{% else %}
|
||||
{{ "%.1f"|format(r.size / 1024) }} KB
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ r.modified | timestamp_fmt }}</td>
|
||||
<td>
|
||||
{% if r.state == 'Successful' %}<span class="badge bg-success">Successful</span>
|
||||
{% elif r.state == 'Failed' %}<span class="badge bg-danger">Failed</span>
|
||||
{% elif r.state %}<span class="badge bg-secondary">{{ r.state }}</span>
|
||||
{% else %}<span class="text-muted small">-</span>{% endif %}
|
||||
</td>
|
||||
<td class="text-end text-nowrap">
|
||||
{% if r.filename.lower().endswith('.xml') %}
|
||||
<a href="{{ url_for('blancco_view_report', filename=r.filename) }}"
|
||||
|
||||
Reference in New Issue
Block a user