diff --git a/srv/tesm/app.py b/srv/tesm/app.py index c65372b..ddab6f9 100644 --- a/srv/tesm/app.py +++ b/srv/tesm/app.py @@ -202,12 +202,6 @@ PERMISSIONS = { "edit": "maintenance.edit", }, }, - "papierkorb": { - "label": "Papierkorb", - "rows": { - "view": "papierkorb.view", - }, - }, }, }, "logs_group": { @@ -259,6 +253,10 @@ PERMISSIONS = { "label": "LDAP", "rows": {"view": "settings_ldap.view", "edit": "settings_ldap.edit"}, }, + "papierkorb": { + "label": "Papierkorb", + "rows": {"view": "papierkorb.view", "edit": "papierkorb.edit"}, + }, }, }, } @@ -276,7 +274,8 @@ PERMISSION_LABELS = { "credentials.edit": "Zugangsdaten ändern (inkl. Löschen)", "maintenance.view": "Wartungsseite ansehen (Geräte-Status, Job-Verlauf)", "maintenance.edit": "Wartungsaktionen ausführen (SSH-Update, SSH-Neustart)", - "papierkorb.view": "Papierkorb ansehen (gelöschte Geräte/Switche/Zugangsdaten/Benutzer/Gruppen — jede Kategorie zusätzlich nur mit deren eigenem Leserecht sichtbar)", + "papierkorb.view": "Papierkorb ansehen (alle gelöschten Geräte/Switche/Zugangsdaten/Benutzer/Gruppen, unabhängig von deren eigenen Leserechten)", + "papierkorb.edit": "Papierkorb bearbeiten (beliebige Einträge wiederherstellen oder endgültig löschen, unabhängig vom sonstigen Bearbeiten-Recht der jeweiligen Ressource)", "logs_live.view": "Live-Log lesen", "logs_activity.view": "Änderungslog lesen", "logs_kea.view": "Kea-DHCP-Log lesen", "users.view": "Benutzer lesen", "users.create": "Benutzer anlegen", @@ -322,7 +321,6 @@ NAV_ITEMS = [ {"key": "switches", "label": "Switche", "icon": "share", "endpoint": "switches"}, {"key": "credentials", "label": "Zugangsdaten", "icon": "key", "endpoint": "credentials"}, {"key": "maintenance", "label": "Wartung", "icon": "wrench", "endpoint": "maintenance"}, - {"key": "papierkorb", "label": "Papierkorb", "icon": "trash", "endpoint": "papierkorb"}, ]}, {"key": "users", "label": "Benutzer", "icon": "users", "endpoint": "users"}, {"key": "groups", "label": "Gruppen", "icon": "groups", "endpoint": "groups"}, @@ -331,6 +329,7 @@ NAV_ITEMS = [ {"key": "settings_ldap", "label": "LDAP", "icon": "users", "endpoint": "settings_ldap"}, {"key": "settings_dhcp", "label": "DHCP", "icon": "network", "endpoint": "settings_dhcp"}, {"key": "settings_importexport", "label": "Im-/Export", "icon": "transfer", "endpoint": "settings_import_export"}, + {"key": "papierkorb", "label": "Papierkorb", "icon": "trash", "endpoint": "papierkorb"}, ]}, {"key": "logs_group", "label": "Logs", "icon": "terminal", "children": [ {"key": "logs_live", "label": "Live", "icon": "terminal", "endpoint": "logs"}, @@ -529,15 +528,26 @@ class User(UserMixin): @property def can_view_papierkorb(self): - """Papierkorb-Seite: eigenes, dediziertes Recht (papierkorb.view) -- - vorher implizit sichtbar für jeden mit irgendeiner der fünf - Ressourcen-Leserechte, wodurch praktisch jeder Benutzer den - Papierkorb sehen konnte (Standardgruppe hat bereits devices.view). - Innerhalb der Seite ist jede Kachel zusätzlich einzeln je Ressource - gated (siehe papierkorb.html) -- papierkorb.view allein zeigt also - noch keine Inhalte, sondern schaltet nur die Seite selbst frei.""" + """Papierkorb: eigener, globaler Bereich unter Einstellungen, komplett + unabhängig von den Leserechten der einzelnen Ressourcen (Geräte/ + Switche/Zugangsdaten/Benutzer/Gruppen) -- vorher implizit sichtbar + für jeden mit irgendeiner der fünf Ressourcen-Leserechte, wodurch + praktisch jeder Benutzer den Papierkorb sehen konnte (Standardgruppe + hat bereits devices.view). papierkorb.view zeigt jetzt ALLE fünf + Kategorien auf einmal, unabhängig davon, ob der Benutzer die + jeweilige aktive Ressource überhaupt sehen darf.""" return self.has_permission("papierkorb.view") + @property + def can_edit_papierkorb(self): + """Wiederherstellen/endgültig Löschen im Papierkorb: eigenes, + globales Recht (papierkorb.edit) -- vorher an das jeweilige + Ressourcen-Recht gekoppelt (z.B. switches.edit für Switche im + Papierkorb). Wer den Papierkorb bearbeiten darf, darf jetzt JEDEN + Eintrag darin wiederherstellen oder endgültig löschen, unabhängig + vom sonstigen Bearbeiten-Recht der jeweiligen Ressource.""" + return self.has_permission("papierkorb.edit") + @property def can_view_live_log(self): return self.has_permission("logs_live.view") @@ -4720,7 +4730,7 @@ def _purge_expired_trash(): @app.route("/devices/restore/", methods=["POST"]) @login_required def restore_device(mac): - if not current_user.has_permission("devices.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Geräte wiederherzustellen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4736,7 +4746,7 @@ def restore_device(mac): @app.route("/devices/purge/", methods=["POST"]) @login_required def purge_device(mac): - if not current_user.has_permission("devices.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Geräte endgültig zu löschen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4752,7 +4762,7 @@ def purge_device(mac): @app.route("/switches/restore/", methods=["POST"]) @login_required def restore_switch(hostname): - if not current_user.has_permission("switches.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Switche wiederherzustellen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4767,7 +4777,7 @@ def restore_switch(hostname): @app.route("/switches/purge/", methods=["POST"]) @login_required def purge_switch(hostname): - if not current_user.has_permission("switches.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Switche endgültig zu löschen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4782,7 +4792,7 @@ def purge_switch(hostname): @app.route("/credentials/restore/", methods=["POST"]) @login_required def restore_credential(cred_id): - if not current_user.has_permission("credentials.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Zugangsdaten wiederherzustellen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4798,7 +4808,7 @@ def restore_credential(cred_id): @app.route("/credentials/purge/", methods=["POST"]) @login_required def purge_credential(cred_id): - if not current_user.has_permission("credentials.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Zugangsdaten endgültig zu löschen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4814,7 +4824,7 @@ def purge_credential(cred_id): @app.route("/users/restore/", methods=["POST"]) @login_required def restore_user(user_id): - if not current_user.has_permission("users.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Benutzer wiederherzustellen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4836,7 +4846,7 @@ def restore_user(user_id): @app.route("/users/purge/", methods=["POST"]) @login_required def purge_user(user_id): - if not current_user.has_permission("users.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Benutzer endgültig zu löschen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4858,7 +4868,7 @@ def purge_user(user_id): @app.route("/groups/restore/", methods=["POST"]) @login_required def restore_group(group_id): - if not current_user.has_permission("groups.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Gruppen wiederherzustellen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4874,7 +4884,7 @@ def restore_group(group_id): @app.route("/groups/purge/", methods=["POST"]) @login_required def purge_group(group_id): - if not current_user.has_permission("groups.edit"): + if not current_user.has_permission("papierkorb.edit"): flash("Keine Berechtigung, Gruppen endgültig zu löschen.", "danger") return redirect(url_for("papierkorb")) conn = get_db_connection() @@ -4916,12 +4926,14 @@ def papierkorb(): return redirect(url_for("index")) _purge_expired_trash() conn = get_db_connection() + # Global: papierkorb.view zeigt alle fünf Kategorien, unabhängig vom + # jeweiligen Ressourcen-Leserecht (siehe can_view_papierkorb). trash = { - "devices": _trashed_devices(conn) if current_user.has_permission("devices.view") else [], - "switches": _trashed_switches(conn) if current_user.has_permission("switches.view") else [], - "credentials": _trashed_credentials(conn) if current_user.has_permission("credentials.view") else [], - "users": _trashed_users(conn) if current_user.has_permission("users.view") else [], - "groups": _trashed_groups(conn) if current_user.has_permission("groups.view") else [], + "devices": _trashed_devices(conn), + "switches": _trashed_switches(conn), + "credentials": _trashed_credentials(conn), + "users": _trashed_users(conn), + "groups": _trashed_groups(conn), } conn.close() return render_template( diff --git a/srv/tesm/templates/papierkorb.html b/srv/tesm/templates/papierkorb.html index 0e8f2ca..e60df9d 100644 --- a/srv/tesm/templates/papierkorb.html +++ b/srv/tesm/templates/papierkorb.html @@ -19,7 +19,6 @@
- {% if current_user.has_permission('devices.view') %}

Clients ({{ trash.devices|length }})

{% if trash.devices %} @@ -33,7 +32,7 @@ {{ d['ip'] }} {{ d['deleted_at'] }} - {% if current_user.has_permission('devices.edit') %} + {% if current_user.has_permission('papierkorb.edit') %}
@@ -55,9 +54,7 @@

Papierkorb ist leer.

{% endif %}
- {% endif %} - {% if current_user.has_permission('switches.view') %}

Switche ({{ trash.switches|length }})

{% if trash.switches %} @@ -71,7 +68,7 @@ {{ s['ip'] }} {{ s['deleted_at'] }} - {% if current_user.has_permission('switches.edit') %} + {% if current_user.has_permission('papierkorb.edit') %}
@@ -93,9 +90,7 @@

Papierkorb ist leer.

{% endif %}
- {% endif %} - {% if current_user.has_permission('credentials.view') %}

Zugangsdaten ({{ trash.credentials|length }})

{% if trash.credentials %} @@ -109,7 +104,7 @@ {{ c['username'] }} {{ c['deleted_at'] }} - {% if current_user.has_permission('credentials.edit') %} + {% if current_user.has_permission('papierkorb.edit') %}
@@ -131,9 +126,7 @@

Papierkorb ist leer.

{% endif %}
- {% endif %} - {% if current_user.has_permission('users.view') %}

Benutzer ({{ trash.users|length }})

{% if trash.users %} @@ -148,7 +141,7 @@ {{ full_name or '—' }} {{ u['deleted_at'] }} - {% if current_user.has_permission('users.edit') %} + {% if current_user.has_permission('papierkorb.edit') %}
@@ -170,9 +163,7 @@

Papierkorb ist leer.

{% endif %}
- {% endif %} - {% if current_user.has_permission('groups.view') %}

Gruppen ({{ trash.groups|length }})

{% if trash.groups %} @@ -185,7 +176,7 @@ {{ g['name'] }} {{ g['deleted_at'] }} - {% if current_user.has_permission('groups.edit') %} + {% if current_user.has_permission('papierkorb.edit') %}
@@ -207,7 +198,6 @@

Papierkorb ist leer.

{% endif %}
- {% endif %}