{% extends "tesm_core/base.html" %} {% from "tesm_core/macros.html" import pill, empty_state, alert %} {% block page_title %}Änderungsprotokoll{% endblock %} {% block page_sub %}{{ total }} Einträge · Hash-Kette {{ 'unversehrt' if chain.ok else 'gebrochen' }}{% endblock %} {% block topbar_extra %} {% if current_user.has('logs_audit.export') %} {{ icon('download', size=15) }} CSV {% endif %} {% endblock %} {% block content %} {% if not chain.ok %} {{ alert(chain.reason ~ ' Erster Bruch bei Eintrag ' ~ chain.broken_at ~ '.', 'danger', 'Das Protokoll wurde verändert') }} {% else %} {{ alert('Jeder Eintrag bindet den Hash seines Vorgängers ein. Eine nachträglich entfernte oder geänderte Zeile fällt bei der Prüfung auf -- ' ~ chain.checked ~ ' Zeilen geprüft.', 'success') }} {% endif %}
{{ icon('search', size=15) }} Zurücksetzen
{% for row in rows %} {% endfor %}
Zeit Benutzer Aktion Ziel Detail Stufe Herkunft
{{ row.ts | dt }} {{ row.actor }} {{ row.action }} {{ row.target }} {{ row.detail | audit_detail }} {# Ampel: Info grün, Hinweis gelb, Warnung rot. Vorher war Info grau und Hinweis blau -- dabei war nicht zu sehen, was harmlos ist und was Aufmerksamkeit braucht. "kritisch" bekommt eine eigene, gefüllte Darstellung, sonst wäre es von "Warnung" nicht zu unterscheiden. #} {% if row.severity == 'critical' %}{{ pill('kritisch', 'critical') }} {% elif row.severity == 'warning' %}{{ pill('Warnung', 'danger') }} {% elif row.severity == 'notice' %}{{ pill('Hinweis', 'warning') }} {% else %}{{ pill('Info', 'online') }}{% endif %} {{ row.ip or '–' | safe }}
{% if not rows %}{{ empty_state('Keine Einträge', 'Zu diesem Filter gibt es nichts.', 'history') }}{% endif %}
{% endblock %}