"Feature: Update admin interface design and layout"

This commit is contained in:
2025-05-29 17:36:35 +02:00
parent f29fda7075
commit 1f2405d56b
3 changed files with 908 additions and 0 deletions

View File

@@ -4298,6 +4298,26 @@ if __name__ == "__main__":
atexit.register(cleanup_queue_manager)
# Robuste Drucker-Initialisierung nach Queue-Manager-Start
app_logger.info("🔄 Starte robuste Drucker-Initialisierung beim Systemstart...")
try:
# In separatem Thread ausführen, um Startzeit nicht zu blockieren
import threading
def startup_printer_init():
try:
force_load_all_printers()
app_logger.info("✅ Startup-Drucker-Initialisierung abgeschlossen")
except Exception as e:
app_logger.error(f"❌ Fehler bei Startup-Drucker-Initialisierung: {str(e)}")
init_thread = threading.Thread(target=startup_printer_init, daemon=True, name="PrinterStartupInit")
init_thread.start()
app_logger.info("🚀 Drucker-Initialisierung im Hintergrund gestartet")
except Exception as e:
app_logger.error(f"❌ Kritischer Fehler beim Starten der Drucker-Initialisierung: {str(e)}")
# System trotzdem starten, auch wenn Drucker-Init fehlschlägt
except Exception as e:
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
else:
@@ -4377,3 +4397,184 @@ if __name__ == "__main__":
except:
pass
sys.exit(1)
def force_load_all_printers():
"""
Lädt und initialisiert alle Drucker um jeden Preis - mit Fallback-Strategien.
Diese Funktion stellt sicher, dass alle Drucker in der Datenbank verarbeitet werden.
"""
printers_logger.info("🔄 Starte robuste Drucker-Initialisierung...")
db_session = get_db_session()
try:
# Alle Drucker aus der Datenbank laden
printers = db_session.query(Printer).all()
printers_logger.info(f"📊 {len(printers)} Drucker in der Datenbank gefunden")
if not printers:
printers_logger.warning("⚠️ Keine Drucker in der Datenbank gefunden!")
return
successful_updates = 0
failed_updates = 0
for printer in printers:
try:
# Status-Update mit Fallback-Strategie
if printer.plug_ip:
printers_logger.debug(f"🔍 Prüfe Drucker {printer.name} ({printer.plug_ip})")
try:
# Hauptstatus-Check mit Timeout
status, active = check_printer_status(printer.plug_ip, timeout=5)
# Status in Datenbank aktualisieren
old_status = printer.status
printer.status = "available" if status == "online" else "offline"
printer.active = active
printer.last_checked = datetime.now()
if old_status != printer.status:
printers_logger.info(f"✅ Drucker {printer.name}: {old_status}{printer.status}")
else:
printers_logger.debug(f"📍 Drucker {printer.name}: Status unverändert ({printer.status})")
successful_updates += 1
except Exception as status_error:
# Fallback: Drucker als offline markieren, aber trotzdem verarbeiten
printers_logger.warning(f"⚠️ Status-Check für {printer.name} fehlgeschlagen: {str(status_error)}")
printer.status = "offline"
printer.active = False
printer.last_checked = datetime.now()
failed_updates += 1
else:
# Drucker ohne IP-Adresse als offline markieren
printers_logger.warning(f"⚠️ Drucker {printer.name} hat keine IP-Adresse - als offline markiert")
printer.status = "offline"
printer.active = False
printer.last_checked = datetime.now()
failed_updates += 1
except Exception as printer_error:
# Selbst bei schwerwiegenden Fehlern: Drucker nicht ignorieren
printers_logger.error(f"❌ Schwerer Fehler bei Drucker {printer.name}: {str(printer_error)}")
try:
# Minimale Fallback-Initialisierung
printer.status = "offline"
printer.active = False
printer.last_checked = datetime.now()
failed_updates += 1
except Exception as fallback_error:
printers_logger.critical(f"💥 Kritischer Fehler bei Fallback für {printer.name}: {str(fallback_error)}")
# Änderungen in Datenbank speichern
try:
db_session.commit()
printers_logger.info(f"✅ Drucker-Status erfolgreich gespeichert")
except Exception as commit_error:
printers_logger.error(f"❌ Fehler beim Speichern der Drucker-Status: {str(commit_error)}")
db_session.rollback()
# Zusammenfassung
total_printers = len(printers)
online_printers = len([p for p in printers if p.status in ["available", "online"]])
printers_logger.info(f"📈 Drucker-Initialisierung abgeschlossen:")
printers_logger.info(f" Gesamt: {total_printers}")
printers_logger.info(f" Online: {online_printers}")
printers_logger.info(f" Offline: {total_printers - online_printers}")
printers_logger.info(f" Erfolgreich: {successful_updates}")
printers_logger.info(f" Fehlgeschlagen: {failed_updates}")
except Exception as global_error:
printers_logger.critical(f"💥 Kritischer Fehler bei Drucker-Initialisierung: {str(global_error)}")
# Trotzdem versuchen, die Session zu schließen
finally:
try:
db_session.close()
except:
pass
@app.route('/api/admin/printers/force-initialize', methods=['POST'])
@admin_required
def force_initialize_printers():
"""Startet eine robuste Drucker-Initialisierung manuell"""
try:
app_logger.info("🚀 Admin-initiierte Drucker-Initialisierung gestartet")
# Robuste Initialisierung in separatem Thread starten
import threading
def run_initialization():
try:
force_load_all_printers()
except Exception as e:
printers_logger.error(f"❌ Fehler bei Thread-initialisierter Drucker-Initialisierung: {str(e)}")
init_thread = threading.Thread(target=run_initialization, daemon=True)
init_thread.start()
return jsonify({
"success": True,
"message": "Drucker-Initialisierung gestartet",
"info": "Die Initialisierung läuft im Hintergrund. Prüfen Sie die Logs für Details."
})
except Exception as e:
app_logger.error(f"❌ Fehler beim Starten der Drucker-Initialisierung: {str(e)}")
return jsonify({
"success": False,
"message": f"Fehler beim Starten der Initialisierung: {str(e)}"
}), 500
@app.route('/api/admin/printers/update-all', methods=['POST'])
@admin_required
def update_all_printers():
"""Aktualisiert den Status aller Drucker"""
try:
db_session = get_db_session()
printers = db_session.query(Printer).all()
updated_printers = []
for printer in printers:
if printer.plug_ip:
try:
status, active = check_printer_status(printer.plug_ip)
old_status = printer.status
printer.update_status(status, active)
updated_printers.append({
"id": printer.id,
"name": printer.name,
"old_status": old_status,
"new_status": status,
"active": active
})
except Exception as e:
printers_logger.warning(f"Fehler beim Aktualisieren von Drucker {printer.name}: {str(e)}")
db_session.commit()
db_session.close()
app_logger.info(f"Status von {len(updated_printers)} Druckern aktualisiert")
return jsonify({
"success": True,
"message": f"Status von {len(updated_printers)} Druckern aktualisiert",
"updated_printers": updated_printers
})
except Exception as e:
app_logger.error(f"Fehler beim Aktualisieren aller Drucker: {str(e)}")
return jsonify({
"success": False,
"message": f"Fehler beim Aktualisieren: {str(e)}"
}), 500