#!/usr/bin/env python3 """ Temporäres Skript zum Hinzufügen der fehlenden /api/statistics/public Route """ with open('app.py', 'r', encoding='utf-8') as f: content = f.read() # Die neue Route die hinzugefügt werden soll new_route = ''' # ===== ÖFFENTLICHE STATISTIK-API ===== @app.route("/api/statistics/public", methods=['GET']) def api_public_statistics(): """ Öffentliche Statistiken ohne Authentifizierung. Stellt grundlegende, nicht-sensible Systemstatistiken bereit, die auf der Startseite angezeigt werden können. Returns: JSON: Öffentliche Statistiken """ try: db_session = get_db_session() # Grundlegende, nicht-sensible Statistiken total_jobs = db_session.query(Job).count() completed_jobs = db_session.query(Job).filter(Job.status == "finished").count() total_printers = db_session.query(Printer).count() active_printers = db_session.query(Printer).filter( Printer.active == True, Printer.status.in_(["online", "available", "idle"]) ).count() # Erfolgsrate berechnen success_rate = round((completed_jobs / total_jobs * 100) if total_jobs > 0 else 0, 1) # Anonymisierte Benutzerstatistiken total_users = db_session.query(User).filter(User.active == True).count() # Letzte 30 Tage Aktivität (anonymisiert) thirty_days_ago = datetime.now() - timedelta(days=30) recent_jobs = db_session.query(Job).filter( Job.created_at >= thirty_days_ago ).count() db_session.close() public_stats = { "system_info": { "total_jobs": total_jobs, "completed_jobs": completed_jobs, "success_rate": success_rate, "total_printers": total_printers, "active_printers": active_printers, "active_users": total_users, "recent_activity": recent_jobs }, "health_indicators": { "system_status": "operational", "printer_availability": round((active_printers / total_printers * 100) if total_printers > 0 else 0, 1), "last_updated": datetime.now().isoformat() }, "features": { "multi_location_support": True, "real_time_monitoring": True, "automated_scheduling": True, "advanced_reporting": True } } return jsonify(public_stats) except Exception as e: app_logger.error(f"Fehler bei öffentlichen Statistiken: {str(e)}") # Fallback-Statistiken bei Fehler return jsonify({ "system_info": { "total_jobs": 0, "completed_jobs": 0, "success_rate": 0, "total_printers": 0, "active_printers": 0, "active_users": 0, "recent_activity": 0 }, "health_indicators": { "system_status": "maintenance", "printer_availability": 0, "last_updated": datetime.now().isoformat() }, "features": { "multi_location_support": True, "real_time_monitoring": True, "automated_scheduling": True, "advanced_reporting": True }, "error": "Statistiken temporär nicht verfügbar" }), 200 # 200 statt 500 um Frontend nicht zu brechen ''' # Füge die Route vor @app.route("/api/stats", methods=['GET']) hinzu marker = '@app.route("/api/stats", methods=[\'GET\'])' if marker in content: parts = content.split(marker, 1) new_content = parts[0] + new_route + marker + parts[1] with open('app.py', 'w', encoding='utf-8') as f: f.write(new_content) print('✅ Öffentliche Statistik-API Route hinzugefügt') else: print('❌ Marker nicht gefunden - versuche alternativen Marker') # Versuche alternativen Marker alt_marker = '@app.route("/api/stats", methods=[\"GET\"])' if alt_marker in content: parts = content.split(alt_marker, 1) new_content = parts[0] + new_route + alt_marker + parts[1] with open('app.py', 'w', encoding='utf-8') as f: f.write(new_content) print('✅ Öffentliche Statistik-API Route mit alternativem Marker hinzugefügt') else: print('❌ Auch alternativer Marker nicht gefunden') print('Suche verfügbare Marker...') import re stats_markers = re.findall(r'@app\.route\("/api/stats".*?\)', content) print(f'Gefundene Stats-Marker: {stats_markers}')