Files
pxe-server/webapp/templates/reports_todo.html
cproudlock 83ba4865e8 Show every time in US Eastern (America/New_York)
Webapp: config.DISPLAY_TZ (default America/New_York) and a local_dt
filter that renders datetimes, ISO strings and Unix timestamps as e.g.
"2026-10-05 13:54 EDT", DST included. Used for the ServiceNow tick list,
technician to-do, imaging tiles and detail page; timestamp_fmt (reports,
backups, enrollment) goes through it too instead of relying on the
process TZ. CSV report_date is Eastern with its offset. Evidence-pack
months are Eastern calendar months, so a wipe late on the 31st lands in
that month rather than the next.

Blancco: init points the new root's /etc/localtime at America/New_York
so the GUI clock is local. Report timestamps keep their explicit
offset; report.utc_offset stays 0 since a fixed offset cannot follow DST.
Report file names stay UTC, as Blancco's own Save names them.
2026-10-05 14:16:14 -04:00

121 lines
5.5 KiB
HTML

{% extends "base.html" %}
{% block title %}Technician To-Do - PXE Server Manager{% endblock %}
{% block content %}
<div class="page-header">
<h1><i class="bi bi-clipboard-check"></i> Technician To-Do</h1>
<div class="header-actions">
<span class="badge badge-{{ 'warning' if todo.total else 'success' }} badge-lg">{{ todo.total }} open</span>
</div>
</div>
<p class="text-muted">
Blancco wipes, reports, evidence packs and cloud uploads are automatic. These are the
CMMC playbook steps that still need a technician ({{ site }}). Mark each one done here once finished.
</p>
{# 1. ServiceNow #}
<div class="section-card">
<div class="section-title">1. Tick wipes on the Onsite Bin Management RITM (ENT-045 / ENT-159)</div>
{% if todo.servicenow %}
<p class="mb-2"><strong>{{ todo.servicenow }}</strong> wipe{{ 's' if todo.servicenow != 1 }} from the last 30 days still to tick in ServiceNow.</p>
<a href="{{ url_for('blancco_servicenow') }}" class="pxe-btn pxe-btn-primary"><i class="bi bi-list-check"></i> Open the tick list</a>
{% else %}
<p class="text-muted mb-0">All caught up.</p>
{% endif %}
</div>
{# 2. Evidence packs #}
<div class="section-card">
<div class="section-title">2. Upload the monthly evidence pack to Box (ENT-056 / ENT-158)</div>
{% if todo.evidence %}
<p class="mb-2">Saved automatically on the 1st. Download it, upload it to the site's ENT-056 / ENT-158 evidence folders in Box, then mark it uploaded.</p>
<div class="table-container">
<table class="data-table">
<thead><tr><th>Month</th><th>File</th><th class="text-end">Actions</th></tr></thead>
<tbody>
{% for p in todo.evidence %}
<tr>
<td class="mono">{{ p.month }}</td>
<td class="mono">{{ p.file }}</td>
<td class="text-end text-nowrap">
<a href="{{ url_for('blancco_evidence_file', filename=p.file) }}" class="pxe-btn pxe-btn-secondary btn-row-action"><i class="bi bi-download"></i> Download</a>
<form method="post" action="{{ url_for('blancco_todo_mark', kind='evidence_uploaded', key=p.month) }}" style="display:inline;">
<input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="pxe-btn pxe-btn-success btn-row-action">Mark uploaded</button>
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted mb-0">No pack waiting. The next one is saved on the 1st of next month.</p>
{% endif %}
</div>
{# 3. Failed wipes #}
<div class="section-card">
<div class="section-title">3. Destroy drives that failed to wipe (ENT-158 / ENT-159)</div>
{% if todo.failed %}
<p class="mb-2">Remove the drive, destroy it per site procedure, record the Certificate of Destruction and the destruction note on the RITM, then mark it here.</p>
<div class="table-container">
<table class="data-table">
<thead><tr><th>Serial</th><th>Model</th><th>Wiped</th><th>Failure</th><th class="text-end">Actions</th></tr></thead>
<tbody>
{% for it in todo.failed %}
<tr title="{{ it.file }}">
<td class="mono">{{ it.serial or '-' }}</td>
<td>{{ it.model or '-' }}</td>
<td class="mono text-nowrap">{{ it.when | local_dt }}</td>
<td class="small wrap">{{ it.note }}</td>
<td class="text-end text-nowrap">
<a href="{{ url_for('blancco_view_report', filename=it.file) }}" class="pxe-btn pxe-btn-secondary btn-row-action"><i class="bi bi-eye"></i> Report</a>
<form method="post" action="{{ url_for('blancco_todo_mark', kind='destroyed', key=it.document_id) }}" style="display:inline;">
<input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="pxe-btn pxe-btn-success btn-row-action">COD recorded</button>
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted mb-0">No failed wipes waiting for destruction.</p>
{% endif %}
</div>
{# 4. Not in the cloud #}
<div class="section-card">
<div class="section-title">4. Reports that did not reach the Blancco cloud (ENT-056)</div>
{% if todo.not_in_cloud %}
<p class="mb-2">Auditors pull certificates from the Blancco Management Portal. Upload the report's XML there by hand, then mark it resolved.</p>
<div class="table-container">
<table class="data-table">
<thead><tr><th>Serial</th><th>Model</th><th>Wiped</th><th class="text-end">Actions</th></tr></thead>
<tbody>
{% for it in todo.not_in_cloud %}
<tr title="{{ it.file }}">
<td class="mono">{{ it.serial or '-' }}</td>
<td>{{ it.model or '-' }}</td>
<td class="mono text-nowrap">{{ it.when | local_dt }}</td>
<td class="text-end text-nowrap">
<a href="{{ url_for('blancco_download_report', filename=it.file) }}" class="pxe-btn pxe-btn-secondary btn-row-action"><i class="bi bi-download"></i> XML</a>
<form method="post" action="{{ url_for('blancco_todo_mark', kind='cloud_resolved', key=it.document_id) }}" style="display:inline;">
<input type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="pxe-btn pxe-btn-success btn-row-action">Resolved</button>
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted mb-0">Every report with a known upload status reached the cloud.</p>
{% endif %}
</div>
{% endblock %}