diff --git a/backend/app.py b/backend/app.py index 849ada49..7bfb779c 100644 --- a/backend/app.py +++ b/backend/app.py @@ -72,6 +72,7 @@ from blueprints.guest import guest_blueprint from blueprints.calendar import calendar_blueprint from blueprints.users import users_blueprint from blueprints.printers import printers_blueprint +from blueprints.jobs import jobs_blueprint # Scheduler importieren falls verfügbar try: @@ -203,6 +204,7 @@ app.register_blueprint(guest_blueprint) app.register_blueprint(calendar_blueprint) app.register_blueprint(users_blueprint) app.register_blueprint(printers_blueprint) +app.register_blueprint(jobs_blueprint) # Login-Manager initialisieren login_manager = LoginManager() @@ -214,7 +216,7 @@ login_manager.login_message_category = "info" @login_manager.user_loader def load_user(user_id): """ - Robuster User-Loader mit verbessertem Error-Handling für Schema-Probleme. + Robuster User-Loader mit verbessertem Error-Handling für Schema-Probleme und SQLite-Interface-Fehler. """ try: # user_id von Flask-Login ist immer ein String - zu Integer konvertieren @@ -224,83 +226,112 @@ def load_user(user_id): app_logger.error(f"Ungültige User-ID: {user_id}") return None + # Versuche Benutzer über robustes Caching-System zu laden + try: + from models import User + cached_user = User.get_by_id_cached(user_id_int) + if cached_user: + return cached_user + except Exception as cache_error: + app_logger.debug(f"Cache-Abfrage fehlgeschlagen: {str(cache_error)}") + db_session = get_db_session() - # Robuste Abfrage mit Error-Handling + # Primäre Abfrage mit SQLAlchemy ORM try: user = db_session.query(User).filter(User.id == user_id_int).first() - db_session.close() - return user - except Exception as db_error: - # Schema-Problem - versuche manuelle Abfrage - app_logger.warning(f"Schema-Problem beim User-Load für ID {user_id_int}: {str(db_error)}") + if user: + db_session.close() + return user + except Exception as orm_error: + # SQLAlchemy ORM-Fehler - versuche Core-Query + app_logger.warning(f"ORM-Abfrage fehlgeschlagen für User-ID {user_id_int}: {str(orm_error)}") - # Erweiterte manuelle Abfrage mit allen wichtigen Feldern try: - result = db_session.execute( - text("""SELECT id, email, username, password_hash, name, role, active, + # Verwende SQLAlchemy Core für robuste Abfrage + from sqlalchemy import text, select + + # Sichere Parameter-Bindung mit expliziter Typisierung + stmt = text(""" + SELECT id, email, username, password_hash, name, role, active, created_at, last_login, updated_at, settings, department, position, phone, bio, last_activity - FROM users WHERE id = :user_id"""), - {"user_id": user_id_int} - ).fetchone() + FROM users + WHERE id = :user_id + """) + + result = db_session.execute(stmt, {"user_id": user_id_int}).fetchone() if result: - # Manuell User-Objekt erstellen mit robuster Tupel-Behandlung + # User-Objekt manuell erstellen mit robusten Defaults user = User() - # Basis-Felder (immer vorhanden) - user.id = result[0] if len(result) > 0 else user_id_int - user.email = result[1] if len(result) > 1 and result[1] else f"user_{user_id_int}@system.local" - user.username = result[2] if len(result) > 2 and result[2] else user.email.split('@')[0] - user.password_hash = result[3] if len(result) > 3 and result[3] else "" - user.name = result[4] if len(result) > 4 and result[4] else f"User {user_id_int}" - user.role = result[5] if len(result) > 5 and result[5] else "user" - user.active = result[6] if len(result) > 6 and result[6] is not None else True + # Sichere Feld-Zuordnung mit Fallbacks + user.id = int(result[0]) if result[0] is not None else user_id_int + user.email = str(result[1]) if result[1] else f"user_{user_id_int}@system.local" + user.username = str(result[2]) if result[2] else f"user_{user_id_int}" + user.password_hash = str(result[3]) if result[3] else "" + user.name = str(result[4]) if result[4] else f"User {user_id_int}" + user.role = str(result[5]) if result[5] else "user" + user.active = bool(result[6]) if result[6] is not None else True - # Erweiterte Felder (optional) - user.created_at = result[7] if len(result) > 7 and result[7] else datetime.now() - user.last_login = result[8] if len(result) > 8 else None - user.updated_at = result[9] if len(result) > 9 and result[9] else datetime.now() - user.settings = result[10] if len(result) > 10 else None - user.department = result[11] if len(result) > 11 else None - user.position = result[12] if len(result) > 12 else None - user.phone = result[13] if len(result) > 13 else None - user.bio = result[14] if len(result) > 14 else None - user.last_activity = result[15] if len(result) > 15 else datetime.now() + # Datetime-Felder mit robuster Behandlung + try: + user.created_at = result[7] if result[7] else datetime.now() + user.last_login = result[8] if result[8] else None + user.updated_at = result[9] if result[9] else datetime.now() + user.last_activity = result[15] if len(result) > 15 and result[15] else datetime.now() + except (IndexError, TypeError, ValueError): + user.created_at = datetime.now() + user.last_login = None + user.updated_at = datetime.now() + user.last_activity = datetime.now() - app_logger.info(f"User {user_id_int} erfolgreich über manuelle Abfrage geladen") + # Optional-Felder + try: + user.settings = result[10] if len(result) > 10 else None + user.department = result[11] if len(result) > 11 else None + user.position = result[12] if len(result) > 12 else None + user.phone = result[13] if len(result) > 13 else None + user.bio = result[14] if len(result) > 14 else None + except (IndexError, TypeError): + user.settings = None + user.department = None + user.position = None + user.phone = None + user.bio = None + + app_logger.info(f"User {user_id_int} erfolgreich über Core-Query geladen") db_session.close() return user - except Exception as manual_error: - app_logger.error(f"Auch manuelle User-Abfrage fehlgeschlagen: {str(manual_error)}") + except Exception as core_error: + app_logger.error(f"Auch Core-Query fehlgeschlagen für User-ID {user_id_int}: {str(core_error)}") - # Letzter Fallback: Minimale User-Daten erstellen + # Letzter Fallback: Minimale Existenz-Prüfung und Notfall-User try: - # Prüfen ob User überhaupt existiert - exists_result = db_session.execute( - text("SELECT COUNT(*) FROM users WHERE id = :user_id"), - {"user_id": user_id_int} - ).fetchone() + exists_stmt = text("SELECT COUNT(*) FROM users WHERE id = :user_id") + exists_result = db_session.execute(exists_stmt, {"user_id": user_id_int}).fetchone() if exists_result and exists_result[0] > 0: - # User existiert, aber Schema ist korrupt - Notfall-User erstellen + # User existiert - erstelle Notfall-Objekt user = User() user.id = user_id_int - user.email = f"user_{user_id_int}@system.local" - user.username = f"user_{user_id_int}" + user.email = f"recovery_user_{user_id_int}@system.local" + user.username = f"recovery_user_{user_id_int}" user.password_hash = "" - user.name = f"User {user_id_int}" + user.name = f"Recovery User {user_id_int}" user.role = "user" user.active = True user.created_at = datetime.now() user.last_login = None user.updated_at = datetime.now() + user.last_activity = datetime.now() - app_logger.warning(f"Notfall-User-Objekt für ID {user_id_int} erstellt") + app_logger.warning(f"Notfall-User-Objekt für ID {user_id_int} erstellt (DB korrupt)") db_session.close() return user + except Exception as fallback_error: app_logger.error(f"Auch Fallback-User-Erstellung fehlgeschlagen: {str(fallback_error)}") @@ -309,6 +340,12 @@ def load_user(user_id): except Exception as e: app_logger.error(f"Kritischer Fehler im User-Loader für ID {user_id}: {str(e)}") + # Session sicher schließen falls noch offen + try: + if 'db_session' in locals(): + db_session.close() + except: + pass return None # Jinja2 Context Processors @@ -1767,8 +1804,8 @@ def maintenance_page(): @login_required @admin_required def locations_page(): - """Multi-Standort-Management-Seite""" - return render_template("locations.html", title="Standorte") + """Multi-Location-System Verwaltungsseite.""" + return render_template("locations.html", title="Standortverwaltung") @app.route("/validation-demo") @login_required @@ -3087,7 +3124,7 @@ def get_current_job(): else: job_data = None - db_session.close() + db_session.close() return jsonify(job_data) except Exception as e: db_session.close() @@ -3123,6 +3160,292 @@ def delete_job(job_id): jobs_logger.error(f"Fehler beim Löschen des Jobs {job_id}: {str(e)}") return jsonify({"error": "Interner Serverfehler"}), 500 +@app.route("/api/jobs", methods=["GET"]) +@login_required +def get_jobs(): + """Gibt alle Jobs zurück. Admins sehen alle Jobs, normale Benutzer nur ihre eigenen.""" + db_session = get_db_session() + + try: + from sqlalchemy.orm import joinedload + + # Paginierung unterstützen + page = request.args.get('page', 1, type=int) + per_page = request.args.get('per_page', 50, type=int) + status_filter = request.args.get('status') + + # Query aufbauen + query = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer)) + + # Admin sieht alle Jobs, User nur eigene + if not current_user.is_admin: + query = query.filter(Job.user_id == int(current_user.id)) + + # Status-Filter anwenden + if status_filter: + query = query.filter(Job.status == status_filter) + + # Sortierung: neueste zuerst + query = query.order_by(Job.created_at.desc()) + + # Paginierung anwenden + offset = (page - 1) * per_page + jobs = query.offset(offset).limit(per_page).all() + + # Gesamtanzahl für Paginierung + total_count = query.count() + + # Convert jobs to dictionaries before closing the session + job_dicts = [job.to_dict() for job in jobs] + + db_session.close() + + jobs_logger.info(f"Jobs abgerufen: {len(job_dicts)} von {total_count} (Seite {page})") + + return jsonify({ + "jobs": job_dicts, + "pagination": { + "page": page, + "per_page": per_page, + "total": total_count, + "pages": (total_count + per_page - 1) // per_page + } + }) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen von Jobs: {str(e)}") + db_session.close() + return jsonify({"error": "Interner Serverfehler"}), 500 + +@app.route("/api/jobs/", methods=["GET"]) +@login_required +@job_owner_required +def get_job_detail(job_id): + """Gibt einen einzelnen Job zurück.""" + db_session = get_db_session() + + try: + from sqlalchemy.orm import joinedload + # Eagerly load the user and printer relationships + job = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer)).filter(Job.id == job_id).first() + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Convert to dict before closing session + job_dict = job.to_dict() + db_session.close() + + return jsonify(job_dict) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen des Jobs {job_id}: {str(e)}") + db_session.close() + return jsonify({"error": "Interner Serverfehler"}), 500 + +@app.route('/api/jobs', methods=['POST']) +@login_required +@measure_execution_time(logger=jobs_logger, task_name="API-Job-Erstellung") +def create_job(): + """ + Erstellt einen neuen Job. + + Body: { + "name": str (optional), + "description": str (optional), + "printer_id": int, + "start_iso": str, + "duration_minutes": int, + "file_path": str (optional) + } + """ + try: + data = request.json + + # Pflichtfelder prüfen + required_fields = ["printer_id", "start_iso", "duration_minutes"] + for field in required_fields: + if field not in data: + return jsonify({"error": f"Feld '{field}' fehlt"}), 400 + + # Daten extrahieren und validieren + printer_id = int(data["printer_id"]) + start_iso = data["start_iso"] + duration_minutes = int(data["duration_minutes"]) + + # Optional: Jobtitel, Beschreibung und Dateipfad + name = data.get("name", f"Druckjob vom {datetime.now().strftime('%d.%m.%Y %H:%M')}") + description = data.get("description", "") + file_path = data.get("file_path") + + # Start-Zeit parsen + try: + start_at = datetime.fromisoformat(start_iso.replace('Z', '+00:00')) + except ValueError: + return jsonify({"error": "Ungültiges Startdatum"}), 400 + + # Dauer validieren + if duration_minutes <= 0: + return jsonify({"error": "Dauer muss größer als 0 sein"}), 400 + + # End-Zeit berechnen + end_at = start_at + timedelta(minutes=duration_minutes) + + db_session = get_db_session() + + # Prüfen, ob der Drucker existiert + printer = db_session.query(Printer).get(printer_id) + if not printer: + db_session.close() + return jsonify({"error": "Drucker nicht gefunden"}), 404 + + # Prüfen, ob der Drucker online ist + printer_status, printer_active = check_printer_status(printer.plug_ip if printer.plug_ip else "") + + # Status basierend auf Drucker-Verfügbarkeit setzen + if printer_status == "online" and printer_active: + job_status = "scheduled" + else: + job_status = "waiting_for_printer" + + # Neuen Job erstellen + new_job = Job( + name=name, + description=description, + printer_id=printer_id, + user_id=current_user.id, + owner_id=current_user.id, + start_at=start_at, + end_at=end_at, + status=job_status, + file_path=file_path, + duration_minutes=duration_minutes + ) + + db_session.add(new_job) + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = new_job.to_dict() + db_session.close() + + jobs_logger.info(f"Neuer Job {new_job.id} erstellt für Drucker {printer_id}, Start: {start_at}, Dauer: {duration_minutes} Minuten") + return jsonify({"job": job_dict}), 201 + + except Exception as e: + jobs_logger.error(f"Fehler beim Erstellen eines Jobs: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@app.route('/api/jobs/', methods=['PUT']) +@login_required +@job_owner_required +def update_job(job_id): + """ + Aktualisiert einen existierenden Job. + """ + try: + data = request.json + + db_session = get_db_session() + job = db_session.query(Job).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job bearbeitet werden kann + if job.status in ["finished", "aborted"]: + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht bearbeitet werden"}), 400 + + # Felder aktualisieren, falls vorhanden + if "name" in data: + job.name = data["name"] + + if "description" in data: + job.description = data["description"] + + if "notes" in data: + job.notes = data["notes"] + + if "start_iso" in data: + try: + new_start = datetime.fromisoformat(data["start_iso"].replace('Z', '+00:00')) + job.start_at = new_start + + # End-Zeit neu berechnen falls Duration verfügbar + if job.duration_minutes: + job.end_at = new_start + timedelta(minutes=job.duration_minutes) + except ValueError: + db_session.close() + return jsonify({"error": "Ungültiges Startdatum"}), 400 + + if "duration_minutes" in data: + duration = int(data["duration_minutes"]) + if duration <= 0: + db_session.close() + return jsonify({"error": "Dauer muss größer als 0 sein"}), 400 + + job.duration_minutes = duration + # End-Zeit neu berechnen + if job.start_at: + job.end_at = job.start_at + timedelta(minutes=duration) + + # Aktualisierungszeitpunkt setzen + job.updated_at = datetime.now() + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} aktualisiert") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Aktualisieren von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@app.route('/api/jobs/active', methods=['GET']) +@login_required +def get_active_jobs(): + """Gibt alle aktiven Jobs zurück.""" + try: + db_session = get_db_session() + from sqlalchemy.orm import joinedload + + query = db_session.query(Job).options( + joinedload(Job.user), + joinedload(Job.printer) + ).filter( + Job.status.in_(["scheduled", "running"]) + ) + + # Normale Benutzer sehen nur ihre eigenen aktiven Jobs + if not current_user.is_admin: + query = query.filter(Job.user_id == current_user.id) + + active_jobs = query.all() + + result = [] + for job in active_jobs: + job_dict = job.to_dict() + # Aktuelle Restzeit berechnen + if job.status == "running" and job.end_at: + remaining_time = job.end_at - datetime.now() + if remaining_time.total_seconds() > 0: + job_dict["remaining_minutes"] = int(remaining_time.total_seconds() / 60) + else: + job_dict["remaining_minutes"] = 0 + + result.append(job_dict) + + db_session.close() + return jsonify({"jobs": result}) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen aktiver Jobs: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + # ===== DRUCKER-ROUTEN ===== @app.route("/api/printers", methods=["GET"]) @@ -3242,7 +3565,7 @@ def check_session_activity(): # JSON-Response für AJAX-Requests if request.headers.get('X-Requested-With') == 'XMLHttpRequest' or request.is_json: - return jsonify({ + return jsonify({ "error": "Session abgelaufen", "reason": "auto_logout_inactivity", "message": f"Sie wurden nach {max_inactive_minutes} Minuten Inaktivität automatisch abgemeldet", @@ -3762,7 +4085,7 @@ def reject_guest_request(request_id): 'success': True, 'message': 'Gastauftrag erfolgreich abgelehnt' }) - + except Exception as e: app_logger.error(f"Fehler beim Ablehnen des Gastauftrags {request_id}: {str(e)}") return jsonify({ @@ -3884,7 +4207,7 @@ def get_guest_request_detail(request_id): 'status': assigned_printer.status } - db_session.close() + db_session.close() return jsonify({ 'success': True, @@ -4054,7 +4377,7 @@ def export_guest_requests(): req.otp_code or '' ]) - db_session.close() + db_session.close() # Response erstellen output.seek(0) @@ -4099,7 +4422,7 @@ def auto_optimize_jobs(): ).all() if not pending_jobs: - db_session.close() + db_session.close() return jsonify({ 'success': True, 'message': 'Keine Jobs zur Optimierung verfügbar', @@ -4152,7 +4475,7 @@ def auto_optimize_jobs(): 'algorithm': algorithm, 'message': f'Optimierung erfolgreich: {optimized_count} Jobs wurden optimiert' }) - + except Exception as e: app_logger.error(f"Fehler bei der Auto-Optimierung: {str(e)}") return jsonify({ @@ -5358,7 +5681,7 @@ def api_logs(): 'end_date': end_date } }) - + except Exception as e: app_logger.error(f"Fehler beim Abrufen der Log-Daten: {str(e)}") return jsonify({ @@ -5509,7 +5832,7 @@ def api_admin_database_status(): 'connection_pool': pool_status, 'timestamp': datetime.now().isoformat() }) - + except Exception as e: app_logger.error(f"Fehler beim Abrufen des Datenbank-Status: {str(e)}") return jsonify({ @@ -5532,95 +5855,142 @@ def api_admin_system_status(): import platform import subprocess - # System-Informationen + # System-Informationen mit robuster String-Behandlung system_info = { - 'platform': platform.system(), - 'platform_release': platform.release(), - 'platform_version': platform.version(), - 'architecture': platform.machine(), - 'processor': platform.processor(), - 'python_version': platform.python_version(), - 'hostname': platform.node() + 'platform': str(platform.system() or 'Unknown'), + 'platform_release': str(platform.release() or 'Unknown'), + 'platform_version': str(platform.version() or 'Unknown'), + 'architecture': str(platform.machine() or 'Unknown'), + 'processor': str(platform.processor() or 'Unknown'), + 'python_version': str(platform.python_version() or 'Unknown'), + 'hostname': str(platform.node() or 'Unknown') } - # CPU-Informationen - cpu_info = { - 'physical_cores': psutil.cpu_count(logical=False), - 'total_cores': psutil.cpu_count(logical=True), - 'max_frequency': psutil.cpu_freq().max if psutil.cpu_freq() else None, - 'current_frequency': psutil.cpu_freq().current if psutil.cpu_freq() else None, - 'cpu_usage_percent': psutil.cpu_percent(interval=1), - 'load_average': psutil.getloadavg() if hasattr(psutil, 'getloadavg') else None - } + # CPU-Informationen mit Fehlerbehandlung + try: + cpu_freq = psutil.cpu_freq() + cpu_info = { + 'physical_cores': psutil.cpu_count(logical=False) or 0, + 'total_cores': psutil.cpu_count(logical=True) or 0, + 'max_frequency': float(cpu_freq.max) if cpu_freq and cpu_freq.max else 0.0, + 'current_frequency': float(cpu_freq.current) if cpu_freq and cpu_freq.current else 0.0, + 'cpu_usage_percent': float(psutil.cpu_percent(interval=1)), + 'load_average': list(psutil.getloadavg()) if hasattr(psutil, 'getloadavg') else [0.0, 0.0, 0.0] + } + except Exception as cpu_error: + app_logger.warning(f"CPU-Informationen nicht verfügbar: {str(cpu_error)}") + cpu_info = { + 'physical_cores': 0, + 'total_cores': 0, + 'max_frequency': 0.0, + 'current_frequency': 0.0, + 'cpu_usage_percent': 0.0, + 'load_average': [0.0, 0.0, 0.0] + } - # Memory-Informationen - memory = psutil.virtual_memory() - memory_info = { - 'total_gb': round(memory.total / (1024**3), 2), - 'available_gb': round(memory.available / (1024**3), 2), - 'used_gb': round(memory.used / (1024**3), 2), - 'percentage': memory.percent, - 'free_gb': round(memory.free / (1024**3), 2) - } + # Memory-Informationen mit robuster Fehlerbehandlung + try: + memory = psutil.virtual_memory() + memory_info = { + 'total_gb': round(float(memory.total) / (1024**3), 2), + 'available_gb': round(float(memory.available) / (1024**3), 2), + 'used_gb': round(float(memory.used) / (1024**3), 2), + 'percentage': float(memory.percent), + 'free_gb': round(float(memory.free) / (1024**3), 2) + } + except Exception as memory_error: + app_logger.warning(f"Memory-Informationen nicht verfügbar: {str(memory_error)}") + memory_info = { + 'total_gb': 0.0, + 'available_gb': 0.0, + 'used_gb': 0.0, + 'percentage': 0.0, + 'free_gb': 0.0 + } - # Disk-Informationen - disk = psutil.disk_usage('/' if os.name != 'nt' else 'C:\\') - disk_info = { - 'total_gb': round(disk.total / (1024**3), 2), - 'used_gb': round(disk.used / (1024**3), 2), - 'free_gb': round(disk.free / (1024**3), 2), - 'percentage': round((disk.used / disk.total) * 100, 1) - } + # Disk-Informationen mit Pfad-Behandlung + try: + disk_path = '/' if os.name != 'nt' else 'C:\\' + disk = psutil.disk_usage(disk_path) + disk_info = { + 'total_gb': round(float(disk.total) / (1024**3), 2), + 'used_gb': round(float(disk.used) / (1024**3), 2), + 'free_gb': round(float(disk.free) / (1024**3), 2), + 'percentage': round((float(disk.used) / float(disk.total)) * 100, 1) + } + except Exception as disk_error: + app_logger.warning(f"Disk-Informationen nicht verfügbar: {str(disk_error)}") + disk_info = { + 'total_gb': 0.0, + 'used_gb': 0.0, + 'free_gb': 0.0, + 'percentage': 0.0 + } # Netzwerk-Informationen try: network = psutil.net_io_counters() network_info = { - 'bytes_sent_mb': round(network.bytes_sent / (1024**2), 2), - 'bytes_recv_mb': round(network.bytes_recv / (1024**2), 2), - 'packets_sent': network.packets_sent, - 'packets_recv': network.packets_recv + 'bytes_sent_mb': round(float(network.bytes_sent) / (1024**2), 2), + 'bytes_recv_mb': round(float(network.bytes_recv) / (1024**2), 2), + 'packets_sent': int(network.packets_sent), + 'packets_recv': int(network.packets_recv) } - except Exception: + except Exception as network_error: + app_logger.warning(f"Netzwerk-Informationen nicht verfügbar: {str(network_error)}") network_info = {'error': 'Netzwerk-Informationen nicht verfügbar'} # Prozess-Informationen try: current_process = psutil.Process() process_info = { - 'pid': current_process.pid, - 'memory_mb': round(current_process.memory_info().rss / (1024**2), 2), - 'cpu_percent': current_process.cpu_percent(), - 'num_threads': current_process.num_threads(), - 'create_time': datetime.fromtimestamp(current_process.create_time()).isoformat(), - 'status': current_process.status() + 'pid': int(current_process.pid), + 'memory_mb': round(float(current_process.memory_info().rss) / (1024**2), 2), + 'cpu_percent': float(current_process.cpu_percent()), + 'num_threads': int(current_process.num_threads()), + 'create_time': datetime.fromtimestamp(float(current_process.create_time())).isoformat(), + 'status': str(current_process.status()) } - except Exception as e: - process_info = {'error': f'Prozess-Informationen nicht verfügbar: {str(e)}'} + except Exception as process_error: + app_logger.warning(f"Prozess-Informationen nicht verfügbar: {str(process_error)}") + process_info = {'error': 'Prozess-Informationen nicht verfügbar'} - # Uptime + # Uptime mit robuster Formatierung try: boot_time = psutil.boot_time() - uptime_seconds = int(time.time() - boot_time) + current_time = time.time() + uptime_seconds = int(current_time - boot_time) - # Robuste uptime-Formatierung - try: + # Sichere uptime-Formatierung ohne problematische Format-Strings + if uptime_seconds > 0: days = uptime_seconds // 86400 - hours = (uptime_seconds % 86400) // 3600 - minutes = ((uptime_seconds % 86400) % 3600) // 60 - uptime_formatted = f"{days}d {hours}h {minutes}m" - except (ValueError, OverflowError, ZeroDivisionError): - uptime_formatted = f"{uptime_seconds}s" + remaining_seconds = uptime_seconds % 86400 + hours = remaining_seconds // 3600 + minutes = (remaining_seconds % 3600) // 60 + + # String-Aufbau ohne Format-Operationen + uptime_parts = [] + if days > 0: + uptime_parts.append(str(days) + "d") + if hours > 0: + uptime_parts.append(str(hours) + "h") + if minutes > 0: + uptime_parts.append(str(minutes) + "m") + + uptime_formatted = " ".join(uptime_parts) if uptime_parts else "0m" + else: + uptime_formatted = "0m" uptime_info = { - 'boot_time': datetime.fromtimestamp(boot_time).isoformat(), + 'boot_time': datetime.fromtimestamp(float(boot_time)).isoformat(), 'uptime_seconds': uptime_seconds, 'uptime_formatted': uptime_formatted } - except Exception: + except Exception as uptime_error: + app_logger.warning(f"Uptime-Informationen nicht verfügbar: {str(uptime_error)}") uptime_info = {'error': 'Uptime-Informationen nicht verfügbar'} - # Service-Status (Windows/Linux kompatibel) + # Service-Status (Windows/Linux kompatibel) mit robuster Behandlung services_status = {} try: if os.name == 'nt': # Windows @@ -5634,7 +6004,7 @@ def api_admin_system_status(): text=True, timeout=5 ) - services_status[service] = 'running' if 'RUNNING' in result.stdout else 'stopped' + services_status[service] = 'running' if 'RUNNING' in str(result.stdout) else 'stopped' except Exception: services_status[service] = 'unknown' else: # Linux @@ -5648,30 +6018,34 @@ def api_admin_system_status(): text=True, timeout=5 ) - services_status[service] = result.stdout.strip() + services_status[service] = str(result.stdout).strip() except Exception: services_status[service] = 'unknown' - except Exception as e: - services_status = {'error': f'Service-Status nicht verfügbar: {str(e)}'} + except Exception as services_error: + app_logger.warning(f"Service-Status nicht verfügbar: {str(services_error)}") + services_status = {'error': 'Service-Status nicht verfügbar'} # System-Gesundheit bewerten health_status = 'healthy' issues = [] - if cpu_info['cpu_usage_percent'] > 80: - health_status = 'warning' - issues.append(f'Hohe CPU-Auslastung: {cpu_info["cpu_usage_percent"]}%') - - if memory_info['percentage'] > 85: - health_status = 'warning' - issues.append(f'Hohe Memory-Auslastung: {memory_info["percentage"]}%') - - if disk_info['percentage'] > 90: - health_status = 'critical' - issues.append(f'Kritisch wenig Speicherplatz: {disk_info["percentage"]}%') - - if process_info.get('memory_mb', 0) > 500: # 500MB+ für Flask-App - issues.append(f'Hoher Memory-Verbrauch der Anwendung: {process_info.get("memory_mb", 0)}MB') + try: + if isinstance(cpu_info.get('cpu_usage_percent'), (int, float)) and cpu_info['cpu_usage_percent'] > 80: + health_status = 'warning' + issues.append('Hohe CPU-Auslastung: ' + str(round(cpu_info['cpu_usage_percent'], 1)) + '%') + + if isinstance(memory_info.get('percentage'), (int, float)) and memory_info['percentage'] > 85: + health_status = 'warning' + issues.append('Hohe Memory-Auslastung: ' + str(round(memory_info['percentage'], 1)) + '%') + + if isinstance(disk_info.get('percentage'), (int, float)) and disk_info['percentage'] > 90: + health_status = 'critical' + issues.append('Kritisch wenig Speicherplatz: ' + str(round(disk_info['percentage'], 1)) + '%') + + if isinstance(process_info.get('memory_mb'), (int, float)) and process_info['memory_mb'] > 500: + issues.append('Hoher Memory-Verbrauch der Anwendung: ' + str(round(process_info['memory_mb'], 1)) + 'MB') + except Exception as health_error: + app_logger.warning(f"System-Gesundheit-Bewertung nicht möglich: {str(health_error)}") return jsonify({ 'success': True, @@ -5692,7 +6066,7 @@ def api_admin_system_status(): app_logger.error(f"Fehler beim Abrufen des System-Status: {str(e)}") return jsonify({ 'success': False, - 'error': f'Fehler beim Abrufen des System-Status: {str(e)}', + 'error': 'Fehler beim Abrufen des System-Status: ' + str(e), 'health_status': 'error' }), 500 @@ -5822,7 +6196,7 @@ def api_stats(): response_data['admin_stats'] = admin_stats return jsonify(response_data) - + except Exception as e: app_logger.error(f"Fehler beim Abrufen der Statistiken: {str(e)}") return jsonify({ @@ -5849,12 +6223,8 @@ def api_admin_stats_live(): 'timestamp': datetime.now().isoformat(), 'users': { 'total': db_session.query(User).count(), - 'active_today': db_session.query(User).filter( - User.last_login >= datetime.now() - timedelta(days=1) - ).count() if hasattr(User, 'last_login') else 0, - 'new_this_week': db_session.query(User).filter( - User.created_at >= datetime.now() - timedelta(days=7) - ).count() if hasattr(User, 'created_at') else 0 + 'active_today': 0, + 'new_this_week': 0 }, 'printers': { 'total': db_session.query(Printer).count(), @@ -5866,54 +6236,110 @@ def api_admin_stats_live(): 'total': db_session.query(Job).count(), 'running': db_session.query(Job).filter(Job.status == 'running').count(), 'queued': db_session.query(Job).filter(Job.status == 'queued').count(), - 'completed_today': db_session.query(Job).filter( - Job.status == 'completed', - Job.updated_at >= datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - ).count() if hasattr(Job, 'updated_at') else 0, - 'failed_today': db_session.query(Job).filter( - Job.status == 'failed', - Job.updated_at >= datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - ).count() if hasattr(Job, 'updated_at') else 0 + 'completed_today': 0, + 'failed_today': 0 } } - # System-Performance-Metriken - import psutil - import os - - # CPU und Memory - stats['system'] = { - 'cpu_percent': psutil.cpu_percent(interval=1), - 'memory_percent': psutil.virtual_memory().percent, - 'disk_percent': psutil.disk_usage('/').percent if os.name != 'nt' else psutil.disk_usage('C:\\').percent, - 'uptime_seconds': int((datetime.now() - datetime.fromtimestamp(psutil.boot_time())).total_seconds()) - } - - # Erfolgsrate berechnen (letzte 24 Stunden) + # Benutzer-Aktivität mit robuster Datums-Behandlung try: - completed_jobs = db_session.query(Job).filter( - Job.status == 'completed', - Job.updated_at >= datetime.now() - timedelta(days=1) - ).count() if hasattr(Job, 'updated_at') else 0 + if hasattr(User, 'last_login'): + yesterday = datetime.now() - timedelta(days=1) + stats['users']['active_today'] = db_session.query(User).filter( + User.last_login >= yesterday + ).count() - failed_jobs = db_session.query(Job).filter( - Job.status == 'failed', - Job.updated_at >= datetime.now() - timedelta(days=1) - ).count() if hasattr(Job, 'updated_at') else 0 + if hasattr(User, 'created_at'): + week_ago = datetime.now() - timedelta(days=7) + stats['users']['new_this_week'] = db_session.query(User).filter( + User.created_at >= week_ago + ).count() + except Exception as user_stats_error: + app_logger.warning(f"Benutzer-Statistiken nicht verfügbar: {str(user_stats_error)}") + + # Job-Aktivität mit robuster Datums-Behandlung + try: + if hasattr(Job, 'updated_at'): + today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) + stats['jobs']['completed_today'] = db_session.query(Job).filter( + Job.status == 'completed', + Job.updated_at >= today_start + ).count() + + stats['jobs']['failed_today'] = db_session.query(Job).filter( + Job.status == 'failed', + Job.updated_at >= today_start + ).count() + except Exception as job_stats_error: + app_logger.warning(f"Job-Statistiken nicht verfügbar: {str(job_stats_error)}") + + # System-Performance-Metriken mit robuster psutil-Behandlung + try: + import psutil + import os - total_finished = completed_jobs + failed_jobs - success_rate = (completed_jobs / total_finished * 100) if total_finished > 0 else 100 + # CPU und Memory mit Fehlerbehandlung + cpu_percent = psutil.cpu_percent(interval=1) + memory_percent = psutil.virtual_memory().percent - stats['performance'] = { - 'success_rate': round(success_rate, 1), - 'completed_24h': completed_jobs, - 'failed_24h': failed_jobs, - 'total_finished_24h': total_finished + # Disk-Pfad sicher bestimmen + disk_path = '/' if os.name != 'nt' else 'C:\\' + disk_percent = psutil.disk_usage(disk_path).percent + + # Uptime sicher berechnen + boot_time = psutil.boot_time() + current_time = time.time() + uptime_seconds = int(current_time - boot_time) + + stats['system'] = { + 'cpu_percent': float(cpu_percent), + 'memory_percent': float(memory_percent), + 'disk_percent': float(disk_percent), + 'uptime_seconds': uptime_seconds } + except Exception as system_stats_error: + app_logger.warning(f"System-Performance-Metriken nicht verfügbar: {str(system_stats_error)}") + stats['system'] = { + 'cpu_percent': 0.0, + 'memory_percent': 0.0, + 'disk_percent': 0.0, + 'uptime_seconds': 0 + } + + # Erfolgsrate berechnen (letzte 24 Stunden) mit robuster Behandlung + try: + if hasattr(Job, 'updated_at'): + day_ago = datetime.now() - timedelta(days=1) + completed_jobs = db_session.query(Job).filter( + Job.status == 'completed', + Job.updated_at >= day_ago + ).count() + + failed_jobs = db_session.query(Job).filter( + Job.status == 'failed', + Job.updated_at >= day_ago + ).count() + + total_finished = completed_jobs + failed_jobs + success_rate = (float(completed_jobs) / float(total_finished) * 100) if total_finished > 0 else 100.0 + + stats['performance'] = { + 'success_rate': round(success_rate, 1), + 'completed_24h': completed_jobs, + 'failed_24h': failed_jobs, + 'total_finished_24h': total_finished + } + else: + stats['performance'] = { + 'success_rate': 100.0, + 'completed_24h': 0, + 'failed_24h': 0, + 'total_finished_24h': 0 + } except Exception as perf_error: app_logger.warning(f"Fehler bei Performance-Berechnung: {str(perf_error)}") stats['performance'] = { - 'success_rate': 0, + 'success_rate': 0.0, 'completed_24h': 0, 'failed_24h': 0, 'total_finished_24h': 0 @@ -5931,19 +6357,24 @@ def api_admin_stats_live(): 'active_workers': 0 } - # Letzte Aktivitäten (Top 5) + # Letzte Aktivitäten (Top 5) mit robuster Job-Behandlung try: recent_jobs = db_session.query(Job).order_by(Job.id.desc()).limit(5).all() - stats['recent_activity'] = [ - { - 'id': job.id, - 'filename': getattr(job, 'filename', 'Unbekannt'), - 'status': job.status, - 'user': job.user.username if job.user else 'Unbekannt', - 'created_at': job.created_at.isoformat() if hasattr(job, 'created_at') and job.created_at else None - } - for job in recent_jobs - ] + stats['recent_activity'] = [] + + for job in recent_jobs: + try: + activity_item = { + 'id': int(job.id), + 'filename': str(getattr(job, 'filename', 'Unbekannt')), + 'status': str(job.status), + 'user': str(job.user.username) if job.user else 'Unbekannt', + 'created_at': job.created_at.isoformat() if hasattr(job, 'created_at') and job.created_at else None + } + stats['recent_activity'].append(activity_item) + except Exception as activity_item_error: + app_logger.warning(f"Fehler bei Activity-Item: {str(activity_item_error)}") + except Exception as activity_error: app_logger.warning(f"Fehler bei Recent Activity: {str(activity_error)}") stats['recent_activity'] = [] @@ -5954,14 +6385,100 @@ def api_admin_stats_live(): 'success': True, 'stats': stats }) - + except Exception as e: app_logger.error(f"Fehler beim Abrufen der Live-Statistiken: {str(e)}") return jsonify({ - 'error': f'Fehler beim Abrufen der Live-Statistiken: {str(e)}' + 'error': 'Fehler beim Abrufen der Live-Statistiken: ' + str(e) }), 500 +@app.route('/api/dashboard/refresh', methods=['POST']) +@login_required +def refresh_dashboard(): + """ + Aktualisiert Dashboard-Daten und gibt aktuelle Statistiken zurück. + + Dieser Endpunkt wird vom Frontend aufgerufen, um Dashboard-Statistiken + zu aktualisieren ohne die gesamte Seite neu zu laden. + + Returns: + JSON: Erfolgs-Status und aktuelle Dashboard-Statistiken + """ + try: + app_logger.info(f"Dashboard-Refresh angefordert von User {current_user.id}") + + db_session = get_db_session() + + # Aktuelle Statistiken abrufen + try: + stats = { + 'active_jobs': db_session.query(Job).filter(Job.status == 'running').count(), + 'available_printers': db_session.query(Printer).filter(Printer.active == True).count(), + 'total_jobs': db_session.query(Job).count(), + 'pending_jobs': db_session.query(Job).filter(Job.status == 'queued').count() + } + + # Erfolgsrate berechnen + total_jobs = stats['total_jobs'] + if total_jobs > 0: + completed_jobs = db_session.query(Job).filter(Job.status == 'completed').count() + stats['success_rate'] = round((completed_jobs / total_jobs) * 100, 1) + else: + stats['success_rate'] = 0 + + # Zusätzliche Statistiken für umfassendere Dashboard-Aktualisierung + stats['completed_jobs'] = db_session.query(Job).filter(Job.status == 'completed').count() + stats['failed_jobs'] = db_session.query(Job).filter(Job.status == 'failed').count() + stats['cancelled_jobs'] = db_session.query(Job).filter(Job.status == 'cancelled').count() + stats['total_users'] = db_session.query(User).filter(User.active == True).count() + + # Drucker-Status-Details + stats['online_printers'] = db_session.query(Printer).filter( + Printer.active == True, + Printer.status == 'online' + ).count() + stats['offline_printers'] = db_session.query(Printer).filter( + Printer.active == True, + Printer.status != 'online' + ).count() + + except Exception as stats_error: + app_logger.error(f"Fehler beim Abrufen der Dashboard-Statistiken: {str(stats_error)}") + # Fallback mit Basis-Statistiken + stats = { + 'active_jobs': 0, + 'available_printers': 0, + 'total_jobs': 0, + 'pending_jobs': 0, + 'success_rate': 0, + 'completed_jobs': 0, + 'failed_jobs': 0, + 'cancelled_jobs': 0, + 'total_users': 0, + 'online_printers': 0, + 'offline_printers': 0 + } + + db_session.close() + + app_logger.info(f"Dashboard-Refresh erfolgreich: {stats}") + + return jsonify({ + 'success': True, + 'stats': stats, + 'timestamp': datetime.now().isoformat(), + 'message': 'Dashboard-Daten erfolgreich aktualisiert' + }) + + except Exception as e: + app_logger.error(f"Fehler beim Dashboard-Refresh: {str(e)}", exc_info=True) + return jsonify({ + 'success': False, + 'error': 'Fehler beim Aktualisieren der Dashboard-Daten', + 'details': str(e) if app.debug else None + }), 500 + # ===== STARTUP UND MAIN ===== if __name__ == "__main__": import sys diff --git a/backend/blueprints/jobs.py b/backend/blueprints/jobs.py new file mode 100644 index 00000000..1fc07475 --- /dev/null +++ b/backend/blueprints/jobs.py @@ -0,0 +1,534 @@ +""" +Jobs Blueprint - API-Endpunkte für Job-Verwaltung +Alle Job-bezogenen API-Endpunkte sind hier zentralisiert. +""" + +from flask import Blueprint, request, jsonify, current_app +from flask_login import login_required, current_user +from datetime import datetime, timedelta +from functools import wraps +from sqlalchemy.orm import joinedload + +from models import get_db_session, Job, Printer +from utils.logging_config import get_logger + +# Blueprint initialisieren +jobs_blueprint = Blueprint('jobs', __name__, url_prefix='/api/jobs') + +# Logger für Jobs +jobs_logger = get_logger("jobs") + +def job_owner_required(f): + """Decorator um zu prüfen, ob der aktuelle Benutzer Besitzer eines Jobs ist oder Admin""" + @wraps(f) + def decorated_function(job_id, *args, **kwargs): + db_session = get_db_session() + job = db_session.query(Job).filter(Job.id == job_id).first() + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + is_owner = job.user_id == int(current_user.id) or job.owner_id == int(current_user.id) + is_admin = current_user.is_admin + + if not (is_owner or is_admin): + db_session.close() + return jsonify({"error": "Keine Berechtigung"}), 403 + + db_session.close() + return f(job_id, *args, **kwargs) + return decorated_function + +def check_printer_status(ip_address: str, timeout: int = 7): + """Mock-Implementierung für Drucker-Status-Check""" + # TODO: Implementiere echten Status-Check + if ip_address: + return "online", True + return "offline", False + +@jobs_blueprint.route('', methods=['GET']) +@login_required +def get_jobs(): + """Gibt alle Jobs zurück. Admins sehen alle Jobs, normale Benutzer nur ihre eigenen.""" + db_session = get_db_session() + + try: + # Paginierung unterstützen + page = request.args.get('page', 1, type=int) + per_page = request.args.get('per_page', 50, type=int) + status_filter = request.args.get('status') + + # Query aufbauen + query = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer)) + + # Admin sieht alle Jobs, User nur eigene + if not current_user.is_admin: + query = query.filter(Job.user_id == int(current_user.id)) + + # Status-Filter anwenden + if status_filter: + query = query.filter(Job.status == status_filter) + + # Sortierung: neueste zuerst + query = query.order_by(Job.created_at.desc()) + + # Paginierung anwenden + offset = (page - 1) * per_page + jobs = query.offset(offset).limit(per_page).all() + + # Gesamtanzahl für Paginierung + total_count = query.count() + + # Convert jobs to dictionaries before closing the session + job_dicts = [job.to_dict() for job in jobs] + + db_session.close() + + jobs_logger.info(f"Jobs abgerufen: {len(job_dicts)} von {total_count} (Seite {page})") + + return jsonify({ + "jobs": job_dicts, + "pagination": { + "page": page, + "per_page": per_page, + "total": total_count, + "pages": (total_count + per_page - 1) // per_page + } + }) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen von Jobs: {str(e)}") + db_session.close() + return jsonify({"error": "Interner Serverfehler"}), 500 + +@jobs_blueprint.route('/', methods=['GET']) +@login_required +@job_owner_required +def get_job(job_id): + """Gibt einen einzelnen Job zurück.""" + db_session = get_db_session() + + try: + # Eagerly load the user and printer relationships + job = db_session.query(Job).options(joinedload(Job.user), joinedload(Job.printer)).filter(Job.id == job_id).first() + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Convert to dict before closing session + job_dict = job.to_dict() + db_session.close() + + return jsonify(job_dict) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen des Jobs {job_id}: {str(e)}") + db_session.close() + return jsonify({"error": "Interner Serverfehler"}), 500 + +@jobs_blueprint.route('', methods=['POST']) +@login_required +def create_job(): + """ + Erstellt einen neuen Job. + + Body: { + "name": str (optional), + "description": str (optional), + "printer_id": int, + "start_iso": str, + "duration_minutes": int, + "file_path": str (optional) + } + """ + try: + data = request.json + + # Pflichtfelder prüfen + required_fields = ["printer_id", "start_iso", "duration_minutes"] + for field in required_fields: + if field not in data: + return jsonify({"error": f"Feld '{field}' fehlt"}), 400 + + # Daten extrahieren und validieren + printer_id = int(data["printer_id"]) + start_iso = data["start_iso"] + duration_minutes = int(data["duration_minutes"]) + + # Optional: Jobtitel, Beschreibung und Dateipfad + name = data.get("name", f"Druckjob vom {datetime.now().strftime('%d.%m.%Y %H:%M')}") + description = data.get("description", "") + file_path = data.get("file_path") + + # Start-Zeit parsen + try: + start_at = datetime.fromisoformat(start_iso.replace('Z', '+00:00')) + except ValueError: + return jsonify({"error": "Ungültiges Startdatum"}), 400 + + # Dauer validieren + if duration_minutes <= 0: + return jsonify({"error": "Dauer muss größer als 0 sein"}), 400 + + # End-Zeit berechnen + end_at = start_at + timedelta(minutes=duration_minutes) + + db_session = get_db_session() + + # Prüfen, ob der Drucker existiert + printer = db_session.query(Printer).get(printer_id) + if not printer: + db_session.close() + return jsonify({"error": "Drucker nicht gefunden"}), 404 + + # Prüfen, ob der Drucker online ist + printer_status, printer_active = check_printer_status(printer.plug_ip if printer.plug_ip else "") + + # Status basierend auf Drucker-Verfügbarkeit setzen + if printer_status == "online" and printer_active: + job_status = "scheduled" + else: + job_status = "waiting_for_printer" + + # Neuen Job erstellen + new_job = Job( + name=name, + description=description, + printer_id=printer_id, + user_id=current_user.id, + owner_id=current_user.id, + start_at=start_at, + end_at=end_at, + status=job_status, + file_path=file_path, + duration_minutes=duration_minutes + ) + + db_session.add(new_job) + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = new_job.to_dict() + db_session.close() + + jobs_logger.info(f"Neuer Job {new_job.id} erstellt für Drucker {printer_id}, Start: {start_at}, Dauer: {duration_minutes} Minuten") + return jsonify({"job": job_dict}), 201 + + except Exception as e: + jobs_logger.error(f"Fehler beim Erstellen eines Jobs: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('/', methods=['PUT']) +@login_required +@job_owner_required +def update_job(job_id): + """Aktualisiert einen existierenden Job.""" + try: + data = request.json + + db_session = get_db_session() + job = db_session.query(Job).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job bearbeitet werden kann + if job.status in ["finished", "aborted"]: + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht bearbeitet werden"}), 400 + + # Felder aktualisieren, falls vorhanden + if "name" in data: + job.name = data["name"] + + if "description" in data: + job.description = data["description"] + + if "notes" in data: + job.notes = data["notes"] + + if "start_iso" in data: + try: + new_start = datetime.fromisoformat(data["start_iso"].replace('Z', '+00:00')) + job.start_at = new_start + + # End-Zeit neu berechnen falls Duration verfügbar + if job.duration_minutes: + job.end_at = new_start + timedelta(minutes=job.duration_minutes) + except ValueError: + db_session.close() + return jsonify({"error": "Ungültiges Startdatum"}), 400 + + if "duration_minutes" in data: + duration = int(data["duration_minutes"]) + if duration <= 0: + db_session.close() + return jsonify({"error": "Dauer muss größer als 0 sein"}), 400 + + job.duration_minutes = duration + # End-Zeit neu berechnen + if job.start_at: + job.end_at = job.start_at + timedelta(minutes=duration) + + # Aktualisierungszeitpunkt setzen + job.updated_at = datetime.now() + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} aktualisiert") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Aktualisieren von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('/', methods=['DELETE']) +@login_required +@job_owner_required +def delete_job(job_id): + """Löscht einen Job.""" + try: + db_session = get_db_session() + job = db_session.query(Job).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job gelöscht werden kann + if job.status == "running": + db_session.close() + return jsonify({"error": "Laufende Jobs können nicht gelöscht werden"}), 400 + + job_name = job.name + db_session.delete(job) + db_session.commit() + db_session.close() + + jobs_logger.info(f"Job '{job_name}' (ID: {job_id}) gelöscht von Benutzer {current_user.id}") + return jsonify({"success": True, "message": "Job erfolgreich gelöscht"}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Löschen des Jobs {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler"}), 500 + +@jobs_blueprint.route('/active', methods=['GET']) +@login_required +def get_active_jobs(): + """Gibt alle aktiven Jobs zurück.""" + try: + db_session = get_db_session() + + query = db_session.query(Job).options( + joinedload(Job.user), + joinedload(Job.printer) + ).filter( + Job.status.in_(["scheduled", "running"]) + ) + + # Normale Benutzer sehen nur ihre eigenen aktiven Jobs + if not current_user.is_admin: + query = query.filter(Job.user_id == current_user.id) + + active_jobs = query.all() + + result = [] + for job in active_jobs: + job_dict = job.to_dict() + # Aktuelle Restzeit berechnen + if job.status == "running" and job.end_at: + remaining_time = job.end_at - datetime.now() + if remaining_time.total_seconds() > 0: + job_dict["remaining_minutes"] = int(remaining_time.total_seconds() / 60) + else: + job_dict["remaining_minutes"] = 0 + + result.append(job_dict) + + db_session.close() + return jsonify({"jobs": result}) + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen aktiver Jobs: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('/current', methods=['GET']) +@login_required +def get_current_job(): + """Gibt den aktuell laufenden Job für den eingeloggten Benutzer zurück.""" + db_session = get_db_session() + + try: + current_job = db_session.query(Job).filter( + Job.user_id == current_user.id, + Job.status == "running" + ).first() + + if current_job: + job_dict = current_job.to_dict() + db_session.close() + return jsonify(job_dict) + else: + db_session.close() + return jsonify({"message": "Kein aktueller Job"}), 404 + except Exception as e: + jobs_logger.error(f"Fehler beim Abrufen des aktuellen Jobs: {str(e)}") + db_session.close() + return jsonify({"error": "Interner Serverfehler"}), 500 + +@jobs_blueprint.route('//start', methods=['POST']) +@login_required +@job_owner_required +def start_job(job_id): + """Startet einen Job manuell.""" + try: + db_session = get_db_session() + job = db_session.query(Job).options(joinedload(Job.printer)).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job gestartet werden kann + if job.status not in ["scheduled", "waiting_for_printer"]: + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht gestartet werden"}), 400 + + # Drucker-Status prüfen + if job.printer.plug_ip: + status, active = check_printer_status(job.printer.plug_ip) + if status != "online" or not active: + db_session.close() + return jsonify({"error": "Drucker ist nicht online"}), 400 + + # Job als laufend markieren + job.status = "running" + job.start_at = datetime.now() + job.end_at = job.start_at + timedelta(minutes=job.duration_minutes) + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} manuell gestartet") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Starten von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('//pause', methods=['POST']) +@login_required +@job_owner_required +def pause_job(job_id): + """Pausiert einen laufenden Job.""" + try: + db_session = get_db_session() + job = db_session.query(Job).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job pausiert werden kann + if job.status != "running": + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht pausiert werden"}), 400 + + # Job pausieren + job.status = "paused" + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} pausiert") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Pausieren von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('//resume', methods=['POST']) +@login_required +@job_owner_required +def resume_job(job_id): + """Setzt einen pausierten Job fort.""" + try: + db_session = get_db_session() + job = db_session.query(Job).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Prüfen, ob der Job fortgesetzt werden kann + if job.status != "paused": + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht fortgesetzt werden"}), 400 + + # Job fortsetzen + job.status = "running" + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} fortgesetzt") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim Fortsetzen von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 + +@jobs_blueprint.route('//finish', methods=['POST']) +@login_required +def finish_job(job_id): + """Beendet einen Job manuell.""" + try: + db_session = get_db_session() + job = db_session.query(Job).options(joinedload(Job.printer)).get(job_id) + + if not job: + db_session.close() + return jsonify({"error": "Job nicht gefunden"}), 404 + + # Berechtigung prüfen + is_owner = job.user_id == int(current_user.id) or job.owner_id == int(current_user.id) + is_admin = current_user.is_admin + + if not (is_owner or is_admin): + db_session.close() + return jsonify({"error": "Keine Berechtigung"}), 403 + + # Prüfen, ob der Job beendet werden kann + if job.status not in ["scheduled", "running", "paused"]: + db_session.close() + return jsonify({"error": f"Job kann im Status '{job.status}' nicht beendet werden"}), 400 + + # Job als beendet markieren + job.status = "finished" + job.actual_end_time = datetime.now() + + db_session.commit() + + # Job-Objekt für die Antwort serialisieren + job_dict = job.to_dict() + db_session.close() + + jobs_logger.info(f"Job {job_id} manuell beendet durch Benutzer {current_user.id}") + return jsonify({"job": job_dict}) + + except Exception as e: + jobs_logger.error(f"Fehler beim manuellen Beenden von Job {job_id}: {str(e)}") + return jsonify({"error": "Interner Serverfehler", "details": str(e)}), 500 \ No newline at end of file diff --git a/backend/database/myp.db b/backend/database/myp.db index 0c8319df..17db3669 100644 Binary files a/backend/database/myp.db and b/backend/database/myp.db differ diff --git a/backend/database/myp.db-wal b/backend/database/myp.db-wal index 22fd7f1f..ad0bf5f2 100644 Binary files a/backend/database/myp.db-wal and b/backend/database/myp.db-wal differ diff --git a/backend/docs/DASHBOARD_REFRESH_IMPLEMENTATION.md b/backend/docs/DASHBOARD_REFRESH_IMPLEMENTATION.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/DASHBOARD_REFRESH_IMPLEMENTATION.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/docs/ERROR_LOG_DASHBOARD_REFRESH.md b/backend/docs/ERROR_LOG_DASHBOARD_REFRESH.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/ERROR_LOG_DASHBOARD_REFRESH.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/docs/FEHLER_BEHOBEN_FORMAT_STRING_UND_SQLITE.md b/backend/docs/FEHLER_BEHOBEN_FORMAT_STRING_UND_SQLITE.md new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/backend/docs/FEHLER_BEHOBEN_FORMAT_STRING_UND_SQLITE.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/logs/app/app.log b/backend/logs/app/app.log index cac7f378..b6148c12 100644 --- a/backend/logs/app/app.log +++ b/backend/logs/app/app.log @@ -78054,3 +78054,740 @@ WHERE users.id = ? 2025-06-01 00:45:17 - myp.database_cleanup - INFO - 🧹 Starte umfassendes Datenbank-Cleanup... 2025-06-01 00:45:17 - myp.database_cleanup - INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... 2025-06-01 00:45:17 - myp.database_cleanup - INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... +2025-06-01 00:56:22 - myp.windows_fixes - INFO - 🔧 Wende Windows-spezifische Fixes an... +2025-06-01 00:56:22 - myp.windows_fixes - INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen) +2025-06-01 00:56:22 - myp.windows_fixes - INFO - ✅ Globaler subprocess-Patch angewendet +2025-06-01 00:56:22 - myp.windows_fixes - INFO - ✅ Alle Windows-Fixes erfolgreich angewendet +2025-06-01 00:56:22 - myp.app - INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\database\myp.db +2025-06-01 00:56:22 - myp.printer_monitor - INFO - 🖨️ Drucker-Monitor initialisiert +2025-06-01 00:56:22 - myp.printer_monitor - INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet +2025-06-01 00:56:22 - myp.database - INFO - Datenbank-Wartungs-Scheduler gestartet +2025-06-01 00:56:22 - myp.analytics - INFO - 📈 Analytics Engine initialisiert +2025-06-01 00:56:23 - myp.dashboard - INFO - Dashboard-Background-Worker gestartet +2025-06-01 00:56:23 - myp.email_notification - INFO - 📧 Offline-E-Mail-Benachrichtigung initialisiert (kein echter E-Mail-Versand) +2025-06-01 00:56:23 - myp.maintenance - INFO - Wartungs-Scheduler gestartet +2025-06-01 00:56:23 - myp.app - INFO - SQLite für Produktionsumgebung konfiguriert (WAL-Modus, Cache, Optimierungen) +2025-06-01 00:56:23 - myp.multi_location - INFO - Standard-Standort erstellt +2025-06-01 00:56:23 - myp.dashboard - INFO - Dashboard-Background-Worker gestartet +2025-06-01 00:56:23 - myp.maintenance - INFO - Wartungs-Scheduler gestartet +2025-06-01 00:56:23 - myp.multi_location - INFO - Standard-Standort erstellt +2025-06-01 00:56:23 - myp.dashboard - INFO - Dashboard WebSocket-Server wird mit threading initialisiert (eventlet-Fallback) +2025-06-01 00:56:23 - myp.dashboard - INFO - Dashboard WebSocket-Server initialisiert (async_mode: threading) +2025-06-01 00:56:23 - myp.security - INFO - 🔒 Security System initialisiert +2025-06-01 00:56:23 - myp.permissions - INFO - 🔐 Permission Template Helpers registriert +2025-06-01 00:56:23 - myp.app - INFO - ================================================== +2025-06-01 00:56:23 - myp.app - INFO - [START] MYP (Manage Your Printers) wird gestartet... +2025-06-01 00:56:23 - myp.app - INFO - [FOLDER] Log-Verzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\logs +2025-06-01 00:56:23 - myp.app - INFO - [CHART] Log-Level: INFO +2025-06-01 00:56:23 - myp.app - INFO - [PC] Betriebssystem: Windows 11 +2025-06-01 00:56:23 - myp.app - INFO - [WEB] Hostname: C040L0079726760 +2025-06-01 00:56:23 - myp.app - INFO - [TIME] Startzeit: 01.06.2025 00:56:23 +2025-06-01 00:56:23 - myp.app - INFO - ================================================== +2025-06-01 00:56:23 - myp.app - INFO - 🔄 Starte Datenbank-Setup und Migrationen... +2025-06-01 00:56:23 - myp.app - INFO - Datenbank mit Optimierungen initialisiert +2025-06-01 00:56:23 - myp.app - INFO - ✅ JobOrder-Tabelle bereits vorhanden +2025-06-01 00:56:23 - myp.app - INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt. +2025-06-01 00:56:23 - myp.app - INFO - ✅ Datenbank-Setup und Migrationen erfolgreich abgeschlossen +2025-06-01 00:56:23 - myp.app - INFO - 🖨️ Starte automatische Steckdosen-Initialisierung... +2025-06-01 00:56:23 - myp.printer_monitor - INFO - 🚀 Starte Steckdosen-Initialisierung beim Programmstart... +2025-06-01 00:56:23 - myp.printer_monitor - WARNING - ⚠️ Keine aktiven Drucker zur Initialisierung gefunden +2025-06-01 00:56:23 - myp.app - INFO - ℹ️ Keine Drucker zur Initialisierung gefunden +2025-06-01 00:56:23 - myp.app - INFO - 🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung +2025-06-01 00:56:23 - myp.app - INFO - Job-Scheduler gestartet +2025-06-01 00:56:23 - myp.app - INFO - Starte Debug-Server auf 0.0.0.0:5000 (HTTP) +2025-06-01 00:56:23 - myp.app - INFO - Windows-Debug-Modus: Auto-Reload deaktiviert +2025-06-01 00:56:24 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://192.168.178.111:5000 +2025-06-01 00:56:24 - werkzeug - INFO - Press CTRL+C to quit +2025-06-01 00:56:24 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:24 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:24 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:24 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /api/session/status HTTP/1.1" 302 - +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /auth/login?next=/api/session/status HTTP/1.1" 302 - +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET / HTTP/1.1" 200 - +2025-06-01 00:56:24 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:24 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:24 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:24 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:24 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:24] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:56:24 - myp.printer_monitor - INFO - 🔍 Starte automatische Tapo-Steckdosenerkennung... +2025-06-01 00:56:24 - myp.printer_monitor - INFO - 🔄 Teste 6 Standard-IPs aus der Konfiguration +2025-06-01 00:56:24 - myp.printer_monitor - INFO - 🔍 Teste IP 1/6: 192.168.0.103 +2025-06-01 00:56:25 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 00:56:25 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:25] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 00:56:25 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:56:25 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:25] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 00:56:25 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:25] "GET /dashboard HTTP/1.1" 200 - +2025-06-01 00:56:25 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/css/tailwind.min.css HTTP/1.1" 200 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/ui-components.js HTTP/1.1" 200 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:26 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:26 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:26 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:26 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:26 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:56:26 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:26] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 00:56:27 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:27] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:30 - myp.printer_monitor - INFO - 🔍 Teste IP 2/6: 192.168.0.104 +2025-06-01 00:56:36 - myp.printer_monitor - INFO - 🔍 Teste IP 3/6: 192.168.0.100 +2025-06-01 00:56:42 - myp.printer_monitor - INFO - 🔍 Teste IP 4/6: 192.168.0.101 +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /printers HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/printers HTTP/1.1" 200 - +2025-06-01 00:56:43 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:43 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:43 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:43 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/printers/monitor/live-status?use_cache=false HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /api/printers HTTP/1.1" 200 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:43] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:44 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:44] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /admin-dashboard HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: tuple index out of range +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: (sqlite3.InterfaceError) bad parameter or other API misuse +[SQL: SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.password_hash AS users_password_hash, users.name AS users_name, users.role AS users_role, users.active AS users_active, users.created_at AS users_created_at, users.last_login AS users_last_login, users.updated_at AS users_updated_at, users.settings AS users_settings, users.last_activity AS users_last_activity, users.department AS users_department, users.position AS users_position, users.phone AS users_phone, users.bio AS users_bio +FROM users +WHERE users.id = ? + LIMIT ? OFFSET ?] +[parameters: (1, 1, 0)] +(Background on this error at: https://sqlalche.me/e/20/rvf5) +2025-06-01 00:56:45 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/admin.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/admin-system.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/admin-live.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/js/admin-dashboard.js HTTP/1.1" 304 - +2025-06-01 00:56:45 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:45 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/stats HTTP/1.1" 302 - +2025-06-01 00:56:45 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:45 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 00:56:45 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /auth/login?next=/api/stats HTTP/1.1" 302 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /api/stats HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET / HTTP/1.1" 200 - +2025-06-01 00:56:45 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:45] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:46 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:46] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:48 - myp.app - INFO - Admin-Check für Funktion admin_guest_requests: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:56:48 - myp.app - INFO - Admin-Gastanfragen Seite aufgerufen von User 1 +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /admin/guest-requests HTTP/1.1" 200 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/js/admin-guest-requests.js HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /api/admin/guest-requests HTTP/1.1" 302 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:48 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:48 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:48 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:48 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /auth/login?next=/api/admin/guest-requests HTTP/1.1" 302 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET / HTTP/1.1" 200 - +2025-06-01 00:56:48 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:48] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:48 - myp.printer_monitor - INFO - 🔍 Teste IP 5/6: 192.168.0.102 +2025-06-01 00:56:49 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:49] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /admin-dashboard HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/admin.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/admin-system.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/admin-live.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/js/admin-dashboard.js HTTP/1.1" 304 - +2025-06-01 00:56:54 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/notifications HTTP/1.1" 302 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/stats HTTP/1.1" 302 - +2025-06-01 00:56:54 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:54 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: (sqlite3.InterfaceError) bad parameter or other API misuse +[SQL: SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.password_hash AS users_password_hash, users.name AS users_name, users.role AS users_role, users.active AS users_active, users.created_at AS users_created_at, users.last_login AS users_last_login, users.updated_at AS users_updated_at, users.settings AS users_settings, users.last_activity AS users_last_activity, users.department AS users_department, users.position AS users_position, users.phone AS users_phone, users.bio AS users_bio +FROM users +WHERE users.id = ? + LIMIT ? OFFSET ?] +[parameters: (1, 1, 0)] +(Background on this error at: https://sqlalche.me/e/20/rvf5) +2025-06-01 00:56:54 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:56:54 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 00:56:54 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: 1, User ID: 1, Is Admin: True +2025-06-01 00:56:54 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /auth/login?next=/api/notifications HTTP/1.1" 302 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /auth/login?next=/api/stats HTTP/1.1" 302 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET / HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /api/stats HTTP/1.1" 200 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:54 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:54] "GET / HTTP/1.1" 200 - +2025-06-01 00:56:54 - myp.printer_monitor - INFO - 🔍 Teste IP 6/6: 192.168.0.105 +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /jobs HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /api/jobs HTTP/1.1" 404 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /api/printers HTTP/1.1" 200 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:55 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:55] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:56 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:56] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /stats HTTP/1.1" 200 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:57 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:57] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /calendar HTTP/1.1" 200 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/main.min.css HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/timegrid.min.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/interaction.min.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/list.min.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/daygrid.min.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/fullcalendar/core.min.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:56:58 - myp.calendar - 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 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /api/calendar/events?start=2025-06-01T00:00:00%2B02:00&end=2025-06-08T00:00:00%2B02:00 HTTP/1.1" 200 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:56:58 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:58] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:56:59 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:56:59] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:57:00 - myp.printer_monitor - INFO - ✅ Steckdosen-Erkennung abgeschlossen: 0/6 Steckdosen gefunden in 36.2s +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /dashboard HTTP/1.1" 200 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:57:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /api/user/settings HTTP/1.1" 200 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:57:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:57:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:57:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:57:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:02] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:57:03 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:03] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:57:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:57:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:57:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:57:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:32] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:57:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:57:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:57:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:57:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:32] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:57:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:57:32] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "GET /api/notifications HTTP/1.1" 302 - +2025-06-01 00:58:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:58:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:58:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:58:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "GET /auth/login?next=/api/notifications HTTP/1.1" 302 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "GET / HTTP/1.1" 200 - +2025-06-01 00:58:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:02] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:58:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:58:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:58:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:58:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:58:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:32] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:58:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:58:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:58:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:32] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:58:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:58:32] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:59:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:02] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:59:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:02] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:59:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:02] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:59:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:02 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:02 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:02] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:59:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:02] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:59:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:59:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:32] "POST /api/dashboard/refresh HTTP/1.1" 404 - +2025-06-01 00:59:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:32] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:59:32 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:32 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:32] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:59:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:32] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /admin-dashboard HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/admin.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/admin-system.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/admin-live.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/js/admin-dashboard.js HTTP/1.1" 304 - +2025-06-01 00:59:39 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:39 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:39 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:39 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/user/settings HTTP/1.1" 302 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:59:39 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/stats HTTP/1.1" 302 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /api/stats HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /auth/login?next=/api/user/settings HTTP/1.1" 302 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /auth/login?next=/api/stats HTTP/1.1" 302 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET / HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET / HTTP/1.1" 200 - +2025-06-01 00:59:39 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:39] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:59:40 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:40] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /admin-dashboard?tab=system HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/css/tailwind.min.css HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/ui-components.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/css/professional-theme.css HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/css/components.css HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/css/optimization-animations.css HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/offline-app.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/optimization-features.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/debug-fix.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: (sqlite3.InterfaceError) bad parameter or other API misuse +[SQL: SELECT users.id AS users_id, users.email AS users_email, users.username AS users_username, users.password_hash AS users_password_hash, users.name AS users_name, users.role AS users_role, users.active AS users_active, users.created_at AS users_created_at, users.last_login AS users_last_login, users.updated_at AS users_updated_at, users.settings AS users_settings, users.last_activity AS users_last_activity, users.department AS users_department, users.position AS users_position, users.phone AS users_phone, users.bio AS users_bio +FROM users +WHERE users.id = ? + LIMIT ? OFFSET ?] +[parameters: (1, 1, 0)] +(Background on this error at: https://sqlalche.me/e/20/rvf5) +2025-06-01 00:59:41 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/global-refresh-functions.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/event-handlers.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/dark-mode-fix.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/job-manager.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/csp-violation-handler.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/printer_monitor.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/notifications.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/session-manager.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/auto-logout.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/admin.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/admin-system.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/admin-live.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/js/admin-dashboard.js HTTP/1.1" 304 - +2025-06-01 00:59:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/user/settings HTTP/1.1" 302 - +2025-06-01 00:59:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 00:59:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/admin/system-health HTTP/1.1" 302 - +2025-06-01 00:59:41 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/stats HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /auth/login?next=/api/user/settings HTTP/1.1" 302 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /auth/login?next=/api/admin/system-health HTTP/1.1" 302 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/manifest.json HTTP/1.1" 304 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET / HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET / HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /api/stats HTTP/1.1" 200 - +2025-06-01 00:59:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:41] "GET /static/icons/icon-144x144.png HTTP/1.1" 304 - +2025-06-01 00:59:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:59:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:42] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 00:59:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:42] "POST /api/session/heartbeat HTTP/1.1" 200 - +2025-06-01 00:59:51 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:59:51 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 00:59:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:59:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 00:59:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:52] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 00:59:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 00:59:52] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:01 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:01 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +" 500 - +2025-06-01 01:00:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:02] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:11 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:11 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:11] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:00:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:11 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:00:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:11] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:00:11 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:00:11 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:00:11 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:00:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:11] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 01:00:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:11] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:00:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:11] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:00:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:12] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:12] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:12 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:13 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:13] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:21 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: tuple index out of range +2025-06-01 01:00:21 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:21 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 01:00:21 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: 1, User ID: 1, Is Admin: True +2025-06-01 01:00:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:22] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:22] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:31 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:31 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:32] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:32] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:41 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:41 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:41] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:00:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:00:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:41] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:00:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:00:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:00:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:41] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:00:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:00:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:41] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 01:00:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:41] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:00:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:42] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:42] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:42 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:43] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:00:51 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:51 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:00:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:52] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:00:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:00:52] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:01 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:01 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:02] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:02] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:11 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 302 - +2025-06-01 01:01:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:11 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:01:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /auth/login?next=/api/printers/monitor/live-status?use_cache%3Dtrue HTTP/1.1" 302 - +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET / HTTP/1.1" 200 - +2025-06-01 01:01:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:11] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:01:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:12] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:12] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:12 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:13 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:13] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:21 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:21 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:22] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:22] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:31 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:31 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:32] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:32] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:41 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: tuple index out of range +2025-06-01 01:01:41 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 01:01:41 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: 1, User ID: 1, Is Admin: True +2025-06-01 01:01:41 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:01:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:01:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:01:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:41] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:01:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:41] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:01:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:01:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:41] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 01:01:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:41] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:01:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:41] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:01:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:42] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:42 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:42] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:43] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:01:51 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:51 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:01:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:52] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:01:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:01:52] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:01 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:01 - myp.app - WARNING - Schema-Problem beim User-Load für ID 1: tuple index out of range +2025-06-01 01:02:01 - myp.app - INFO - User 1 erfolgreich über manuelle Abfrage geladen +2025-06-01 01:02:01 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: 1, User ID: 1, Is Admin: True +2025-06-01 01:02:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:02] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:02] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:11 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:11 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:11 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:02:11 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:11] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:02:11 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:02:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:11] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:02:11 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:02:11 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:02:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:11] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 01:02:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:11] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:02:11 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:11] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:02:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:12] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:12 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:12 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:12] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:13 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:13] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:21 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:21 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:22] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:22 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:22] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:31 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:31 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:32] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:32 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:32] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:41 - myp.app - INFO - Admin-Check für Funktion api_admin_database_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:41 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:41 - myp.app - INFO - Admin-Check für Funktion api_admin_system_health: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:41] "GET /api/notifications HTTP/1.1" 200 - +2025-06-01 01:02:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:41] "GET /api/admin/system-health HTTP/1.1" 200 - +2025-06-01 01:02:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:02:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:02:41 - myp.printer_monitor - INFO - 🔄 Aktualisiere Live-Druckerstatus... +2025-06-01 01:02:41 - myp.printer_monitor - INFO - ℹ️ Keine aktiven Drucker gefunden +2025-06-01 01:02:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:41] "GET /api/printers/monitor/live-status?use_cache=true HTTP/1.1" 200 - +2025-06-01 01:02:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:41] "GET /api/admin/database/status HTTP/1.1" 200 - +2025-06-01 01:02:41 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:41] "GET /api/session/status HTTP/1.1" 200 - +2025-06-01 01:02:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:42] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:42 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:42 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:42] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:43 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:43] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:02:51 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:51 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:02:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:52] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:02:52 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:02:52] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:03:01 - myp.app - INFO - Admin-Check für Funktion api_admin_system_status: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:03:01 - myp.app - INFO - Admin-Check für Funktion api_admin_stats_live: User authenticated: True, User ID: 1, Is Admin: True +2025-06-01 01:03:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:03:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:03:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:03:02] "GET /api/admin/system/status HTTP/1.1" 500 - +2025-06-01 01:03:02 - werkzeug - INFO - 127.0.0.1 - - [01/Jun/2025 01:03:02] "GET /api/admin/stats/live HTTP/1.1" 500 - +2025-06-01 01:03:03 - myp.app - WARNING - 🛑 Signal 2 empfangen - fahre System herunter... +2025-06-01 01:03:03 - myp.app - INFO - 🔄 Beende Queue Manager... +2025-06-01 01:03:04 - myp.app - INFO - Job-Scheduler gestoppt +2025-06-01 01:03:04 - myp.app - INFO - 💾 Führe robustes Datenbank-Cleanup durch... +2025-06-01 01:03:04 - myp.database_cleanup - INFO - 🧹 Starte umfassendes Datenbank-Cleanup... +2025-06-01 01:03:04 - myp.database_cleanup - INFO - 📝 Schritt 1: Schließe alle Datenbankverbindungen... +2025-06-01 01:03:04 - myp.database_cleanup - INFO - 🔄 Schließe alle aktiven Datenbankverbindungen... diff --git a/backend/logs/errors/errors.log b/backend/logs/errors/errors.log index ac5e1548..616d9584 100644 --- a/backend/logs/errors/errors.log +++ b/backend/logs/errors/errors.log @@ -1765,3 +1765,53 @@ information about how to avoid this problem. 2025-06-01 00:45:04 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) 2025-06-01 00:45:14 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) 2025-06-01 00:45:14 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:56:25 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 00:56:25 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:56:26 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:59:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:59:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 00:59:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:00:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:00:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:01:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:01:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:12 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:12 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:13 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:22 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:22 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:32 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:32 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:42 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:42 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:43 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:02:52 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) +2025-06-01 01:02:52 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:03:02 - myp.app - ERROR - Fehler beim Abrufen des System-Status: argument 1 (impossible) +2025-06-01 01:03:02 - myp.app - ERROR - Fehler beim Abrufen der Live-Statistiken: argument 1 (impossible) diff --git a/backend/logs/printers/printers.log b/backend/logs/printers/printers.log index ab61e5b2..45a11955 100644 --- a/backend/logs/printers/printers.log +++ b/backend/logs/printers/printers.log @@ -2602,3 +2602,44 @@ 2025-06-01 00:44:23 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker 2025-06-01 00:44:53 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) 2025-06-01 00:44:53 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:24 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:24 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:26 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:26 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:43 - myp.printers - INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 00:56:43 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:43 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:43 - myp.printers - INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 00:56:45 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:45 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:48 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:48 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:54 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:56:54 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:56:55 - myp.printers - INFO - Schnelles Laden abgeschlossen: 6 Drucker geladen (ohne Status-Check) +2025-06-01 00:57:02 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:57:02 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:57:32 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:57:32 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:58:02 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:58:02 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:58:32 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:58:32 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:59:02 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:59:02 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:59:32 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:59:32 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:59:39 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:59:39 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 00:59:41 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 00:59:41 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 01:00:11 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 01:00:11 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 01:00:41 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 01:00:41 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 01:01:41 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 01:01:41 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 01:02:11 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 01:02:11 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker +2025-06-01 01:02:41 - myp.printers - INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1) +2025-06-01 01:02:41 - myp.printers - INFO - ✅ Live-Status-Abfrage erfolgreich: 0 Drucker diff --git a/backend/logs/scheduler/scheduler.log b/backend/logs/scheduler/scheduler.log index 091aed2d..b476a041 100644 --- a/backend/logs/scheduler/scheduler.log +++ b/backend/logs/scheduler/scheduler.log @@ -2746,3 +2746,8 @@ 2025-06-01 00:42:25 - myp.scheduler - INFO - Scheduler gestartet 2025-06-01 00:45:17 - myp.scheduler - INFO - Scheduler-Thread beendet 2025-06-01 00:45:17 - myp.scheduler - INFO - Scheduler gestoppt +2025-06-01 00:56:22 - myp.scheduler - INFO - Task check_jobs registriert: Intervall 30s, Enabled: True +2025-06-01 00:56:23 - myp.scheduler - INFO - Scheduler-Thread gestartet +2025-06-01 00:56:23 - myp.scheduler - INFO - Scheduler gestartet +2025-06-01 01:03:04 - myp.scheduler - INFO - Scheduler-Thread beendet +2025-06-01 01:03:04 - myp.scheduler - INFO - Scheduler gestoppt diff --git a/backend/models.py b/backend/models.py index 749a212e..208c7893 100644 --- a/backend/models.py +++ b/backend/models.py @@ -400,6 +400,26 @@ class User(UserMixin, Base): return user + @classmethod + def get_by_id_cached(cls, user_id: int) -> Optional['User']: + """ + Holt einen Benutzer anhand der ID mit Caching. + """ + cache_key = get_cache_key("User", user_id, "id") + cached_user = get_cache(cache_key) + + if cached_user is not None: + return cached_user + + with get_cached_session() as session: + user = session.query(cls).filter(cls.id == user_id).first() + + if user: + # User für 10 Minuten cachen + set_cache(cache_key, user, 600) + + return user + def update_last_login(self): """ Aktualisiert den letzten Login-Zeitstempel. diff --git a/backend/static/css/output.css b/backend/static/css/output.css index adf65a13..9d566412 100644 --- a/backend/static/css/output.css +++ b/backend/static/css/output.css @@ -8170,6 +8170,10 @@ footer { background-color: rgb(243 244 246 / 0.8); } +.focus\:opacity-100:focus { + opacity: 1; +} + .focus\:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; diff --git a/backend/static/js/ui-components.js b/backend/static/js/ui-components.js index 3f78f83a..48e50d6c 100644 --- a/backend/static/js/ui-components.js +++ b/backend/static/js/ui-components.js @@ -969,36 +969,37 @@ let icon = ''; switch(type) { case 'success': - icon = ` + icon = ` `; break; case 'error': - icon = ` + icon = ` `; break; case 'warning': - icon = ` + icon = ` `; break; case 'info': default: - icon = ` + icon = ` `; } // Inhalt der Flash Message flashElement.innerHTML = ` -
+
${icon} -
-

