🎉 Improved backend structure & documentation, added new GLASSMORPHISM_NOTIFICATIONS feature 🎨

This commit is contained in:
Till Tomczak 2025-06-01 04:36:33 +02:00
parent 19eeed46fb
commit f0fe4c29d5
31 changed files with 1349 additions and 181 deletions

View File

@ -1254,10 +1254,12 @@ 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"""
"""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', {})
@ -1295,6 +1297,91 @@ def get_user_settings():
"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
def user_change_password():
@ -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():

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@

130
backend/fix_public_stats.py Normal file
View File

@ -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}')

View File

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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...

View File

@ -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 - ==================================================

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -575,4 +575,225 @@
</div>
</div>
</div>
<!-- Wartungs-Modal -->
<div id="maintenance-modal" class="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 hidden">
<div class="flex items-center justify-center h-full p-4">
<div class="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-2xl max-w-md w-full">
<div class="text-center mb-6">
<div class="mx-auto flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 dark:bg-blue-900 mb-4">
<svg class="h-6 w-6 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
</svg>
</div>
<h3 class="text-lg font-medium text-slate-900 dark:text-white mb-2">System-Wartung</h3>
<p class="text-sm text-slate-500 dark:text-slate-400">Wählen Sie eine Wartungsoption:</p>
</div>
<div class="space-y-3 mb-6">
<button id="modal-clear-cache" class="w-full px-4 py-3 bg-blue-500 text-white rounded-xl hover:bg-blue-600 transition-all duration-300 text-sm font-medium">
🗑️ Cache leeren
</button>
<button id="modal-optimize-db" class="w-full px-4 py-3 bg-green-500 text-white rounded-xl hover:bg-green-600 transition-all duration-300 text-sm font-medium">
🔧 Datenbank optimieren
</button>
<button id="modal-create-backup" class="w-full px-4 py-3 bg-purple-500 text-white rounded-xl hover:bg-purple-600 transition-all duration-300 text-sm font-medium">
💾 Backup erstellen
</button>
<button id="modal-advanced-settings" class="w-full px-4 py-3 bg-slate-500 text-white rounded-xl hover:bg-slate-600 transition-all duration-300 text-sm font-medium">
⚙️ Erweiterte Einstellungen
</button>
</div>
<div class="flex justify-end">
<button id="close-maintenance-modal" class="px-4 py-2 bg-slate-200 dark:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-xl hover:bg-slate-300 dark:hover:bg-slate-600 transition-colors text-sm font-medium">
Schließen
</button>
</div>
</div>
</div>
</div>
<script>
// ===== WARTUNGS-FUNKTIONALITÄT =====
// Wartung Modal Event Listeners
document.addEventListener('DOMContentLoaded', function() {
const maintenanceBtn = document.getElementById('maintenance-btn');
const maintenanceModal = document.getElementById('maintenance-modal');
const closeModalBtn = document.getElementById('close-maintenance-modal');
// Modal öffnen
if (maintenanceBtn) {
maintenanceBtn.addEventListener('click', function() {
maintenanceModal.classList.remove('hidden');
});
}
// Modal schließen
if (closeModalBtn) {
closeModalBtn.addEventListener('click', function() {
maintenanceModal.classList.add('hidden');
});
}
// Modal schließen beim Klick außerhalb
maintenanceModal.addEventListener('click', function(e) {
if (e.target === maintenanceModal) {
maintenanceModal.classList.add('hidden');
}
});
// Wartungs-Funktionen
document.getElementById('modal-clear-cache').addEventListener('click', clearCache);
document.getElementById('modal-optimize-db').addEventListener('click', optimizeDatabase);
document.getElementById('modal-create-backup').addEventListener('click', createBackup);
document.getElementById('modal-advanced-settings').addEventListener('click', function() {
window.location.href = '{{ url_for("admin_settings") }}';
});
});
// Notification anzeigen
function showNotification(message, type = 'info') {
// Erstelle temporäre Notification
const notification = document.createElement('div');
notification.className = `fixed top-4 right-4 z-50 p-4 rounded-xl shadow-lg max-w-sm transition-all duration-300 ${
type === 'success' ? 'bg-green-500 text-white' :
type === 'error' ? 'bg-red-500 text-white' :
'bg-blue-500 text-white'
}`;
notification.innerHTML = `
<div class="flex items-center space-x-3">
<div class="flex-shrink-0">
${type === 'success' ? '✅' : type === 'error' ? '❌' : ''}
</div>
<div class="text-sm font-medium">${message}</div>
</div>
`;
document.body.appendChild(notification);
// Animation einblenden
setTimeout(() => {
notification.style.transform = 'translateX(0)';
notification.style.opacity = '1';
}, 100);
// Automatisch entfernen nach 5 Sekunden
setTimeout(() => {
notification.style.transform = 'translateX(100%)';
notification.style.opacity = '0';
setTimeout(() => {
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
}, 300);
}, 5000);
}
// CSRF Token
function getCsrfToken() {
const token = document.querySelector('meta[name="csrf-token"]');
return token ? token.getAttribute('content') : '';
}
// Cache leeren
async function clearCache() {
if (!confirm('Möchten Sie den Cache wirklich leeren?')) return;
try {
showNotification('Cache wird geleert...', 'info');
const response = await fetch('/api/admin/cache/clear', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCsrfToken()
}
});
const result = await response.json();
if (response.ok && result.success) {
showNotification('Cache erfolgreich geleert', 'success');
// Modal schließen
document.getElementById('maintenance-modal').classList.add('hidden');
} else {
showNotification(result.message || 'Fehler beim Leeren des Cache', 'error');
}
} catch (error) {
showNotification('Netzwerkfehler: ' + error.message, 'error');
}
}
// Datenbank optimieren
async function optimizeDatabase() {
if (!confirm('Möchten Sie die Datenbank optimieren? Dies kann einige Minuten dauern.')) return;
try {
showNotification('Datenbank wird optimiert...', 'info');
const response = await fetch('/api/admin/database/optimize', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCsrfToken()
}
});
const result = await response.json();
if (response.ok && result.success) {
showNotification('Datenbank erfolgreich optimiert', 'success');
// Modal schließen
document.getElementById('maintenance-modal').classList.add('hidden');
} else {
showNotification(result.message || 'Fehler bei der Datenbankoptimierung', 'error');
}
} catch (error) {
showNotification('Netzwerkfehler: ' + error.message, 'error');
}
}
// Backup erstellen
async function createBackup() {
if (!confirm('Möchten Sie ein Backup erstellen?')) return;
try {
showNotification('Backup wird erstellt...', 'info');
const response = await fetch('/api/admin/backup/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCsrfToken()
}
});
const result = await response.json();
if (response.ok && result.success) {
showNotification('Backup erfolgreich erstellt', 'success');
// Modal schließen
document.getElementById('maintenance-modal').classList.add('hidden');
} else {
showNotification(result.message || 'Fehler beim Erstellen des Backups', 'error');
}
} catch (error) {
showNotification('Netzwerkfehler: ' + error.message, 'error');
}
}
// Escape-Taste um Modal zu schließen
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
const modal = document.getElementById('maintenance-modal');
if (!modal.classList.contains('hidden')) {
modal.classList.add('hidden');
}
}
});
</script>
{% endblock %}

View File

@ -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 => {