Session zu Aktive Nutzung im Dashboard
Dieser Commit ist enthalten in:
1
backups/backup_v2docker_20250621_030000_encrypted.sql.gz.enc
Normale Datei
1
backups/backup_v2docker_20250621_030000_encrypted.sql.gz.enc
Normale Datei
Dateidiff unterdrückt, weil mindestens eine Zeile zu lang ist
@@ -32,10 +32,38 @@ def dashboard():
|
|||||||
cur.execute("SELECT COUNT(*) FROM customers")
|
cur.execute("SELECT COUNT(*) FROM customers")
|
||||||
total_customers = cur.fetchone()[0] if cur.rowcount > 0 else 0
|
total_customers = cur.fetchone()[0] if cur.rowcount > 0 else 0
|
||||||
|
|
||||||
# Anzahl aktiver Sessions
|
# Anzahl aktiver Sessions (Admin-Panel)
|
||||||
cur.execute("SELECT COUNT(*) FROM sessions WHERE is_active = true")
|
cur.execute("SELECT COUNT(*) FROM sessions WHERE is_active = true")
|
||||||
active_sessions = cur.fetchone()[0] if cur.rowcount > 0 else 0
|
active_sessions = cur.fetchone()[0] if cur.rowcount > 0 else 0
|
||||||
|
|
||||||
|
# Aktive Nutzung (Kunden-Software) - Lizenzen mit Heartbeats in den letzten 15 Minuten
|
||||||
|
active_usage = 0
|
||||||
|
try:
|
||||||
|
# Prüfe ob Tabelle existiert
|
||||||
|
cur.execute("""
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT FROM information_schema.tables
|
||||||
|
WHERE table_name = 'license_heartbeats'
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
table_exists = cur.fetchone()[0]
|
||||||
|
|
||||||
|
if table_exists:
|
||||||
|
cur.execute("""
|
||||||
|
SELECT COUNT(DISTINCT license_id)
|
||||||
|
FROM license_heartbeats
|
||||||
|
WHERE timestamp > NOW() - INTERVAL '15 minutes'
|
||||||
|
""")
|
||||||
|
active_usage = cur.fetchone()[0] if cur.rowcount > 0 else 0
|
||||||
|
except Exception as e:
|
||||||
|
# Bei Fehler einfach 0 verwenden
|
||||||
|
current_app.logger.warning(f"Could not get active usage: {str(e)}")
|
||||||
|
# Rollback der fehlgeschlagenen Transaktion
|
||||||
|
conn.rollback()
|
||||||
|
# Neue Transaktion starten
|
||||||
|
conn = get_connection()
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
# Top 10 Lizenzen - vereinfacht
|
# Top 10 Lizenzen - vereinfacht
|
||||||
cur.execute("""
|
cur.execute("""
|
||||||
SELECT
|
SELECT
|
||||||
@@ -69,7 +97,8 @@ def dashboard():
|
|||||||
stats = {
|
stats = {
|
||||||
'total_customers': total_customers,
|
'total_customers': total_customers,
|
||||||
'total_licenses': active_licenses,
|
'total_licenses': active_licenses,
|
||||||
'active_sessions': active_sessions,
|
'active_sessions': active_sessions, # Admin-Panel Sessions
|
||||||
|
'active_usage': active_usage, # Aktive Kunden-Nutzung
|
||||||
'active_licenses': active_licenses,
|
'active_licenses': active_licenses,
|
||||||
'full_licenses': 0,
|
'full_licenses': 0,
|
||||||
'test_licenses': 0,
|
'test_licenses': 0,
|
||||||
|
|||||||
@@ -96,9 +96,9 @@
|
|||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="card stat-card h-100">
|
<div class="card stat-card h-100">
|
||||||
<div class="card-body text-center">
|
<div class="card-body text-center">
|
||||||
<div class="card-icon text-success{% if stats.active_sessions > 0 %} pulse-effect{% endif %}">🟢</div>
|
<div class="card-icon text-success{% if stats.active_usage > 0 %} pulse-effect{% endif %}">🟢</div>
|
||||||
<div class="card-value text-success">{{ stats.active_sessions }}</div>
|
<div class="card-value text-success">{{ stats.active_usage }}</div>
|
||||||
<div class="card-label text-muted">Aktive Sessions</div>
|
<div class="card-label text-muted">Aktive Nutzung</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren