auth ist im kasten
Formeleon Deployment Pipeline / Deploy to Dev Environment (push) Successful in 4s
Formeleon Deployment Pipeline / Deploy to Production Environment (push) Has been skipped

This commit is contained in:
br committed 2026-08-04 23:07:18 +02:00
1 parent 8498781c85
commit 7f81932fa5
14 files changed
+843 -443

No files matched your search

+101 -6
View File
@@ -524,20 +524,21 @@ def update_submission_status(submission_id):
@admin_required
def list_users():
"""List all users (admin only)."""
user = get_current_user()
admin_user = get_current_user()
users = UserAdminService.get_users()
return render_template('admin/users/list.html',
user=user,
admin_user=admin_user,
users=users,
dev_mode=current_app.config.get('DEV_MODE', False))
dev_mode=current_app.config.get('DEV_MODE', False),
is_admin=admin_user.is_admin())
@admin_bp.route('/users/<user_id>', methods=['GET', 'POST'])
@admin_required
def view_user(user_id):
"""View and edit a user (admin only)."""
user = get_current_user()
admin_user = get_current_user()
target_user = User.query.get(user_id)
if not target_user:
@@ -546,7 +547,7 @@ def view_user(user_id):
if request.method == 'POST':
UserAdminService.update_user(
target_user, request.form.get('email'), request.form.get('name'),
request.form.get('role'), user
request.form.get('role'), admin_user
)
flash('User updated successfully!', 'success')
@@ -556,7 +557,7 @@ def view_user(user_id):
tenants = target_user.tenants
return render_template('admin/users/view.html',
user=user,
admin_user=admin_user,
target_user=target_user,
tenants=tenants,
dev_mode=current_app.config.get('DEV_MODE', False),
@@ -584,6 +585,100 @@ def delete_user(user_id):
return redirect(url_for('admin.list_users'))
@admin_bp.route('/users/<user_id>/tenants', methods=['GET', 'POST'])
@admin_required
def manage_user_tenants(user_id):
"""Manage tenant assignments for a user (admin only)."""
admin_user = get_current_user()
target_user = User.query.get(user_id)
if not target_user:
abort(404, description='User not found')
if request.method == 'POST':
# Add or remove tenant assignments
action = request.form.get('action')
tenant_id = request.form.get('tenant_id')
if action == 'add' and tenant_id:
tenant = Tenant.query.get(tenant_id)
if tenant and tenant not in target_user.tenants:
target_user.tenants.append(tenant)
db.session.commit()
AuditLog.log_action(
action='assign_tenant',
resource_type='user',
user=admin_user,
resource_id=target_user.id,
details={'tenant_id': tenant_id, 'tenant_name': tenant.name}
)
flash(f'User assigned to tenant {tenant.name}!', 'success')
elif action == 'remove' and tenant_id:
tenant = Tenant.query.get(tenant_id)
if tenant and tenant in target_user.tenants:
target_user.tenants.remove(tenant)
db.session.commit()
AuditLog.log_action(
action='remove_tenant',
resource_type='user',
user=admin_user,
resource_id=target_user.id,
details={'tenant_id': tenant_id, 'tenant_name': tenant.name}
)
flash(f'User removed from tenant {tenant.name}!', 'success')
return redirect(url_for('admin.manage_user_tenants', user_id=target_user.id))
# Get all tenants and user's current tenants
all_tenants = Tenant.query.order_by(Tenant.name).all()
user_tenants = list(target_user.tenants)
return render_template('admin/users/tenants.html',
admin_user=admin_user,
target_user=target_user,
all_tenants=all_tenants,
user_tenants=user_tenants,
dev_mode=current_app.config.get('DEV_MODE', False))
@admin_bp.route('/users/<user_id>/role', methods=['POST'])
@admin_required
def update_user_role(user_id):
"""Update user role (admin only)."""
admin_user = get_current_user()
target_user = User.query.get(user_id)
if not target_user:
abort(404, description='User not found')
# Don't allow changing own role
if target_user.id == admin_user.id:
flash('Cannot change your own role!', 'error')
return redirect(url_for('admin.view_user', user_id=target_user.id))
new_role = request.form.get('role')
if new_role and new_role in [r.value for r in UserRole]:
old_role = target_user.role.value
target_user.role = UserRole(new_role)
db.session.commit()
AuditLog.log_action(
action='update_role',
resource_type='user',
user=admin_user,
resource_id=target_user.id,
details={'old_role': old_role, 'new_role': new_role}
)
flash(f'User role updated to {new_role}!', 'success')
else:
flash('Invalid role!', 'error')
return redirect(url_for('admin.view_user', user_id=target_user.id))
@admin_bp.route('/profile')
@login_required
def profile():