"Feature: Update admin interface design and layout"
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user