📝 Enhanced Printer Details Modal and Scrollable Update Documentation Added 🎉

This commit is contained in:
Till Tomczak 2025-06-01 17:34:16 +02:00
parent 7de193d4b2
commit 345fc6cbb5
32 changed files with 2691 additions and 38 deletions

View File

@ -533,7 +533,7 @@ def job_owner_required(f):
@wraps(f) @wraps(f)
def decorated_function(job_id, *args, **kwargs): def decorated_function(job_id, *args, **kwargs):
db_session = get_db_session() db_session = get_db_session()
job = db_session.get(Job, job_id) # Modernized from query().get() job = db_session.query(Job).filter(Job.id == job_id).first()
if not job: if not job:
db_session.close() db_session.close()
@ -1463,7 +1463,7 @@ def user_export_data():
"""Exportiert alle Benutzerdaten als JSON für DSGVO-Konformität""" """Exportiert alle Benutzerdaten als JSON für DSGVO-Konformität"""
try: try:
db_session = get_db_session() db_session = get_db_session()
user = db_session.get(User, int(current_user.id)) # Modernized from query().get() user = db_session.query(User).filter(User.id == int(current_user.id)).first()
if not user: if not user:
db_session.close() db_session.close()
@ -1513,7 +1513,7 @@ def user_update_profile_api():
data = request.get_json() data = request.get_json()
db_session = get_db_session() db_session = get_db_session()
user = db_session.get(User, int(current_user.id)) # Modernized from query().get() user = db_session.query(User).filter(User.id == int(current_user.id)).first()
if not user: if not user:
db_session.close() db_session.close()
@ -2669,7 +2669,7 @@ def toggle_printer_power(printer_id):
# Standard-Zustand ermitteln (Toggle-Verhalten) # Standard-Zustand ermitteln (Toggle-Verhalten)
db_session = get_db_session() db_session = get_db_session()
printer = db_session.get(Printer, printer_id) # Modernized from query().get() printer = db_session.get(Printer, printer_id)
if not printer: if not printer:
db_session.close() db_session.close()
@ -2730,7 +2730,7 @@ def test_printer_tapo_connection(printer_id):
""" """
try: try:
db_session = get_db_session() db_session = get_db_session()
printer = db_session.get(Printer, printer_id) # Modernized from query().get() printer = db_session.get(Printer, printer_id)
if not printer: if not printer:
db_session.close() db_session.close()
@ -3103,7 +3103,7 @@ def admin_update_user_form(user_id):
db_session = get_db_session() db_session = get_db_session()
user = db_session.get(User, user_id) user = db_session.query(User).get(user_id)
if not user: if not user:
db_session.close() db_session.close()
flash("Benutzer nicht gefunden.", "error") flash("Benutzer nicht gefunden.", "error")
@ -3174,7 +3174,7 @@ def admin_update_printer_form(printer_id):
db_session = get_db_session() db_session = get_db_session()
printer = db_session.get(Printer, printer_id) printer = db_session.query(Printer).get(printer_id)
if not printer: if not printer:
db_session.close() db_session.close()
flash("Drucker nicht gefunden.", "error") flash("Drucker nicht gefunden.", "error")
@ -3373,7 +3373,7 @@ def upload_avatar():
# Alte Avatar-Datei löschen falls vorhanden # Alte Avatar-Datei löschen falls vorhanden
db_session = get_db_session() db_session = get_db_session()
user = db_session.get(User, current_user.id) # Modernized from query().get() user = db_session.query(User).get(current_user.id)
if user and user.avatar_path: if user and user.avatar_path:
delete_file_safe(user.avatar_path) delete_file_safe(user.avatar_path)
@ -3810,7 +3810,7 @@ def get_job_detail(job_id):
try: try:
# Eagerly load the user and printer relationships # Eagerly load the user and printer relationships
job = db_session.get(Job, job_id) # Modernized from query().get() job = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer)).filter(Job.id == job_id).first()
if not job: if not job:
db_session.close() db_session.close()
@ -3833,7 +3833,7 @@ def delete_job(job_id):
"""Löscht einen Job.""" """Löscht einen Job."""
try: try:
db_session = get_db_session() db_session = get_db_session()
job = db_session.get(Job, job_id) # Modernized from query().get() job = db_session.query(Job).get(job_id)
if not job: if not job:
db_session.close() db_session.close()
@ -3963,7 +3963,7 @@ def create_job():
db_session = get_db_session() db_session = get_db_session()
# Prüfen, ob der Drucker existiert # Prüfen, ob der Drucker existiert
printer = db_session.get(Printer, printer_id) # Modernized from query().get() printer = db_session.get(Printer, printer_id)
if not printer: if not printer:
db_session.close() db_session.close()
return jsonify({"error": "Drucker nicht gefunden"}), 404 return jsonify({"error": "Drucker nicht gefunden"}), 404
@ -4016,7 +4016,7 @@ def update_job(job_id):
data = request.json data = request.json
db_session = get_db_session() db_session = get_db_session()
job = db_session.get(Job, job_id) # Modernized from query().get() job = db_session.query(Job).get(job_id)
if not job: if not job:
db_session.close() db_session.close()
@ -4626,7 +4626,7 @@ def approve_guest_request(request_id):
try: try:
db_session = get_db_session() db_session = get_db_session()
guest_request = db_session.get(GuestRequest, request_id) guest_request = db_session.query(GuestRequest).filter(GuestRequest.id == request_id).first()
if not guest_request: if not guest_request:
db_session.close() db_session.close()
@ -4656,7 +4656,7 @@ def approve_guest_request(request_id):
# Falls Drucker zugewiesen werden soll # Falls Drucker zugewiesen werden soll
if printer_id: if printer_id:
printer = db_session.get(Printer, printer_id) printer = db_session.query(Printer).filter(Printer.id == printer_id).first()
if printer: if printer:
guest_request.assigned_printer_id = printer_id guest_request.assigned_printer_id = printer_id
@ -4706,7 +4706,7 @@ def reject_guest_request(request_id):
try: try:
db_session = get_db_session() db_session = get_db_session()
guest_request = db_session.get(GuestRequest, request_id) guest_request = db_session.query(GuestRequest).filter(GuestRequest.id == request_id).first()
if not guest_request: if not guest_request:
db_session.close() db_session.close()
@ -4773,7 +4773,7 @@ def delete_guest_request(request_id):
try: try:
db_session = get_db_session() db_session = get_db_session()
guest_request = db_session.get(GuestRequest, request_id) guest_request = db_session.query(GuestRequest).filter(GuestRequest.id == request_id).first()
if not guest_request: if not guest_request:
db_session.close() db_session.close()
@ -4817,7 +4817,7 @@ def get_guest_request_detail(request_id):
try: try:
db_session = get_db_session() db_session = get_db_session()
guest_request = db_session.get(GuestRequest, request_id) guest_request = db_session.query(GuestRequest).filter(GuestRequest.id == request_id).first()
if not guest_request: if not guest_request:
db_session.close() db_session.close()
@ -4860,18 +4860,18 @@ def get_guest_request_detail(request_id):
# Bearbeiter-Informationen hinzufügen # Bearbeiter-Informationen hinzufügen
if guest_request.approved_by: if guest_request.approved_by:
approved_by_user = db_session.get(User, guest_request.approved_by) approved_by_user = db_session.query(User).filter(User.id == guest_request.approved_by).first()
if approved_by_user: if approved_by_user:
request_data['approved_by_name'] = approved_by_user.name or approved_by_user.username request_data['approved_by_name'] = approved_by_user.name or approved_by_user.username
if guest_request.rejected_by: if guest_request.rejected_by:
rejected_by_user = db_session.get(User, guest_request.rejected_by) rejected_by_user = db_session.query(User).filter(User.id == guest_request.rejected_by).first()
if rejected_by_user: if rejected_by_user:
request_data['rejected_by_name'] = rejected_by_user.name or rejected_by_user.username request_data['rejected_by_name'] = rejected_by_user.name or rejected_by_user.username
# Zugewiesener Drucker # Zugewiesener Drucker
if hasattr(guest_request, 'assigned_printer_id') and guest_request.assigned_printer_id: if hasattr(guest_request, 'assigned_printer_id') and guest_request.assigned_printer_id:
assigned_printer = db_session.get(Printer, guest_request.assigned_printer_id) assigned_printer = db_session.query(Printer).filter(Printer.id == guest_request.assigned_printer_id).first()
if assigned_printer: if assigned_printer:
request_data['assigned_printer'] = { request_data['assigned_printer'] = {
'id': assigned_printer.id, 'id': assigned_printer.id,
@ -7200,6 +7200,331 @@ def export_admin_logs():
"message": f"Fehler beim Exportieren: {str(e)}" "message": f"Fehler beim Exportieren: {str(e)}"
}), 500 }), 500
# ===== FEHLENDE ADMIN API-ENDPUNKTE =====
@app.route("/api/admin/database/status", methods=['GET'])
@login_required
@admin_required
def api_admin_database_status():
"""
API-Endpunkt für erweiterten Datenbank-Gesundheitsstatus.
Führt umfassende Datenbank-Diagnose durch und liefert detaillierte
Statusinformationen für den Admin-Bereich.
Returns:
JSON: Detaillierter Datenbank-Gesundheitsstatus
"""
try:
app_logger.info(f"Datenbank-Gesundheitscheck gestartet von Admin-User {current_user.id}")
# Datenbankverbindung mit Timeout
db_session = get_db_session()
start_time = time.time()
# 1. Basis-Datenbankverbindung testen mit Timeout
connection_status = "OK"
connection_time_ms = 0
try:
query_start = time.time()
result = db_session.execute(text("SELECT 1 as test_connection")).fetchone()
connection_time_ms = round((time.time() - query_start) * 1000, 2)
if connection_time_ms > 5000: # 5 Sekunden
connection_status = f"LANGSAM: {connection_time_ms}ms"
elif not result:
connection_status = "FEHLER: Keine Antwort"
except Exception as e:
connection_status = f"FEHLER: {str(e)[:100]}"
app_logger.error(f"Datenbankverbindungsfehler: {str(e)}")
# 2. Erweiterte Schema-Integrität prüfen
schema_status = {"status": "OK", "details": {}, "missing_tables": [], "table_counts": {}}
try:
required_tables = {
'users': 'Benutzer-Verwaltung',
'printers': 'Drucker-Verwaltung',
'jobs': 'Druck-Aufträge',
'guest_requests': 'Gast-Anfragen',
'settings': 'System-Einstellungen'
}
existing_tables = []
table_counts = {}
for table_name, description in required_tables.items():
try:
count_result = db_session.execute(text(f"SELECT COUNT(*) as count FROM {table_name}")).fetchone()
table_count = count_result[0] if count_result else 0
existing_tables.append(table_name)
table_counts[table_name] = table_count
schema_status["details"][table_name] = {
"exists": True,
"count": table_count,
"description": description
}
except Exception as table_error:
schema_status["missing_tables"].append(table_name)
schema_status["details"][table_name] = {
"exists": False,
"error": str(table_error)[:50],
"description": description
}
app_logger.warning(f"Tabelle {table_name} nicht verfügbar: {str(table_error)}")
schema_status["table_counts"] = table_counts
if len(schema_status["missing_tables"]) > 0:
schema_status["status"] = f"WARNUNG: {len(schema_status['missing_tables'])} fehlende Tabellen"
elif len(existing_tables) != len(required_tables):
schema_status["status"] = f"UNVOLLSTÄNDIG: {len(existing_tables)}/{len(required_tables)} Tabellen"
except Exception as e:
schema_status["status"] = f"FEHLER: {str(e)[:100]}"
app_logger.error(f"Schema-Integritätsprüfung fehlgeschlagen: {str(e)}")
# 3. Migrations-Status und Versionsinformationen
migration_info = {"status": "Unbekannt", "version": None, "details": {}}
try:
# Alembic-Version prüfen
try:
result = db_session.execute(text("SELECT version_num FROM alembic_version ORDER BY version_num DESC LIMIT 1")).fetchone()
if result:
migration_info["version"] = result[0]
migration_info["status"] = "Alembic-Migration aktiv"
migration_info["details"]["alembic"] = True
else:
migration_info["status"] = "Keine Alembic-Migration gefunden"
migration_info["details"]["alembic"] = False
except Exception:
# Fallback: Schema-Informationen sammeln
try:
# SQLite-spezifische Abfrage
tables_result = db_session.execute(text("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")).fetchall()
if tables_result:
table_list = [row[0] for row in tables_result]
migration_info["status"] = f"Schema mit {len(table_list)} Tabellen erkannt"
migration_info["details"]["detected_tables"] = table_list
migration_info["details"]["alembic"] = False
else:
migration_info["status"] = "Keine Tabellen erkannt"
except Exception:
# Weitere Datenbank-Engines
migration_info["status"] = "Schema-Erkennung nicht möglich"
migration_info["details"]["alembic"] = False
except Exception as e:
migration_info["status"] = f"FEHLER: {str(e)[:100]}"
app_logger.error(f"Migrations-Statusprüfung fehlgeschlagen: {str(e)}")
# 4. Performance-Benchmarks
performance_info = {"status": "OK", "benchmarks": {}, "overall_score": 100}
try:
benchmarks = {}
# Einfache Select-Query
start = time.time()
db_session.execute(text("SELECT COUNT(*) FROM users")).fetchone()
benchmarks["simple_select"] = round((time.time() - start) * 1000, 2)
# Join-Query (falls möglich)
try:
start = time.time()
db_session.execute(text("SELECT u.username, COUNT(j.id) FROM users u LEFT JOIN jobs j ON u.id = j.user_id GROUP BY u.id LIMIT 5")).fetchall()
benchmarks["join_query"] = round((time.time() - start) * 1000, 2)
except Exception:
benchmarks["join_query"] = None
# Insert/Update-Performance simulieren
try:
start = time.time()
db_session.execute(text("SELECT 1 WHERE EXISTS (SELECT 1 FROM users LIMIT 1)")).fetchone()
benchmarks["exists_check"] = round((time.time() - start) * 1000, 2)
except Exception:
benchmarks["exists_check"] = None
performance_info["benchmarks"] = benchmarks
# Performance-Score berechnen
avg_time = sum(t for t in benchmarks.values() if t is not None) / len([t for t in benchmarks.values() if t is not None])
if avg_time < 10:
performance_info["status"] = "AUSGEZEICHNET"
performance_info["overall_score"] = 100
elif avg_time < 50:
performance_info["status"] = "GUT"
performance_info["overall_score"] = 85
elif avg_time < 200:
performance_info["status"] = "AKZEPTABEL"
performance_info["overall_score"] = 70
elif avg_time < 1000:
performance_info["status"] = "LANGSAM"
performance_info["overall_score"] = 50
else:
performance_info["status"] = "SEHR LANGSAM"
performance_info["overall_score"] = 25
except Exception as e:
performance_info["status"] = f"FEHLER: {str(e)[:100]}"
performance_info["overall_score"] = 0
app_logger.error(f"Performance-Benchmark fehlgeschlagen: {str(e)}")
# 5. Datenbankgröße und Speicher-Informationen
storage_info = {"size": "Unbekannt", "details": {}}
try:
# SQLite-Datei-Größe
db_uri = current_app.config.get('SQLALCHEMY_DATABASE_URI', '')
if 'sqlite:///' in db_uri:
db_file_path = db_uri.replace('sqlite:///', '')
if os.path.exists(db_file_path):
file_size = os.path.getsize(db_file_path)
storage_info["size"] = f"{file_size / (1024 * 1024):.2f} MB"
storage_info["details"]["file_path"] = db_file_path
storage_info["details"]["last_modified"] = datetime.fromtimestamp(os.path.getmtime(db_file_path)).isoformat()
# Speicherplatz-Warnung
try:
import shutil
total, used, free = shutil.disk_usage(os.path.dirname(db_file_path))
free_gb = free / (1024**3)
storage_info["details"]["disk_free_gb"] = round(free_gb, 2)
if free_gb < 1:
storage_info["warning"] = "Kritisch wenig Speicherplatz"
elif free_gb < 5:
storage_info["warning"] = "Wenig Speicherplatz verfügbar"
except Exception:
pass
else:
# Für andere Datenbanken: Versuche Größe über Metadaten zu ermitteln
storage_info["size"] = "Externe Datenbank"
storage_info["details"]["database_type"] = "Nicht-SQLite"
except Exception as e:
storage_info["size"] = f"FEHLER: {str(e)[:50]}"
app_logger.warning(f"Speicher-Informationen nicht verfügbar: {str(e)}")
# 6. Aktuelle Verbindungs-Pool-Informationen
connection_pool_info = {"status": "Nicht verfügbar", "details": {}}
try:
# SQLAlchemy Pool-Status (falls verfügbar)
engine = db_session.get_bind()
if hasattr(engine, 'pool'):
pool = engine.pool
connection_pool_info["details"]["pool_size"] = getattr(pool, 'size', lambda: 'N/A')()
connection_pool_info["details"]["checked_in"] = getattr(pool, 'checkedin', lambda: 'N/A')()
connection_pool_info["details"]["checked_out"] = getattr(pool, 'checkedout', lambda: 'N/A')()
connection_pool_info["status"] = "Pool aktiv"
else:
connection_pool_info["status"] = "Kein Pool konfiguriert"
except Exception as e:
connection_pool_info["status"] = f"Pool-Status nicht verfügbar: {str(e)[:50]}"
db_session.close()
# Gesamtstatus ermitteln
overall_status = "healthy"
health_score = 100
critical_issues = []
warnings = []
# Kritische Probleme
if "FEHLER" in connection_status:
overall_status = "critical"
health_score -= 50
critical_issues.append("Datenbankverbindung fehlgeschlagen")
if "FEHLER" in schema_status["status"]:
overall_status = "critical"
health_score -= 30
critical_issues.append("Schema-Integrität kompromittiert")
if performance_info["overall_score"] < 25:
overall_status = "critical" if overall_status != "critical" else overall_status
health_score -= 25
critical_issues.append("Extreme Performance-Probleme")
# Warnungen
if "WARNUNG" in schema_status["status"] or len(schema_status["missing_tables"]) > 0:
if overall_status == "healthy":
overall_status = "warning"
health_score -= 15
warnings.append(f"Schema-Probleme: {len(schema_status['missing_tables'])} fehlende Tabellen")
if "LANGSAM" in connection_status:
if overall_status == "healthy":
overall_status = "warning"
health_score -= 10
warnings.append("Langsame Datenbankverbindung")
if "warning" in storage_info:
if overall_status == "healthy":
overall_status = "warning"
health_score -= 15
warnings.append(storage_info["warning"])
health_score = max(0, health_score) # Nicht unter 0
total_time = round((time.time() - start_time) * 1000, 2)
result = {
"success": True,
"status": overall_status,
"health_score": health_score,
"critical_issues": critical_issues,
"warnings": warnings,
"connection": {
"status": connection_status,
"response_time_ms": connection_time_ms
},
"schema": schema_status,
"migration": migration_info,
"performance": performance_info,
"storage": storage_info,
"connection_pool": connection_pool_info,
"timestamp": datetime.now().isoformat(),
"check_duration_ms": total_time,
"summary": {
"database_responsive": "FEHLER" not in connection_status,
"schema_complete": len(schema_status["missing_tables"]) == 0,
"performance_acceptable": performance_info["overall_score"] >= 50,
"storage_adequate": "warning" not in storage_info,
"overall_healthy": overall_status == "healthy"
}
}
app_logger.info(f"Datenbank-Gesundheitscheck abgeschlossen: Status={overall_status}, Score={health_score}, Dauer={total_time}ms")
return jsonify(result)
except Exception as e:
app_logger.error(f"Kritischer Fehler beim Datenbank-Gesundheitscheck: {str(e)}")
return jsonify({
"success": False,
"error": f"Kritischer Systemfehler: {str(e)}",
"status": "critical",
"health_score": 0,
"critical_issues": ["System-Gesundheitscheck fehlgeschlagen"],
"warnings": [],
"connection": {"status": "FEHLER bei der Prüfung"},
"schema": {"status": "FEHLER bei der Prüfung"},
"migration": {"status": "FEHLER bei der Prüfung"},
"performance": {"status": "FEHLER bei der Prüfung"},
"storage": {"size": "FEHLER bei der Prüfung"},
"timestamp": datetime.now().isoformat(),
"summary": {
"database_responsive": False,
"schema_complete": False,
"performance_acceptable": False,
"storage_adequate": False,
"overall_healthy": False
}
}), 500
@app.route("/api/admin/system/status", methods=['GET']) @app.route("/api/admin/system/status", methods=['GET'])
@login_required @login_required
@admin_required @admin_required

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -68,3 +68,8 @@
2025-06-01 15:48:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 15:48:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 16:04:33 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 16:04:33 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 16:48:43 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert 2025-06-01 16:48:43 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 17:04:59 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 17:13:03 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 17:14:39 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 17:14:58 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert
2025-06-01 17:16:36 - [analytics] analytics - [INFO] INFO - 📈 Analytics Engine initialisiert

View File

@ -1769,3 +1769,94 @@ WHERE jobs.status = ?) AS anon_1]
2025-06-01 16:48:45 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert 2025-06-01 16:48:45 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-01 16:50:17 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True 2025-06-01 16:50:17 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 16:50:17 - [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 16:50:17 - [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 17:04:58 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:04:59 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
2025-06-01 17:04:59 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
2025-06-01 17:05:00 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
2025-06-01 17:05:00 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
2025-06-01 17:05:00 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-01 17:05:00 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
2025-06-01 17:05:00 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-01 17:05:00 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-01 17:05:00 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-01 17:05:04 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 0/2 Drucker erfolgreich
2025-06-01 17:05:04 - [app] app - [WARNING] WARNING - ⚠️ 2 Drucker konnten nicht initialisiert werden
2025-06-01 17:05:04 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-01 17:05:04 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-01 17:05:04 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-01 17:05:04 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-01 17:09:50 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:12:37 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:13:03 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:13:04 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
2025-06-01 17:13:04 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
2025-06-01 17:13:04 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
2025-06-01 17:13:04 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
2025-06-01 17:13:04 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-01 17:13:04 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
2025-06-01 17:13:04 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-01 17:13:04 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-01 17:13:04 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-01 17:13:09 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 0/2 Drucker erfolgreich
2025-06-01 17:13:09 - [app] app - [WARNING] WARNING - ⚠️ 2 Drucker konnten nicht initialisiert werden
2025-06-01 17:13:09 - [app] app - [INFO] INFO - ✅ Printer Queue Manager erfolgreich gestartet
2025-06-01 17:13:09 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-01 17:13:09 - [app] app - [INFO] INFO - Starte HTTP-Server auf 0.0.0.0:80
2025-06-01 17:14:39 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:14:40 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
2025-06-01 17:14:40 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
2025-06-01 17:14:40 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
2025-06-01 17:14:40 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
2025-06-01 17:14:40 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-01 17:14:40 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
2025-06-01 17:14:40 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-01 17:14:40 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-01 17:14:40 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-01 17:14:42 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 0/1 Drucker erfolgreich
2025-06-01 17:14:42 - [app] app - [WARNING] WARNING - ⚠️ 1 Drucker konnten nicht initialisiert werden
2025-06-01 17:14:42 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-01 17:14:42 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-01 17:14:42 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-01 17:14:42 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-01 17:14:57 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:14:58 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
2025-06-01 17:14:58 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
2025-06-01 17:14:58 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
2025-06-01 17:14:58 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
2025-06-01 17:14:58 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-01 17:14:58 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
2025-06-01 17:14:59 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-01 17:14:59 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-01 17:14:59 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-01 17:14:59 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 1/1 Drucker erfolgreich
2025-06-01 17:14:59 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-01 17:14:59 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-01 17:14:59 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-01 17:14:59 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-01 17:15:59 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:15:59 - [app] app - [INFO] INFO - Admin-Dashboard aufgerufen von Administrator (Tab: dashboard)
2025-06-01 17:16:35 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db
2025-06-01 17:16:36 - [app] app - [INFO] INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen)
2025-06-01 17:16:36 - [app] app - [INFO] INFO - ✅ Timeout Force-Quit Manager geladen
2025-06-01 17:16:37 - [app] app - [INFO] INFO - ✅ Zentraler Shutdown-Manager initialisiert
2025-06-01 17:16:37 - [app] app - [INFO] INFO - 🔄 Starte Datenbank-Setup und Migrationen...
2025-06-01 17:16:37 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-01 17:16:37 - [app] app - [INFO] INFO - ✅ JobOrder-Tabelle bereits vorhanden
2025-06-01 17:16:37 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-01 17:16:37 - [app] app - [INFO] INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen
2025-06-01 17:16:37 - [app] app - [INFO] INFO - 🖨️ Starte automatische Steckdosen-Initialisierung...
2025-06-01 17:16:37 - [app] app - [INFO] INFO - ✅ Steckdosen-Initialisierung: 2/2 Drucker erfolgreich
2025-06-01 17:16:37 - [app] app - [INFO] INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung
2025-06-01 17:16:37 - [app] app - [INFO] INFO - Job-Scheduler gestartet
2025-06-01 17:16:37 - [app] app - [INFO] INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP)
2025-06-01 17:16:37 - [app] app - [INFO] INFO - Windows-Debug-Modus: Auto-Reload deaktiviert
2025-06-01 17:17:59 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:18:00 - [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 17:18:04 - [app] app - [INFO] INFO - Admin-Check für Funktion admin_page: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:18:04 - [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 17:18:04 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_logs: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:18:04 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_logs: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:18:04 - [app] app - [INFO] INFO - Admin-Check für Funktion api_admin_logs: User authenticated: True, User ID: 1, Is Admin: True
2025-06-01 17:18:35 - [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 17:19:05 - [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 17:19:50 - [app] app - [INFO] INFO - OTP generiert für Guest Request 1

View File

@ -68,3 +68,8 @@
2025-06-01 15:48:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 15:48:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 16:04:33 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 16:04:33 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 16:48:43 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation) 2025-06-01 16:48:43 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 17:04:59 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 17:13:03 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 17:14:39 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 17:14:57 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)
2025-06-01 17:16:36 - [backup] backup - [INFO] INFO - BackupManager initialisiert (minimal implementation)

View File

@ -29,3 +29,4 @@
2025-06-01 14:29:52 - [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 14:29:52 - [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 15:11:03 - [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 15:11:03 - [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 15:15:50 - [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 15:15:50 - [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 17:17:49 - [calendar] calendar - [INFO] INFO - 📅 Kalender-Events abgerufen: 16 Einträge für Zeitraum 2025-06-01 00:00:00 bis 2025-06-08 00:00:00

View File

@ -265,3 +265,23 @@
2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet 2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) 2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) 2025-06-01 16:48:44 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-01 17:04:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:04:59 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:04:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 17:04:59 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-01 17:13:04 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:13:04 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:13:04 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 17:13:04 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-01 17:14:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:14:40 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:14:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 17:14:40 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-01 17:14:58 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:14:58 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:14:58 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 17:14:58 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)
2025-06-01 17:16:36 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:16:36 - [dashboard] dashboard - [INFO] INFO - Dashboard-Background-Worker gestartet
2025-06-01 17:16:36 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback)
2025-06-01 17:16:36 - [dashboard] dashboard - [INFO] INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading)

View File

@ -68,3 +68,8 @@
2025-06-01 15:48:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 15:48:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 16:04:33 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 16:04:33 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 16:48:43 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet 2025-06-01 16:48:43 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 17:04:59 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 17:13:03 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 17:14:39 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 17:14:57 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet
2025-06-01 17:16:36 - [database] database - [INFO] INFO - Datenbank-Wartungs-Scheduler gestartet

View File

@ -10,3 +10,6 @@
2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup... 2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... 2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... 2025-06-01 03:39:41 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...
2025-06-01 17:13:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🧹 Starte umfassendes Datenbank-Cleanup...
2025-06-01 17:13:19 - [database_cleanup] database_cleanup - [INFO] INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen...
2025-06-01 17:13:19 - [database_cleanup] database_cleanup - [INFO] INFO - 🔄 Schließe alle aktiven Datenbankverbindungen...

View File

@ -66,3 +66,8 @@
2025-06-01 15:49:00 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 15:49:00 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 16:04:34 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 16:04:34 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 16:48:44 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) 2025-06-01 16:48:44 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 17:04:59 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 17:13:04 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 17:14:40 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 17:14:58 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)
2025-06-01 17:16:36 - [email_notification] email_notification - [INFO] INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand)

View File

@ -0,0 +1 @@
2025-06-01 17:19:50 - [guest] guest - [INFO] INFO - Neue Gastanfrage erstellt: ID 1, Name: Till Tomczak, OTP generiert

View File

@ -103,3 +103,20 @@ WHERE printers.id = ?]
2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2064.36ms 2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2064.36ms
2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - Neuer Job 14 erstellt für Drucker 4, Start: 2025-06-01 16:51:00, Dauer: 222 Minuten 2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - Neuer Job 14 erstellt für Drucker 4, Start: 2025-06-01 16:51:00, Dauer: 222 Minuten
2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2070.85ms 2025-06-01 16:52:09 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2070.85ms
2025-06-01 17:15:30 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 14 von 14 (Seite 1)
2025-06-01 17:15:35 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 14 von 14 (Seite 1)
2025-06-01 17:15:35 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 14 von 14 (Seite 1)
2025-06-01 17:15:48 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 1.31ms
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 14 von 14 (Seite 1)
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 14 von 14 (Seite 1)
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - Neuer Job 15 erstellt für Drucker 4, Start: 2025-06-01 17:16:00, Dauer: 60 Minuten
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2061.18ms
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - Neuer Job 16 erstellt für Drucker 4, Start: 2025-06-01 17:16:00, Dauer: 60 Minuten
2025-06-01 17:15:50 - [jobs] jobs - [INFO] INFO - ✅ API-Job-Erstellung 'create_job' erfolgreich in 2076.70ms
2025-06-01 17:15:59 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:17:42 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:17:43 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:17:44 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:17:48 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:17:51 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)
2025-06-01 17:20:00 - [jobs] jobs - [INFO] INFO - Jobs abgerufen: 16 von 16 (Seite 1)

View File

@ -132,3 +132,13 @@
2025-06-01 16:04:34 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 16:04:34 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 16:48:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 16:48:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 16:48:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet 2025-06-01 16:48:44 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:04:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:04:59 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:13:04 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:13:04 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:14:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:14:40 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:14:58 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:14:58 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:16:36 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet
2025-06-01 17:16:36 - [maintenance] maintenance - [INFO] INFO - Wartungs-Scheduler gestartet

View File

@ -132,3 +132,13 @@
2025-06-01 16:04:34 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 16:04:34 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 16:48:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 16:48:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 16:48:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt 2025-06-01 16:48:44 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:04:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:04:59 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:13:04 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:13:04 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:14:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:14:40 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:14:58 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:14:58 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:16:36 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt
2025-06-01 17:16:36 - [multi_location] multi_location - [INFO] INFO - Standard-Standort erstellt

View File

@ -64,3 +64,8 @@
2025-06-01 15:49:00 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 15:49:00 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 16:04:34 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 16:04:34 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 16:48:44 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert 2025-06-01 16:48:44 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 17:04:59 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 17:13:04 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 17:14:40 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 17:14:58 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-01 17:16:36 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert

View File

@ -2225,3 +2225,94 @@
2025-06-01 16:49:07 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 2 Drucker 2025-06-01 16:49:07 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 2 Drucker
2025-06-01 16:49:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105 2025-06-01 16:49:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-01 16:49:13 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 2/6 Steckdosen gefunden in 28.4s 2025-06-01 16:49:13 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 2/6 Steckdosen gefunden in 28.4s
2025-06-01 17:04:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:04:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:05:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-01 17:05:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-01 17:05:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-01 17:05:01 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-01 17:05:02 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.103): Steckdose konnte nicht ausgeschaltet werden
2025-06-01 17:05:04 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.104): Steckdose konnte nicht ausgeschaltet werden
2025-06-01 17:05:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 0/2 erfolgreich
2025-06-01 17:05:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-01 17:05:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-01 17:05:07 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 2 aktiven Druckern...
2025-06-01 17:05:13 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-01 17:05:16 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.103): UNREACHABLE (Ping fehlgeschlagen)
2025-06-01 17:05:16 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.104): UNREACHABLE (Ping fehlgeschlagen)
2025-06-01 17:05:16 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 2 Drucker
2025-06-01 17:05:19 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-01 17:05:25 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-01 17:05:31 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-01 17:05:37 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.2s
2025-06-01 17:09:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:09:50 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:12:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:12:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:13:03 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:13:03 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:13:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-01 17:13:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-01 17:13:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-01 17:13:05 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-01 17:13:07 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.103): Steckdose konnte nicht ausgeschaltet werden
2025-06-01 17:13:09 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.104): Steckdose konnte nicht ausgeschaltet werden
2025-06-01 17:13:09 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 0/2 erfolgreich
2025-06-01 17:13:11 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-01 17:13:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-01 17:13:23 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-01 17:13:29 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-01 17:13:35 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-01 17:13:41 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.1s
2025-06-01 17:14:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:14:39 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:14:40 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-01 17:14:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-01 17:14:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-01 17:14:41 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-01 17:14:42 - [printer_monitor] printer_monitor - [WARNING] WARNING - ❌ Tapo P110 (192.168.0.103): Steckdose konnte nicht ausgeschaltet werden
2025-06-01 17:14:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 0/1 erfolgreich
2025-06-01 17:14:57 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:14:57 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo P110 (192.168.0.103): Steckdose ausgeschaltet
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 1/1 erfolgreich
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-01 17:14:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-01 17:15:01 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdose mit IP 192.168.0.103 ist erreichbar
2025-06-01 17:15:02 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo-Steckdose 'Tapo P110 (192.168.0.103)' (192.168.0.103) gefunden - Status: off
2025-06-01 17:15:02 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-01 17:15:04 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdose mit IP 192.168.0.104 ist erreichbar
2025-06-01 17:15:04 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo-Steckdose 'Tapo P110 (192.168.0.104)' (192.168.0.104) gefunden - Status: off
2025-06-01 17:15:04 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Drucker Tapo P110 (192.168.0.104) als aktiv markiert
2025-06-01 17:15:04 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-01 17:15:10 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-01 17:15:16 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-01 17:15:22 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-01 17:15:28 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 2/6 Steckdosen gefunden in 28.5s
2025-06-01 17:15:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-01 17:15:59 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 2 aktiven Druckern...
2025-06-01 17:16:02 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 2 Drucker
2025-06-01 17:16:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-01 17:16:36 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-01 17:16:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart...
2025-06-01 17:16:37 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo P110 (192.168.0.103): Steckdose ausgeschaltet
2025-06-01 17:16:37 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo P110 (192.168.0.104): Steckdose ausgeschaltet
2025-06-01 17:16:37 - [printer_monitor] printer_monitor - [INFO] INFO - 🎯 Steckdosen-Initialisierung abgeschlossen: 2/2 erfolgreich
2025-06-01 17:16:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung...
2025-06-01 17:16:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration
2025-06-01 17:16:38 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 1/6: 192.168.0.103
2025-06-01 17:16:40 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdose mit IP 192.168.0.103 ist erreichbar
2025-06-01 17:16:40 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo-Steckdose 'Tapo P110 (192.168.0.103)' (192.168.0.103) gefunden - Status: off
2025-06-01 17:16:40 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 2/6: 192.168.0.104
2025-06-01 17:16:42 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdose mit IP 192.168.0.104 ist erreichbar
2025-06-01 17:16:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-01 17:16:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 2 aktiven Druckern...
2025-06-01 17:16:42 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Tapo-Steckdose 'Tapo P110 (192.168.0.104)' (192.168.0.104) gefunden - Status: off
2025-06-01 17:16:42 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 3/6: 192.168.0.100
2025-06-01 17:16:44 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 2 Drucker
2025-06-01 17:16:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 4/6: 192.168.0.101
2025-06-01 17:16:54 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 5/6: 192.168.0.102
2025-06-01 17:17:00 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Teste IP 6/6: 192.168.0.105
2025-06-01 17:17:06 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Steckdosen-Erkennung abgeschlossen: 2/6 Steckdosen gefunden in 28.4s

View File

