📚 Improved backend structure & logs management 🎉

This commit is contained in:
2025-06-11 09:29:15 +02:00
parent 4813e6cc70
commit 6fe5882e7d
17 changed files with 523 additions and 3 deletions

View File

@ -423,6 +423,342 @@ def stats_page():
"""Zeigt die Statistiken-Seite an"""
return render_template("stats.html", title="Statistiken")
# ===== API-ENDPUNKTE FÜR FRONTEND-KOMPATIBILITÄT =====
@app.route("/api/jobs", methods=["GET"])
@login_required
def api_get_jobs():
"""API-Endpunkt für Jobs - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import get_jobs
return get_jobs()
@app.route("/api/jobs", methods=["POST"])
@login_required
def api_create_job():
"""API-Endpunkt für Job-Erstellung - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import create_job
return create_job()
@app.route("/api/jobs/<int:job_id>", methods=["GET"])
@login_required
def api_get_job(job_id):
"""API-Endpunkt für einzelnen Job - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import get_job
return get_job(job_id)
@app.route("/api/jobs/<int:job_id>", methods=["PUT"])
@login_required
def api_update_job(job_id):
"""API-Endpunkt für Job-Update - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import update_job
return update_job(job_id)
@app.route("/api/jobs/<int:job_id>", methods=["DELETE"])
@login_required
def api_delete_job(job_id):
"""API-Endpunkt für Job-Löschung - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import delete_job
return delete_job(job_id)
@app.route("/api/jobs/active", methods=["GET"])
@login_required
def api_get_active_jobs():
"""API-Endpunkt für aktive Jobs - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import get_active_jobs
return get_active_jobs()
@app.route("/api/jobs/current", methods=["GET"])
@login_required
def api_get_current_job():
"""API-Endpunkt für aktuellen Job - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import get_current_job
return get_current_job()
@app.route("/api/jobs/<int:job_id>/start", methods=["POST"])
@login_required
def api_start_job(job_id):
"""API-Endpunkt für Job-Start - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import start_job
return start_job(job_id)
@app.route("/api/jobs/<int:job_id>/pause", methods=["POST"])
@login_required
def api_pause_job(job_id):
"""API-Endpunkt für Job-Pause - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import pause_job
return pause_job(job_id)
@app.route("/api/jobs/<int:job_id>/resume", methods=["POST"])
@login_required
def api_resume_job(job_id):
"""API-Endpunkt für Job-Resume - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import resume_job
return resume_job(job_id)
@app.route("/api/jobs/<int:job_id>/finish", methods=["POST"])
@login_required
def api_finish_job(job_id):
"""API-Endpunkt für Job-Finish - leitet an Jobs-Blueprint weiter"""
from blueprints.jobs import finish_job
return finish_job(job_id)
@app.route("/api/printers", methods=["GET"])
@login_required
def api_get_printers():
"""API-Endpunkt für Drucker-Liste"""
try:
from models import get_db_session, Printer
db_session = get_db_session()
printers = db_session.query(Printer).filter(Printer.active == True).all()
printer_list = []
for printer in printers:
printer_dict = {
"id": printer.id,
"name": printer.name,
"model": printer.model,
"location": printer.location,
"status": printer.status,
"ip_address": printer.ip_address,
"plug_ip": printer.plug_ip,
"active": printer.active,
"last_checked": printer.last_checked.isoformat() if printer.last_checked else None
}
printer_list.append(printer_dict)
db_session.close()
app_logger.info(f"✅ API: {len(printer_list)} Drucker abgerufen")
return jsonify({"printers": printer_list})
except Exception as e:
app_logger.error(f"❌ API-Fehler beim Abrufen der Drucker: {str(e)}")
return jsonify({"error": "Fehler beim Laden der Drucker", "details": str(e)}), 500
@app.route("/api/printers/status", methods=["GET"])
@login_required
def api_get_printer_status():
"""API-Endpunkt für Drucker-Status"""
try:
from models import get_db_session, Printer
from utils.tapo_controller import tapo_controller
db_session = get_db_session()
printers = db_session.query(Printer).filter(Printer.active == True).all()
status_list = []
for printer in printers:
# Tapo-Steckdosen-Status prüfen
if printer.plug_ip:
try:
reachable, plug_status = tapo_controller.check_outlet_status(
printer.plug_ip,
printer_id=printer.id
)
status_dict = {
"id": printer.id,
"name": printer.name,
"status": printer.status,
"plug_status": plug_status,
"plug_reachable": reachable,
"plug_ip": printer.plug_ip,
"location": printer.location
}
except Exception as e:
app_logger.warning(f"⚠️ Fehler bei Steckdosen-Status für {printer.name}: {str(e)}")
status_dict = {
"id": printer.id,
"name": printer.name,
"status": "error",
"plug_status": "unknown",
"plug_reachable": False,
"plug_ip": printer.plug_ip,
"location": printer.location,
"error": str(e)
}
else:
status_dict = {
"id": printer.id,
"name": printer.name,
"status": printer.status,
"plug_status": "no_plug",
"plug_reachable": False,
"plug_ip": None,
"location": printer.location
}
status_list.append(status_dict)
db_session.close()
app_logger.info(f"✅ API: Status für {len(status_list)} Drucker abgerufen")
return jsonify({"printers": status_list})
except Exception as e:
app_logger.error(f"❌ API-Fehler beim Abrufen des Drucker-Status: {str(e)}")
return jsonify({"error": "Fehler beim Laden des Drucker-Status", "details": str(e)}), 500
# ===== SESSION-API-ENDPUNKTE =====
@app.route("/api/session/status", methods=["GET"])
@login_required
def api_session_status():
"""API-Endpunkt für Session-Status"""
try:
last_activity = session.get('last_activity')
if last_activity:
last_activity_time = datetime.fromisoformat(last_activity)
time_since_activity = (datetime.now() - last_activity_time).total_seconds()
time_left_seconds = max(0, SESSION_LIFETIME.total_seconds() - time_since_activity)
else:
time_left_seconds = SESSION_LIFETIME.total_seconds()
return jsonify({
"success": True,
"user": {
"id": current_user.id,
"email": current_user.email,
"name": current_user.name,
"is_admin": current_user.is_admin
},
"session": {
"time_left_seconds": int(time_left_seconds),
"max_inactive_minutes": int(SESSION_LIFETIME.total_seconds() / 60),
"last_activity": last_activity or datetime.now().isoformat()
}
})
except Exception as e:
app_logger.error(f"❌ Session-Status-Fehler: {str(e)}")
return jsonify({"success": False, "error": str(e)}), 500
@app.route("/api/session/heartbeat", methods=["POST"])
@login_required
def api_session_heartbeat():
"""API-Endpunkt für Session-Heartbeat"""
try:
# Session-Aktivität aktualisieren
session['last_activity'] = datetime.now().isoformat()
session.permanent = True
# Verbleibende Zeit berechnen
time_left_seconds = SESSION_LIFETIME.total_seconds()
return jsonify({
"success": True,
"time_left_seconds": int(time_left_seconds),
"timestamp": datetime.now().isoformat()
})
except Exception as e:
app_logger.error(f"❌ Session-Heartbeat-Fehler: {str(e)}")
return jsonify({"success": False, "error": str(e)}), 500
@app.route("/api/session/extend", methods=["POST"])
@login_required
def api_session_extend():
"""API-Endpunkt für Session-Verlängerung"""
try:
data = request.get_json() or {}
extend_minutes = data.get('extend_minutes', 30)
# Session verlängern
session['last_activity'] = datetime.now().isoformat()
session.permanent = True
return jsonify({
"success": True,
"extended_minutes": extend_minutes,
"new_expiry": (datetime.now() + SESSION_LIFETIME).isoformat()
})
except Exception as e:
app_logger.error(f"❌ Session-Extend-Fehler: {str(e)}")
return jsonify({"success": False, "error": str(e)}), 500
@app.route("/api/jobs/recent", methods=["GET"])
@login_required
def api_get_recent_jobs():
"""API-Endpunkt für kürzlich erstellte Jobs"""
try:
from models import get_db_session, Job
db_session = get_db_session()
# Letzte 10 Jobs des Benutzers (oder alle für Admin)
query = db_session.query(Job).order_by(Job.created_at.desc())
if not current_user.is_admin:
query = query.filter(Job.user_id == current_user.id)
recent_jobs = query.limit(10).all()
job_list = []
for job in recent_jobs:
job_dict = {
"id": job.id,
"name": job.name,
"status": job.status,
"created_at": job.created_at.isoformat() if job.created_at else None,
"start_at": job.start_at.isoformat() if job.start_at else None,
"duration_minutes": job.duration_minutes,
"printer_name": job.printer.name if job.printer else "Unbekannt"
}
job_list.append(job_dict)
db_session.close()
app_logger.info(f"✅ API: {len(job_list)} kürzliche Jobs abgerufen")
return jsonify({"jobs": job_list})
except Exception as e:
app_logger.error(f"❌ API-Fehler beim Abrufen kürzlicher Jobs: {str(e)}")
return jsonify({"error": "Fehler beim Laden kürzlicher Jobs", "details": str(e)}), 500
@app.route("/api/stats", methods=["GET"])
@login_required
def api_get_stats():
"""API-Endpunkt für System-Statistiken"""
try:
from models import get_db_session, Job, Printer
db_session = get_db_session()
# Grundlegende Statistiken
total_jobs = db_session.query(Job).count()
active_jobs = db_session.query(Job).filter(Job.status.in_(["scheduled", "running"])).count()
completed_jobs = db_session.query(Job).filter(Job.status == "finished").count()
total_printers = db_session.query(Printer).filter(Printer.active == True).count()
# Benutzer-spezifische Statistiken
if not current_user.is_admin:
user_jobs = db_session.query(Job).filter(Job.user_id == current_user.id).count()
user_active_jobs = db_session.query(Job).filter(
Job.user_id == current_user.id,
Job.status.in_(["scheduled", "running"])
).count()
else:
user_jobs = total_jobs
user_active_jobs = active_jobs
db_session.close()
stats = {
"total_jobs": total_jobs,
"active_jobs": active_jobs,
"completed_jobs": completed_jobs,
"total_printers": total_printers,
"user_jobs": user_jobs,
"user_active_jobs": user_active_jobs,
"timestamp": datetime.now().isoformat()
}
app_logger.info(f"✅ API: Statistiken abgerufen")
return jsonify(stats)
except Exception as e:
app_logger.error(f"❌ API-Fehler beim Abrufen der Statistiken: {str(e)}")
return jsonify({"error": "Fehler beim Laden der Statistiken", "details": str(e)}), 500
# Statische Seiten
@app.route("/privacy")
def privacy():

