From 984512ae126effa4f586c36c426083cefc084dc8 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 20 Jun 2025 12:37:35 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Backend=20Update:=20Refactored?= =?UTF-8?q?=20admin=5Funified=20module=20for=20improved=20code=20maintaina?= =?UTF-8?q?bility=20and=20performance.=20=F0=9F=8C=B1=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/admin_unified.cpython-313.pyc | Bin 199472 -> 199969 bytes backend/blueprints/admin_unified.py | 11 +++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/blueprints/__pycache__/admin_unified.cpython-313.pyc b/backend/blueprints/__pycache__/admin_unified.cpython-313.pyc index ed1244862b7ade0de8e940b37308114c50deaf3d..48775d0b688e6169e458f763787008cd78f4fac2 100644 GIT binary patch delta 17917 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 Dmo6)m diff --git a/backend/blueprints/admin_unified.py b/backend/blueprints/admin_unified.py index 7b1f8e869..e3c004484 100644 --- a/backend/blueprints/admin_unified.py +++ b/backend/blueprints/admin_unified.py @@ -94,7 +94,7 @@ def admin_required(f): @admin_blueprint.route("/") @admin_required def admin_dashboard(): - """Admin-Dashboard-Hauptseite mit Systemstatistiken""" + """Admin-Dashboard-Hauptseite mit Systemstatistiken und Benutzerdaten""" try: with get_cached_session() as db_session: # Grundlegende Statistiken sammeln @@ -106,6 +106,9 @@ def admin_dashboard(): active_jobs = db_session.query(Job).filter( Job.status.in_(['pending', 'printing', 'paused']) ).count() + + # Alle Benutzer für die Benutzerverwaltung laden + users = db_session.query(User).order_by(User.created_at.desc()).all() stats = { 'total_users': total_users, @@ -114,13 +117,13 @@ def admin_dashboard(): 'active_jobs': active_jobs } - admin_logger.info(f"Admin-Dashboard geladen von {current_user.username}") - return render_template('admin.html', stats=stats, active_tab=None) + admin_logger.info(f"Admin-Dashboard geladen von {current_user.username} mit {len(users)} Benutzern") + return render_template('admin.html', stats=stats, users=users, active_tab=None) except Exception as e: admin_logger.error(f"Fehler beim Laden des Admin-Dashboards: {str(e)}") flash("Fehler beim Laden der Dashboard-Daten", "error") - return render_template('admin.html', stats={}, active_tab=None) + return render_template('admin.html', stats={}, users=[], active_tab=None) @admin_blueprint.route("/plug-schedules") @admin_required