from flask import Blueprint, render_template, redirect, url_for, flash, request from flask_login import login_required, current_user from extensions import db, hash_password from models import User, ROLES, ESPORT_GAMES users_bp = Blueprint('users', __name__, url_prefix='/users') @users_bp.route('') @login_required def list_users(): if current_user.role != 'president': flash('Only the president can manage users.', 'danger') return redirect(url_for('main.dashboard')) users = User.query.order_by(User.role, User.full_name).all() return render_template('pages/users.html', users=users, roles=ROLES) @users_bp.route('//edit', methods=['GET', 'POST']) @login_required def edit_user(user_id): if current_user.role != 'president': flash('Only the president can edit users.', 'danger') return redirect(url_for('main.dashboard')) user = User.query.get_or_404(user_id) if request.method == 'POST': full_name = request.form.get('full_name') email = request.form.get('email') phone = request.form.get('phone') role = request.form.get('role') is_active = request.form.get('is_active_account') == 'on' if role not in ROLES: flash('Invalid role selected.', 'danger') return render_template('pages/edit_user.html', user=user, roles=ROLES, esport_games=ESPORT_GAMES) # E-Sports fields selected_games = request.form.getlist('games') trn_username = request.form.get('trn_username', '').strip() discord_username = request.form.get('discord_username', '').strip() league_os_profile = request.form.get('league_os_profile', '').strip() user.full_name = full_name user.email = email user.phone = phone user.role = role user.is_active_account = is_active user.games = ','.join(selected_games) if selected_games else None user.trn_username = trn_username or None user.discord_username = discord_username or None user.league_os_profile = league_os_profile or None password = request.form.get('password') if password: user.password_hash = hash_password(password) db.session.commit() flash(f'User {user.full_name} updated successfully!', 'success') return redirect(url_for('users.list_users')) return render_template('pages/edit_user.html', user=user, roles=ROLES, esport_games=ESPORT_GAMES) @users_bp.route('//delete', methods=['POST']) @login_required def delete_user(user_id): if current_user.role != 'president': flash('Only the president can delete users.', 'danger') return redirect(url_for('main.dashboard')) if current_user.id == user_id: flash('You cannot delete your own account.', 'danger') return redirect(url_for('users.list_users')) user = User.query.get_or_404(user_id) db.session.delete(user) db.session.commit() flash(f'User {user.full_name} has been removed.', 'success') return redirect(url_for('users.list_users')) @users_bp.route('/create', methods=['GET', 'POST']) @login_required def create_user(): if current_user.role != 'president': flash('Only the president can create users.', 'danger') return redirect(url_for('main.dashboard')) if request.method == 'POST': username = request.form.get('username') email = request.form.get('email') password = request.form.get('password') full_name = request.form.get('full_name') phone = request.form.get('phone') role = request.form.get('role') if role not in ROLES: flash('Invalid role selected.', 'danger') return render_template('pages/create_user.html', roles=ROLES) if User.query.filter_by(username=username).first(): flash('Username already exists.', 'danger') return render_template('pages/create_user.html', roles=ROLES) if User.query.filter_by(email=email).first(): flash('Email already registered.', 'danger') return render_template('pages/create_user.html', roles=ROLES) hashed_password = hash_password(password) user = User( username=username, password_hash=hashed_password, role=role, full_name=full_name, email=email, phone=phone ) db.session.add(user) db.session.commit() flash(f'User {full_name} created as {role}!', 'success') return redirect(url_for('users.list_users')) return render_template('pages/create_user.html', roles=ROLES) @users_bp.route('/profile') @login_required def profile(): return render_template('pages/profile.html', user=current_user) @users_bp.route('/profile/edit', methods=['GET', 'POST']) @login_required def edit_profile(): if request.method == 'POST': full_name = request.form.get('full_name') email = request.form.get('email') phone = request.form.get('phone') # E-Sports fields selected_games = request.form.getlist('games') trn_username = request.form.get('trn_username', '').strip() discord_username = request.form.get('discord_username', '').strip() league_os_profile = request.form.get('league_os_profile', '').strip() # Check email uniqueness if changed if email != current_user.email and User.query.filter_by(email=email).first(): flash('Email already in use.', 'danger') return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES) current_user.full_name = full_name current_user.email = email current_user.phone = phone current_user.games = ','.join(selected_games) if selected_games else None current_user.trn_username = trn_username or None current_user.discord_username = discord_username or None current_user.league_os_profile = league_os_profile or None password = request.form.get('password') if password: current_user.password_hash = hash_password(password) db.session.commit() flash('Profile updated successfully!', 'success') return redirect(url_for('users.profile')) return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES)