Christian Mueller 5267baf0b4 feat: rewrite busylight as FastAPI web application with SQLite
Replace the standalone Python script + config.cfg with a full web
application featuring:
- FastAPI backend with REST API
- SQLite database (config, state, activity log separated)
- Bootstrap 5 web interface for configuration
- Pages: Dashboard, Users, Devices, Assignments, Color Rules, Settings, Log
- APScheduler background polling for Teams presence + AIDA status
- systemd service file for Linux deployment
- Migration script to import existing config.cfg data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-23 20:46:33 +02:00

69 lines
2.7 KiB
HTML

{% extends "base.html" %}
{% block title %}Protokoll - Busylight{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h4 class="mb-0">Protokoll</h4>
<span class="text-muted" id="last-update"></span>
</div>
<div class="card">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover log-table mb-0">
<thead>
<tr>
<th>Zeitpunkt</th>
<th>Benutzer</th>
<th>AIDA-Status</th>
<th>Teams-Status</th>
<th>WLED-URL</th>
<th>Ergebnis</th>
</tr>
</thead>
<tbody>
{% for log in logs %}
<tr>
<td class="text-nowrap">{{ log.timestamp }}</td>
<td>{{ log.user_name }}</td>
<td>
<span class="badge {% if log.aida_status == 'anwesend' %}bg-success{% elif log.aida_status == 'abwesend' %}bg-secondary{% elif log.aida_status == 'homeoffice' %}bg-warning text-dark{% else %}bg-light text-dark{% endif %}">
{{ log.aida_status or '-' }}
</span>
</td>
<td>
<span class="badge bg-info">{{ log.teams_status or '-' }}</span>
</td>
<td><small class="font-monospace">{{ log.wled_url }}</small></td>
<td>
{% if log.result and '200' in log.result %}
<span class="text-success"><i class="bi bi-check-circle"></i> {{ log.result }}</span>
{% else %}
<span class="text-danger"><i class="bi bi-x-circle"></i> {{ log.result }}</span>
{% endif %}
</td>
</tr>
{% endfor %}
{% if not logs %}
<tr>
<td colspan="6" class="text-center text-muted py-4">
Noch keine Protokoll-Eintraege vorhanden.
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
setTimeout(() => location.reload(), 15000);
document.getElementById('last-update').textContent =
'Aktualisiert: ' + new Date().toLocaleTimeString('de-DE');
</script>
{% endblock %}