from flask import Blueprint, render_template, redirect, url_for, flash from flask_login import login_required, current_user from extensions import db from models import User, Tryout, Evaluation, TryoutRegistration, Team, TeamMember from sqlalchemy import func main_bp = Blueprint('main', __name__) @main_bp.route('/') def index(): return redirect(url_for('auth.login')) @main_bp.route('/dashboard') @login_required def dashboard(): user = current_user stats = {} if user.role == 'president': stats['total_users'] = User.query.count() stats['total_players'] = User.query.filter_by(role='player').count() stats['total_tryouts'] = Tryout.query.count() stats['total_evaluations'] = Evaluation.query.count() stats['active_tryouts'] = Tryout.query.filter_by(status='in_progress').count() stats['upcoming_tryouts'] = Tryout.query.filter_by(status='upcoming').count() stats['recent_users'] = User.query.order_by(User.created_at.desc()).limit(5).all() stats['recent_tryouts'] = Tryout.query.order_by(Tryout.created_at.desc()).limit(5).all() elif user.role == 'manager': stats['total_tryouts'] = Tryout.query.filter_by(created_by=user.id).count() stats['active_tryouts'] = Tryout.query.filter_by(created_by=user.id, status='in_progress').count() stats['total_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).count() stats['my_tryouts'] = Tryout.query.filter_by(created_by=user.id).order_by(Tryout.date.desc()).limit(5).all() elif user.role == 'coach': stats['my_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).count() stats['pending_evaluations'] = 0 registrations = TryoutRegistration.query.filter(TryoutRegistration.status.in_(['registered', 'attended'])).all() registered_player_ids = [r.player_id for r in registrations] evaluated_player_ids = [e.player_id for e in Evaluation.query.filter_by(evaluator_id=user.id).all()] stats['pending_evaluations'] = len(set(registered_player_ids) - set(evaluated_player_ids)) stats['my_recent_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).order_by(Evaluation.created_at.desc()).limit(5).all() elif user.role == 'player': stats['my_tryouts'] = TryoutRegistration.query.filter_by(player_id=user.id).count() stats['my_evaluations'] = Evaluation.query.filter_by(player_id=user.id).count() stats['average_score'] = db.session.query(func.avg(Evaluation.overall_score)).filter_by(player_id=user.id).scalar() or 0 stats['my_registrations'] = TryoutRegistration.query.filter_by(player_id=user.id).order_by(TryoutRegistration.registered_at.desc()).limit(5).all() stats['my_eval_list'] = Evaluation.query.filter_by(player_id=user.id).order_by(Evaluation.created_at.desc()).limit(5).all() elif user.role == 'scout': stats['total_players'] = User.query.filter_by(role='player').count() stats['total_evaluations'] = Evaluation.query.count() stats['avg_scores'] = db.session.query( Evaluation.player_id, func.avg(Evaluation.overall_score).label('avg_score') ).group_by(Evaluation.player_id).order_by(func.avg(Evaluation.overall_score).desc()).limit(5).all() stats['top_players'] = [] for row in stats['avg_scores']: p = User.query.get(row.player_id) if p: stats['top_players'].append((p, round(row.avg_score, 1))) return render_template('pages/dashboard.html', user=user, stats=stats)