View File

@ -148,7 +148,8 @@ def calendar_view():
can_edit = can_edit_events(current_user)
with get_cached_session() as db_session:
printers = db_session.query(Printer).filter_by(active=True).all()
# Alle Drucker für Auswahlfelder anzeigen (unabhängig von active-Status)
printers = db_session.query(Printer).all()
return render_template('calendar.html',
printers=printers,
@ -1270,8 +1271,8 @@ def api_printer_availability():
return jsonify({"error": "Ungültiges Datumsformat"}), 400
with get_cached_session() as db_session:
# Alle aktiven Drucker laden
printers = db_session.query(Printer).filter_by(active=True).all()
# Alle Drucker laden für Verfügbarkeitsanalyse (unabhängig von active-Status)
printers = db_session.query(Printer).all()
availability_info = []

Binary file not shown.

View File

@ -4028,3 +4028,85 @@ WHERE users.id = ?
2025-06-11 09:17:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:17:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:17:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:18:44 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:18:46 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:18:48 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:18:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:18:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:18:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:19:44 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:19:46 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:19:48 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:19:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:19:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:19:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:20:45 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:20:47 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:20:49 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:20:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:20:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:20:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:21:44 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:21:46 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:21:48 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:21:50 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:21:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:21:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:22:45 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:22:47 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:22:49 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:22:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:22:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:22:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:23:44 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:23:46 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:23:49 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:23:51 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:23:53 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:23:55 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:24:19 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 1, Status: disconnected, Quelle: system
2025-06-11 09:24:19 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:24:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/printers
2025-06-11 09:24:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-11 09:24:21 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 2, Status: disconnected, Quelle: system
2025-06-11 09:24:23 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 3, Status: disconnected, Quelle: system
2025-06-11 09:24:25 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 4, Status: disconnected, Quelle: system
2025-06-11 09:24:27 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 5, Status: disconnected, Quelle: system
2025-06-11 09:24:29 - [app] app - [INFO] INFO - Steckdosen-Status geloggt: Drucker 6, Status: disconnected, Quelle: system
2025-06-11 09:25:48 - [app] app - [WARNING] WARNING - DatabaseCleanupManager nicht verfügbar - Fallback auf Legacy-Cleanup
2025-06-11 09:25:48 - [app] app - [INFO] INFO - Optimierte SQLite-Engine erstellt: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend\instance\printer_manager.db
2025-06-11 09:25:48 - [app] app - [INFO] INFO - SQLite für Raspberry Pi optimiert (reduzierte Cache-Größe, SD-Karten I/O)
2025-06-11 09:25:48 - [app] app - [INFO] INFO - Datenbank mit Optimierungen initialisiert
2025-06-11 09:25:49 - [app] app - [INFO] INFO - Admin-Benutzer admin (admin@mercedes-benz.com) existiert bereits. Passwort wurde zurückgesetzt.
2025-06-11 09:25:49 - [app] app - [INFO] INFO - [START] Server startet auf 0.0.0.0:5000
2025-06-11 09:25:49 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-11 09:25:55 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/.well-known/appspecific/com.chrome.devtools.json
2025-06-11 09:26:13 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/.well-known/appspecific/com.chrome.devtools.json
2025-06-11 09:26:13 - [app] app - [ERROR] ERROR - Fehler beim Laden des Benutzers 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, users.theme_preference AS users_theme_preference, users.language_preference AS users_language_preference, users.email_notifications AS users_email_notifications, users.browser_notifications AS users_browser_notifications, users.dashboard_layout AS users_dashboard_layout, users.compact_mode AS users_compact_mode, users.show_completed_jobs AS users_show_completed_jobs, users.auto_refresh_interval AS users_auto_refresh_interval, users.auto_logout_timeout AS users_auto_logout_timeout
FROM users
WHERE users.id = ?
LIMIT ? OFFSET ?]
[parameters: (1, 1, 0)]
(Background on this error at: https://sqlalche.me/e/20/rvf5)
2025-06-11 09:26:14 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:26:15 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/printers
2025-06-11 09:26:16 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-11 09:26:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/.well-known/appspecific/com.chrome.devtools.json
2025-06-11 09:26:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:26:21 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/printers
2025-06-11 09:26:21 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/static/icons/icon-192.png
2025-06-11 09:26:35 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:26:50 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:26:50 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:27:05 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:27:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:27:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:27:35 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:27:50 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:27:50 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:28:05 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:28:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:28:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs
2025-06-11 09:28:20 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1
2025-06-11 09:28:35 - [app] app - [INFO] INFO - Not Found (404): http://127.0.0.1:5000/api/jobs?page=1

View File

@ -60,3 +60,4 @@
2025-06-11 08:54:35 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-11 09:06:43 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-11 09:08:17 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert
2025-06-11 09:25:48 - [permissions] permissions - [INFO] INFO - 🔐 Permission Template Helpers registriert

View File

@ -575,3 +575,14 @@
2025-06-11 09:06:43 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-11 09:08:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-11 09:08:17 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-11 09:25:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🖨️ Drucker-Monitor initialisiert
2025-06-11 09:25:48 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Automatische Tapo-Erkennung in separatem Thread gestartet
2025-06-11 09:25:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔄 Aktualisiere Live-Druckerstatus...
2025-06-11 09:25:49 - [printer_monitor] printer_monitor - [INFO] INFO - 🔍 Prüfe Status von 6 aktiven Druckern...
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.101): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.103): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.100): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.104): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.102): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [WARNING] WARNING - 🔌 Tapo P110 (192.168.0.106): UNREACHABLE (Ping fehlgeschlagen)
2025-06-11 09:25:58 - [printer_monitor] printer_monitor - [INFO] INFO - ✅ Status-Update abgeschlossen für 6 Drucker

View File

@ -321,3 +321,6 @@
2025-06-11 08:54:14 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-11 08:54:14 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 6 Drucker
2025-06-11 08:54:14 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 3.33ms
2025-06-11 09:25:49 - [printers] printers - [INFO] INFO - 🔄 Live-Status-Abfrage von Benutzer Administrator (ID: 1)
2025-06-11 09:25:58 - [printers] printers - [INFO] INFO - ✅ Live-Status-Abfrage erfolgreich: 6 Drucker
2025-06-11 09:25:58 - [printers] printers - [INFO] INFO - [OK] API-Live-Drucker-Status-Abfrage 'get_live_printer_status' erfolgreich in 9043.66ms

View File

@ -312,3 +312,14 @@
2025-06-11 09:08:17 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden)
2025-06-11 09:08:17 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet
2025-06-11 09:08:17 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet
2025-06-11 09:24:33 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Stoppe Queue-Manager...
2025-06-11 09:24:33 - [queue_manager] queue_manager - [INFO] INFO - ⏳ Warte auf Monitor-Thread...
2025-06-11 09:24:33 - [queue_manager] queue_manager - [INFO] INFO - 🛑 Shutdown-Signal empfangen - beende Monitor-Loop
2025-06-11 09:24:33 - [queue_manager] queue_manager - [INFO] INFO - 🔚 Monitor-Loop beendet
2025-06-11 09:24:33 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestoppt
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Initialisiere neuen Queue-Manager...
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Zentrale Shutdown-Verwaltung erkannt - deaktiviere lokale Signal-Handler
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - 🚀 Starte Printer Queue Manager...
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - 🔄 Queue-Überwachung gestartet (Intervall: 120 Sekunden)
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - ✅ Printer Queue Manager gestartet
2025-06-11 09:25:49 - [queue_manager] queue_manager - [INFO] INFO - ✅ Queue-Manager erfolgreich gestartet

View File

@ -133,3 +133,6 @@
2025-06-11 09:08:17 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-11 09:08:17 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-11 09:08:17 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet
2025-06-11 09:25:48 - [scheduler] scheduler - [INFO] INFO - Task check_jobs registriert: Intervall 30s, Enabled: True
2025-06-11 09:25:49 - [scheduler] scheduler - [INFO] INFO - Scheduler-Thread gestartet
2025-06-11 09:25:49 - [scheduler] scheduler - [INFO] INFO - Scheduler gestartet

View File

@ -60,3 +60,4 @@
2025-06-11 08:54:35 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-11 09:06:43 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-11 09:08:17 - [security] security - [INFO] INFO - 🔒 Security System initialisiert
2025-06-11 09:25:48 - [security] security - [INFO] INFO - 🔒 Security System initialisiert

View File

@ -474,3 +474,12 @@
2025-06-11 09:08:17 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-11 09:08:17 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-11 09:08:17 - [startup] startup - [INFO] INFO - ==================================================
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - ==================================================
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - [START] MYP Platform Backend wird gestartet...
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - 🐍 Python Version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - 💻 Betriebssystem: nt (win32)
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - 📁 Arbeitsverzeichnis: C:\Users\TTOMCZA.EMEA\Dev\Projektarbeit-MYP\backend
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - ⏰ Startzeit: 2025-06-11T09:25:48.820576
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - 🪟 Windows-Modus: Aktiviert
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - 🔒 Windows-sichere Log-Rotation: Aktiviert
2025-06-11 09:25:48 - [startup] startup - [INFO] INFO - ==================================================

View File

@ -35,3 +35,47 @@
2025-06-11 08:52:54 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.104 nicht erreichbar
2025-06-11 08:52:56 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.106 nicht erreichbar
2025-06-11 08:52:56 - [tapo_control] tapo_control - [INFO] INFO - Dashboard geladen: 6 Steckdosen, 0 online
2025-06-11 09:08:22 - [tapo_control] tapo_control - [INFO] INFO - Tapo Dashboard aufgerufen von Benutzer: Administrator
2025-06-11 09:08:25 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.100 nicht erreichbar
2025-06-11 09:08:27 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.101 nicht erreichbar
2025-06-11 09:08:29 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.102 nicht erreichbar
2025-06-11 09:08:31 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.103 nicht erreichbar
2025-06-11 09:08:33 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.104 nicht erreichbar
2025-06-11 09:08:35 - [tapo_control] tapo_control - [WARNING] WARNING - ⚠️ Tapo-Steckdose 192.168.0.106 nicht erreichbar
2025-06-11 09:08:35 - [tapo_control] tapo_control - [INFO] INFO - Dashboard geladen: 6 Steckdosen, 0 online
2025-06-11 09:09:06 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:09:18 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:09:36 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:09:49 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:10:06 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:10:19 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:10:36 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:10:49 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:11:06 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:11:19 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:11:36 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:11:49 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:12:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:12:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:13:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:13:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:14:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:14:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:15:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:15:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:17:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:17:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:18:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:18:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:19:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:19:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:20:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:20:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:21:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:21:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:22:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:22:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:23:42 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:23:55 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar
2025-06-11 09:24:17 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage für 6 Tapo-Steckdosen gestartet
2025-06-11 09:24:29 - [tapo_control] tapo_control - [INFO] INFO - Status-Abfrage abgeschlossen: 0/6 Steckdosen erreichbar

View File

@ -332,3 +332,13 @@
2025-06-11 09:08:43 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 5/6: 192.168.0.102
2025-06-11 09:08:49 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 6/6: 192.168.0.105
2025-06-11 09:08:55 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ steckdosen-erkennung abgeschlossen: 0/6 steckdosen gefunden in 36.1s
2025-06-11 09:25:48 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ tapo controller initialisiert
2025-06-11 09:25:50 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 starte automatische tapo-steckdosenerkennung...
2025-06-11 09:25:50 - [tapo_controller] tapo_controller - [INFO] INFO - 🔄 teste 6 standard-ips aus der konfiguration
2025-06-11 09:25:50 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 1/6: 192.168.0.103
2025-06-11 09:25:56 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 2/6: 192.168.0.104
2025-06-11 09:26:02 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 3/6: 192.168.0.100
2025-06-11 09:26:08 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 4/6: 192.168.0.101
2025-06-11 09:26:14 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 5/6: 192.168.0.102
2025-06-11 09:26:20 - [tapo_controller] tapo_controller - [INFO] INFO - 🔍 teste ip 6/6: 192.168.0.105
2025-06-11 09:26:26 - [tapo_controller] tapo_controller - [INFO] INFO - ✅ steckdosen-erkennung abgeschlossen: 0/6 steckdosen gefunden in 36.1s

View File

@ -107,3 +107,7 @@
2025-06-11 09:08:20 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:08:22 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:08:36 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:24:19 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:25:49 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:26:14 - [user] user - [INFO] INFO - User admin retrieved settings via API
2025-06-11 09:26:20 - [user] user - [INFO] INFO - User admin retrieved settings via API

View File

@ -90,3 +90,7 @@
2025-06-11 09:08:16 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-11 09:08:16 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-11 09:08:16 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet
2025-06-11 09:25:48 - [windows_fixes] windows_fixes - [INFO] INFO - 🔧 Wende Windows-spezifische Fixes an...
2025-06-11 09:25:48 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Subprocess automatisch gepatcht für UTF-8 Encoding (run + Popen)
2025-06-11 09:25:48 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Globaler subprocess-Patch angewendet
2025-06-11 09:25:48 - [windows_fixes] windows_fixes - [INFO] INFO - ✅ Alle Windows-Fixes erfolgreich angewendet