📝 Enhanced Printer Details Modal and Scrollable Update Documentation Added 🎉
This commit is contained in:
parent
7de193d4b2
commit
345fc6cbb5
365
backend/app.py
365
backend/app.py
@ -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.
Binary file not shown.
1
backend/docs/ENHANCED_PRINTER_DETAILS_MODAL.md
Normal file
1
backend/docs/ENHANCED_PRINTER_DETAILS_MODAL.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
1
backend/docs/MODAL_SCROLLABLE_UPDATE.md
Normal file
1
backend/docs/MODAL_SCROLLABLE_UPDATE.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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...
|
||||||
|
@ -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)
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
2025-06-01 17:19:50 - [guest] guest - [INFO] INFO - Neue Gastanfrage erstellt: ID 1, Name: Till Tomczak, OTP generiert
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 - ==================================================
|
||||||
|
@ -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
|
||||||
|
2
backend/static/css/tailwind.min.css
vendored
2
backend/static/css/tailwind.min.css
vendored
File diff suppressed because one or more lines are too long
@ -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
|
||||||
|
@ -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">
|
||||||
|
@ -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() {
|
||||||
|
try {
|
||||||
await this.loadPrinters();
|
await this.loadPrinters();
|
||||||
this.populateFilterDropdowns(); // setupFilters() existiert nicht - verwende populateFilterDropdowns()
|
this.initializeEventListeners();
|
||||||
this.initializePerformanceMonitoring();
|
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 %}
|
Loading…
x
Reference in New Issue
Block a user