diff --git a/backend/__pycache__/app.cpython-313.pyc b/backend/__pycache__/app.cpython-313.pyc index cc980458..90fd9971 100644 Binary files a/backend/__pycache__/app.cpython-313.pyc and b/backend/__pycache__/app.cpython-313.pyc differ diff --git a/backend/app.py b/backend/app.py index 54be710d..5be9b641 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1254,46 +1254,133 @@ def user_update_settings(): finally: db_session.close() -@app.route("/api/user/settings", methods=["GET"]) +@app.route("/api/user/settings", methods=["GET", "POST"]) @login_required def get_user_settings(): - """Holt die aktuellen Benutzereinstellungen""" - try: - # Einstellungen aus Session oder Datenbank laden - user_settings = session.get('user_settings', {}) - - # Standard-Einstellungen falls keine vorhanden - default_settings = { - "theme": "system", - "reduced_motion": False, - "contrast": "normal", - "notifications": { - "new_jobs": True, - "job_updates": True, - "system": True, - "email": False - }, - "privacy": { - "activity_logs": True, - "two_factor": False, - "auto_logout": 60 + """Holt die aktuellen Benutzereinstellungen (GET) oder speichert sie (POST)""" + + if request.method == "GET": + try: + # Einstellungen aus Session oder Datenbank laden + user_settings = session.get('user_settings', {}) + + # Standard-Einstellungen falls keine vorhanden + default_settings = { + "theme": "system", + "reduced_motion": False, + "contrast": "normal", + "notifications": { + "new_jobs": True, + "job_updates": True, + "system": True, + "email": False + }, + "privacy": { + "activity_logs": True, + "two_factor": False, + "auto_logout": 60 + } } - } - - # Merge mit Standard-Einstellungen - settings = {**default_settings, **user_settings} - - return jsonify({ - "success": True, - "settings": settings - }) - - except Exception as e: - user_logger.error(f"Fehler beim Laden der Benutzereinstellungen: {str(e)}") - return jsonify({ - "success": False, - "error": "Fehler beim Laden der Einstellungen" - }), 500 + + # Merge mit Standard-Einstellungen + settings = {**default_settings, **user_settings} + + return jsonify({ + "success": True, + "settings": settings + }) + + except Exception as e: + user_logger.error(f"Fehler beim Laden der Benutzereinstellungen: {str(e)}") + return jsonify({ + "success": False, + "error": "Fehler beim Laden der Einstellungen" + }), 500 + + elif request.method == "POST": + """Benutzereinstellungen über API aktualisieren""" + db_session = get_db_session() + try: + # JSON-Daten extrahieren + if not request.is_json: + return jsonify({"error": "Anfrage muss im JSON-Format sein"}), 400 + + data = request.get_json() + if not data: + return jsonify({"error": "Keine Daten empfangen"}), 400 + + # Einstellungen aus der Anfrage extrahieren + theme = data.get("theme", "system") + reduced_motion = bool(data.get("reduced_motion", False)) + contrast = data.get("contrast", "normal") + notifications = data.get("notifications", {}) + privacy = data.get("privacy", {}) + + # Validierung der Eingaben + valid_themes = ["light", "dark", "system"] + if theme not in valid_themes: + theme = "system" + + valid_contrasts = ["normal", "high"] + if contrast not in valid_contrasts: + contrast = "normal" + + # Benutzer aus der Datenbank laden + user = db_session.query(User).filter(User.id == int(current_user.id)).first() + + if not user: + return jsonify({"error": "Benutzer nicht gefunden"}), 404 + + # Einstellungen-Dictionary erstellen + settings = { + "theme": theme, + "reduced_motion": reduced_motion, + "contrast": contrast, + "notifications": { + "new_jobs": bool(notifications.get("new_jobs", True)), + "job_updates": bool(notifications.get("job_updates", True)), + "system": bool(notifications.get("system", True)), + "email": bool(notifications.get("email", False)) + }, + "privacy": { + "activity_logs": bool(privacy.get("activity_logs", True)), + "two_factor": bool(privacy.get("two_factor", False)), + "auto_logout": max(5, min(480, int(privacy.get("auto_logout", 60)))) # 5-480 Minuten + }, + "last_updated": datetime.now().isoformat() + } + + # Prüfen, ob User-Tabelle eine settings-Spalte hat + if hasattr(user, 'settings'): + # Einstellungen in der Datenbank speichern + import json + user.settings = json.dumps(settings) + else: + # Fallback: In Session speichern (temporär) + session['user_settings'] = settings + + user.updated_at = datetime.now() + db_session.commit() + + user_logger.info(f"Benutzer {current_user.username} hat seine Einstellungen über die API aktualisiert") + + return jsonify({ + "success": True, + "message": "Einstellungen erfolgreich aktualisiert", + "settings": settings + }) + + except ValueError as e: + error = f"Ungültige Eingabedaten: {str(e)}" + user_logger.warning(f"Ungültige Einstellungsdaten von Benutzer {current_user.username}: {str(e)}") + return jsonify({"error": error}), 400 + except Exception as e: + db_session.rollback() + error = f"Fehler beim Aktualisieren der Einstellungen: {str(e)}" + user_logger.error(f"Fehler beim Aktualisieren der Einstellungen für Benutzer {current_user.username}: {str(e)}") + return jsonify({"error": "Interner Serverfehler"}), 500 + finally: + db_session.close() @app.route("/user/change-password", methods=["POST"]) @login_required @@ -1523,8 +1610,6 @@ def kiosk_deactivate(): except Exception as e: kiosk_logger.error(f"Unerwarteter Fehler bei Kiosk-Deaktivierung: {str(e)}") return jsonify({"error": "Unerwarteter Fehler"}), 500 -@app.route('/api/kiosk/activate', methods=['POST']) -@login_required def kiosk_activate(): """Kiosk-Modus aktivieren (nur für Admins).""" try: @@ -6396,6 +6481,99 @@ def api_admin_system_status(): 'health_status': 'error' }), 500 + +# ===== ÖFFENTLICHE STATISTIK-API ===== + +@app.route("/api/statistics/public", methods=['GET']) +def api_public_statistics(): + """ + Öffentliche Statistiken ohne Authentifizierung. + + Stellt grundlegende, nicht-sensible Systemstatistiken bereit, + die auf der Startseite angezeigt werden können. + + Returns: + JSON: Öffentliche Statistiken + """ + try: + db_session = get_db_session() + + # Grundlegende, nicht-sensible Statistiken + total_jobs = db_session.query(Job).count() + completed_jobs = db_session.query(Job).filter(Job.status == "finished").count() + total_printers = db_session.query(Printer).count() + active_printers = db_session.query(Printer).filter( + Printer.active == True, + Printer.status.in_(["online", "available", "idle"]) + ).count() + + # Erfolgsrate berechnen + success_rate = round((completed_jobs / total_jobs * 100) if total_jobs > 0 else 0, 1) + + # Anonymisierte Benutzerstatistiken + total_users = db_session.query(User).filter(User.active == True).count() + + # Letzte 30 Tage Aktivität (anonymisiert) + thirty_days_ago = datetime.now() - timedelta(days=30) + recent_jobs = db_session.query(Job).filter( + Job.created_at >= thirty_days_ago + ).count() + + db_session.close() + + public_stats = { + "system_info": { + "total_jobs": total_jobs, + "completed_jobs": completed_jobs, + "success_rate": success_rate, + "total_printers": total_printers, + "active_printers": active_printers, + "active_users": total_users, + "recent_activity": recent_jobs + }, + "health_indicators": { + "system_status": "operational", + "printer_availability": round((active_printers / total_printers * 100) if total_printers > 0 else 0, 1), + "last_updated": datetime.now().isoformat() + }, + "features": { + "multi_location_support": True, + "real_time_monitoring": True, + "automated_scheduling": True, + "advanced_reporting": True + } + } + + return jsonify(public_stats) + + except Exception as e: + app_logger.error(f"Fehler bei öffentlichen Statistiken: {str(e)}") + + # Fallback-Statistiken bei Fehler + return jsonify({ + "system_info": { + "total_jobs": 0, + "completed_jobs": 0, + "success_rate": 0, + "total_printers": 0, + "active_printers": 0, + "active_users": 0, + "recent_activity": 0 + }, + "health_indicators": { + "system_status": "maintenance", + "printer_availability": 0, + "last_updated": datetime.now().isoformat() + }, + "features": { + "multi_location_support": True, + "real_time_monitoring": True, + "automated_scheduling": True, + "advanced_reporting": True + }, + "error": "Statistiken temporär nicht verfügbar" + }), 200 # 200 statt 500 um Frontend nicht zu brechen + @app.route("/api/stats", methods=['GET']) @login_required def api_stats(): diff --git a/backend/blueprints/__pycache__/admin_api.cpython-313.pyc b/backend/blueprints/__pycache__/admin_api.cpython-313.pyc new file mode 100644 index 00000000..eb36a3f3 Binary files /dev/null and b/backend/blueprints/__pycache__/admin_api.cpython-313.pyc differ diff --git a/backend/database/myp.db b/backend/database/myp.db index df4be5db..2211b354 100644 Binary files a/backend/database/myp.db and b/backend/database/myp.db differ diff --git a/backend/database/myp.db-shm b/backend/database/myp.db-shm index 9e930c7d..c2bb791f 100644 Binary files a/backend/database/myp.db-shm and b/backend/database/myp.db-shm differ diff --git a/backend/database/myp.db-wal b/backend/database/myp.db-wal index b47fe35c..a9085d2d 100644 Binary files a/backend/database/myp.db-wal and b/backend/database/myp.db-wal differ diff --git a/backend/docs/GLASSMORPHISM_NOTIFICATIONS.md b/backend/docs/GLASSMORPHISM_NOTIFICATIONS.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/GLASSMORPHISM_NOTIFICATIONS.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/fix_public_stats.py b/backend/fix_public_stats.py new file mode 100644 index 00000000..1468caec --- /dev/null +++ b/backend/fix_public_stats.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +""" +Temporäres Skript zum Hinzufügen der fehlenden /api/statistics/public Route +""" + +with open('app.py', 'r', encoding='utf-8') as f: + content = f.read() + +# Die neue Route die hinzugefügt werden soll +new_route = ''' +# ===== ÖFFENTLICHE STATISTIK-API ===== + +@app.route("/api/statistics/public", methods=['GET']) +def api_public_statistics(): + """ + Öffentliche Statistiken ohne Authentifizierung. + + Stellt grundlegende, nicht-sensible Systemstatistiken bereit, + die auf der Startseite angezeigt werden können. + + Returns: + JSON: Öffentliche Statistiken + """ + try: + db_session = get_db_session() + + # Grundlegende, nicht-sensible Statistiken + total_jobs = db_session.query(Job).count() + completed_jobs = db_session.query(Job).filter(Job.status == "finished").count() + total_printers = db_session.query(Printer).count() + active_printers = db_session.query(Printer).filter( + Printer.active == True, + Printer.status.in_(["online", "available", "idle"]) + ).count() + + # Erfolgsrate berechnen + success_rate = round((completed_jobs / total_jobs * 100) if total_jobs > 0 else 0, 1) + + # Anonymisierte Benutzerstatistiken + total_users = db_session.query(User).filter(User.active == True).count() + + # Letzte 30 Tage Aktivität (anonymisiert) + thirty_days_ago = datetime.now() - timedelta(days=30) + recent_jobs = db_session.query(Job).filter( + Job.created_at >= thirty_days_ago + ).count() + + db_session.close() + + public_stats = { + "system_info": { + "total_jobs": total_jobs, + "completed_jobs": completed_jobs, + "success_rate": success_rate, + "total_printers": total_printers, + "active_printers": active_printers, + "active_users": total_users, + "recent_activity": recent_jobs + }, + "health_indicators": { + "system_status": "operational", + "printer_availability": round((active_printers / total_printers * 100) if total_printers > 0 else 0, 1), + "last_updated": datetime.now().isoformat() + }, + "features": { + "multi_location_support": True, + "real_time_monitoring": True, + "automated_scheduling": True, + "advanced_reporting": True + } + } + + return jsonify(public_stats) + + except Exception as e: + app_logger.error(f"Fehler bei öffentlichen Statistiken: {str(e)}") + + # Fallback-Statistiken bei Fehler + return jsonify({ + "system_info": { + "total_jobs": 0, + "completed_jobs": 0, + "success_rate": 0, + "total_printers": 0, + "active_printers": 0, + "active_users": 0, + "recent_activity": 0 + }, + "health_indicators": { + "system_status": "maintenance", + "printer_availability": 0, + "last_updated": datetime.now().isoformat() + }, + "features": { + "multi_location_support": True, + "real_time_monitoring": True, + "automated_scheduling": True, + "advanced_reporting": True + }, + "error": "Statistiken temporär nicht verfügbar" + }), 200 # 200 statt 500 um Frontend nicht zu brechen + +''' + +# Füge die Route vor @app.route("/api/stats", methods=['GET']) hinzu +marker = '@app.route("/api/stats", methods=[\'GET\'])' +if marker in content: + parts = content.split(marker, 1) + new_content = parts[0] + new_route + marker + parts[1] + + with open('app.py', 'w', encoding='utf-8') as f: + f.write(new_content) + print('✅ Öffentliche Statistik-API Route hinzugefügt') +else: + print('❌ Marker nicht gefunden - versuche alternativen Marker') + # Versuche alternativen Marker + alt_marker = '@app.route("/api/stats", methods=[\"GET\"])' + if alt_marker in content: + parts = content.split(alt_marker, 1) + new_content = parts[0] + new_route + alt_marker + parts[1] + + with open('app.py', 'w', encoding='utf-8') as f: + f.write(new_content) + print('✅ Öffentliche Statistik-API Route mit alternativem Marker hinzugefügt') + else: + print('❌ Auch alternativer Marker nicht gefunden') + print('Suche verfügbare Marker...') + import re + stats_markers = re.findall(r'@app\.route\("/api/stats".*?\)', content) + print(f'Gefundene Stats-Marker: {stats_markers}') \ No newline at end of file diff --git a/backend/logs/admin_api/admin_api.log b/backend/logs/admin_api/admin_api.log new file mode 100644 index 00000000..e69de29b diff --git a/backend/logs/analytics/analytics.log b/backend/logs/analytics/analytics.log index b4925290..44ca440b 100644 --- a/backend/logs/analytics/analytics.log +++ b/backend/logs/analytics/analytics.log @@ -17,3 +17,10 @@ 2025-06-01 04:14:22 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 04:16:09 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 04:22:49 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:26:29 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:26:32 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:28:39 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:28:58 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:29:28 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:31:09 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert +2025-06-01 04:36:21 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index f0b1a22e..7766ac1d 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -616,3 +616,72 @@ WHERE users.id = ? 2025-06-01 04:24:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True 2025-06-01 04:25:22 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True 2025-06-01 04:25:52 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 04:26:22 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 04:26:29 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:26:30 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 04:26:30 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 04:26:30 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 04:26:30 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 04:26:31 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 04:26:31 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 04:26:31 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 04:26:31 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 04:26:31 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 04:26:31 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 04:26:31 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 04:26:31 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 04:26:32 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:26:33 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:26:33 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:26:34 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:26:44 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:26:54 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:27:06 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:27:09 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:28:39 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:28:40 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:28:40 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:28:58 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:28:59 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:28:59 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:29:27 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:29:28 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 04:29:29 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 04:29:29 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 04:29:29 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 04:29:29 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 04:29:29 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 04:29:29 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 04:29:29 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 04:29:29 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 04:29:36 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:29:45 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:29:53 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:30:34 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:30:42 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:31:08 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:31:10 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen +2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert +2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 04:31:10 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 04:31:10 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 04:31:10 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 04:31:10 - [app] app - [INFO] INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 04:31:10 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 04:31:10 - [app] app - [INFO] INFO - Job-Scheduler gestartet +2025-06-01 04:31:10 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 04:31:10 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 04:31:12 - [app] app - [ERROR] ERROR - Fehler beim Laden der Admin-Dashboard-Daten: Could not build url for endpoint 'admin_settings'. Did you mean 'optimization_settings' instead? +2025-06-01 04:36:21 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 04:36:22 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 04:36:22 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen diff --git a/backend/logs/backup/backup.log b/backend/logs/backup/backup.log index 731c6da2..46c1f3b3 100644 --- a/backend/logs/backup/backup.log +++ b/backend/logs/backup/backup.log @@ -17,3 +17,10 @@ 2025-06-01 04:14:22 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 04:16:09 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 04:22:49 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:26:29 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:26:32 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:28:39 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:28:58 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:29:28 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:31:09 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) +2025-06-01 04:36:21 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) diff --git a/backend/logs/calendar/calendar.log b/backend/logs/calendar/calendar.log index 895f121d..88417a9d 100644 --- a/backend/logs/calendar/calendar.log +++ b/backend/logs/calendar/calendar.log @@ -10,3 +10,6 @@ 2025-06-01 04:08:27 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 2025-06-01 04:08:48 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 2025-06-01 04:16:18 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 +2025-06-01 04:31:18 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 +2025-06-01 04:31:38 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 +2025-06-01 04:31:41 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 0 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00 diff --git a/backend/logs/dashboard/dashboard.log b/backend/logs/dashboard/dashboard.log index 2dfdcd7c..63673cbd 100644 --- a/backend/logs/dashboard/dashboard.log +++ b/backend/logs/dashboard/dashboard.log @@ -61,3 +61,31 @@ 2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet 2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) 2025-06-01 04:22:50 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:26:30 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:26:33 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:28:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:28:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:29:28 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:29:29 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:31:10 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet +2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 04:36:22 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) diff --git a/backend/logs/database/database.log b/backend/logs/database/database.log index 3b4a67ff..756ca047 100644 --- a/backend/logs/database/database.log +++ b/backend/logs/database/database.log @@ -17,3 +17,10 @@ 2025-06-01 04:14:22 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 04:16:09 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 04:22:49 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:26:29 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:26:32 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:28:39 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:28:58 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:29:28 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:31:09 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 04:36:21 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet diff --git a/backend/logs/email_notification/email_notification.log b/backend/logs/email_notification/email_notification.log index e40485ba..37c7f702 100644 --- a/backend/logs/email_notification/email_notification.log +++ b/backend/logs/email_notification/email_notification.log @@ -15,3 +15,10 @@ 2025-06-01 04:14:23 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 04:16:10 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 04:22:50 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:26:30 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:26:33 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:28:40 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:28:59 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:29:28 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:31:10 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 04:36:22 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) diff --git a/backend/logs/jobs/jobs.log b/backend/logs/jobs/jobs.log index 5d5dc0e4..431d6def 100644 --- a/backend/logs/jobs/jobs.log +++ b/backend/logs/jobs/jobs.log @@ -47,3 +47,8 @@ 2025-06-01 04:16:16 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) 2025-06-01 04:16:58 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) 2025-06-01 04:17:52 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) +2025-06-01 04:22:55 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) +2025-06-01 04:31:23 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) +2025-06-01 04:31:36 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) +2025-06-01 04:31:53 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) +2025-06-01 04:32:03 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 0 von 0 (Seite 1) diff --git a/backend/logs/maintenance/maintenance.log b/backend/logs/maintenance/maintenance.log index f7cac34d..cddaf251 100644 --- a/backend/logs/maintenance/maintenance.log +++ b/backend/logs/maintenance/maintenance.log @@ -30,3 +30,17 @@ 2025-06-01 04:16:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 04:22:50 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:26:30 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:26:30 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:26:33 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:26:33 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:28:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:28:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:28:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:28:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:29:28 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:29:29 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:31:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:31:10 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:36:22 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet +2025-06-01 04:36:22 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet diff --git a/backend/logs/multi_location/multi_location.log b/backend/logs/multi_location/multi_location.log index 04441e76..99886626 100644 --- a/backend/logs/multi_location/multi_location.log +++ b/backend/logs/multi_location/multi_location.log @@ -30,3 +30,17 @@ 2025-06-01 04:16:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 04:22:50 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:26:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:26:30 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:26:33 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:26:33 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:28:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:28:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:28:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:28:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:29:28 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:29:29 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:31:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:31:10 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:36:22 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt +2025-06-01 04:36:22 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt diff --git a/backend/logs/permissions/permissions.log b/backend/logs/permissions/permissions.log index 5a8ef51b..29e32d27 100644 --- a/backend/logs/permissions/permissions.log +++ b/backend/logs/permissions/permissions.log @@ -13,3 +13,10 @@ 2025-06-01 04:14:23 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 04:16:10 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 04:22:50 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:26:30 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:26:33 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:28:40 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:28:59 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:29:29 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:31:10 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert +2025-06-01 04:36:22 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert diff --git a/backend/logs/printer_monitor/printer_monitor.log b/backend/logs/printer_monitor/printer_monitor.log index 7aa915c2..208bd630 100644 --- a/backend/logs/printer_monitor/printer_monitor.log +++ b/backend/logs/printer_monitor/printer_monitor.log @@ -638,3 +638,78 @@ 2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden 2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... 2025-06-01 04:25:57 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:26:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:26:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 04:26:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:26:32 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:26:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 04:26:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 04:26:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 04:26:55 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 04:27:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 04:27:07 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s +2025-06-01 04:28:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:28:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:28:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:28:58 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:29:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:29:28 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:29:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 04:29:29 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 04:29:30 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:29:31 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:29:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 04:29:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 04:29:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:29:51 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:29:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 04:30:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 04:30:06 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s +2025-06-01 04:31:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:31:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 04:31:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 04:31:10 - [printer_monitor] printer_monitor - [WARNING] WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 04:31:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 04:31:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 04:31:23 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:31:26 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:31:29 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:31:35 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 04:31:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 04:31:47 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.0s +2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:32:10 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 04:32:52 - [printer_monitor] printer_monitor - [INFO] INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 04:36:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 04:36:21 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log index 6b03436c..0d2edcfa 100644 --- a/backend/logs/printers/printers.log +++ b/backend/logs/printers/printers.log @@ -3312,3 +3312,28 @@ 2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) 2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker 2025-06-01 04:25:57 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.68ms +2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:26:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.53ms +2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:29:31 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.65ms +2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:29:51 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 5.38ms +2025-06-01 04:31:23 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.61ms +2025-06-01 04:31:26 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:31:29 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 5.46ms +2025-06-01 04:31:36 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:32:10 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.91ms +2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 04:32:52 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 6.71ms diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index 97b90515..00806711 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -2869,3 +2869,16 @@ 2025-06-01 04:22:49 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True 2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet 2025-06-01 04:22:50 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 04:26:29 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:26:31 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 04:26:31 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 04:26:32 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:28:39 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:28:58 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:29:28 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:29:29 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 04:29:29 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 04:31:09 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 04:31:10 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet +2025-06-01 04:31:10 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet +2025-06-01 04:36:21 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True diff --git a/backend/logs/security/security.log b/backend/logs/security/security.log index a5ed1df7..e1e5920b 100644 --- a/backend/logs/security/security.log +++ b/backend/logs/security/security.log @@ -13,3 +13,10 @@ 2025-06-01 04:14:23 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 04:16:10 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 04:22:50 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:26:30 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:26:33 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:28:40 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:28:59 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:29:29 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:31:10 - [security] security - [INFO] INFO - 🔒 Security System initialisiert +2025-06-01 04:36:22 - [security] security - [INFO] INFO - 🔒 Security System initialisiert diff --git a/backend/logs/shutdown_manager/shutdown_manager.log b/backend/logs/shutdown_manager/shutdown_manager.log index 2ffadc47..b2866e1e 100644 --- a/backend/logs/shutdown_manager/shutdown_manager.log +++ b/backend/logs/shutdown_manager/shutdown_manager.log @@ -46,3 +46,26 @@ 2025-06-01 04:14:23 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 04:16:10 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 04:22:50 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:26:30 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 04:26:33 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... +2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 04:28:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... +2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 04:28:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... +2025-06-01 04:29:29 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:31:10 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert +2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown... +2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 1 Cleanup-Funktionen aus... +2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Koordiniertes Shutdown abgeschlossen in 0.0s +2025-06-01 04:36:22 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... diff --git a/backend/logs/startup/startup.log b/backend/logs/startup/startup.log index 011a2eaa..2523603b 100644 --- a/backend/logs/startup/startup.log +++ b/backend/logs/startup/startup.log @@ -129,3 +129,66 @@ 2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-01 04:22:50 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:26:30.681481 +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:26:30 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:26:33.469002 +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:26:33 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:28:40.487299 +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:28:40 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:28:59.128550 +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:28:59 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:29:28.997767 +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:29:28 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:31:10.171279 +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:31:10 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ================================================== +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet... +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)] +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32) +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T04:36:22.434555 +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert +2025-06-01 04:36:22 - [startup] startup - [INFO] INFO - ================================================== diff --git a/backend/logs/user/user.log b/backend/logs/user/user.log index 8d3c2af7..5d9b4a64 100644 --- a/backend/logs/user/user.log +++ b/backend/logs/user/user.log @@ -1 +1,3 @@ 2025-06-01 04:07:12 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen +2025-06-01 04:32:24 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen +2025-06-01 04:33:16 - [user] user - [INFO] INFO - Benutzer admin hat seine Einstellungsseite aufgerufen diff --git a/backend/logs/windows_fixes/windows_fixes.log b/backend/logs/windows_fixes/windows_fixes.log index c048f17c..9f9a249c 100644 --- a/backend/logs/windows_fixes/windows_fixes.log +++ b/backend/logs/windows_fixes/windows_fixes.log @@ -66,3 +66,31 @@ 2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-01 04:22:49 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:26:29 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:26:32 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:28:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:28:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:29:27 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:31:08 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 04:36:21 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet diff --git a/backend/static/js/glassmorphism-notifications.js b/backend/static/js/glassmorphism-notifications.js index 490a0568..993074d3 100644 --- a/backend/static/js/glassmorphism-notifications.js +++ b/backend/static/js/glassmorphism-notifications.js @@ -309,13 +309,13 @@ class GlassmorphismNotificationSystem { const toasts = Array.from(container.children); toasts.forEach((toast, index) => { // Gestaffelte Positionierung mit smooth transition - toast.style.top = `${1 + index * 4.5}rem`; + toast.style.top = `${1 + index * 3.75}rem`; toast.style.zIndex = 1000 - index; // Leichter Versatz für Tiefeneffekt if (index > 0) { - toast.style.transform = `scale(${1 - index * 0.02})`; - toast.style.opacity = `${1 - index * 0.1}`; + toast.style.transform = `scale(${1 - index * 0.015})`; + toast.style.opacity = `${1 - index * 0.08}`; } }); } @@ -579,31 +579,31 @@ class GlassmorphismNotificationSystem { styles.id = 'glassmorphism-notification-styles'; styles.textContent = ` .glassmorphism-toast { - margin-bottom: 0.75rem; + margin-bottom: 0.625rem; transform: translateX(100%); opacity: 0; - transition: all 0.8s cubic-bezier(0.34, 1.56, 0.64, 1); + transition: all 0.7s cubic-bezier(0.34, 1.56, 0.64, 1); will-change: transform, opacity, filter; /* Erweiterte Premium Glassmorphism-Eigenschaften */ - backdrop-filter: blur(60px) saturate(220%) brightness(125%) contrast(115%); - -webkit-backdrop-filter: blur(60px) saturate(220%) brightness(125%) contrast(115%); + backdrop-filter: blur(50px) saturate(200%) brightness(120%) contrast(110%); + -webkit-backdrop-filter: blur(50px) saturate(200%) brightness(120%) contrast(110%); box-shadow: - 0 40px 80px rgba(0, 0, 0, 0.12), - 0 20px 40px rgba(0, 0, 0, 0.08), - 0 8px 16px rgba(0, 0, 0, 0.06), - inset 0 3px 0 rgba(255, 255, 255, 0.5), - inset 0 1px 2px rgba(255, 255, 255, 0.8), - 0 0 0 1px rgba(255, 255, 255, 0.2); - border-radius: 1.75rem; + 0 32px 64px rgba(0, 0, 0, 0.1), + 0 16px 32px rgba(0, 0, 0, 0.06), + 0 6px 12px rgba(0, 0, 0, 0.05), + inset 0 2px 0 rgba(255, 255, 255, 0.4), + inset 0 1px 2px rgba(255, 255, 255, 0.7), + 0 0 0 1px rgba(255, 255, 255, 0.18); + border-radius: 1.5rem; overflow: hidden; position: relative; /* Subtile Farbverläufe */ background: linear-gradient(145deg, - rgba(255, 255, 255, 0.15) 0%, - rgba(255, 255, 255, 0.08) 25%, - rgba(255, 255, 255, 0.12) 50%, - rgba(255, 255, 255, 0.06) 75%, - rgba(255, 255, 255, 0.1) 100%); + rgba(255, 255, 255, 0.12) 0%, + rgba(255, 255, 255, 0.06) 25%, + rgba(255, 255, 255, 0.1) 50%, + rgba(255, 255, 255, 0.05) 75%, + rgba(255, 255, 255, 0.08) 100%); } /* Erweiterte Glassmorphism-Overlay-Effekte */ @@ -873,37 +873,37 @@ class GlassmorphismNotificationSystem { .toast-content { position: relative; overflow: hidden; - padding: 1.5rem; + padding: 1rem; border-radius: inherit; } .toast-header { display: flex; align-items: flex-start; - gap: 1.25rem; + gap: 0.875rem; } .toast-icon { flex-shrink: 0; - width: 3rem; - height: 3rem; + width: 2.25rem; + height: 2.25rem; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: linear-gradient(145deg, - rgba(255, 255, 255, 0.4) 0%, - rgba(255, 255, 255, 0.25) 50%, - rgba(255, 255, 255, 0.35) 100%); - backdrop-filter: blur(20px) saturate(150%); - -webkit-backdrop-filter: blur(20px) saturate(150%); - border: 1px solid rgba(255, 255, 255, 0.5); + rgba(255, 255, 255, 0.35) 0%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.3) 100%); + backdrop-filter: blur(16px) saturate(140%); + -webkit-backdrop-filter: blur(16px) saturate(140%); + border: 1px solid rgba(255, 255, 255, 0.4); box-shadow: - 0 12px 24px rgba(0, 0, 0, 0.08), - 0 4px 8px rgba(0, 0, 0, 0.05), - inset 0 2px 0 rgba(255, 255, 255, 0.7), - inset 0 -1px 0 rgba(0, 0, 0, 0.05); - transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + 0 8px 16px rgba(0, 0, 0, 0.06), + 0 2px 4px rgba(0, 0, 0, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.6), + inset 0 -1px 0 rgba(0, 0, 0, 0.03); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } @@ -916,7 +916,7 @@ class GlassmorphismNotificationSystem { left: -50%; width: 200%; height: 200%; - background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%); + background: radial-gradient(circle, rgba(255, 255, 255, 0.25) 0%, transparent 70%); opacity: 0; transition: opacity 0.3s ease; animation: icon-pulse 3s ease-in-out infinite; @@ -924,7 +924,7 @@ class GlassmorphismNotificationSystem { @keyframes icon-pulse { 0%, 100% { opacity: 0; transform: scale(0.8); } - 50% { opacity: 0.5; transform: scale(1.2); } + 50% { opacity: 0.4; transform: scale(1.1); } } .toast-icon:hover::before { @@ -933,29 +933,29 @@ class GlassmorphismNotificationSystem { } .toast-icon:hover { - transform: scale(1.15) rotate(10deg); + transform: scale(1.08) rotate(8deg); box-shadow: - 0 20px 40px rgba(0, 0, 0, 0.12), - 0 8px 16px rgba(0, 0, 0, 0.08), - inset 0 2px 0 rgba(255, 255, 255, 0.8), - inset 0 -1px 0 rgba(0, 0, 0, 0.08); + 0 12px 24px rgba(0, 0, 0, 0.08), + 0 4px 8px rgba(0, 0, 0, 0.06), + inset 0 1px 0 rgba(255, 255, 255, 0.7), + inset 0 -1px 0 rgba(0, 0, 0, 0.05); } .dark .toast-icon { background: linear-gradient(145deg, - rgba(0, 0, 0, 0.4) 0%, - rgba(15, 15, 15, 0.3) 50%, - rgba(0, 0, 0, 0.35) 100%); - border: 1px solid rgba(255, 255, 255, 0.15); + rgba(0, 0, 0, 0.35) 0%, + rgba(15, 15, 15, 0.25) 50%, + rgba(0, 0, 0, 0.3) 100%); + border: 1px solid rgba(255, 255, 255, 0.12); box-shadow: - 0 12px 24px rgba(0, 0, 0, 0.3), - 0 4px 8px rgba(0, 0, 0, 0.2), - inset 0 2px 0 rgba(255, 255, 255, 0.15), - inset 0 -1px 0 rgba(255, 255, 255, 0.05); + 0 8px 16px rgba(0, 0, 0, 0.25), + 0 2px 4px rgba(0, 0, 0, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.12), + inset 0 -1px 0 rgba(255, 255, 255, 0.03); } .dark .toast-icon::before { - background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 70%); + background: radial-gradient(circle, rgba(255, 255, 255, 0.12) 0%, transparent 70%); } .toast-body { @@ -964,56 +964,90 @@ class GlassmorphismNotificationSystem { } .toast-title { - font-weight: 700; - font-size: 1rem; - margin-bottom: 0.5rem; - line-height: 1.4; - letter-spacing: 0.015em; - text-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); + font-weight: 600; + font-size: 0.875rem; + margin-bottom: 0.375rem; + line-height: 1.3; + letter-spacing: 0.01em; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.06); background: linear-gradient(135deg, currentColor 0%, currentColor 100%); -webkit-background-clip: text; background-clip: text; } .toast-message { - font-size: 0.9rem; - line-height: 1.6; - opacity: 0.92; - font-weight: 500; - text-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); + font-size: 0.8125rem; + line-height: 1.4; + opacity: 0.9; + font-weight: 450; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); } .toast-actions { display: flex; - gap: 0.625rem; + gap: 0.5rem; align-items: flex-start; flex-shrink: 0; } .toast-action-btn { - padding: 0.5rem 1rem; + padding: 0.5rem 0.875rem; border-radius: 0.75rem; - font-size: 0.8125rem; - font-weight: 600; + font-size: 0.75rem; + font-weight: 500; border: none; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; gap: 0.375rem; - background: rgba(255, 255, 255, 0.2); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.25) 0%, + rgba(255, 255, 255, 0.12) 50%, + rgba(255, 255, 255, 0.2) 100%); color: inherit; - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); + backdrop-filter: blur(16px) saturate(130%); + -webkit-backdrop-filter: blur(16px) saturate(130%); border: 1px solid rgba(255, 255, 255, 0.3); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: + 0 4px 8px rgba(0, 0, 0, 0.06), + 0 1px 2px rgba(0, 0, 0, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.5); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.06); + position: relative; + overflow: hidden; + } + + /* Button-Shimmer-Effekt */ + .toast-action-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, + transparent 0%, + rgba(255, 255, 255, 0.3) 50%, + transparent 100%); + transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1); + } + + .toast-action-btn:hover::before { + left: 100%; } .toast-action-btn:hover { - background: rgba(255, 255, 255, 0.35); - transform: translateY(-2px) scale(1.05); - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.35) 0%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.3) 100%); + transform: translateY(-2px) scale(1.04); + box-shadow: + 0 8px 16px rgba(0, 0, 0, 0.08), + 0 2px 4px rgba(0, 0, 0, 0.06), + inset 0 1px 0 rgba(255, 255, 255, 0.6); + border-color: rgba(255, 255, 255, 0.5); } .toast-action-btn:active { @@ -1022,71 +1056,148 @@ class GlassmorphismNotificationSystem { } .toast-action-primary { - background: linear-gradient(135deg, - rgba(59, 130, 246, 0.9) 0%, - rgba(37, 99, 235, 0.9) 100%); + background: linear-gradient(145deg, + rgba(59, 130, 246, 0.8) 0%, + rgba(37, 99, 235, 0.85) 50%, + rgba(59, 130, 246, 0.75) 100%); color: white; border-color: rgba(59, 130, 246, 0.6); - box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3); + box-shadow: + 0 4px 12px rgba(59, 130, 246, 0.2), + 0 1px 3px rgba(59, 130, 246, 0.12), + inset 0 1px 0 rgba(255, 255, 255, 0.25); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + } + + .toast-action-primary::before { + background: linear-gradient(90deg, + transparent 0%, + rgba(255, 255, 255, 0.25) 50%, + transparent 100%); } .toast-action-primary:hover { - background: linear-gradient(135deg, - rgba(59, 130, 246, 1) 0%, - rgba(37, 99, 235, 1) 100%); - box-shadow: 0 8px 20px rgba(59, 130, 246, 0.4); + background: linear-gradient(145deg, + rgba(59, 130, 246, 0.9) 0%, + rgba(37, 99, 235, 0.95) 50%, + rgba(59, 130, 246, 0.85) 100%); + box-shadow: + 0 8px 20px rgba(59, 130, 246, 0.25), + 0 2px 6px rgba(59, 130, 246, 0.18), + inset 0 1px 0 rgba(255, 255, 255, 0.3); } .dark .toast-action-btn { - background: rgba(0, 0, 0, 0.3); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(15, 15, 15, 0.25) 50%, + rgba(0, 0, 0, 0.3) 100%); + border: 1px solid rgba(255, 255, 255, 0.12); + box-shadow: + 0 4px 8px rgba(0, 0, 0, 0.15), + 0 1px 2px rgba(0, 0, 0, 0.12), + inset 0 1px 0 rgba(255, 255, 255, 0.08); } .dark .toast-action-btn:hover { - background: rgba(0, 0, 0, 0.4); - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.45) 0%, + rgba(15, 15, 15, 0.35) 50%, + rgba(0, 0, 0, 0.4) 100%); + box-shadow: + 0 8px 16px rgba(0, 0, 0, 0.2), + 0 2px 4px rgba(0, 0, 0, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.12); } .toast-close { padding: 0.375rem; - border-radius: 0.5rem; + border-radius: 0.625rem; border: none; - background: rgba(255, 255, 255, 0.15); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.18) 0%, + rgba(255, 255, 255, 0.08) 50%, + rgba(255, 255, 255, 0.12) 100%); color: inherit; cursor: pointer; - opacity: 0.8; + opacity: 0.75; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); + backdrop-filter: blur(16px) saturate(110%); + -webkit-backdrop-filter: blur(16px) saturate(110%); border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + box-shadow: + 0 2px 4px rgba(0, 0, 0, 0.06), + 0 1px 2px rgba(0, 0, 0, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.3); + position: relative; + overflow: hidden; + } + + /* Close-Button-Ripple-Effekt */ + .toast-close::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: rgba(255, 255, 255, 0.3); + transform: translate(-50%, -50%); + transition: width 0.25s ease, height 0.25s ease; + } + + .toast-close:hover::after { + width: 100%; + height: 100%; } .toast-close:hover { opacity: 1; - background: rgba(255, 255, 255, 0.25); - transform: scale(1.15) rotate(90deg); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.28) 0%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.22) 100%); + transform: scale(1.1) rotate(90deg); + box-shadow: + 0 4px 8px rgba(0, 0, 0, 0.08), + 0 1px 2px rgba(0, 0, 0, 0.06), + inset 0 1px 0 rgba(255, 255, 255, 0.5); } .toast-close:active { - transform: scale(1.1) rotate(90deg); + transform: scale(1.05) rotate(90deg); transition: transform 0.1s ease; } .dark .toast-close { - background: rgba(0, 0, 0, 0.2); - border: 1px solid rgba(255, 255, 255, 0.15); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.25) 0%, + rgba(15, 15, 15, 0.15) 50%, + rgba(0, 0, 0, 0.2) 100%); + border: 1px solid rgba(255, 255, 255, 0.08); + box-shadow: + 0 2px 4px rgba(0, 0, 0, 0.15), + 0 1px 2px rgba(0, 0, 0, 0.12), + inset 0 1px 0 rgba(255, 255, 255, 0.06); + } + + .dark .toast-close::after { + background: rgba(255, 255, 255, 0.15); } .dark .toast-close:hover { - background: rgba(0, 0, 0, 0.3); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(15, 15, 15, 0.25) 50%, + rgba(0, 0, 0, 0.4) 100%); + box-shadow: + 0 4px 8px rgba(0, 0, 0, 0.25), + 0 1px 2px rgba(0, 0, 0, 0.18), + inset 0 1px 0 rgba(255, 255, 255, 0.1); } .toast-progress { @@ -1094,25 +1205,51 @@ class GlassmorphismNotificationSystem { bottom: 0; left: 0; right: 0; - height: 4px; - background: rgba(255, 255, 255, 0.15); + height: 3px; + background: linear-gradient(90deg, + rgba(255, 255, 255, 0.08) 0%, + rgba(255, 255, 255, 0.04) 50%, + rgba(255, 255, 255, 0.08) 100%); overflow: hidden; - border-radius: 0 0 1.5rem 1.5rem; + border-radius: 0 0 1.75rem 1.75rem; + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); } .toast-progress-bar { height: 100%; background: linear-gradient(90deg, - rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0.6) 0%, + rgba(255, 255, 255, 0.8) 25%, rgba(255, 255, 255, 0.9) 50%, - rgba(255, 255, 255, 0.7) 100%); + rgba(255, 255, 255, 0.8) 75%, + rgba(255, 255, 255, 0.6) 100%); width: 0%; - transition: width 0.3s ease; + transition: width 0.25s ease; position: relative; border-radius: inherit; box-shadow: - 0 0 8px rgba(255, 255, 255, 0.5), - inset 0 1px 0 rgba(255, 255, 255, 0.8); + 0 0 8px rgba(255, 255, 255, 0.4), + 0 0 4px rgba(255, 255, 255, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + } + + /* Progress-Bar-Animationen */ + .toast-progress-bar::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(90deg, + transparent 0%, + rgba(255, 255, 255, 0.4) 25%, + rgba(255, 255, 255, 0.6) 50%, + rgba(255, 255, 255, 0.4) 75%, + transparent 100%); + animation: progress-shimmer 2s ease-in-out infinite; } .toast-progress-bar::after { @@ -1122,11 +1259,15 @@ class GlassmorphismNotificationSystem { left: 0; right: 0; bottom: 0; - background: linear-gradient(90deg, - transparent 0%, - rgba(255, 255, 255, 0.4) 50%, - transparent 100%); - animation: progress-shimmer 2s ease-in-out infinite; + background: linear-gradient(45deg, + transparent 25%, + rgba(255, 255, 255, 0.2) 25%, + rgba(255, 255, 255, 0.2) 50%, + transparent 50%, + transparent 75%, + rgba(255, 255, 255, 0.2) 75%); + background-size: 12px 12px; + animation: progress-stripes 0.8s linear infinite; } @keyframes progress-shimmer { @@ -1134,21 +1275,55 @@ class GlassmorphismNotificationSystem { 100% { transform: translateX(100%); } } + @keyframes progress-stripes { + 0% { background-position: 0 0; } + 100% { background-position: 12px 0; } + } + @keyframes toast-progress { from { width: 100%; } to { width: 0%; } } .notification-settings { - max-width: 350px; - padding: 0.5rem 0; + max-width: 320px; + padding: 0.875rem; + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.12) 0%, + rgba(255, 255, 255, 0.06) 50%, + rgba(255, 255, 255, 0.1) 100%); + border-radius: 1.25rem; + backdrop-filter: blur(24px) saturate(140%); + -webkit-backdrop-filter: blur(24px) saturate(140%); + border: 1px solid rgba(255, 255, 255, 0.25); + box-shadow: + 0 16px 32px rgba(0, 0, 0, 0.08), + 0 6px 12px rgba(0, 0, 0, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.4); + } + + .dark .notification-settings { + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.35) 0%, + rgba(15, 15, 15, 0.25) 50%, + rgba(0, 0, 0, 0.3) 100%); + border: 1px solid rgba(255, 255, 255, 0.08); + box-shadow: + 0 16px 32px rgba(0, 0, 0, 0.25), + 0 6px 12px rgba(0, 0, 0, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.06); } .notification-settings h3 { margin-bottom: 1rem; - font-size: 1.1rem; - font-weight: 700; + font-size: 1rem; + font-weight: 600; color: inherit; + text-align: center; + background: linear-gradient(135deg, currentColor 0%, currentColor 100%); + -webkit-background-clip: text; + background-clip: text; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); } .setting-item { @@ -1157,40 +1332,98 @@ class GlassmorphismNotificationSystem { gap: 0.75rem; margin: 1rem 0; cursor: pointer; - font-size: 0.9rem; - font-weight: 500; - padding: 0.5rem; - border-radius: 0.5rem; - transition: all 0.2s ease; + font-size: 0.875rem; + font-weight: 450; + padding: 0.75rem; + border-radius: 0.875rem; + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.08) 0%, + rgba(255, 255, 255, 0.04) 100%); + border: 1px solid rgba(255, 255, 255, 0.12); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + position: relative; + overflow: hidden; + } + + /* Setting-Item-Hover-Effekt */ + .setting-item::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, + transparent 0%, + rgba(255, 255, 255, 0.08) 50%, + transparent 100%); + transition: left 0.3s ease; + } + + .setting-item:hover::before { + left: 100%; } .setting-item:hover { - background: rgba(255, 255, 255, 0.1); - transform: translateX(4px); + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.16) 0%, + rgba(255, 255, 255, 0.08) 100%); + transform: translateX(6px) scale(1.01); + box-shadow: + 0 6px 12px rgba(0, 0, 0, 0.06), + 0 1px 2px rgba(0, 0, 0, 0.04), + inset 0 1px 0 rgba(255, 255, 255, 0.25); + } + + .dark .setting-item { + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.18) 0%, + rgba(15, 15, 15, 0.12) 100%); + border: 1px solid rgba(255, 255, 255, 0.06); + } + + .dark .setting-item:hover { + background: linear-gradient(145deg, + rgba(0, 0, 0, 0.25) 0%, + rgba(15, 15, 15, 0.18) 100%); + box-shadow: + 0 6px 12px rgba(0, 0, 0, 0.15), + 0 1px 2px rgba(0, 0, 0, 0.12), + inset 0 1px 0 rgba(255, 255, 255, 0.08); } .setting-item input[type="checkbox"] { margin: 0; - width: 1.2rem; - height: 1.2rem; + width: 1.25rem; + height: 1.25rem; accent-color: currentColor; + cursor: pointer; + border-radius: 0.3rem; + transition: all 0.2s ease; + } + + .setting-item input[type="checkbox"]:checked { + transform: scale(1.05); + box-shadow: 0 0 6px rgba(59, 130, 246, 0.3); } /* Responsive Design */ @media (max-width: 640px) { .notifications-container { - left: 0.75rem; - right: 0.75rem; - top: 0.75rem; + left: 0.5rem; + right: 0.5rem; + top: 0.5rem; } .glassmorphism-toast { margin-bottom: 0.5rem; - border-radius: 1rem; + border-radius: 1.25rem; } .toast-content { - padding: 1rem; + padding: 0.875rem; } .toast-header { @@ -1203,17 +1436,21 @@ class GlassmorphismNotificationSystem { } .toast-title { - font-size: 0.85rem; - } - - .toast-message { font-size: 0.8125rem; } - .toast-action-btn { - padding: 0.4rem 0.8rem; + .toast-message { font-size: 0.75rem; } + + .toast-action-btn { + padding: 0.4rem 0.7rem; + font-size: 0.7rem; + } + + .toast-close { + padding: 0.3rem; + } } /* High Contrast Mode */ diff --git a/backend/templates/admin.html b/backend/templates/admin.html index 2544f711..adade0a8 100644 --- a/backend/templates/admin.html +++ b/backend/templates/admin.html @@ -575,4 +575,225 @@ + + + + + {% endblock %} diff --git a/backend/templates/index.html b/backend/templates/index.html index 0c486d3d..6ae655d8 100644 --- a/backend/templates/index.html +++ b/backend/templates/index.html @@ -1108,10 +1108,7 @@ function setupErrorHandling() { function setupPerformanceOptimizations() { // Preload critical resources const preloadLinks = [ - '/api/statistics/public', - '/static/icons/iso-27001.svg', - '/static/icons/mercedes-star.svg', - '/static/icons/gdpr.svg' + '/api/statistics/public' ]; preloadLinks.forEach(href => {