diff --git a/backend/app/app.py b/backend/app/app.py index b9ca101f..f3d73249 100644 --- a/backend/app/app.py +++ b/backend/app/app.py @@ -1,40 +1,23 @@ import os import sys import logging -import threading -import time -import subprocess -import socket -import json -import secrets -from concurrent.futures import ThreadPoolExecutor, as_completed +import atexit from datetime import datetime, timedelta -from functools import wraps -from typing import Optional, Dict, List, Tuple, Any, Union - -from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, session, send_file, Response, make_response -from flask_login import LoginManager, login_user, logout_user, login_required, current_user, UserMixin -from werkzeug.security import check_password_hash, generate_password_hash +from flask import Flask, render_template, request, jsonify, redirect, url_for, flash, send_file, abort, session +from flask_login import LoginManager, login_user, logout_user, login_required, current_user from werkzeug.utils import secure_filename -import sqlalchemy.exc -import sqlalchemy -from sqlalchemy.orm import joinedload +from sqlalchemy.orm import sessionmaker, joinedload from sqlalchemy import func -from PyP100 import PyP110 -from flask_wtf.csrf import CSRFProtect -from flask_wtf.csrf import CSRFError -from config.settings import ( - SECRET_KEY, TAPO_USERNAME, TAPO_PASSWORD, PRINTERS, - FLASK_HOST, FLASK_PORT, FLASK_DEBUG, SESSION_LIFETIME, - SCHEDULER_INTERVAL, SCHEDULER_ENABLED, get_ssl_context, FLASK_FALLBACK_PORT, - SSL_ENABLED, SSL_CERT_PATH, SSL_KEY_PATH -) -from utils.logging_config import setup_logging, get_logger, log_startup_info, debug_request, debug_response, measure_execution_time -from models import User, Printer, Job, Stats, GuestRequest, UserPermission, Notification, get_db_session, init_database, create_initial_admin -from utils.job_scheduler import scheduler -from utils.template_helpers import register_template_helpers -from utils.database_utils import backup_manager, database_monitor, maintenance_scheduler +# Lokale Imports +from models import init_database, create_initial_admin, User, Printer, Job, Stats, SystemLog, get_db_session, GuestRequest, UserPermission, Notification +from utils.logging_config import setup_logging, get_logger +from utils.printer_status import check_printer_status, check_multiple_printers_status +from utils.decorators import measure_execution_time +from utils.file_manager import FileManager +from utils.job_scheduler import JobScheduler, get_job_scheduler +from utils.queue_manager import start_queue_manager, stop_queue_manager, get_queue_manager +from config.settings import SECRET_KEY, UPLOAD_FOLDER, ALLOWED_EXTENSIONS, ENVIRONMENT # Blueprints importieren from blueprints.guest import guest_blueprint @@ -4067,6 +4050,45 @@ def mark_all_notifications_read(): # ===== ENDE BENACHRICHTIGUNGS-API-ENDPUNKTE ===== +# ===== QUEUE-MANAGER-API-ENDPUNKTE ===== + +@app.route('/api/queue/status', methods=['GET']) +@login_required +def get_queue_status(): + """Gibt den aktuellen Status der Drucker-Warteschlangen zurück.""" + try: + queue_manager = get_queue_manager() + status = queue_manager.get_queue_status() + + return jsonify({ + "success": True, + "queue_status": status + }) + + except Exception as e: + app_logger.error(f"Fehler beim Abrufen des Queue-Status: {str(e)}") + return jsonify({ + "success": False, + "message": f"Fehler beim Abrufen des Queue-Status: {str(e)}" + }), 500 + +@app.route('/api/queue/check-now', methods=['POST']) +@login_required +def trigger_queue_check(): + """Triggert eine sofortige Überprüfung der Warteschlangen.""" + try: + # Bestehende check_waiting_jobs API verwenden + return check_waiting_jobs() + + except Exception as e: + app_logger.error(f"Fehler beim manuellen Queue-Check: {str(e)}") + return jsonify({ + "success": False, + "message": f"Fehler beim manuellen Queue-Check: {str(e)}" + }), 500 + +# ===== ENDE QUEUE-MANAGER-API-ENDPUNKTE ===== + # ===== STARTUP UND MAIN ===== if __name__ == "__main__": import sys @@ -4082,6 +4104,21 @@ if __name__ == "__main__": # Template-Hilfsfunktionen registrieren register_template_helpers(app) + # Queue-Manager für automatische Drucker-Überwachung starten + try: + queue_manager = start_queue_manager() + app_logger.info("✅ Printer Queue Manager erfolgreich gestartet") + + # Shutdown-Handler registrieren + def cleanup_queue_manager(): + app_logger.info("🔄 Beende Queue Manager...") + stop_queue_manager() + + atexit.register(cleanup_queue_manager) + + except Exception as e: + app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}") + # Scheduler starten (falls aktiviert) if SCHEDULER_ENABLED: try: diff --git a/backend/app/templates/jobs.html b/backend/app/templates/jobs.html index 7982815a..ac1ca234 100644 --- a/backend/app/templates/jobs.html +++ b/backend/app/templates/jobs.html @@ -26,6 +26,9 @@