168 lines
7.2 KiB
Python
168 lines
7.2 KiB
Python
from flask import Blueprint, render_template, request, jsonify, redirect, url_for, abort
|
|
from flask_login import current_user, login_required
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
from functools import wraps
|
|
|
|
from models import User, UserPermission, get_cached_session
|
|
from utils.logging_config import get_logger
|
|
|
|
users_blueprint = Blueprint('users', __name__)
|
|
logger = get_logger("users")
|
|
|
|
def users_admin_required(f):
|
|
"""Decorator zur Prüfung der Admin-Berechtigung für Users Blueprint."""
|
|
@wraps(f)
|
|
@login_required
|
|
def users_decorated_function(*args, **kwargs):
|
|
if not current_user.is_admin:
|
|
abort(403, "Nur Administratoren haben Zugriff auf diese Seite")
|
|
return f(*args, **kwargs)
|
|
return users_decorated_function
|
|
|
|
@users_blueprint.route('/admin/users/<int:user_id>/permissions', methods=['GET'])
|
|
@users_admin_required
|
|
def admin_user_permissions(user_id):
|
|
"""Benutzerberechtigungen anzeigen und bearbeiten."""
|
|
with get_cached_session() as db_session:
|
|
user = db_session.query(User).filter_by(id=user_id).first()
|
|
if not user:
|
|
abort(404, "Benutzer nicht gefunden")
|
|
|
|
# Berechtigungen laden oder erstellen, falls nicht vorhanden
|
|
permission = db_session.query(UserPermission).filter_by(user_id=user_id).first()
|
|
if not permission:
|
|
permission = UserPermission(user_id=user_id)
|
|
db_session.add(permission)
|
|
db_session.commit()
|
|
|
|
return render_template('admin_user_permissions.html', user=user, permission=permission)
|
|
|
|
@users_blueprint.route('/api/users/<int:user_id>/permissions', methods=['GET'])
|
|
@login_required
|
|
def api_get_user_permissions(user_id):
|
|
"""Benutzerberechtigungen als JSON zurückgeben."""
|
|
# Nur Admins oder der Benutzer selbst darf seine Berechtigungen sehen
|
|
if not current_user.is_admin and current_user.id != user_id:
|
|
return jsonify({"error": "Keine Berechtigung"}), 403
|
|
|
|
try:
|
|
with get_cached_session() as db_session:
|
|
permission = db_session.query(UserPermission).filter_by(user_id=user_id).first()
|
|
|
|
if not permission:
|
|
# Falls keine Berechtigungen existieren, Standard-Werte zurückgeben
|
|
return jsonify({
|
|
"user_id": user_id,
|
|
"can_start_jobs": False,
|
|
"needs_approval": True,
|
|
"can_approve_jobs": False
|
|
})
|
|
|
|
return jsonify(permission.to_dict())
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Abrufen der Benutzerberechtigungen: {str(e)}")
|
|
return jsonify({"error": "Fehler beim Verarbeiten der Anfrage"}), 500
|
|
|
|
@users_blueprint.route('/api/users/<int:user_id>/permissions', methods=['PUT'])
|
|
@users_admin_required
|
|
def api_update_user_permissions(user_id):
|
|
"""Benutzerberechtigungen aktualisieren."""
|
|
try:
|
|
data = request.get_json()
|
|
if not data:
|
|
return jsonify({"error": "Keine Daten erhalten"}), 400
|
|
|
|
with get_cached_session() as db_session:
|
|
# Benutzer prüfen
|
|
user = db_session.query(User).filter_by(id=user_id).first()
|
|
if not user:
|
|
return jsonify({"error": "Benutzer nicht gefunden"}), 404
|
|
|
|
# Berechtigungen laden oder erstellen
|
|
permission = db_session.query(UserPermission).filter_by(user_id=user_id).first()
|
|
if not permission:
|
|
permission = UserPermission(user_id=user_id)
|
|
db_session.add(permission)
|
|
|
|
# Berechtigungen aktualisieren
|
|
if 'can_start_jobs' in data:
|
|
permission.can_start_jobs = bool(data['can_start_jobs'])
|
|
|
|
if 'needs_approval' in data:
|
|
permission.needs_approval = bool(data['needs_approval'])
|
|
|
|
if 'can_approve_jobs' in data:
|
|
permission.can_approve_jobs = bool(data['can_approve_jobs'])
|
|
|
|
db_session.commit()
|
|
|
|
logger.info(f"Berechtigungen für Benutzer {user_id} aktualisiert durch Admin {current_user.id}")
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"permissions": permission.to_dict()
|
|
})
|
|
|
|
except SQLAlchemyError as e:
|
|
logger.error(f"Datenbankfehler beim Aktualisieren der Benutzerberechtigungen: {str(e)}")
|
|
return jsonify({"error": "Datenbankfehler beim Verarbeiten der Anfrage"}), 500
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Aktualisieren der Benutzerberechtigungen: {str(e)}")
|
|
return jsonify({"error": "Fehler beim Verarbeiten der Anfrage"}), 500
|
|
|
|
@users_blueprint.route('/admin/users/<int:user_id>/permissions/update', methods=['POST'])
|
|
@users_admin_required
|
|
def admin_update_user_permissions(user_id):
|
|
"""Benutzerberechtigungen über Formular aktualisieren."""
|
|
try:
|
|
# Formularfelder auslesen
|
|
can_start_jobs = request.form.get('can_start_jobs') == 'on'
|
|
needs_approval = request.form.get('needs_approval') == 'on'
|
|
can_approve_jobs = request.form.get('can_approve_jobs') == 'on'
|
|
|
|
with get_cached_session() as db_session:
|
|
# Benutzer prüfen
|
|
user = db_session.query(User).filter_by(id=user_id).first()
|
|
if not user:
|
|
abort(404, "Benutzer nicht gefunden")
|
|
|
|
# Berechtigungen laden oder erstellen
|
|
permission = db_session.query(UserPermission).filter_by(user_id=user_id).first()
|
|
if not permission:
|
|
permission = UserPermission(user_id=user_id)
|
|
db_session.add(permission)
|
|
|
|
# Berechtigungen aktualisieren
|
|
permission.can_start_jobs = can_start_jobs
|
|
permission.needs_approval = needs_approval
|
|
permission.can_approve_jobs = can_approve_jobs
|
|
|
|
db_session.commit()
|
|
|
|
logger.info(f"Berechtigungen für Benutzer {user_id} aktualisiert durch Admin {current_user.id} (Formular)")
|
|
|
|
return redirect(url_for('users.admin_user_permissions', user_id=user_id))
|
|
|
|
except Exception as e:
|
|
logger.error(f"Fehler beim Aktualisieren der Benutzerberechtigungen: {str(e)}")
|
|
abort(500, "Fehler beim Verarbeiten der Anfrage")
|
|
|
|
# Erweiterung des bestehenden Benutzer-Bearbeitungsformulars
|
|
@users_blueprint.route('/admin/users/<int:user_id>/edit/permissions', methods=['GET'])
|
|
@users_admin_required
|
|
def admin_edit_user_permissions_section(user_id):
|
|
"""Rendert nur den Berechtigungsteil für das Benutzer-Edit-Formular."""
|
|
with get_cached_session() as db_session:
|
|
user = db_session.query(User).filter_by(id=user_id).first()
|
|
if not user:
|
|
abort(404, "Benutzer nicht gefunden")
|
|
|
|
# Berechtigungen laden oder erstellen, falls nicht vorhanden
|
|
permission = db_session.query(UserPermission).filter_by(user_id=user_id).first()
|
|
if not permission:
|
|
permission = UserPermission(user_id=user_id)
|
|
db_session.add(permission)
|
|
db_session.commit()
|
|
|
|
return render_template('_user_permissions_form.html', user=user, permission=permission) |