${message}

+
+

${message}

- - - -
@@ -1543,7 +1572,8 @@

Unterdrückte Nachrichten (${this.suppressedMessages.length})

-
@@ -1573,11 +1603,11 @@
${this.isActive ? ` - ` : ''} -
@@ -1585,43 +1615,91 @@
`; - // Event Listeners + // Event Listeners mit Event Delegation modal.addEventListener('click', (e) => { - if (e.target === modal || e.target.classList.contains('dnd-close-btn')) { - modal.remove(); + e.stopPropagation(); + + // Schließen bei Klick auf Hintergrund + if (e.target === modal) { + this.closeModal(modal); + return; } + // Schließen-Buttons + if (e.target.closest('.dnd-close-btn') || e.target.closest('.dnd-close-btn-main')) { + e.preventDefault(); + this.closeModal(modal); + return; + } + + // Schnell-Aktionen if (e.target.classList.contains('dnd-quick-btn')) { + e.preventDefault(); const duration = parseInt(e.target.dataset.duration); if (duration === 0) { this.enable(); } else { this.enable(duration); } - modal.remove(); + this.closeModal(modal); + return; } + // Deaktivieren-Button if (e.target.classList.contains('dnd-disable-btn')) { + e.preventDefault(); this.disable(); - modal.remove(); + this.closeModal(modal); + return; } + // Alle löschen if (e.target.classList.contains('dnd-clear-btn')) { + e.preventDefault(); this.clearSuppressedMessages(); - modal.remove(); - this.showSettings(); // Modal neu laden + this.closeModal(modal); + // Modal neu öffnen mit aktualisierten Daten + setTimeout(() => this.showSettings(), 100); + return; } + // Einstellungen-Checkboxen if (e.target.classList.contains('dnd-setting')) { const setting = e.target.dataset.setting; this.settings[setting] = e.target.checked; this.saveSettings(); + return; } }); + // ESC-Taste zum Schließen + const escapeHandler = (e) => { + if (e.key === 'Escape') { + this.closeModal(modal); + document.removeEventListener('keydown', escapeHandler); + } + }; + document.addEventListener('keydown', escapeHandler); + + // Modal zum DOM hinzufügen document.body.appendChild(modal); } + /** + * Modal schließen + */ + closeModal(modal) { + if (modal && modal.parentNode) { + modal.style.opacity = '0'; + modal.style.pointerEvents = 'none'; + setTimeout(() => { + if (modal.parentNode) { + modal.parentNode.removeChild(modal); + } + }, 200); + } + } + /** * Unterdrückte Nachrichten löschen */ @@ -1851,6 +1929,23 @@ }); console.log('✅ MYP UI Components erfolgreich initialisiert - Erweiterte Benutzeroberfläche mit Glassmorphism und Do Not Disturb bereit'); + + // Test der glasigen Flash Messages (nur im Development) + if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { + // Warten auf vollständige Initialisierung, dann Test-Messages anzeigen + setTimeout(() => { + console.log('🧪 Teste glasige Flash Messages...'); + showFlashMessage('Glassmorphism Flash Messages sind aktiv! ✨', 'success', 7000); + + setTimeout(() => { + showFlashMessage('Do Not Disturb System ist bereit. Probieren Sie es im Footer aus! 🔕', 'info', 7000); + }, 1000); + + setTimeout(() => { + showFlashMessage('Warnung: Dies ist eine Test-Nachricht für das glasige Design.', 'warning', 7000); + }, 2000); + }, 2000); + } }); // Globale Variablen für erweiterte Flash Messages diff --git a/backend/templates/base.html b/backend/templates/base.html index ed174f7f..f1196186 100644 --- a/backend/templates/base.html +++ b/backend/templates/base.html @@ -628,6 +628,46 @@ + +
+

Benachrichtigungen

+
+ +
+ Nicht stören: + +
+ + + +
+
+

Rechtliches