Dashboard mit Statistiken
Dieser Commit ist enthalten in:
@@ -64,9 +64,101 @@ def logout():
|
||||
session.pop('username', None)
|
||||
return redirect(url_for('login'))
|
||||
|
||||
@app.route("/", methods=["GET", "POST"])
|
||||
@app.route("/")
|
||||
@login_required
|
||||
def dashboard():
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
# Statistiken abrufen
|
||||
# Gesamtanzahl Kunden
|
||||
cur.execute("SELECT COUNT(*) FROM customers")
|
||||
total_customers = cur.fetchone()[0]
|
||||
|
||||
# Gesamtanzahl Lizenzen
|
||||
cur.execute("SELECT COUNT(*) FROM licenses")
|
||||
total_licenses = cur.fetchone()[0]
|
||||
|
||||
# Aktive Lizenzen (nicht abgelaufen und is_active = true)
|
||||
cur.execute("""
|
||||
SELECT COUNT(*) FROM licenses
|
||||
WHERE valid_until >= CURRENT_DATE AND is_active = TRUE
|
||||
""")
|
||||
active_licenses = cur.fetchone()[0]
|
||||
|
||||
# Abgelaufene Lizenzen
|
||||
cur.execute("""
|
||||
SELECT COUNT(*) FROM licenses
|
||||
WHERE valid_until < CURRENT_DATE
|
||||
""")
|
||||
expired_licenses = cur.fetchone()[0]
|
||||
|
||||
# Lizenzen die in den nächsten 30 Tagen ablaufen
|
||||
cur.execute("""
|
||||
SELECT COUNT(*) FROM licenses
|
||||
WHERE valid_until >= CURRENT_DATE
|
||||
AND valid_until < CURRENT_DATE + INTERVAL '30 days'
|
||||
AND is_active = TRUE
|
||||
""")
|
||||
expiring_soon = cur.fetchone()[0]
|
||||
|
||||
# Testlizenzen vs Vollversionen
|
||||
cur.execute("""
|
||||
SELECT license_type, COUNT(*)
|
||||
FROM licenses
|
||||
GROUP BY license_type
|
||||
""")
|
||||
license_types = dict(cur.fetchall())
|
||||
|
||||
# Letzte 5 erstellten Lizenzen
|
||||
cur.execute("""
|
||||
SELECT l.id, l.license_key, c.name, l.valid_until,
|
||||
CASE
|
||||
WHEN l.valid_until < CURRENT_DATE THEN 'abgelaufen'
|
||||
WHEN l.valid_until < CURRENT_DATE + INTERVAL '30 days' THEN 'läuft bald ab'
|
||||
ELSE 'aktiv'
|
||||
END as status
|
||||
FROM licenses l
|
||||
JOIN customers c ON l.customer_id = c.id
|
||||
ORDER BY l.id DESC
|
||||
LIMIT 5
|
||||
""")
|
||||
recent_licenses = cur.fetchall()
|
||||
|
||||
# Bald ablaufende Lizenzen (nächste 30 Tage)
|
||||
cur.execute("""
|
||||
SELECT l.id, l.license_key, c.name, l.valid_until,
|
||||
l.valid_until - CURRENT_DATE as days_left
|
||||
FROM licenses l
|
||||
JOIN customers c ON l.customer_id = c.id
|
||||
WHERE l.valid_until >= CURRENT_DATE
|
||||
AND l.valid_until < CURRENT_DATE + INTERVAL '30 days'
|
||||
AND l.is_active = TRUE
|
||||
ORDER BY l.valid_until
|
||||
LIMIT 10
|
||||
""")
|
||||
expiring_licenses = cur.fetchall()
|
||||
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
stats = {
|
||||
'total_customers': total_customers,
|
||||
'total_licenses': total_licenses,
|
||||
'active_licenses': active_licenses,
|
||||
'expired_licenses': expired_licenses,
|
||||
'expiring_soon': expiring_soon,
|
||||
'full_licenses': license_types.get('full', 0),
|
||||
'test_licenses': license_types.get('test', 0),
|
||||
'recent_licenses': recent_licenses,
|
||||
'expiring_licenses': expiring_licenses
|
||||
}
|
||||
|
||||
return render_template("dashboard.html", stats=stats, username=session.get('username'))
|
||||
|
||||
@app.route("/create", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def create_license():
|
||||
if request.method == "POST":
|
||||
name = request.form["customer_name"]
|
||||
email = request.form["email"]
|
||||
@@ -96,7 +188,7 @@ def dashboard():
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
return redirect("/")
|
||||
return redirect("/create")
|
||||
|
||||
return render_template("index.html", username=session.get('username'))
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren