"feat: Update documentation and fix issues in various files"

This commit is contained in:
2025-05-29 18:08:58 +02:00
parent 92d0fe2190
commit 9ee6e015b5
8 changed files with 1236 additions and 10 deletions

View File

@@ -10,7 +10,7 @@ from flask_wtf.csrf import CSRFError
from werkzeug.utils import secure_filename
from werkzeug.security import generate_password_hash, check_password_hash
from sqlalchemy.orm import sessionmaker, joinedload
from sqlalchemy import func
from sqlalchemy import func, text
from functools import wraps
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import List, Dict, Tuple
@@ -134,10 +134,56 @@ login_manager.login_message_category = "info"
@login_manager.user_loader
def load_user(user_id):
db_session = get_db_session()
user = db_session.query(User).filter(User.id == user_id).first()
db_session.close()
return user
"""
Robuster User-Loader mit Error-Handling für Schema-Probleme.
"""
try:
db_session = get_db_session()
# Robuste Abfrage mit Error-Handling
try:
user = db_session.query(User).filter(User.id == user_id).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}: {str(db_error)}")
# Manuelle Abfrage nur mit Basis-Feldern
try:
result = db_session.execute(
text("SELECT id, email, password_hash, name, role, active FROM users WHERE id = :user_id"),
{"user_id": user_id}
).fetchone()
if result:
# Manuell User-Objekt erstellen
user = User()
user.id = result[0]
user.email = result[1] if len(result) > 1 else f"user_{user_id}@system.local"
user.password_hash = result[2] if len(result) > 2 else ""
user.name = result[3] if len(result) > 3 else f"User {user_id}"
user.role = result[4] if len(result) > 4 else "user"
user.active = result[5] if len(result) > 5 else True
# Standard-Werte für fehlende Felder
user.username = getattr(user, 'username', user.email.split('@')[0])
user.created_at = getattr(user, 'created_at', datetime.now())
user.last_login = getattr(user, 'last_login', None)
user.updated_at = getattr(user, 'updated_at', datetime.now())
db_session.close()
return user
except Exception as manual_error:
app_logger.error(f"Auch manuelle User-Abfrage fehlgeschlagen: {str(manual_error)}")
db_session.close()
return None
except Exception as e:
app_logger.error(f"Kritischer Fehler im User-Loader für ID {user_id}: {str(e)}")
return None
# Jinja2 Context Processors
@app.context_processor
@@ -230,7 +276,9 @@ def admin_required(f):
@wraps(f)
@login_required
def decorated_function(*args, **kwargs):
app_logger.info(f"Admin-Check für Funktion {f.__name__}: User authenticated: {current_user.is_authenticated}, User ID: {current_user.id if current_user.is_authenticated else 'None'}, Is Admin: {current_user.is_admin if current_user.is_authenticated else 'None'}")
if not current_user.is_admin:
app_logger.warning(f"Admin-Zugriff verweigert für User {current_user.id if current_user.is_authenticated else 'Anonymous'} auf Funktion {f.__name__}")
return jsonify({"error": "Nur Administratoren haben Zugriff"}), 403
return f(*args, **kwargs)
return decorated_function
@@ -5111,6 +5159,8 @@ def refresh_dashboard():
def get_admin_guest_requests():
"""Gibt alle Gastaufträge für Admin-Verwaltung zurück"""
try:
app_logger.info(f"API-Aufruf /api/admin/guest-requests von User {current_user.id if current_user.is_authenticated else 'Anonymous'}")
db_session = get_db_session()
# Parameter auslesen
@@ -5194,7 +5244,7 @@ def get_admin_guest_requests():
})
except Exception as e:
app_logger.error(f"Fehler beim Laden der Admin-Gastaufträge: {str(e)}")
app_logger.error(f"Fehler beim Laden der Admin-Gastaufträge: {str(e)}", exc_info=True)
return jsonify({
'success': False,
'message': f'Fehler beim Laden der Gastaufträge: {str(e)}'