retrait de page html redondantes, ajout de la modification des username et affichage des userrname au lieu des noms complets

This commit is contained in:
cedrick2711
2026-07-23 21:44:35 -04:00
parent bf4c0ce4b1
commit 322b67e26f
35 changed files with 188 additions and 119 deletions
Binary file not shown.
+58
View File
@@ -0,0 +1,58 @@
"""Data migration script to fix corrupted username fields.
This script fixes the bug where user.username was incorrectly set to full_name
instead of preserving the actual username. It migrates existing users by:
1. Setting username to a slug version of full_name (e.g., 'sarah-johnson')
2. Clearing full_name to empty string (will be collected via profile edit)
Run this script once to fix existing database records.
"""
from app import create_app
from extensions import db
from models import User
def slugify(name):
"""Convert a name to a username-friendly slug.
Args:
name (str): Full name to convert.
Returns:
str: Slugified username.
"""
return name.lower().replace(' ', '-').replace("'", '')
def migrate():
"""Migrate existing users to fix corrupted username/full_name fields."""
with app.app_context():
users = User.query.all()
migrated = 0
for user in users:
# If username looks like a full name (contains spaces), migrate it
if ' ' in user.username:
# Save the current username (which is actually the full name)
actual_full_name = user.username
# Generate a username from the full name
new_username = slugify(actual_full_name)
# Ensure uniqueness
base_username = new_username
counter = 1
while User.query.filter_by(username=new_username).first() and User.query.get(user.id).username != new_username:
new_username = f"{base_username}-{counter}"
counter += 1
user.username = new_username
user.full_name = actual_full_name
migrated += 1
print(f"Migrated: '{actual_full_name}' -> username='{new_username}', full_name='{actual_full_name}'")
db.session.commit()
print(f"\n[MIGRATION] Migrated {migrated} users")
print("Done! Usernames are now properly stored.")
print("Users should edit their profile to set a proper username and full name.")
if __name__ == '__main__':
app = create_app()
migrate()
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -61,7 +61,7 @@ def login():
next_page = request.args.get('next') next_page = request.args.get('next')
if next_page and not is_safe_url(next_page): if next_page and not is_safe_url(next_page):
next_page = None next_page = None
flash(f'Welcome back, {user.full_name}!', 'success') flash(f'Welcome back, {user.username}!', 'success')
return redirect(next_page) if next_page else redirect(url_for('main.dashboard')) return redirect(next_page) if next_page else redirect(url_for('main.dashboard'))
else: else:
flash('Login unsuccessful. Please check username and password.', 'danger') flash('Login unsuccessful. Please check username and password.', 'danger')
+2 -2
View File
@@ -67,8 +67,8 @@ def list_evaluations():
sort_map = { sort_map = {
'tryout': Tryout.title, 'tryout': Tryout.title,
'player': player_alias.full_name, 'player': player_alias.username,
'evaluator': evaluator_alias.full_name, 'evaluator': evaluator_alias.username,
'mecanics_score': Evaluation.mecanics_score, 'mecanics_score': Evaluation.mecanics_score,
'cohesion_score': Evaluation.cohesion_score, 'cohesion_score': Evaluation.cohesion_score,
'communication_score': Evaluation.communication_score, 'communication_score': Evaluation.communication_score,
+6 -6
View File
@@ -82,7 +82,7 @@ def api_events():
# Player scrim - show all participants # Player scrim - show all participants
player_names = [] player_names = []
for p in match.participants.all(): for p in match.participants.all():
player_name = p.player.full_name if p.player else 'Unknown Player' player_name = p.player.username if p.player else 'Unknown Player'
player_names.append(player_name) player_names.append(player_name)
participants_str = ', '.join(player_names) if player_names else 'No players' participants_str = ', '.join(player_names) if player_names else 'No players'
match_desc = participants_str + (f"<br>{match.description}" if match.description else '') match_desc = participants_str + (f"<br>{match.description}" if match.description else '')
@@ -186,11 +186,11 @@ def api_events_for_tryout(tryout_id):
team1_players = [] team1_players = []
for p in match.participants.filter_by(team_side=1).all(): for p in match.participants.filter_by(team_side=1).all():
if p.player: if p.player:
team1_players.append(p.player.full_name) team1_players.append(p.player.username)
team2_players = [] team2_players = []
for p in match.participants.filter_by(team_side=2).all(): for p in match.participants.filter_by(team_side=2).all():
if p.player: if p.player:
team2_players.append(p.player.full_name) team2_players.append(p.player.username)
if team1_players and team2_players: if team1_players and team2_players:
participants_str = f"{', '.join(team1_players)} vs {', '.join(team2_players)}" participants_str = f"{', '.join(team1_players)} vs {', '.join(team2_players)}"
else: else:
@@ -198,7 +198,7 @@ def api_events_for_tryout(tryout_id):
else: else:
player_names = [] player_names = []
for p in match.participants.all(): for p in match.participants.all():
player_name = p.player.full_name if p.player else 'Unknown Player' player_name = p.player.username if p.player else 'Unknown Player'
player_names.append(player_name) player_names.append(player_name)
participants_str = ', '.join(player_names) if player_names else 'No players' participants_str = ', '.join(player_names) if player_names else 'No players'
@@ -295,7 +295,7 @@ def create_match(tryout_id):
teams = Team.query.filter_by(tryout_id=tryout_id).all() teams = Team.query.filter_by(tryout_id=tryout_id).all()
registrations = TryoutRegistration.query.filter_by(tryout_id=tryout_id).all() registrations = TryoutRegistration.query.filter_by(tryout_id=tryout_id).all()
all_players = [User.query.get(r.player_id) for r in registrations if User.query.get(r.player_id)] all_players = [User.query.get(r.player_id) for r in registrations if User.query.get(r.player_id)]
all_players = sorted([p for p in all_players if p], key=lambda x: x.full_name) all_players = sorted([p for p in all_players if p], key=lambda x: x.username)
if request.method == 'POST': if request.method == 'POST':
title = request.form.get('title') title = request.form.get('title')
@@ -453,7 +453,7 @@ def edit_match(match_id):
# Only show players registered for this tryout # Only show players registered for this tryout
registrations = TryoutRegistration.query.filter_by(tryout_id=tryout.id).all() registrations = TryoutRegistration.query.filter_by(tryout_id=tryout.id).all()
all_players = [User.query.get(r.player_id) for r in registrations if r.player_id] all_players = [User.query.get(r.player_id) for r in registrations if r.player_id]
all_players = sorted([p for p in all_players if p], key=lambda x: x.full_name) all_players = sorted([p for p in all_players if p], key=lambda x: x.username)
current_player_ids = [p.player_id for p in match.participants.all()] current_player_ids = [p.player_id for p in match.participants.all()]
# Get players grouped by team side for player_vs_player matches # Get players grouped by team side for player_vs_player matches
team1_player_ids = [p.player_id for p in match.participants.filter_by(team_side=1).all()] team1_player_ids = [p.player_id for p in match.participants.filter_by(team_side=1).all()]
+10 -10
View File
@@ -34,9 +34,9 @@ def list_teams():
flash('You do not have permission to view teams.', 'danger') flash('You do not have permission to view teams.', 'danger')
return redirect(url_for('main.dashboard')) return redirect(url_for('main.dashboard'))
coaches = User.query.filter_by(role='coach').order_by(User.full_name).all() coaches = User.query.filter_by(role='coach').order_by(User.username).all()
managers = User.query.filter_by(role='manager').order_by(User.full_name).all() managers = User.query.filter_by(role='manager').order_by(User.username).all()
all_players = User.query.filter_by(role='player').order_by(User.full_name).all() all_players = User.query.filter_by(role='player').order_by(User.username).all()
return render_template('pages/teams.html', teams=teams, coaches=coaches, managers=managers, all_players=all_players, can_manage=can_manage) return render_template('pages/teams.html', teams=teams, coaches=coaches, managers=managers, all_players=all_players, can_manage=can_manage)
@@ -239,7 +239,7 @@ def add_player(team_id):
# Check if player is already on this team # Check if player is already on this team
existing = TeamPlayer.query.filter_by(player_id=player.id, org_team_id=team.id).first() existing = TeamPlayer.query.filter_by(player_id=player.id, org_team_id=team.id).first()
if existing: if existing:
flash(f'{player.full_name} is already on {team.name}.', 'info') flash(f'{player.username} is already on {team.name}.', 'info')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
# Add player to the team using TeamPlayer model (allows multiple teams) # Add player to the team using TeamPlayer model (allows multiple teams)
@@ -250,7 +250,7 @@ def add_player(team_id):
) )
db.session.add(tp) db.session.add(tp)
db.session.commit() db.session.commit()
flash(f'{player.full_name} added to {team.name}!', 'success') flash(f'{player.username} added to {team.name}!', 'success')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
@@ -275,12 +275,12 @@ def remove_player(team_id, player_id):
tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first() tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first()
if not tp: if not tp:
flash(f'{player.full_name} is not on {team.name}.', 'danger') flash(f'{player.username} is not on {team.name}.', 'danger')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
db.session.delete(tp) db.session.delete(tp)
db.session.commit() db.session.commit()
flash(f'{player.full_name} removed from {team.name}.', 'success') flash(f'{player.username} removed from {team.name}.', 'success')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
@@ -312,7 +312,7 @@ def toggle_player_status(team_id, player_id):
'success': True, 'success': True,
'player_id': player_id, 'player_id': player_id,
'new_status': tp.status, 'new_status': tp.status,
'player_name': tp.player.full_name 'player_name': tp.player.username
}) })
@@ -379,7 +379,7 @@ def add_player_note(team_id, player_id):
# Verify player belongs to this team # Verify player belongs to this team
tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first() tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first()
if not tp: if not tp:
flash(f'{player.full_name} is not on {team.name}.', 'danger') flash(f'{player.username} is not on {team.name}.', 'danger')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
content = request.form.get('content', '').strip() content = request.form.get('content', '').strip()
@@ -392,6 +392,6 @@ def add_player_note(team_id, player_id):
) )
db.session.add(note) db.session.add(note)
db.session.commit() db.session.commit()
flash(f'Note added for {player.full_name}!', 'success') flash(f'Note added for {player.username}!', 'success')
return redirect(url_for('teams.list_teams')) return redirect(url_for('teams.list_teams'))
+10 -10
View File
@@ -73,8 +73,8 @@ def create_tryout():
return redirect(url_for('tryouts.list_tryouts')) return redirect(url_for('tryouts.list_tryouts'))
org_teams = OrgTeam.query.order_by(OrgTeam.name).all() org_teams = OrgTeam.query.order_by(OrgTeam.name).all()
managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.full_name).all() managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.username).all()
coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.full_name).all() coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.username).all()
if request.method == 'POST': if request.method == 'POST':
title = request.form.get('title') title = request.form.get('title')
@@ -265,7 +265,7 @@ def view_tryout(tryout_id):
# Only expose all_players to users who can manage players in this tryout # Only expose all_players to users who can manage players in this tryout
all_players = None all_players = None
if can_edit: if can_edit:
all_players = User.query.filter_by(role='player').order_by(User.full_name).all() all_players = User.query.filter_by(role='player').order_by(User.username).all()
# Get matches for this tryout with participant info # Get matches for this tryout with participant info
matches = Match.query.filter_by(tryout_id=tryout_id).order_by(Match.date, Match.start_time).all() matches = Match.query.filter_by(tryout_id=tryout_id).order_by(Match.date, Match.start_time).all()
@@ -275,12 +275,12 @@ def view_tryout(tryout_id):
participants = { participants = {
'team1': match.team1.name if match.team1 else 'TBD', 'team1': match.team1.name if match.team1 else 'TBD',
'team2': match.team2.name if match.team2 else 'TBD', 'team2': match.team2.name if match.team2 else 'TBD',
'team1_players': [{'name': m.player.full_name, 'position': m.position} for m in match.team1.members.all()] if match.team1 else [], 'team1_players': [{'name': m.player.username, 'position': m.position} for m in match.team1.members.all()] if match.team1 else [],
'team2_players': [{'name': m.player.full_name, 'position': m.position} for m in match.team2.members.all()] if match.team2 else [] 'team2_players': [{'name': m.player.username, 'position': m.position} for m in match.team2.members.all()] if match.team2 else []
} }
elif match.match_type == 'player_vs_player': elif match.match_type == 'player_vs_player':
team1_players = [{'name': p.player.full_name, 'position': p.position} for p in match.participants.filter_by(team_side=1).all() if p.player] team1_players = [{'name': p.player.username, 'position': p.position} for p in match.participants.filter_by(team_side=1).all() if p.player]
team2_players = [{'name': p.player.full_name, 'position': p.position} for p in match.participants.filter_by(team_side=2).all() if p.player] team2_players = [{'name': p.player.username, 'position': p.position} for p in match.participants.filter_by(team_side=2).all() if p.player]
participants = { participants = {
'team1': 'Team 1', 'team1': 'Team 1',
'team2': 'Team 2', 'team2': 'Team 2',
@@ -288,7 +288,7 @@ def view_tryout(tryout_id):
'team2_players': team2_players 'team2_players': team2_players
} }
else: else:
participants = [p.player.full_name for p in match.participants.all()] participants = [p.player.username for p in match.participants.all()]
match_data.append({ match_data.append({
'match': match, 'match': match,
'participants': participants 'participants': participants
@@ -433,7 +433,7 @@ def register_player(tryout_id):
existing = TryoutRegistration.query.filter_by(tryout_id=tryout_id, player_id=player.id).first() existing = TryoutRegistration.query.filter_by(tryout_id=tryout_id, player_id=player.id).first()
if existing: if existing:
flash(f'{player.full_name} is already registered for this tryout.', 'info') flash(f'{player.username} is already registered for this tryout.', 'info')
return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id))
if tryout.max_players: if tryout.max_players:
@@ -445,7 +445,7 @@ def register_player(tryout_id):
registration = TryoutRegistration(tryout_id=tryout_id, player_id=player.id) registration = TryoutRegistration(tryout_id=tryout_id, player_id=player.id)
db.session.add(registration) db.session.add(registration)
db.session.commit() db.session.commit()
flash(f'{player.full_name} registered for tryout!', 'success') flash(f'{player.username} registered for tryout!', 'success')
return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id))
+23 -17
View File
@@ -66,7 +66,7 @@ def list_users():
flash('Only the president can manage users.', 'danger') flash('Only the president can manage users.', 'danger')
return redirect(url_for('main.dashboard')) return redirect(url_for('main.dashboard'))
users = User.query.order_by(User.role, User.full_name).all() users = User.query.order_by(User.role, User.username).all()
return render_template('pages/users.html', users=users, roles=ROLES) return render_template('pages/users.html', users=users, roles=ROLES)
@@ -124,7 +124,7 @@ def edit_user(user_id):
user.password_hash = hash_password(password) user.password_hash = hash_password(password)
db.session.commit() db.session.commit()
flash(f'User {user.full_name} updated successfully!', 'success') flash(f'User {user.username} updated successfully!', 'success')
return redirect(url_for('users.list_users')) return redirect(url_for('users.list_users'))
user_gamertags = {gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in user.gamertags} user_gamertags = {gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in user.gamertags}
@@ -207,7 +207,7 @@ def delete_user(user_id):
db.session.delete(user) db.session.delete(user)
db.session.commit() db.session.commit()
flash(f'User {user.full_name} has been removed.', 'success') flash(f'User {user.username} has been removed.', 'success')
return redirect(url_for('users.list_users')) return redirect(url_for('users.list_users'))
@@ -292,6 +292,7 @@ def edit_profile():
Response: Edit form or redirect to profile. Response: Edit form or redirect to profile.
""" """
if request.method == 'POST': if request.method == 'POST':
username = request.form.get('username')
full_name = request.form.get('full_name') full_name = request.form.get('full_name')
email = request.form.get('email') email = request.form.get('email')
phone = request.form.get('phone') phone = request.form.get('phone')
@@ -301,10 +302,15 @@ def edit_profile():
discord_user_id = request.form.get('discord_user_id', '').strip() discord_user_id = request.form.get('discord_user_id', '').strip()
league_os_profile = request.form.get('league_os_profile', '').strip() league_os_profile = request.form.get('league_os_profile', '').strip()
if username != current_user.username and User.query.filter_by(username=username).first():
flash('Username already taken.', 'danger')
return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS, user_gamertags={gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in current_user.gamertags})
if email != current_user.email and User.query.filter_by(email=email).first(): if email != current_user.email and User.query.filter_by(email=email).first():
flash('Email already in use.', 'danger') flash('Email already in use.', 'danger')
return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS) return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS, user_gamertags={gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in current_user.gamertags})
current_user.username = username
current_user.full_name = full_name current_user.full_name = full_name
current_user.email = email current_user.email = email
current_user.phone = phone current_user.phone = phone
@@ -358,13 +364,13 @@ def get_disponibilities():
if not current_user.can_manage_teams() and not current_user.can_schedule_matches(): if not current_user.can_manage_teams() and not current_user.can_schedule_matches():
return jsonify({'error': 'Unauthorized'}), 403 return jsonify({'error': 'Unauthorized'}), 403
players = User.query.filter_by(role='player', is_active_account=True).order_by(User.full_name).all() players = User.query.filter_by(role='player', is_active_account=True).order_by(User.username).all()
result = {} result = {}
for player in players: for player in players:
disponibilities = list(player.disponibilities) disponibilities = list(player.disponibilities)
result[player.id] = { result[player.id] = {
'full_name': player.full_name, 'username': player.username,
'disponibilities': [ 'disponibilities': [
{ {
'id': d.id, 'id': d.id,
@@ -671,7 +677,7 @@ def upload_contract():
# Generate unique filename # Generate unique filename
original_filename = secure_filename(file.filename) original_filename = secure_filename(file.filename)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
stored_filename = f"{secure_filename(player.full_name)}_{timestamp}_{original_filename}" stored_filename = f"{secure_filename(player.username)}_{timestamp}_{original_filename}"
stored_filename = stored_filename.replace(' ', '_') stored_filename = stored_filename.replace(' ', '_')
# Save file # Save file
@@ -691,7 +697,7 @@ def upload_contract():
db.session.add(contract) db.session.add(contract)
db.session.commit() db.session.commit()
flash(f'Contract uploaded successfully for {player.full_name}!', 'success') flash(f'Contract uploaded successfully for {player.username}!', 'success')
return redirect(url_for('users.list_contracts')) return redirect(url_for('users.list_contracts'))
return render_template('pages/upload_contract.html', players=players) return render_template('pages/upload_contract.html', players=players)
@@ -955,13 +961,13 @@ def one_on_one():
# Send Discord notification # Send Discord notification
send_discord_notification( send_discord_notification(
player_name=current_user.full_name, player_name=current_user.username,
points=points, points=points,
date_str=date_str, date_str=date_str,
start_time_str=start_time_str, start_time_str=start_time_str,
end_time_str=end_time_str, end_time_str=end_time_str,
team_name=org_team.name if org_team else None, team_name=org_team.name if org_team else None,
coach_name=coach.full_name, coach_name=coach.username,
coach_discord=coach.discord_username, coach_discord=coach.discord_username,
coach_discord_id=coach.discord_user_id, coach_discord_id=coach.discord_user_id,
request_id=request_obj.id request_id=request_obj.id
@@ -1207,7 +1213,7 @@ def manage_personal_notes():
players = [] players = []
if org_team: if org_team:
player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()]
players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else []
if request.method == 'POST': if request.method == 'POST':
player_id = request.form.get('player_id', type=int) player_id = request.form.get('player_id', type=int)
@@ -1264,7 +1270,7 @@ def notes_dashboard():
players = [] players = []
if org_team: if org_team:
player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()]
players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else []
# Get existing team notes # Get existing team notes
team_notes = [] team_notes = []
@@ -1361,9 +1367,9 @@ def add_personal_note():
org_team = OrgTeam.query.filter_by(coach_id=current_user.id).first() org_team = OrgTeam.query.filter_by(coach_id=current_user.id).first()
if org_team: if org_team:
player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()]
players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else []
elif current_user.role in ['president', 'manager']: elif current_user.role in ['president', 'manager']:
players = User.query.filter_by(role='player').order_by(User.full_name).all() players = User.query.filter_by(role='player').order_by(User.username).all()
# Get available matches and tryouts for context # Get available matches and tryouts for context
matches = [] matches = []
@@ -1483,7 +1489,7 @@ def add_note_from_match(match_id):
participants = MatchParticipant.query.filter_by(match_id=match_id).all() participants = MatchParticipant.query.filter_by(match_id=match_id).all()
participant_ids = [p.player_id for p in participants] participant_ids = [p.player_id for p in participants]
players = User.query.filter(User.id.in_(participant_ids)).order_by(User.full_name).all() if participant_ids else [] players = User.query.filter(User.id.in_(participant_ids)).order_by(User.username).all() if participant_ids else []
# Get team notes for context # Get team notes for context
team_notes = [] team_notes = []
@@ -1553,9 +1559,9 @@ def add_note_from_tryout(tryout_id):
# If coach, filter to only their team players; otherwise include all # If coach, filter to only their team players; otherwise include all
if org_team: if org_team:
team_player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] team_player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()]
players = User.query.filter(User.id.in_(player_ids), User.id.in_(team_player_ids)).order_by(User.full_name).all() players = User.query.filter(User.id.in_(player_ids), User.id.in_(team_player_ids)).order_by(User.username).all()
else: else:
players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all()
# Get team notes for context # Get team notes for context
team_notes = [] team_notes = []
+2 -2
View File
@@ -18,10 +18,10 @@
</div> </div>
<div class="user-badge"> <div class="user-badge">
<div class="user-avatar"> <div class="user-avatar">
{{ current_user.full_name[:2] | upper }} {{ current_user.username[:2] | upper }}
</div> </div>
<div class="user-info"> <div class="user-info">
<span class="user-name">{{ current_user.full_name }}</span> <span class="user-name">{{ current_user.username }}</span>
<span class="user-role role-{{ current_user.role }}">{{ current_user.role | capitalize }}</span> <span class="user-role role-{{ current_user.role }}">{{ current_user.role | capitalize }}</span>
</div> </div>
</div> </div>
+2 -2
View File
@@ -43,8 +43,8 @@
{# User Avatar Macro - renders user avatar with name #} {# User Avatar Macro - renders user avatar with name #}
{% macro user_avatar(user, size='sm') %} {% macro user_avatar(user, size='sm') %}
<div class="user-mini"> <div class="user-mini">
<div class="avatar-{{ size }}">{{ user.full_name[:2] | upper }}</div> <div class="avatar-{{ size }}">{{ user.username[:2] | upper }}</div>
<span>{{ user.full_name }}</span> <span>{{ user.username }}</span>
</div> </div>
{% endmacro %} {% endmacro %}
+2 -2
View File
@@ -49,7 +49,7 @@
<option value="">-- Select a player --</option> <option value="">-- Select a player --</option>
{% for player in players %} {% for player in players %}
<option value="{{ player.id }}" {% if preselected_player_id == player.id %}selected{% endif %}> <option value="{{ player.id }}" {% if preselected_player_id == player.id %}selected{% endif %}>
{{ player.full_name }} {{ player.username }}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
@@ -98,7 +98,7 @@
<div class="team-notes-reference"> <div class="team-notes-reference">
{% for note in team_notes %} {% for note in team_notes %}
<div class="note-reference-item"> <div class="note-reference-item">
<small class="text-muted">{{ note.created_at.strftime('%Y-%m-%d') }} - {{ note.coach.full_name }}:</small> <small class="text-muted">{{ note.created_at.strftime('%Y-%m-%d') }} - {{ note.coach.username }}:</small>
<p>{{ note.content[:200] }}{% if note.content|length > 200 %}...{% endif %}</p> <p>{{ note.content[:200] }}{% if note.content|length > 200 %}...{% endif %}</p>
</div> </div>
{% endfor %} {% endfor %}
+1 -1
View File
@@ -33,7 +33,7 @@
<tbody> <tbody>
{% for contract in contracts %} {% for contract in contracts %}
<tr> <tr>
<td>{{ contract.player.full_name }}</td> <td>{{ contract.player.username }}</td>
<td>{{ contract.team.name if contract.team else 'N/A' }}</td> <td>{{ contract.team.name if contract.team else 'N/A' }}</td>
<td>{{ contract.original_filename }}</td> <td>{{ contract.original_filename }}</td>
<td> <td>
+3 -3
View File
@@ -76,7 +76,7 @@
<tbody> <tbody>
{% for u in stats.recent_users %} {% for u in stats.recent_users %}
<tr> <tr>
<td>{{ u.full_name }}</td> <td>{{ u.username }}</td>
<td><span class="badge badge-{{ u.role }}">{{ u.role }}</span></td> <td><span class="badge badge-{{ u.role }}">{{ u.role }}</span></td>
<td>{{ u.created_at.strftime('%m/%d/%Y') }}</td> <td>{{ u.created_at.strftime('%m/%d/%Y') }}</td>
</tr> </tr>
@@ -251,7 +251,7 @@
<tbody> <tbody>
{% for e in stats.my_recent_evaluations %} {% for e in stats.my_recent_evaluations %}
<tr> <tr>
<td>{{ e.player.full_name }}</td> <td>{{ e.player.username }}</td>
<td>{{ e.tryout.title }}</td> <td>{{ e.tryout.title }}</td>
<td><span class="score">{{ e.overall_score }}</span></td> <td><span class="score">{{ e.overall_score }}</span></td>
<td>{{ e.created_at.strftime('%m/%d/%Y') }}</td> <td>{{ e.created_at.strftime('%m/%d/%Y') }}</td>
@@ -365,7 +365,7 @@
{% for player, score in stats.top_players %} {% for player, score in stats.top_players %}
<tr> <tr>
<td>{{ loop.index }}</td> <td>{{ loop.index }}</td>
<td>{{ player.full_name }}</td> <td>{{ player.username }}</td>
<td><span class="score">{{ score }}</span></td> <td><span class="score">{{ score }}</span></td>
</tr> </tr>
{% endfor %} {% endfor %}
+6 -2
View File
@@ -9,16 +9,20 @@
<form method="POST" action="{{ url_for('users.edit_profile') }}" class="form"> <form method="POST" action="{{ url_for('users.edit_profile') }}" class="form">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<div class="form-row"> <div class="form-row">
<div class="form-group col-6">
<label for="username">Username</label>
<input type="text" id="username" name="username" value="{{ user.username }}" required>
</div>
<div class="form-group col-6"> <div class="form-group col-6">
<label for="full_name">Full Name</label> <label for="full_name">Full Name</label>
<input type="text" id="full_name" name="full_name" value="{{ user.full_name }}" required> <input type="text" id="full_name" name="full_name" value="{{ user.full_name }}" required>
</div> </div>
</div>
<div class="form-row">
<div class="form-group col-6"> <div class="form-group col-6">
<label for="email">Email</label> <label for="email">Email</label>
<input type="email" id="email" name="email" value="{{ user.email }}" required> <input type="email" id="email" name="email" value="{{ user.email }}" required>
</div> </div>
</div>
<div class="form-row">
<div class="form-group col-6"> <div class="form-group col-6">
<label for="phone">Phone</label> <label for="phone">Phone</label>
<input type="tel" id="phone" name="phone" value="{{ user.phone or '' }}"> <input type="tel" id="phone" name="phone" value="{{ user.phone or '' }}">
+2 -2
View File
@@ -1,5 +1,5 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}Edit {{ user.full_name }} - TryoutPro{% endblock %} {% block title %}Edit {{ user.username }} - TryoutPro{% endblock %}
{% block page_title %}Edit User{% endblock %} {% block page_title %}Edit User{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Edit</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('users.list_users') }}">Users</a> / Edit</span>{% endblock %}
@@ -11,7 +11,7 @@
<div class="form-row"> <div class="form-row">
<div class="form-group col-6"> <div class="form-group col-6">
<label for="full_name">Full Name</label> <label for="full_name">Full Name</label>
<input type="text" id="full_name" name="full_name" value="{{ user.full_name }}" required> <input type="text" id="full_name" name="full_name" value="{{ user.username }}" required>
</div> </div>
<div class="form-group col-6"> <div class="form-group col-6">
<label for="email">Email</label> <label for="email">Email</label>
+6 -6
View File
@@ -1,6 +1,6 @@
{% extends "layouts/base.html" %} {% extends "layouts/base.html" %}
{% block title %}Evaluate {{ player.full_name }} - TryoutPro{% endblock %} {% block title %}Evaluate {{ player.username }} - TryoutPro{% endblock %}
{% block page_title %}Evaluate {{ player.full_name }}{% endblock %} {% block page_title %}Evaluate {{ player.username }}{% endblock %}
{% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %} {% block breadcrumb %}<span class="breadcrumb">Home / <a href="{{ url_for('tryouts.view_tryout', tryout_id=tryout.id) }}">{{ tryout.title }}</a> / Evaluate</span>{% endblock %}
{% block content %} {% block content %}
@@ -12,9 +12,9 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="eval-player-info mb-4"> <div class="eval-player-info mb-4">
<div class="user-avatar avatar-lg">{{ player.full_name[:2] | upper }}</div> <div class="user-avatar avatar-lg">{{ player.username[:2] | upper }}</div>
<div> <div>
<h3>{{ player.full_name }}</h3> <h3>{{ player.username }}</h3>
<p class="text-muted">{{ player.email }} | {{ player.phone or 'No phone' }}</p> <p class="text-muted">{{ player.email }} | {{ player.phone or 'No phone' }}</p>
</div> </div>
</div> </div>
@@ -138,7 +138,7 @@
{% if evaluators %} {% if evaluators %}
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3><i class="fas fa-users"></i> All Evaluations for {{ player.full_name }}</h3> <h3><i class="fas fa-users"></i> All Evaluations for {{ player.username }}</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<table class="table"> <table class="table">
@@ -161,7 +161,7 @@
<tbody> <tbody>
{% for entry in evaluators %} {% for entry in evaluators %}
<tr> <tr>
<td>{{ entry.evaluator.full_name }}</td> <td>{{ entry.evaluator.username }}</td>
<td>{{ entry.eval.mecanics_score or '-' }}</td> <td>{{ entry.eval.mecanics_score or '-' }}</td>
<td>{{ entry.eval.cohesion_score or '-' }}</td> <td>{{ entry.eval.cohesion_score or '-' }}</td>
<td>{{ entry.eval.communication_score or '-' }}</td> <td>{{ entry.eval.communication_score or '-' }}</td>
+3 -3
View File
@@ -29,7 +29,7 @@
<i class="fas fa-user"></i> <i class="fas fa-user"></i>
</div> </div>
<div class="stat-info"> <div class="stat-info">
<h3>{{ data.player.full_name[:12] }}</h3> <h3>{{ data.player.username[:12] }}</h3>
<p>Avg: <strong>{{ data.avg }}</strong> / {{ data.count }} evals</p> <p>Avg: <strong>{{ data.avg }}</strong> / {{ data.count }} evals</p>
</div> </div>
</div> </div>
@@ -73,8 +73,8 @@
{% for eval in evaluations %} {% for eval in evaluations %}
<tr> <tr>
<td>{{ eval.tryout.title if eval.tryout else 'Deleted Tryout' }}</td> <td>{{ eval.tryout.title if eval.tryout else 'Deleted Tryout' }}</td>
<td>{{ eval.player.full_name if eval.player else 'Deleted Player' }}</td> <td>{{ eval.player.username if eval.player else 'Deleted Player' }}</td>
<td>{{ eval.evaluator.full_name if eval.evaluator else 'Deleted Evaluator' }}</td> <td>{{ eval.evaluator.username if eval.evaluator else 'Deleted Evaluator' }}</td>
<td>{{ eval.mecanics_score or '-' }}</td> <td>{{ eval.mecanics_score or '-' }}</td>
<td>{{ eval.cohesion_score or '-' }}</td> <td>{{ eval.cohesion_score or '-' }}</td>
<td>{{ eval.communication_score or '-' }}</td> <td>{{ eval.communication_score or '-' }}</td>
+4 -4
View File
@@ -141,7 +141,7 @@
<h5>{{ match.team1.name }}</h5> <h5>{{ match.team1.name }}</h5>
<ul class="team-members-list"> <ul class="team-members-list">
{% for member in match.team1.members %} {% for member in match.team1.members %}
<li>{{ member.player.full_name if member.player else 'Unknown Player' }}{% if member.position %} <span class="position-tag">{{ member.position }}</span>{% endif %}</li> <li>{{ member.player.username if member.player else 'Unknown Player' }}{% if member.position %} <span class="position-tag">{{ member.position }}</span>{% endif %}</li>
{% else %} {% else %}
<li class="text-muted">No players assigned</li> <li class="text-muted">No players assigned</li>
{% endfor %} {% endfor %}
@@ -155,7 +155,7 @@
<h5>{{ match.team2.name }}</h5> <h5>{{ match.team2.name }}</h5>
<ul class="team-members-list"> <ul class="team-members-list">
{% for member in match.team2.members %} {% for member in match.team2.members %}
<li>{{ member.player.full_name if member.player else 'Unknown Player' }}{% if member.position %} <span class="position-tag">{{ member.position }}</span>{% endif %}</li> <li>{{ member.player.username if member.player else 'Unknown Player' }}{% if member.position %} <span class="position-tag">{{ member.position }}</span>{% endif %}</li>
{% else %} {% else %}
<li class="text-muted">No players assigned</li> <li class="text-muted">No players assigned</li>
{% endfor %} {% endfor %}
@@ -220,7 +220,7 @@
{% for player in all_players %} {% for player in all_players %}
<label class="checkbox-label player-checkbox" data-player-id="{{ player.id }}"> <label class="checkbox-label player-checkbox" data-player-id="{{ player.id }}">
<input type="checkbox" name="player_ids" value="{{ player.id }}" {% if match and player.id in current_player_ids %}checked{% endif %}> <input type="checkbox" name="player_ids" value="{{ player.id }}" {% if match and player.id in current_player_ids %}checked{% endif %}>
{{ player.full_name }} {{ player.username }}
<span class="disponibility-indicator" data-player-id="{{ player.id }}"></span> <span class="disponibility-indicator" data-player-id="{{ player.id }}"></span>
</label> </label>
{% endfor %} {% endfor %}
@@ -388,7 +388,7 @@
var playerDataById = { var playerDataById = {
player_data: { player_data: {
{%- for p in all_players %} {%- for p in all_players %}
{{ p.id }}: "{{ p.full_name | escape }}", {{ p.id }}: "{{ p.username | escape }}",
{%- endfor %} {%- endfor %}
} }
}; };
+3 -3
View File
@@ -49,7 +49,7 @@
<select name="player_id" id="player_id" class="form-select" required> <select name="player_id" id="player_id" class="form-select" required>
<option value="">-- Select a Player --</option> <option value="">-- Select a Player --</option>
{% for player in players %} {% for player in players %}
<option value="{{ player.id }}">{{ player.full_name }}</option> <option value="{{ player.id }}">{{ player.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@@ -144,11 +144,11 @@
{% for note in personal_notes %} {% for note in personal_notes %}
<div class="detail-item full-width mb-4"> <div class="detail-item full-width mb-4">
<span class="detail-label"> <span class="detail-label">
<i class="fas fa-user"></i> {{ note.player.full_name if note.player else 'Unknown Player' }} - <i class="fas fa-user"></i> {{ note.player.username if note.player else 'Unknown Player' }} -
<span class="text-muted">{{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }}</span> <span class="text-muted">{{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }}</span>
</span> </span>
<span class="detail-value">{{ note.content | nl2br if note.content else '' }}</span> <span class="detail-value">{{ note.content | nl2br if note.content else '' }}</span>
<span class="detail-label text-muted small">From: {{ note.coach.full_name if note.coach else 'Unknown Coach' }}</span> <span class="detail-label text-muted small">From: {{ note.coach.username if note.coach else 'Unknown Coach' }}</span>
{% if note.match_id or note.team_id or note.tryout_id %} {% if note.match_id or note.team_id or note.tryout_id %}
<div class="mt-2"> <div class="mt-2">
{% if note.match_id and note.match %} {% if note.match_id and note.match %}
+4 -4
View File
@@ -18,7 +18,7 @@
{% for note in team_notes %} {% for note in team_notes %}
<div class="detail-grid mt-4"> <div class="detail-grid mt-4">
<div class="detail-item full-width"> <div class="detail-item full-width">
<span class="detail-label"><i class="fas fa-user"></i> Coach: {{ note.coach.full_name if note.coach else 'Unknown Coach' }}</span> <span class="detail-label"><i class="fas fa-user"></i> Coach: {{ note.coach.username if note.coach else 'Unknown Coach' }}</span>
<span class="detail-value">{{ note.content | nl2br }}</span> <span class="detail-value">{{ note.content | nl2br }}</span>
</div> </div>
</div> </div>
@@ -35,7 +35,7 @@
<div class="card-header"> <div class="card-header">
<h3><i class="fas fa-user"></i> Personal Notes</h3> <h3><i class="fas fa-user"></i> Personal Notes</h3>
{% if coach %} {% if coach %}
<span class="badge badge-coach">From: {{ coach.full_name }}</span> <span class="badge badge-coach">From: {{ coach.username }}</span>
{% endif %} {% endif %}
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -43,7 +43,7 @@
{% for note in personal_notes %} {% for note in personal_notes %}
<div class="detail-grid mt-4"> <div class="detail-grid mt-4">
<div class="detail-item full-width"> <div class="detail-item full-width">
<span class="detail-label"><i class="fas fa-sticky-note"></i> Note from {{ note.coach.full_name if note.coach else 'Unknown Coach' }}</span> <span class="detail-label"><i class="fas fa-sticky-note"></i> Note from {{ note.coach.username if note.coach else 'Unknown Coach' }}</span>
<span class="detail-value">{{ note.content | nl2br }}</span> <span class="detail-value">{{ note.content | nl2br }}</span>
</div> </div>
</div> </div>
@@ -60,7 +60,7 @@
<div class="card-header"> <div class="card-header">
<h3><i class="fas fa-calendar-check"></i> Request One on One Session</h3> <h3><i class="fas fa-calendar-check"></i> Request One on One Session</h3>
{% if coach %} {% if coach %}
<span class="badge badge-info">Coach: {{ coach.full_name }}</span> <span class="badge badge-info">Coach: {{ coach.username }}</span>
{% endif %} {% endif %}
</div> </div>
<div class="card-body"> <div class="card-body">
+3 -3
View File
@@ -20,7 +20,7 @@
<select name="player_id" id="player_id" class="form-select" required> <select name="player_id" id="player_id" class="form-select" required>
<option value="">-- Select a Player --</option> <option value="">-- Select a Player --</option>
{% for player in players %} {% for player in players %}
<option value="{{ player.id }}">{{ player.full_name }}</option> <option value="{{ player.id }}">{{ player.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@@ -50,11 +50,11 @@
{% for note in personal_notes %} {% for note in personal_notes %}
<div class="detail-item full-width mb-4"> <div class="detail-item full-width mb-4">
<span class="detail-label"> <span class="detail-label">
<i class="fas fa-user"></i> {{ note.player.full_name if note.player else 'Unknown Player' }} - <i class="fas fa-user"></i> {{ note.player.username if note.player else 'Unknown Player' }} -
<span class="text-muted">{{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }}</span> <span class="text-muted">{{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }}</span>
</span> </span>
<span class="detail-value">{{ note.content | nl2br if note.content else '' }}</span> <span class="detail-value">{{ note.content | nl2br if note.content else '' }}</span>
<span class="detail-label text-muted small">From: {{ note.coach.full_name if note.coach else 'Unknown Coach' }}</span> <span class="detail-label text-muted small">From: {{ note.coach.username if note.coach else 'Unknown Coach' }}</span>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
+2 -2
View File
@@ -19,7 +19,7 @@
<div class="detail-grid mt-4"> <div class="detail-grid mt-4">
<div class="detail-item full-width"> <div class="detail-item full-width">
<span class="detail-label"> <span class="detail-label">
<i class="fas fa-sticky-note"></i> Note from {{ note.coach.full_name if note.coach else 'Unknown Coach' }} <i class="fas fa-sticky-note"></i> Note from {{ note.coach.username if note.coach else 'Unknown Coach' }}
</span> </span>
<span class="detail-value">{{ note.content | nl2br }}</span> <span class="detail-value">{{ note.content | nl2br }}</span>
<div class="mt-2"> <div class="mt-2">
@@ -62,7 +62,7 @@
{% for note in team_notes %} {% for note in team_notes %}
<div class="detail-grid mt-4"> <div class="detail-grid mt-4">
<div class="detail-item full-width"> <div class="detail-item full-width">
<span class="detail-label"><i class="fas fa-user"></i> Coach: {{ note.coach.full_name if note.coach else 'Unknown Coach' }}</span> <span class="detail-label"><i class="fas fa-user"></i> Coach: {{ note.coach.username if note.coach else 'Unknown Coach' }}</span>
<span class="detail-value">{{ note.content | nl2br }}</span> <span class="detail-value">{{ note.content | nl2br }}</span>
</div> </div>
</div> </div>
+2 -2
View File
@@ -25,8 +25,8 @@
<tr> <tr>
<td> <td>
<div class="user-mini"> <div class="user-mini">
<div class="avatar-sm">{{ entry.player.full_name[:2] | upper }}</div> <div class="avatar-sm">{{ entry.player.username[:2] | upper }}</div>
<span>{{ entry.player.full_name }}</span> <span>{{ entry.player.username }}</span>
</div> </div>
</td> </td>
<td>{{ entry.player.email }}</td> <td>{{ entry.player.email }}</td>
+3 -2
View File
@@ -22,9 +22,10 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="profile-header"> <div class="profile-header">
<div class="user-avatar avatar-xl">{{ user.full_name[:2] | upper }}</div> <div class="user-avatar avatar-xl">{{ user.username[:2] | upper }}</div>
<div class="profile-info"> <div class="profile-info">
<h2>{{ user.full_name }}</h2> <h2>{{ user.username }}</h2>
<span class="text-muted" style="font-size: 1.1em;">{{ user.full_name }}</span>
<span class="badge badge-{{ user.role }} badge-lg">{{ user.role | capitalize }}</span> <span class="badge badge-{{ user.role }} badge-lg">{{ user.role | capitalize }}</span>
<p class="text-muted">Member since {{ user.created_at.strftime('%B %Y') }}</p> <p class="text-muted">Member since {{ user.created_at.strftime('%B %Y') }}</p>
</div> </div>
+12 -12
View File
@@ -30,7 +30,7 @@
<select id="coach_id" name="coach_id" class="form-select"> <select id="coach_id" name="coach_id" class="form-select">
<option value="">-- No coach assigned --</option> <option value="">-- No coach assigned --</option>
{% for coach in coaches %} {% for coach in coaches %}
<option value="{{ coach.id }}">{{ coach.full_name }}</option> <option value="{{ coach.id }}">{{ coach.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@@ -39,7 +39,7 @@
<select id="manager_id" name="manager_id" class="form-select"> <select id="manager_id" name="manager_id" class="form-select">
<option value="">-- No manager assigned --</option> <option value="">-- No manager assigned --</option>
{% for manager in managers %} {% for manager in managers %}
<option value="{{ manager.id }}">{{ manager.full_name }}</option> <option value="{{ manager.id }}">{{ manager.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@@ -61,9 +61,9 @@
<div class="card-actions"> <div class="card-actions">
<div class="team-staff"> <div class="team-staff">
{% if team.coach %} {% if team.coach %}
<span class="text-muted">Coach: {{ team.coach.full_name }}</span> <span class="text-muted">Coach: {{ team.coach.username }}</span>
{% if can_manage %} {% if can_manage %}
<form method="POST" action="{{ url_for('teams.remove_coach', team_id=team.id) }}" class="inline-form" onsubmit="return confirm('Remove coach {{ team.coach.full_name }} from {{ team.name }}?')"> <form method="POST" action="{{ url_for('teams.remove_coach', team_id=team.id) }}" class="inline-form" onsubmit="return confirm('Remove coach {{ team.coach.username }} from {{ team.name }}?')">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Coach"> <button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Coach">
<i class="fas fa-user-minus"></i> <i class="fas fa-user-minus"></i>
@@ -74,9 +74,9 @@
<span class="text-muted">No coach assigned</span> <span class="text-muted">No coach assigned</span>
{% endif %} {% endif %}
{% if team.manager %} {% if team.manager %}
<span class="text-muted ml-2">Manager: {{ team.manager.full_name }}</span> <span class="text-muted ml-2">Manager: {{ team.manager.username }}</span>
{% if can_manage %} {% if can_manage %}
<form method="POST" action="{{ url_for('teams.remove_manager', team_id=team.id) }}" class="inline-form" onsubmit="return confirm('Remove manager {{ team.manager.full_name }} from {{ team.name }}?')"> <form method="POST" action="{{ url_for('teams.remove_manager', team_id=team.id) }}" class="inline-form" onsubmit="return confirm('Remove manager {{ team.manager.username }} from {{ team.name }}?')">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Manager"> <button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Manager">
<i class="fas fa-user-minus"></i> <i class="fas fa-user-minus"></i>
@@ -125,8 +125,8 @@
<tr> <tr>
<td> <td>
<div class="user-mini"> <div class="user-mini">
<div class="avatar-sm">{{ entry.player.full_name[:2] | upper }}</div> <div class="avatar-sm">{{ entry.player.username[:2] | upper }}</div>
<span>{{ entry.player.full_name }}</span> <span>{{ entry.player.username }}</span>
</div> </div>
</td> </td>
<td> <td>
@@ -148,7 +148,7 @@
<td>{{ entry.player.phone or '-' }}</td> <td>{{ entry.player.phone or '-' }}</td>
{% if can_manage_team %} {% if can_manage_team %}
<td> <td>
<form method="POST" action="{{ url_for('teams.remove_player', team_id=team.id, player_id=entry.player.id) }}" class="inline-form" onsubmit="return confirm('Remove {{ entry.player.full_name }} from {{ team.name }}?')"> <form method="POST" action="{{ url_for('teams.remove_player', team_id=team.id, player_id=entry.player.id) }}" class="inline-form" onsubmit="return confirm('Remove {{ entry.player.username }} from {{ team.name }}?')">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<button type="submit" class="btn btn-sm btn-danger"> <button type="submit" class="btn btn-sm btn-danger">
<i class="fas fa-user-minus"></i> Remove <i class="fas fa-user-minus"></i> Remove
@@ -184,7 +184,7 @@
<option value="">-- Select a player --</option> <option value="">-- Select a player --</option>
{% for p in all_players %} {% for p in all_players %}
{% if p.id not in team.players | map(attribute='id') %} {% if p.id not in team.players | map(attribute='id') %}
<option value="{{ p.id }}">{{ p.full_name }}</option> <option value="{{ p.id }}">{{ p.username }}</option>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</select> </select>
@@ -237,7 +237,7 @@
<select id="edit_coach_id" name="coach_id" class="form-select"> <select id="edit_coach_id" name="coach_id" class="form-select">
<option value="">-- No coach assigned --</option> <option value="">-- No coach assigned --</option>
{% for coach in coaches %} {% for coach in coaches %}
<option value="{{ coach.id }}">{{ coach.full_name }}</option> <option value="{{ coach.id }}">{{ coach.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
@@ -246,7 +246,7 @@
<select id="edit_manager_id" name="manager_id" class="form-select"> <select id="edit_manager_id" name="manager_id" class="form-select">
<option value="">-- No manager assigned --</option> <option value="">-- No manager assigned --</option>
{% for manager in managers %} {% for manager in managers %}
<option value="{{ manager.id }}">{{ manager.full_name }}</option> <option value="{{ manager.id }}">{{ manager.username }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
+3 -3
View File
@@ -56,7 +56,7 @@
<option value="">-- No target team --</option> <option value="">-- No target team --</option>
{% for team in org_teams %} {% for team in org_teams %}
<option value="{{ team.id }}" {% if tryout and tryout.target_org_team_id == team.id %}selected{% endif %}> <option value="{{ team.id }}" {% if tryout and tryout.target_org_team_id == team.id %}selected{% endif %}>
{{ team.name }}{% if team.coach %} (Coach: {{ team.coach.full_name }}){% endif %} {{ team.name }}{% if team.coach %} (Coach: {{ team.coach.username }}){% endif %}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
@@ -67,7 +67,7 @@
<option value="">-- No manager assigned --</option> <option value="">-- No manager assigned --</option>
{% for manager in managers %} {% for manager in managers %}
<option value="{{ manager.id }}" {% if tryout and tryout.manager_id == manager.id %}selected{% endif %}> <option value="{{ manager.id }}" {% if tryout and tryout.manager_id == manager.id %}selected{% endif %}>
{{ manager.full_name }} {{ manager.username }}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
@@ -80,7 +80,7 @@
<option value="">-- No coach assigned --</option> <option value="">-- No coach assigned --</option>
{% for coach in coaches %} {% for coach in coaches %}
<option value="{{ coach.id }}" {% if tryout and tryout.coach_id == coach.id %}selected{% endif %}> <option value="{{ coach.id }}" {% if tryout and tryout.coach_id == coach.id %}selected{% endif %}>
{{ coach.full_name }} {{ coach.username }}
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
+1 -1
View File
@@ -17,7 +17,7 @@
<select id="player_id" name="player_id" class="form-select" required> <select id="player_id" name="player_id" class="form-select" required>
<option value="">-- Select a player --</option> <option value="">-- Select a player --</option>
{% for player in players %} {% for player in players %}
<option value="{{ player.id }}">{{ player.full_name }}{% if player.org_team %} - {{ player.org_team.name }}{% endif %}</option> <option value="{{ player.id }}">{{ player.username }}{% if player.org_team %} - {{ player.org_team.name }}{% endif %}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
+3 -3
View File
@@ -30,8 +30,8 @@
<tr> <tr>
<td> <td>
<div class="user-mini"> <div class="user-mini">
<div class="avatar-sm">{{ u.full_name[:2] | upper }}</div> <div class="avatar-sm">{{ u.username[:2] | upper }}</div>
<span>{{ u.full_name }}</span> <span>{{ u.username }}</span>
</div> </div>
</td> </td>
<td>{{ u.username }}</td> <td>{{ u.username }}</td>
@@ -50,7 +50,7 @@
<i class="fas fa-edit"></i> Edit <i class="fas fa-edit"></i> Edit
</a> </a>
{% if u.id != current_user.id %} {% if u.id != current_user.id %}
<form method="POST" action="{{ url_for('users.delete_user', user_id=u.id) }}" class="inline-form" onsubmit="return confirm('Delete {{ u.full_name }}? This cannot be undone.');"> <form method="POST" action="{{ url_for('users.delete_user', user_id=u.id) }}" class="inline-form" onsubmit="return confirm('Delete {{ u.username }}? This cannot be undone.');">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<button type="submit" class="btn btn-sm btn-danger"> <button type="submit" class="btn btn-sm btn-danger">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
+11 -11
View File
@@ -57,11 +57,11 @@
</div> </div>
<div class="detail-item"> <div class="detail-item">
<span class="detail-label">Manager</span> <span class="detail-label">Manager</span>
<span class="detail-value">{{ tryout.manager.full_name if tryout.manager else 'Not assigned' }}</span> <span class="detail-value">{{ tryout.manager.username if tryout.manager else 'Not assigned' }}</span>
</div> </div>
<div class="detail-item"> <div class="detail-item">
<span class="detail-label">Coach</span> <span class="detail-label">Coach</span>
<span class="detail-value">{{ tryout.coach.full_name if tryout.coach else 'Not assigned' }}</span> <span class="detail-value">{{ tryout.coach.username if tryout.coach else 'Not assigned' }}</span>
</div> </div>
<div class="detail-item"> <div class="detail-item">
<span class="detail-label">Registered Players</span> <span class="detail-label">Registered Players</span>
@@ -102,7 +102,7 @@
<option value="">-- Select a player --</option> <option value="">-- Select a player --</option>
{% for p in all_players %} {% for p in all_players %}
{% set is_already = registrations | selectattr('player_id', 'equalto', p.id) | list | length > 0 %} {% set is_already = registrations | selectattr('player_id', 'equalto', p.id) | list | length > 0 %}
<option value="{{ p.id }}" {% if is_already %}disabled class="text-muted"{% endif %}>{{ p.full_name }}{% if is_already %} (already registered){% endif %}</option> <option value="{{ p.id }}" {% if is_already %}disabled class="text-muted"{% endif %}>{{ p.username }}{% if is_already %} (already registered){% endif %}</option>
{% endfor %} {% endfor %}
</select> </select>
<button type="submit" class="btn btn-sm btn-primary ml-2"> <button type="submit" class="btn btn-sm btn-primary ml-2">
@@ -137,8 +137,8 @@
<tr> <tr>
<td> <td>
<div class="user-mini"> <div class="user-mini">
<div class="avatar-sm">{{ p.full_name[:2] | upper }}</div> <div class="avatar-sm">{{ p.username[:2] | upper }}</div>
<span>{{ p.full_name }}</span> <span>{{ p.username }}</span>
</div> </div>
</td> </td>
<td> <td>
@@ -167,7 +167,7 @@
<a href="{{ url_for('evaluations.evaluate_player', tryout_id=tryout.id, player_id=p.id) }}" class="btn btn-sm btn-primary" title="Evaluate player"> <a href="{{ url_for('evaluations.evaluate_player', tryout_id=tryout.id, player_id=p.id) }}" class="btn btn-sm btn-primary" title="Evaluate player">
<i class="fas fa-edit"></i> {% if player_eval_status.get(p.id) %}Edit{% else %}Evaluate{% endif %} <i class="fas fa-edit"></i> {% if player_eval_status.get(p.id) %}Edit{% else %}Evaluate{% endif %}
</a> </a>
<a href="{{ url_for('users.add_note_from_tryout', tryout_id=tryout.id) }}?player_id={{ p.id }}" class="btn btn-sm btn-outline" title="Add note for {{ p.full_name }}"> <a href="{{ url_for('users.add_note_from_tryout', tryout_id=tryout.id) }}?player_id={{ p.id }}" class="btn btn-sm btn-outline" title="Add note for {{ p.username }}">
<i class="fas fa-sticky-note"></i> <i class="fas fa-sticky-note"></i>
</a> </a>
</td> </td>
@@ -213,8 +213,8 @@
<ul class="team-members"> <ul class="team-members">
{% for member in team.members %} {% for member in team.members %}
<li> <li>
<div class="avatar-sm">{{ member.player.full_name[:2] | upper }}</div> <div class="avatar-sm">{{ member.player.username[:2] | upper }}</div>
<span>{{ member.player.full_name }}</span> <span>{{ member.player.username }}</span>
{% if member.position %} {% if member.position %}
<span class="position-tag">{{ member.position }}</span> <span class="position-tag">{{ member.position }}</span>
{% endif %} {% endif %}
@@ -231,7 +231,7 @@
<option value="">Select player...</option> <option value="">Select player...</option>
{% for p in registered_players %} {% for p in registered_players %}
{% if p.id not in team.members | map(attribute='player') | map(attribute='id') | list %} {% if p.id not in team.members | map(attribute='player') | map(attribute='id') | list %}
<option value="{{ p.id }}">{{ p.full_name }}</option> <option value="{{ p.id }}">{{ p.username }}</option>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</select> </select>
@@ -429,8 +429,8 @@
<tbody> <tbody>
{% for eval in evaluations %} {% for eval in evaluations %}
<tr> <tr>
<td>{{ eval.player.full_name }}</td> <td>{{ eval.player.username }}</td>
<td>{{ eval.evaluator.full_name }}</td> <td>{{ eval.evaluator.username }}</td>
<td>{{ eval.mecanics_score or '-' }}</td> <td>{{ eval.mecanics_score or '-' }}</td>
<td>{{ eval.cohesion_score or '-' }}</td> <td>{{ eval.cohesion_score or '-' }}</td>
<td>{{ eval.communication_score or '-' }}</td> <td>{{ eval.communication_score or '-' }}</td>