"Feat: Integrate job scheduler in backend"
This commit is contained in:
@@ -3,16 +3,24 @@ import sys
|
|||||||
import logging
|
import logging
|
||||||
import atexit
|
import atexit
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from flask import Flask, render_template, request, jsonify, redirect, url_for, flash, send_file, abort, session
|
from flask import Flask, render_template, request, jsonify, redirect, url_for, flash, send_file, abort, session, make_response
|
||||||
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
|
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
|
||||||
|
from flask_wtf import CSRFProtect
|
||||||
|
from flask_wtf.csrf import CSRFError
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
from sqlalchemy.orm import sessionmaker, joinedload
|
from sqlalchemy.orm import sessionmaker, joinedload
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
|
from functools import wraps
|
||||||
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
|
from typing import List, Dict, Tuple
|
||||||
|
import time
|
||||||
|
import subprocess
|
||||||
|
import json
|
||||||
|
|
||||||
# Lokale Imports
|
# Lokale Imports
|
||||||
from models import init_database, create_initial_admin, User, Printer, Job, Stats, SystemLog, get_db_session, GuestRequest, UserPermission, Notification
|
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, measure_execution_time, log_startup_info, debug_request, debug_response
|
from utils.logging_config import setup_logging, get_logger, measure_execution_time, log_startup_info, debug_request, debug_response
|
||||||
from utils.file_manager import FileManager
|
|
||||||
from utils.job_scheduler import JobScheduler, get_job_scheduler
|
from utils.job_scheduler import JobScheduler, get_job_scheduler
|
||||||
from utils.queue_manager import start_queue_manager, stop_queue_manager, get_queue_manager
|
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, SESSION_LIFETIME
|
from config.settings import SECRET_KEY, UPLOAD_FOLDER, ALLOWED_EXTENSIONS, ENVIRONMENT, SESSION_LIFETIME
|
||||||
|
@@ -50,6 +50,14 @@ FLASK_FALLBACK_PORT = 8080 # Geändert von 80 auf 8080 (nicht-privilegierter Po
|
|||||||
FLASK_DEBUG = True
|
FLASK_DEBUG = True
|
||||||
SESSION_LIFETIME = timedelta(days=7)
|
SESSION_LIFETIME = timedelta(days=7)
|
||||||
|
|
||||||
|
# Upload-Konfiguration
|
||||||
|
UPLOAD_FOLDER = os.path.join(BASE_DIR, "uploads")
|
||||||
|
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'gcode', '3mf', 'stl'}
|
||||||
|
MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB Maximum-Dateigröße
|
||||||
|
|
||||||
|
# Umgebungskonfiguration
|
||||||
|
ENVIRONMENT = get_env_variable("MYP_ENVIRONMENT", "development")
|
||||||
|
|
||||||
# SSL-Konfiguration
|
# SSL-Konfiguration
|
||||||
SSL_ENABLED = get_env_variable("MYP_SSL_ENABLED", "True").lower() in ("true", "1", "yes")
|
SSL_ENABLED = get_env_variable("MYP_SSL_ENABLED", "True").lower() in ("true", "1", "yes")
|
||||||
SSL_CERT_PATH = os.path.join(BASE_DIR, "certs", "myp.crt")
|
SSL_CERT_PATH = os.path.join(BASE_DIR, "certs", "myp.crt")
|
||||||
@@ -96,6 +104,11 @@ def ensure_ssl_directory():
|
|||||||
if ssl_dir and not os.path.exists(ssl_dir):
|
if ssl_dir and not os.path.exists(ssl_dir):
|
||||||
os.makedirs(ssl_dir, exist_ok=True)
|
os.makedirs(ssl_dir, exist_ok=True)
|
||||||
|
|
||||||
|
def ensure_upload_directory():
|
||||||
|
"""Erstellt das Upload-Verzeichnis, falls es nicht existiert."""
|
||||||
|
if not os.path.exists(UPLOAD_FOLDER):
|
||||||
|
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
||||||
|
|
||||||
def get_ssl_context():
|
def get_ssl_context():
|
||||||
"""
|
"""
|
||||||
Gibt den SSL-Kontext für Flask zurück, wenn SSL aktiviert ist.
|
Gibt den SSL-Kontext für Flask zurück, wenn SSL aktiviert ist.
|
||||||
|
@@ -408,4 +408,16 @@ scheduler.register_task(
|
|||||||
func=check_jobs,
|
func=check_jobs,
|
||||||
interval=60,
|
interval=60,
|
||||||
enabled=True
|
enabled=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Alias für Kompatibilität
|
||||||
|
JobScheduler = BackgroundTaskScheduler
|
||||||
|
|
||||||
|
def get_job_scheduler() -> BackgroundTaskScheduler:
|
||||||
|
"""
|
||||||
|
Gibt den globalen Job-Scheduler zurück.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
BackgroundTaskScheduler: Der globale Scheduler
|
||||||
|
"""
|
||||||
|
return scheduler
|
Reference in New Issue
Block a user