Zugangsdaten-Entitaet, Gruppen-Tabelle mit Aufklappansicht, Vor-/Nachname, Dashboard-Sektionen

- Zugangsdaten (SSH-Logins) als eigenstaendige, wiederverwendbare Entitaet
  statt direkt am Switch; inline Neuanlage beim Switch-Erstellen moeglich;
  automatische Migration bestehender Switch-Logins
- Gruppen-Seite als Tabelle mit Aufklapp-Zeile fuer Rechte (Akkordeon),
  Admin als feste Systemzeile (Mitgliederverwaltung ueber is_admin),
  Standardgruppe 'Benutzer' mit allen Ansichtsrechten (devices.view,
  switches.view), automatische Zuordnung neuer/verwaister Benutzer
- Users-Seite: Icon-Buttons statt Text, Bearbeiten+Passwortaenderung in
  einem Modal zusammengefuehrt, Gruppe/Admin-Zuweisung ueber eigenen
  Zuweisen-Button (wie Switch-Zuordnung bei Devices), Vor-/Nachname
- Dashboard: einheitliche Kachelansicht mit/ohne Login, drei sortierte
  Abschnitte (Offline/Online/Deaktiviert), Kachel-Suchfilter, Bootstrap-
  artiges Grid (max. 6 Spalten), Aktivieren-Option im Popup fuer
  deaktivierte Geraete, Countdown serverseitig korrekt geseedet
- Sidebar dauerhaft einklappbar (Desktop, persistent via localStorage)
- Devices-Tabelle: Aktions-Buttons nebeneinander statt untereinander

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 13:30:47 +02:00
co-authored by Claude Sonnet 5
parent 08d8d1f738
commit fa6bb2935f
12 changed files with 1108 additions and 345 deletions
+8 -3
View File
@@ -14,7 +14,12 @@ def generate_ips_list():
switches = {
row["hostname"]: row
for row in conn.execute("SELECT hostname, ip, username, password FROM switches")
for row in conn.execute("""
SELECT switches.hostname, switches.ip,
credentials.username AS username, credentials.password AS password
FROM switches
LEFT JOIN credentials ON credentials.id = switches.credential_id
""")
}
devices = conn.execute("""
@@ -26,12 +31,12 @@ def generate_ips_list():
for dev in devices:
switch = switches.get(dev["switch_hostname"])
if switch:
if switch and switch["password"]:
switch_ip = switch["ip"]
switch_user = switch["username"]
switch_pass = decrypt_password(switch["password"])
else:
switch_ip = ""
switch_ip = switch["ip"] if switch else ""
switch_user = ""
switch_pass = ""