@ -4222,3 +4222,86 @@
2025-06-01 16:52:09 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2062.13ms 2025-06-01 16:52:09 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2062.13ms
2025-06-01 16:52:09 - [printers] printers - [WARNING] WARNING - ❌ Drucker 192.168.0.103: OFFLINE (Steckdose nicht erreichbar) 2025-06-01 16:52:09 - [printers] printers - [WARNING] WARNING - ❌ Drucker 192.168.0.103: OFFLINE (Steckdose nicht erreichbar)
2025-06-01 16:52:09 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2068.54ms 2025-06-01 16:52:09 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2068.54ms
2025-06-01 17:05:07 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:05:07 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:05:16 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:05:16 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 9036.46ms
2025-06-01 17:05:18 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:05:18 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:05:18 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.53ms
2025-06-01 17:05:21 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:05:22 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:05:22 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:05:22 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.54ms
2025-06-01 17:05:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:05:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:05:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.01ms
2025-06-01 17:15:30 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:15:35 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:15:35 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:15:50 - [printers] printers - [WARNING] WARNING - ❌ Drucker 192.168.0.103: OFFLINE (Steckdose nicht erreichbar)
2025-06-01 17:15:50 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2058.19ms
2025-06-01 17:15:50 - [printers] printers - [WARNING] WARNING - ❌ Drucker 192.168.0.103: OFFLINE (Steckdose nicht erreichbar)
2025-06-01 17:15:50 - [printers] printers - [INFO] INFO - ✅ Drucker-Status-Prüfung 'check_printer_status' erfolgreich in 2073.26ms
2025-06-01 17:15:59 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:15:59 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:16:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:16:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2489.84ms
2025-06-01 17:16:42 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:16:42 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:16:44 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:16:44 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2232.23ms
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.84ms
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:17:13 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.84ms
2025-06-01 17:17:14 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:17:14 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:17:14 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.33ms
2025-06-01 17:17:40 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:17:40 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:17:40 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.62ms
2025-06-01 17:17:42 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:17:59 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:17:59 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:17:59 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.70ms
2025-06-01 17:18:04 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:18:04 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:18:04 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 2.21ms
2025-06-01 17:18:40 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:18:40 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:18:40 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.37ms
2025-06-01 17:18:54 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:18:54 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:18:54 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.35ms
2025-06-01 17:19:05 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:19:05 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:19:05 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.36ms
2025-06-01 17:20:00 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:20:01 - [printers] printers - [INFO] INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check)
2025-06-01 17:20:01 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:20:01 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:20:01 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.74ms
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.47ms
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:20:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.62ms
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 1.56ms
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:21:02 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.34ms
2025-06-01 17:21:07 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:21:07 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:21:07 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.28ms
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.60ms
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 2 Drucker
2025-06-01 17:21:32 - [printers] printers - [INFO] INFO - ✅ API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 0.63ms

View File

@ -54,3 +54,15 @@
2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden) 2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden)
2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet 2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet
2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet 2025-06-01 04:54:13 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Initialisiere neuen Queue-Manager...
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Zentrale Shutdown-Verwaltung erkannt - deaktiviere lokale Signal-Handler
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Starte Printer Queue Manager...
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden)
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🔍 Überprüfe 6 wartende Jobs...
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Stoppe Queue-Manager...
2025-06-01 17:13:09 - [queue_manager] queue_manager - [INFO] INFO - ⏳ Warte auf Monitor-Thread...
2025-06-01 17:13:14 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop
2025-06-01 17:13:14 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet
2025-06-01 17:13:14 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt

File diff suppressed because it is too large Load Diff

View File

@ -64,3 +64,8 @@
2025-06-01 15:49:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 15:49:00 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 16:04:34 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 16:04:34 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 16:48:44 - [security] security - [INFO] INFO - 🔒 Security System initialisiert 2025-06-01 16:48:44 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 17:04:59 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 17:13:04 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 17:14:40 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 17:14:58 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-01 17:16:36 - [security] security - [INFO] INFO - 🔒 Security System initialisiert

View File

@ -137,3 +137,13 @@
2025-06-01 15:49:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet... 2025-06-01 15:49:01 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🏁 System wird beendet...
2025-06-01 16:04:34 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 16:04:34 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 16:48:44 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert 2025-06-01 16:48:44 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 17:04:59 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 17:13:04 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 17:13:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Starte koordiniertes System-Shutdown...
2025-06-01 17:13:09 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🧹 Führe 5 Cleanup-Funktionen aus...
2025-06-01 17:13:14 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔄 Beende Scheduler mit stop()...
2025-06-01 17:13:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - ✅ Scheduler erfolgreich gestoppt
2025-06-01 17:13:19 - [shutdown_manager] shutdown_manager - [INFO] INFO - 💾 Führe sicheres Datenbank-Cleanup durch...
2025-06-01 17:14:40 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 17:14:58 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert
2025-06-01 17:16:36 - [shutdown_manager] shutdown_manager - [INFO] INFO - 🔧 Shutdown-Manager initialisiert

View File

@ -584,3 +584,48 @@
2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert 2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert 2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - ================================================== 2025-06-01 16:48:44 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-01 17:04: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 17:04:59 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T17:04:59.954526
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 17:04:59 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-01 17:13:04 - [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 17:13:04 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T17:13:04.493182
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 17:13:04 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-01 17:14: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 17:14:40 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T17:14:40.360811
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 17:14:40 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-01 17:14:58 - [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 17:14:58 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T17:14:58.769848
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 17:14:58 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - ==================================================
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - 🚀 MYP Platform Backend wird gestartet...
2025-06-01 17:16:36 - [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 17:16:36 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-01T17:16:36.813057
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-01 17:16:36 - [startup] startup - [INFO] INFO - ==================================================

View File

@ -262,3 +262,33 @@
2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) 2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet 2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet 2025-06-01 16:48:42 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:04:58 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:04:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:04:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:04:58 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:09:50 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:09:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:09:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:09:50 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:12:37 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:12:37 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:12:37 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:12:37 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:13:03 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:13:03 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:13:03 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:13:03 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:13:19 - [windows_fixes] windows_fixes - [INFO] INFO - 🔄 Starte Windows Thread-Shutdown...
2025-06-01 17:13:19 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Windows Thread-Shutdown abgeschlossen
2025-06-01 17:14:39 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:14:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:14:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:14:39 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:14:57 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:14:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:14:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:14:57 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-01 17:16:35 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-01 17:16:35 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-01 17:16:35 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-01 17:16:35 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet

File diff suppressed because one or more lines are too long

View File

@ -36,8 +36,9 @@ class AdminDashboard {
console.log('🚀 Initialisiere Mercedes-Benz MYP Admin Dashboard'); console.log('🚀 Initialisiere Mercedes-Benz MYP Admin Dashboard');
// CSRF Token setzen // CSRF Token mit verbesserter Extraktion
this.csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); this.csrfToken = this.extractCSRFToken();
console.log('🔒 CSRF Token:', this.csrfToken ? 'verfügbar' : 'FEHLT!');
// Event-Listener nur einmal registrieren // Event-Listener nur einmal registrieren
this.attachEventListeners(); this.attachEventListeners();
@ -52,6 +53,39 @@ class AdminDashboard {
console.log('✅ Admin Dashboard erfolgreich initialisiert'); console.log('✅ Admin Dashboard erfolgreich initialisiert');
} }
extractCSRFToken() {
// Methode 1: Meta Tag
const metaToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
if (metaToken) {
console.log('🔒 CSRF Token aus meta Tag geladen');
return metaToken;
}
// Methode 2: Hidden Input
const hiddenInput = document.querySelector('input[name="csrf_token"]')?.value;
if (hiddenInput) {
console.log('🔒 CSRF Token aus hidden input geladen');
return hiddenInput;
}
// Methode 3: Cookie (falls verfügbar)
const cookieToken = document.cookie.split('; ').find(row => row.startsWith('csrf_token='))?.split('=')[1];
if (cookieToken) {
console.log('🔒 CSRF Token aus Cookie geladen');
return cookieToken;
}
// Methode 4: Flask-WTF Standard
const flaskToken = document.querySelector('meta[name="csrf-token"]')?.content;
if (flaskToken) {
console.log('🔒 CSRF Token aus Flask-WTF Meta geladen');
return flaskToken;
}
console.error('❌ CSRF Token konnte nicht gefunden werden!');
return null;
}
attachEventListeners() { attachEventListeners() {
if (this.eventListenersAttached) { if (this.eventListenersAttached) {
console.log('⚠️ Event-Listener bereits registriert, überspringe...'); console.log('⚠️ Event-Listener bereits registriert, überspringe...');
@ -259,6 +293,12 @@ class AdminDashboard {
async loadInitialData() { async loadInitialData() {
await this.loadLiveStats(); await this.loadLiveStats();
await this.checkSystemHealth(); await this.checkSystemHealth();
// Button-Test ausführen
setTimeout(() => {
this.testButtons();
}, 1000);
// Logs laden falls wir auf dem Logs-Tab sind // Logs laden falls wir auf dem Logs-Tab sind
if (window.location.search.includes('tab=logs') || document.querySelector('.tabs [href*="logs"]')?.classList.contains('active')) { if (window.location.search.includes('tab=logs') || document.querySelector('.tabs [href*="logs"]')?.classList.contains('active')) {
await this.loadLogs(); await this.loadLogs();
@ -829,22 +869,55 @@ class AdminDashboard {
this.showNotification('🔄 Fehler werden automatisch behoben...', 'info'); this.showNotification('🔄 Fehler werden automatisch behoben...', 'info');
// Debug: CSRF Token prüfen
if (!this.csrfToken) {
console.error('❌ CSRF Token fehlt! Versuche Token neu zu laden...');
this.csrfToken = this.extractCSRFToken();
if (!this.csrfToken) {
this.showNotification('❌ Sicherheitsfehler: CSRF Token nicht verfügbar', 'error');
return;
}
}
console.log('🔧 Starte automatische Fehlerkorrektur...');
console.log('🔒 CSRF Token für Request:', this.csrfToken.substring(0, 10) + '...');
try { try {
const response = await fetch('/api/admin/fix-errors', { const requestOptions = {
method: 'POST', method: 'POST',
headers: { 'X-CSRFToken': this.csrfToken } headers: {
}); 'Content-Type': 'application/json',
'X-CSRFToken': this.csrfToken
}
};
console.log('📡 Sende Request an:', '/api/admin/fix-errors');
console.log('📝 Request Headers:', requestOptions.headers);
const response = await fetch('/api/admin/fix-errors', requestOptions);
console.log('📡 Response Status:', response.status);
console.log('📡 Response Headers:', Object.fromEntries(response.headers.entries()));
if (!response.ok) {
const errorText = await response.text();
console.error('❌ Response Error:', errorText);
throw new Error(`HTTP ${response.status}: ${response.statusText} - ${errorText}`);
}
const data = await response.json(); const data = await response.json();
console.log('✅ Response Data:', data);
if (data.success) { if (data.success) {
this.showNotification('✅ Automatische Reparatur erfolgreich!', 'success'); this.showNotification('✅ Automatische Reparatur erfolgreich!', 'success');
setTimeout(() => this.checkSystemHealth(), 2000); setTimeout(() => this.checkSystemHealth(), 2000);
} else { } else {
this.showNotification('❌ Automatische Reparatur fehlgeschlagen', 'error'); this.showNotification(`❌ Automatische Reparatur fehlgeschlagen: ${data.message || 'Unbekannter Fehler'}`, 'error');
} }
} catch (error) { } catch (error) {
this.showNotification('❌ Fehler bei der automatischen Reparatur', 'error'); console.error('❌ Fehler bei automatischer Reparatur:', error);
this.showNotification(`❌ Fehler bei der automatischen Reparatur: ${error.message}`, 'error');
} }
} }
@ -1079,6 +1152,101 @@ class AdminDashboard {
this.showNotification('❌ Fehler beim Exportieren der Logs: ' + error.message, 'error'); this.showNotification('❌ Fehler beim Exportieren der Logs: ' + error.message, 'error');
} }
} }
// ===== BUTTON-FUNKTIONALITÄT-TEST =====
testButtons() {
console.log('🧪 Teste Button-Funktionalität...');
// Teste Fix-Errors Button
const fixBtn = document.querySelector('#fix-errors-btn');
if (fixBtn) {
console.log('✅ Fix-Errors Button gefunden:', fixBtn);
console.log('🔗 Event-Listener-Status:', fixBtn.dataset.listenerAttached);
// Manueller Test-Click
fixBtn.addEventListener('click', (e) => {
console.log('🖱️ Fix-Errors Button wurde geklickt (manueller Listener)');
e.preventDefault();
e.stopPropagation();
this.testFixErrors();
});
} else {
console.error('❌ Fix-Errors Button NICHT gefunden!');
}
// Teste View-Details Button
const viewBtn = document.querySelector('#view-error-details-btn');
if (viewBtn) {
console.log('✅ View-Details Button gefunden:', viewBtn);
console.log('🔗 Event-Listener-Status:', viewBtn.dataset.listenerAttached);
// Manueller Test-Click
viewBtn.addEventListener('click', (e) => {
console.log('🖱️ View-Details Button wurde geklickt (manueller Listener)');
e.preventDefault();
e.stopPropagation();
console.log('🔄 Weiterleitung zu Logs-Tab...');
window.location.href = '/admin-dashboard?tab=logs';
});
} else {
console.error('❌ View-Details Button NICHT gefunden!');
}
}
// Test-Version der Fix-Errors Funktion
async testFixErrors() {
console.log('🧪 TEST: Fix-Errors wird ausgeführt...');
// Token-Test
console.log('🔒 Aktueller CSRF Token:', this.csrfToken);
if (!this.csrfToken) {
console.error('❌ CSRF Token fehlt - versuche neu zu laden...');
this.csrfToken = this.extractCSRFToken();
console.log('🔒 Neu geladener Token:', this.csrfToken);
}
this.showNotification('🧪 TEST: Starte automatische Fehlerkorrektur...', 'info');
try {
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.csrfToken,
'X-Requested-With': 'XMLHttpRequest'
}
};
console.log('📡 TEST Request an:', '/api/admin/fix-errors');
console.log('📝 TEST Headers:', requestOptions.headers);
const response = await fetch('/api/admin/fix-errors', requestOptions);
console.log('📡 TEST Response Status:', response.status);
console.log('📡 TEST Response Headers:', Object.fromEntries(response.headers.entries()));
if (!response.ok) {
const errorText = await response.text();
console.error('❌ TEST Response Error:', errorText);
this.showNotification(`❌ TEST Fehler: ${response.status} - ${errorText}`, 'error');
return;
}
const data = await response.json();
console.log('✅ TEST Response Data:', data);
if (data.success) {
this.showNotification('✅ TEST: Automatische Reparatur erfolgreich!', 'success');
} else {
this.showNotification(`❌ TEST: Reparatur fehlgeschlagen - ${data.message}`, 'error');
}
} catch (error) {
console.error('❌ TEST Fehler:', error);
this.showNotification(`❌ TEST Netzwerk-Fehler: ${error.message}`, 'error');
}
}
} }
// Sichere Initialisierung - nur einmal ausführen // Sichere Initialisierung - nur einmal ausführen

View File

@ -6,9 +6,29 @@
{{ super() }} {{ super() }}
<!-- CSRF Token für AJAX-Anfragen --> <!-- CSRF Token für AJAX-Anfragen -->
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Verstecktes CSRF-Input als Fallback -->
<form id="csrf-form" style="display: none;">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
</form>
<!-- Konsolidierte Admin JavaScript Datei - verhindert Event-Handler-Konflikte --> <!-- Konsolidierte Admin JavaScript Datei - verhindert Event-Handler-Konflikte -->
<script src="{{ url_for('static', filename='js/admin-unified.js') }}" defer></script> <script src="{{ url_for('static', filename='js/admin-unified.js') }}" defer></script>
<!-- Debug Script für CSRF Token -->
<script>
document.addEventListener('DOMContentLoaded', function() {
const metaToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
const hiddenToken = document.querySelector('input[name="csrf_token"]')?.value;
console.log('🔒 CSRF Debug - Meta Token:', metaToken ? 'verfügbar' : 'FEHLT');
console.log('🔒 CSRF Debug - Hidden Token:', hiddenToken ? 'verfügbar' : 'FEHLT');
if (!metaToken && !hiddenToken) {
console.error('❌ KRITISCH: Kein CSRF Token gefunden!');
}
});
</script>
<!-- Loading Overlay --> <!-- Loading Overlay -->
<div id="loading-overlay" class="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center hidden"> <div id="loading-overlay" class="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center hidden">
<div class="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-2xl"> <div class="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-2xl">
@ -579,7 +599,7 @@
<!-- Wartungs-Modal --> <!-- Wartungs-Modal -->
<div id="maintenance-modal" class="fixed inset-0 bg-black/50 backdrop-blur-sm z-50 hidden"> <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="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="bg-white dark:bg-slate-800 rounded-2xl p-8 shadow-2xl max-w-md w-full max-h-90vh overflow-y-auto scrollbar-thin scrollbar-thumb-rounded">
<div class="text-center mb-6"> <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"> <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"> <svg class="h-6 w-6 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">

View File

@ -1288,15 +1288,233 @@ let printerManager;
// Enhanced Printer Management System // Enhanced Printer Management System
class PrinterManager { class PrinterManager {
constructor() { constructor() {
this.init(); this.printers = [];
this.setupEventListeners(); this.lastUpdateTime = null;
this.startAutoRefresh(); this.autoRefreshInterval = null;
this.isPerformanceMonitoringEnabled = false;
} }
async init() { async init() {
await this.loadPrinters(); try {
this.populateFilterDropdowns(); // setupFilters() existiert nicht - verwende populateFilterDropdowns() await this.loadPrinters();
this.initializePerformanceMonitoring(); this.initializeEventListeners();
this.initializePerformanceMonitoring();
this.startAutoRefresh();
console.log('✅ PrinterManager erfolgreich initialisiert');
} catch (error) {
console.error('❌ Fehler bei PrinterManager-Initialisierung:', error);
}
}
initializePerformanceMonitoring() {
try {
// Performance Monitoring initialisieren
this.isPerformanceMonitoringEnabled = true;
console.log('✅ Performance Monitoring aktiviert');
} catch (error) {
console.error('⚠️ Performance Monitoring konnte nicht initialisiert werden:', error);
this.isPerformanceMonitoringEnabled = false;
}
}
async testPrint(printerId) {
try {
console.log(`🖨️ Testdruck für Drucker ${printerId} wird gestartet...`);
// Toggle-Button für Testdruck
const response = await fetch(`/api/admin/printers/${printerId}/toggle`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify({ state: true })
});
const result = await response.json();
if (response.ok && result.success) {
this.showSuccess(`Testdruck für Drucker ${printerId} gestartet`);
// Drucker-Status aktualisieren
setTimeout(() => this.loadPrinters(), 1000);
} else {
this.showError(`Testdruck fehlgeschlagen: ${result.error || 'Unbekannter Fehler'}`);
}
} catch (error) {
console.error('Fehler beim Testdruck:', error);
this.showError('Netzwerkfehler beim Starten des Testdrucks');
}
}
async pausePrint(printerId) {
try {
console.log(`⏸️ Pausiere Druck für Drucker ${printerId}...`);
const response = await fetch(`/api/admin/printers/${printerId}/toggle`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify({ state: false })
});
const result = await response.json();
if (response.ok && result.success) {
this.showSuccess(`Druck für Drucker ${printerId} pausiert`);
setTimeout(() => this.loadPrinters(), 1000);
} else {
this.showError(`Pausieren fehlgeschlagen: ${result.error || 'Unbekannter Fehler'}`);
}
} catch (error) {
console.error('Fehler beim Pausieren:', error);
this.showError('Netzwerkfehler beim Pausieren des Drucks');
}
}
async resetPrinter(printerId) {
try {
console.log(`🔄 Reset für Drucker ${printerId}...`);
const response = await fetch(`/api/admin/printers/${printerId}/toggle`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify({ state: false })
});
const result = await response.json();
if (response.ok && result.success) {
this.showSuccess(`Drucker ${printerId} wurde zurückgesetzt`);
setTimeout(() => this.loadPrinters(), 1000);
} else {
this.showError(`Reset fehlgeschlagen: ${result.error || 'Unbekannter Fehler'}`);
}
} catch (error) {
console.error('Fehler beim Reset:', error);
this.showError('Netzwerkfehler beim Zurücksetzen des Druckers');
}
}
async connectPrinter(printerId) {
try {
console.log(`🔗 Verbinde zu Drucker ${printerId}...`);
const response = await fetch(`/api/admin/printers/${printerId}/toggle`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify({ state: true })
});
const result = await response.json();
if (response.ok && result.success) {
this.showSuccess(`Verbindung zu Drucker ${printerId} hergestellt`);
setTimeout(() => this.loadPrinters(), 1000);
} else {
this.showError(`Verbindung fehlgeschlagen: ${result.error || 'Unbekannter Fehler'}`);
}
} catch (error) {
console.error('Fehler bei Verbindung:', error);
this.showError('Netzwerkfehler beim Verbinden mit dem Drucker');
}
}
initializeEventListeners() {
// Search input
const searchInput = document.getElementById('search-input');
if (searchInput) {
searchInput.addEventListener('input', this.debounce(() => this.applyFilters(), 300));
}
// Filter dropdowns
['filterStatus', 'filterLocation', 'filterModel', 'sort-by'].forEach(id => {
const element = document.getElementById(id);
if (element) {
element.addEventListener('change', () => this.applyFilters());
}
});
// Filter checkboxes
['show-offline', 'show-maintenance', 'only-available'].forEach(id => {
const element = document.getElementById(id);
if (element) {
element.addEventListener('change', () => this.applyFilters());
}
});
// Modal close handlers
document.addEventListener('click', (e) => {
if (e.target.classList.contains('modal-overlay')) {
this.closeAllModals();
}
});
// Keyboard shortcuts
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
this.closeAllModals();
}
});
console.log('✅ Event Listeners initialisiert');
}
showSuccess(message) {
console.log('✅ Erfolg:', message);
// Toast-Benachrichtigung hier implementieren
this.showToast(message, 'success');
}
showError(message) {
console.error('❌ Fehler:', message);
// Toast-Benachrichtigung hier implementieren
this.showToast(message, 'error');
}
showToast(message, type = 'info') {
// Einfache Toast-Implementation
const toast = document.createElement('div');
toast.className = `fixed top-4 right-4 p-4 rounded-lg shadow-lg z-50 ${
type === 'success' ? 'bg-green-500 text-white' :
type === 'error' ? 'bg-red-500 text-white' :
'bg-blue-500 text-white'
}`;
toast.textContent = message;
document.body.appendChild(toast);
// Animation
setTimeout(() => toast.classList.add('animate-fade-in'), 10);
// Auto-remove
setTimeout(() => {
toast.classList.add('animate-fade-out');
setTimeout(() => document.body.removeChild(toast), 300);
}, 3000);
}
getCSRFToken() {
const metaTag = document.querySelector('meta[name="csrf-token"]');
if (metaTag) {
return metaTag.getAttribute('content');
}
// Fallback: Suche nach CSRFToken in versteckten Input-Feldern
const csrfInput = document.querySelector('input[name="csrf_token"]');
if (csrfInput) {
return csrfInput.value;
}
console.warn('⚠️ CSRF-Token nicht gefunden');
return '';
} }
setupEventListeners() { setupEventListeners() {
@ -2039,15 +2257,302 @@ class PrinterManager {
} }
} }
loadPrinterDetails(printer) { async loadPrinterDetails(printer) {
// Hier würden die Detail-Informationen geladen werden
console.log('Lade Details für Drucker:', printer); console.log('Lade Details für Drucker:', printer);
// TODO: Implementiere Detail-Ansicht
try {
// Update basic info
document.getElementById('printer-name-display').textContent = printer.name;
document.getElementById('printer-model-display').textContent = printer.model || 'Unbekanntes Modell';
document.getElementById('ip-address').textContent = printer.ip_address || printer.plug_ip || 'Keine IP';
// Update status
this.updatePrinterStatusDisplay(printer);
// Load extended data from API
const response = await fetch(`/api/printers/${printer.id}/details`);
if (response.ok) {
const detailData = await response.json();
if (detailData.success) {
this.populateDetailedPrinterInfo(detailData.data);
} else {
console.warn('Fehler beim Laden der erweiterten Druckerdetails:', detailData.message);
this.populateMockPrinterInfo(printer);
}
} else {
console.warn('API-Endpunkt nicht verfügbar, verwende Mock-Daten');
this.populateMockPrinterInfo(printer);
}
} catch (error) {
console.error('Fehler beim Laden der Druckerdetails:', error);
this.populateMockPrinterInfo(printer);
}
}
updatePrinterStatusDisplay(printer) {
const statusIcon = document.getElementById('printer-status-icon');
const statusBadge = document.getElementById('printer-status-badge');
const powerBtn = document.getElementById('power-toggle-btn');
// Status Icon und Badge aktualisieren
const statusClasses = this.getStatusClasses(printer.status);
statusIcon.className = `w-12 h-12 ${statusClasses.iconBg} rounded-xl flex items-center justify-center`;
statusIcon.innerHTML = this.getStatusIcon(printer.status);
statusBadge.className = `inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${statusClasses.badge}`;
statusBadge.innerHTML = `
<div class="w-2 h-2 ${printer.status === 'online' ? 'bg-green-500' : printer.status === 'offline' ? 'bg-red-500' : 'bg-yellow-500'} rounded-full mr-2 ${printer.status === 'printing' ? 'animate-pulse' : ''}"></div>
${this.getStatusText(printer.status)}
`;
// Power Button aktualisieren
if (printer.status === 'offline') {
powerBtn.innerHTML = `
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
</svg>
<span>Steckdose einschalten</span>
`;
powerBtn.className = 'w-full px-4 py-3 bg-green-500 hover:bg-green-600 text-white rounded-lg transition-colors flex items-center justify-center space-x-2';
} else {
powerBtn.innerHTML = `
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728L5.636 5.636m12.728 12.728L18.364 5.636M5.636 18.364l12.728-12.728"/>
</svg>
<span>Steckdose ausschalten</span>
`;
powerBtn.className = 'w-full px-4 py-3 bg-red-500 hover:bg-red-600 text-white rounded-lg transition-colors flex items-center justify-center space-x-2';
}
}
populateDetailedPrinterInfo(data) {
// Netzwerkstatus
document.getElementById('network-status').textContent = data.network?.connected ? 'Verbunden' : 'Getrennt';
document.getElementById('last-activity').textContent = this.formatTimeAgo(data.last_activity);
document.getElementById('printer-uptime').textContent = `Uptime: ${this.formatUptime(data.uptime)}`;
// Temperaturen
if (data.temperatures) {
this.updateTemperatureDisplays(data.temperatures);
}
// Aktueller Job
if (data.current_job) {
this.displayCurrentJob(data.current_job);
} else {
this.showNoJobMessage();
}
// Aktivitätsverlauf
if (data.activity_log) {
this.displayActivityLog(data.activity_log);
}
// Statistiken
if (data.statistics) {
this.displayStatistics(data.statistics);
}
}
populateMockPrinterInfo(printer) {
// Mock-Informationen für Drucker-Details
const detailsContainer = document.getElementById('printer-details-content');
if (detailsContainer) {
detailsContainer.innerHTML = `
<div class="space-y-4">
<div>
<h4 class="font-medium">Grundinformationen</h4>
<p>Modell: ${printer.model || 'Unbekannt'}</p>
<p>Standort: ${printer.location || 'Unbekannt'}</p>
<p>IP-Adresse: ${printer.ip_address || printer.plug_ip || 'Unbekannt'}</p>
</div>
</div>
`;
}
}
updateTemperatureDisplays(temperatures) {
if (temperatures.extruder) {
document.getElementById('extruder-temp').textContent = `${temperatures.extruder.current}°C`;
const extruderPercent = (temperatures.extruder.current / temperatures.extruder.max) * 100;
document.getElementById('extruder-temp-bar').style.width = `${extruderPercent}%`;
}
if (temperatures.bed) {
document.getElementById('bed-temp').textContent = `${temperatures.bed.current}°C`;
const bedPercent = (temperatures.bed.current / temperatures.bed.max) * 100;
document.getElementById('bed-temp-bar').style.width = `${bedPercent}%`;
}
if (temperatures.ambient) {
document.getElementById('ambient-temp').textContent = `${temperatures.ambient.current}°C`;
}
}
displayCurrentJob(job) {
document.getElementById('no-job-message').classList.add('hidden');
document.getElementById('active-job-display').classList.remove('hidden');
document.getElementById('job-title').textContent = job.title;
document.getElementById('job-details').textContent = `Gestartet vor ${this.formatDuration(job.time_elapsed)}`;
document.getElementById('job-progress-text').textContent = `${job.progress}%`;
document.getElementById('job-progress-bar').style.width = `${job.progress}%`;
document.getElementById('time-elapsed').textContent = `Vergangen: ${this.formatDuration(job.time_elapsed)}`;
document.getElementById('time-remaining').textContent = `Verbleibend: ~${this.formatDuration(job.time_remaining)}`;
document.getElementById('current-layer').textContent = `${job.current_layer}/${job.total_layers}`;
document.getElementById('print-quality').textContent = job.quality;
document.getElementById('print-material').textContent = job.material;
// Priority Badge
const priorityBadge = document.getElementById('job-priority');
priorityBadge.textContent = job.priority === 'high' ? 'Hoch' : job.priority === 'low' ? 'Niedrig' : 'Normal';
priorityBadge.className = job.priority === 'high' ?
'px-3 py-1 bg-orange-100 dark:bg-orange-900/30 text-orange-800 dark:text-orange-300 rounded-full text-sm font-medium' :
'px-3 py-1 bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300 rounded-full text-sm font-medium';
// Show job control buttons
document.getElementById('pause-resume-btn').classList.remove('hidden');
document.getElementById('stop-print-btn').classList.remove('hidden');
}
showNoJobMessage() {
document.getElementById('no-job-message').classList.remove('hidden');
document.getElementById('active-job-display').classList.add('hidden');
document.getElementById('pause-resume-btn').classList.add('hidden');
document.getElementById('stop-print-btn').classList.add('hidden');
}
displayActivityLog(activities) {
const container = document.getElementById('recent-activity-info');
container.innerHTML = activities.map(activity => `
<div class="flex items-center space-x-3 p-3 bg-gray-50 dark:bg-slate-700/50 rounded-lg">
<div class="flex-shrink-0">
<div class="w-2 h-2 ${activity.type === 'success' ? 'bg-green-500' : activity.type === 'error' ? 'bg-red-500' : 'bg-blue-500'} rounded-full"></div>
</div>
<div class="flex-1 min-w-0">
<p class="text-sm font-medium text-mercedes-black dark:text-white">${activity.action}</p>
<p class="text-xs text-mercedes-gray dark:text-slate-400">${this.formatTimeAgo(activity.time)}</p>
</div>
</div>
`).join('');
}
displayStatistics(stats) {
// Heutige Statistiken
document.getElementById('jobs-today').textContent = stats.today.jobs;
document.getElementById('success-rate').textContent = `${stats.today.success_rate}%`;
document.getElementById('print-time-today').textContent = `${stats.today.print_time}h`;
document.getElementById('material-used').textContent = `${stats.today.material_used}g`;
// Wöchentliche Statistiken
document.getElementById('weekly-jobs').textContent = stats.weekly.jobs;
document.getElementById('weekly-success').textContent = stats.weekly.successful;
document.getElementById('weekly-failed').textContent = stats.weekly.failed;
document.getElementById('weekly-material').textContent = `${(stats.weekly.material_used / 1000).toFixed(1)}kg`;
}
formatTimeAgo(dateString) {
const now = new Date();
const date = new Date(dateString);
const diffInMinutes = Math.floor((now - date) / (1000 * 60));
if (diffInMinutes < 1) return 'Gerade eben';
if (diffInMinutes < 60) return `Vor ${diffInMinutes} Min`;
if (diffInMinutes < 1440) return `Vor ${Math.floor(diffInMinutes / 60)} Std`;
return `Vor ${Math.floor(diffInMinutes / 1440)} Tagen`;
}
renderSmartPlugControls(printer) {
// Nur für Admins sichtbar
if (!this.isCurrentUserAdmin()) {
return '';
}
const isOnline = ['online', 'printing', 'idle'].includes(printer.status);
const buttonClass = isOnline ? 'bg-red-500 hover:bg-red-600' : 'bg-green-500 hover:bg-green-600';
const buttonText = isOnline ? 'AUS' : 'EIN';
const buttonIcon = isOnline ?
`<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>` :
`<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
</svg>`;
return `
<div class="smart-plug-control p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
<h4 class="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
🔌 Smart-Plug Steuerung
</h4>
<div class="flex items-center justify-between">
<div class="text-xs text-gray-500">
Steckdose: ${printer.plug_ip || 'Nicht konfiguriert'}
</div>
<button
onclick="printerManager.toggleSmartPlug(${printer.id}, ${!isOnline})"
class="smart-plug-btn flex items-center space-x-1 px-3 py-1 rounded text-white text-sm font-medium ${buttonClass} transition-colors duration-200"
${!printer.plug_ip ? 'disabled' : ''}
>
${buttonIcon}
<span>${buttonText}</span>
</button>
</div>
<div class="mt-2 text-xs text-gray-500">
Status: <span class="font-medium">${this.getStatusText(printer.status)}</span>
</div>
</div>
`;
}
async toggleSmartPlug(printerId, turnOn) {
try {
const action = turnOn ? 'einschalten' : 'ausschalten';
console.log(`🔌 Smart-Plug für Drucker ${printerId} wird ${action}...`);
// Visuelles Feedback
const button = document.querySelector(`button[onclick*="toggleSmartPlug(${printerId}"]`);
if (button) {
button.disabled = true;
button.innerHTML = '<svg class="w-4 h-4 animate-spin" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path></svg> <span>Wird geschaltet...</span>';
}
const response = await fetch(`/api/admin/printers/${printerId}/toggle`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': this.getCSRFToken()
},
body: JSON.stringify({ state: turnOn })
});
const result = await response.json();
if (response.ok && result.success) {
this.showSuccess(`Smart-Plug erfolgreich ${action}: ${result.printer_name}`);
// Sofortige UI-Aktualisierung
setTimeout(() => this.loadPrinters(), 500);
} else {
this.showError(`Smart-Plug ${action} fehlgeschlagen: ${result.error || 'Unbekannter Fehler'}`);
}
} catch (error) {
console.error('Fehler beim Smart-Plug Toggle:', error);
this.showError(`Netzwerkfehler beim ${turnOn ? 'Einschalten' : 'Ausschalten'} der Smart-Plug`);
} finally {
// Button wieder aktivieren
setTimeout(() => this.loadPrinters(), 1000);
}
}
isCurrentUserAdmin() {
// Prüfe ob der aktuelle Benutzer Admin-Rechte hat
const userRole = document.querySelector('meta[name="user-role"]')?.getAttribute('content');
return userRole === 'admin';
} }
} }
// Initialize Printer Manager // Initialize Printer Manager
printerManager = new PrinterManager(); printerManager = new PrinterManager();
printerManager.init();
// Global functions for UI interactions // Global functions for UI interactions
function refreshPrinters() { function refreshPrinters() {
@ -2220,5 +2725,89 @@ function getStatusSummary() {
return summary; return summary;
} }
// Neue globale Funktionen für Printer Details Modal Schnellaktionen
function refreshPrinterDetails() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
printerManager.loadPrinterDetails(currentPrinter);
}
}
function togglePrinterPower() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
const isOnline = ['online', 'printing', 'idle'].includes(currentPrinter.status);
printerManager.toggleSmartPlug(currentPrinter.id, !isOnline);
}
}
function pauseResumePrint() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter && currentPrinter.status === 'printing') {
// TODO: Implementiere Pause/Resume Funktionalität
console.log('Pausiere/Fortsetze Druck für Drucker:', currentPrinter.id);
printerManager.showSuccess('Pause/Resume Funktionalität wird implementiert');
}
}
function stopPrint() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter && currentPrinter.status === 'printing') {
if (confirm('Möchten Sie den aktuellen Druckauftrag wirklich abbrechen?')) {
// TODO: Implementiere Stop Print Funktionalität
console.log('Stoppe Druck für Drucker:', currentPrinter.id);
printerManager.showSuccess('Stop Print Funktionalität wird implementiert');
}
}
}
function sendToMaintenance() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
if (confirm(`Möchten Sie ${currentPrinter.name} in den Wartungsmodus versetzen?`)) {
// TODO: Implementiere Wartungsmodus
console.log('Wartungsmodus für Drucker:', currentPrinter.id);
printerManager.showSuccess('Wartungsmodus Funktionalität wird implementiert');
}
}
}
function testPrinterConnection() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
console.log('Teste Verbindung für Drucker:', currentPrinter.id);
printerManager.showSuccess('Verbindungstest wird durchgeführt...');
// Simulate connection test
setTimeout(() => {
printerManager.showSuccess('Verbindung erfolgreich getestet');
}, 2000);
}
}
function openFileManager() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
console.log('Öffne Datei-Manager für Drucker:', currentPrinter.id);
printerManager.showSuccess('Datei-Manager wird geöffnet...');
// TODO: Implementiere Datei-Manager Modal
}
}
function uploadFile() {
const currentPrinter = printerManager.getCurrentDetailsPrinter();
if (currentPrinter) {
console.log('Datei-Upload für Drucker:', currentPrinter.id);
printerManager.showSuccess('Datei-Upload wird geöffnet...');
// TODO: Implementiere Datei-Upload Modal
}
}
</script>
{% endblock %}
});
return summary;
}
</script> </script>
{% endblock %} {% endblock %}