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:
Binary file not shown.
@@ -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
@@ -61,7 +61,7 @@ def login():
|
||||
next_page = request.args.get('next')
|
||||
if next_page and not is_safe_url(next_page):
|
||||
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'))
|
||||
else:
|
||||
flash('Login unsuccessful. Please check username and password.', 'danger')
|
||||
|
||||
@@ -67,8 +67,8 @@ def list_evaluations():
|
||||
|
||||
sort_map = {
|
||||
'tryout': Tryout.title,
|
||||
'player': player_alias.full_name,
|
||||
'evaluator': evaluator_alias.full_name,
|
||||
'player': player_alias.username,
|
||||
'evaluator': evaluator_alias.username,
|
||||
'mecanics_score': Evaluation.mecanics_score,
|
||||
'cohesion_score': Evaluation.cohesion_score,
|
||||
'communication_score': Evaluation.communication_score,
|
||||
|
||||
+6
-6
@@ -82,7 +82,7 @@ def api_events():
|
||||
# Player scrim - show all participants
|
||||
player_names = []
|
||||
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)
|
||||
participants_str = ', '.join(player_names) if player_names else 'No players'
|
||||
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 = []
|
||||
for p in match.participants.filter_by(team_side=1).all():
|
||||
if p.player:
|
||||
team1_players.append(p.player.full_name)
|
||||
team1_players.append(p.player.username)
|
||||
team2_players = []
|
||||
for p in match.participants.filter_by(team_side=2).all():
|
||||
if p.player:
|
||||
team2_players.append(p.player.full_name)
|
||||
team2_players.append(p.player.username)
|
||||
if team1_players and team2_players:
|
||||
participants_str = f"{', '.join(team1_players)} vs {', '.join(team2_players)}"
|
||||
else:
|
||||
@@ -198,7 +198,7 @@ def api_events_for_tryout(tryout_id):
|
||||
else:
|
||||
player_names = []
|
||||
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)
|
||||
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()
|
||||
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 = 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':
|
||||
title = request.form.get('title')
|
||||
@@ -453,7 +453,7 @@ def edit_match(match_id):
|
||||
# Only show players registered for this tryout
|
||||
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 = 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()]
|
||||
# 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()]
|
||||
|
||||
+10
-10
@@ -34,9 +34,9 @@ def list_teams():
|
||||
flash('You do not have permission to view teams.', 'danger')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
coaches = User.query.filter_by(role='coach').order_by(User.full_name).all()
|
||||
managers = User.query.filter_by(role='manager').order_by(User.full_name).all()
|
||||
all_players = User.query.filter_by(role='player').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.username).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)
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ def add_player(team_id):
|
||||
# Check if player is already on this team
|
||||
existing = TeamPlayer.query.filter_by(player_id=player.id, org_team_id=team.id).first()
|
||||
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'))
|
||||
|
||||
# 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.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'))
|
||||
|
||||
|
||||
@@ -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()
|
||||
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'))
|
||||
|
||||
db.session.delete(tp)
|
||||
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'))
|
||||
|
||||
|
||||
@@ -312,7 +312,7 @@ def toggle_player_status(team_id, player_id):
|
||||
'success': True,
|
||||
'player_id': player_id,
|
||||
'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
|
||||
tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first()
|
||||
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'))
|
||||
|
||||
content = request.form.get('content', '').strip()
|
||||
@@ -392,6 +392,6 @@ def add_player_note(team_id, player_id):
|
||||
)
|
||||
db.session.add(note)
|
||||
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'))
|
||||
+10
-10
@@ -73,8 +73,8 @@ def create_tryout():
|
||||
return redirect(url_for('tryouts.list_tryouts'))
|
||||
|
||||
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()
|
||||
coaches = User.query.filter_by(role='coach', 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.username).all()
|
||||
|
||||
if request.method == 'POST':
|
||||
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
|
||||
all_players = None
|
||||
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
|
||||
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 = {
|
||||
'team1': match.team1.name if match.team1 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 [],
|
||||
'team2_players': [{'name': m.player.full_name, 'position': m.position} for m in match.team2.members.all()] if match.team2 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.username, 'position': m.position} for m in match.team2.members.all()] if match.team2 else []
|
||||
}
|
||||
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]
|
||||
team2_players = [{'name': p.player.full_name, 'position': p.position} for p in match.participants.filter_by(team_side=2).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.username, 'position': p.position} for p in match.participants.filter_by(team_side=2).all() if p.player]
|
||||
participants = {
|
||||
'team1': 'Team 1',
|
||||
'team2': 'Team 2',
|
||||
@@ -288,7 +288,7 @@ def view_tryout(tryout_id):
|
||||
'team2_players': team2_players
|
||||
}
|
||||
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': match,
|
||||
'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()
|
||||
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))
|
||||
|
||||
if tryout.max_players:
|
||||
@@ -445,7 +445,7 @@ def register_player(tryout_id):
|
||||
registration = TryoutRegistration(tryout_id=tryout_id, player_id=player.id)
|
||||
db.session.add(registration)
|
||||
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))
|
||||
|
||||
|
||||
|
||||
+23
-17
@@ -66,7 +66,7 @@ def list_users():
|
||||
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()
|
||||
users = User.query.order_by(User.role, User.username).all()
|
||||
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)
|
||||
|
||||
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'))
|
||||
|
||||
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.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'))
|
||||
|
||||
|
||||
@@ -292,6 +292,7 @@ def edit_profile():
|
||||
Response: Edit form or redirect to profile.
|
||||
"""
|
||||
if request.method == 'POST':
|
||||
username = request.form.get('username')
|
||||
full_name = request.form.get('full_name')
|
||||
email = request.form.get('email')
|
||||
phone = request.form.get('phone')
|
||||
@@ -301,10 +302,15 @@ def edit_profile():
|
||||
discord_user_id = request.form.get('discord_user_id', '').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():
|
||||
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.email = email
|
||||
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():
|
||||
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 = {}
|
||||
|
||||
for player in players:
|
||||
disponibilities = list(player.disponibilities)
|
||||
result[player.id] = {
|
||||
'full_name': player.full_name,
|
||||
'username': player.username,
|
||||
'disponibilities': [
|
||||
{
|
||||
'id': d.id,
|
||||
@@ -671,7 +677,7 @@ def upload_contract():
|
||||
# Generate unique filename
|
||||
original_filename = secure_filename(file.filename)
|
||||
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(' ', '_')
|
||||
|
||||
# Save file
|
||||
@@ -691,7 +697,7 @@ def upload_contract():
|
||||
db.session.add(contract)
|
||||
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 render_template('pages/upload_contract.html', players=players)
|
||||
@@ -955,13 +961,13 @@ def one_on_one():
|
||||
|
||||
# Send Discord notification
|
||||
send_discord_notification(
|
||||
player_name=current_user.full_name,
|
||||
player_name=current_user.username,
|
||||
points=points,
|
||||
date_str=date_str,
|
||||
start_time_str=start_time_str,
|
||||
end_time_str=end_time_str,
|
||||
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_id=coach.discord_user_id,
|
||||
request_id=request_obj.id
|
||||
@@ -1207,7 +1213,7 @@ def manage_personal_notes():
|
||||
players = []
|
||||
if org_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)).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':
|
||||
player_id = request.form.get('player_id', type=int)
|
||||
@@ -1264,7 +1270,7 @@ def notes_dashboard():
|
||||
players = []
|
||||
if org_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)).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
|
||||
team_notes = []
|
||||
@@ -1361,9 +1367,9 @@ def add_personal_note():
|
||||
org_team = OrgTeam.query.filter_by(coach_id=current_user.id).first()
|
||||
if org_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)).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']:
|
||||
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
|
||||
matches = []
|
||||
@@ -1483,7 +1489,7 @@ def add_note_from_match(match_id):
|
||||
participants = MatchParticipant.query.filter_by(match_id=match_id).all()
|
||||
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
|
||||
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 org_team:
|
||||
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:
|
||||
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
|
||||
team_notes = []
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
</div>
|
||||
<div class="user-badge">
|
||||
<div class="user-avatar">
|
||||
{{ current_user.full_name[:2] | upper }}
|
||||
{{ current_user.username[:2] | upper }}
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
{# User Avatar Macro - renders user avatar with name #}
|
||||
{% macro user_avatar(user, size='sm') %}
|
||||
<div class="user-mini">
|
||||
<div class="avatar-{{ size }}">{{ user.full_name[:2] | upper }}</div>
|
||||
<span>{{ user.full_name }}</span>
|
||||
<div class="avatar-{{ size }}">{{ user.username[:2] | upper }}</div>
|
||||
<span>{{ user.username }}</span>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<option value="">-- Select a player --</option>
|
||||
{% for player in players %}
|
||||
<option value="{{ player.id }}" {% if preselected_player_id == player.id %}selected{% endif %}>
|
||||
{{ player.full_name }}
|
||||
{{ player.username }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -98,7 +98,7 @@
|
||||
<div class="team-notes-reference">
|
||||
{% for note in team_notes %}
|
||||
<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>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<tbody>
|
||||
{% for contract in contracts %}
|
||||
<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.original_filename }}</td>
|
||||
<td>
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<tbody>
|
||||
{% for u in stats.recent_users %}
|
||||
<tr>
|
||||
<td>{{ u.full_name }}</td>
|
||||
<td>{{ u.username }}</td>
|
||||
<td><span class="badge badge-{{ u.role }}">{{ u.role }}</span></td>
|
||||
<td>{{ u.created_at.strftime('%m/%d/%Y') }}</td>
|
||||
</tr>
|
||||
@@ -251,7 +251,7 @@
|
||||
<tbody>
|
||||
{% for e in stats.my_recent_evaluations %}
|
||||
<tr>
|
||||
<td>{{ e.player.full_name }}</td>
|
||||
<td>{{ e.player.username }}</td>
|
||||
<td>{{ e.tryout.title }}</td>
|
||||
<td><span class="score">{{ e.overall_score }}</span></td>
|
||||
<td>{{ e.created_at.strftime('%m/%d/%Y') }}</td>
|
||||
@@ -365,7 +365,7 @@
|
||||
{% for player, score in stats.top_players %}
|
||||
<tr>
|
||||
<td>{{ loop.index }}</td>
|
||||
<td>{{ player.full_name }}</td>
|
||||
<td>{{ player.username }}</td>
|
||||
<td><span class="score">{{ score }}</span></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
@@ -9,16 +9,20 @@
|
||||
<form method="POST" action="{{ url_for('users.edit_profile') }}" class="form">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
||||
<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">
|
||||
<label for="full_name">Full Name</label>
|
||||
<input type="text" id="full_name" name="full_name" value="{{ user.full_name }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group col-6">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" id="email" name="email" value="{{ user.email }}" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group col-6">
|
||||
<label for="phone">Phone</label>
|
||||
<input type="tel" id="phone" name="phone" value="{{ user.phone or '' }}">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% 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 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-group col-6">
|
||||
<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 class="form-group col-6">
|
||||
<label for="email">Email</label>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "layouts/base.html" %}
|
||||
{% block title %}Evaluate {{ player.full_name }} - TryoutPro{% endblock %}
|
||||
{% block page_title %}Evaluate {{ player.full_name }}{% endblock %}
|
||||
{% block title %}Evaluate {{ player.username }} - TryoutPro{% 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 content %}
|
||||
@@ -12,9 +12,9 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<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>
|
||||
<h3>{{ player.full_name }}</h3>
|
||||
<h3>{{ player.username }}</h3>
|
||||
<p class="text-muted">{{ player.email }} | {{ player.phone or 'No phone' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -138,7 +138,7 @@
|
||||
{% if evaluators %}
|
||||
<div class="card">
|
||||
<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 class="card-body">
|
||||
<table class="table">
|
||||
@@ -161,7 +161,7 @@
|
||||
<tbody>
|
||||
{% for entry in evaluators %}
|
||||
<tr>
|
||||
<td>{{ entry.evaluator.full_name }}</td>
|
||||
<td>{{ entry.evaluator.username }}</td>
|
||||
<td>{{ entry.eval.mecanics_score or '-' }}</td>
|
||||
<td>{{ entry.eval.cohesion_score or '-' }}</td>
|
||||
<td>{{ entry.eval.communication_score or '-' }}</td>
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<i class="fas fa-user"></i>
|
||||
</div>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -73,8 +73,8 @@
|
||||
{% for eval in evaluations %}
|
||||
<tr>
|
||||
<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.evaluator.full_name if eval.evaluator else 'Deleted Evaluator' }}</td>
|
||||
<td>{{ eval.player.username if eval.player else 'Deleted Player' }}</td>
|
||||
<td>{{ eval.evaluator.username if eval.evaluator else 'Deleted Evaluator' }}</td>
|
||||
<td>{{ eval.mecanics_score or '-' }}</td>
|
||||
<td>{{ eval.cohesion_score or '-' }}</td>
|
||||
<td>{{ eval.communication_score or '-' }}</td>
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
<h5>{{ match.team1.name }}</h5>
|
||||
<ul class="team-members-list">
|
||||
{% 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 %}
|
||||
<li class="text-muted">No players assigned</li>
|
||||
{% endfor %}
|
||||
@@ -155,7 +155,7 @@
|
||||
<h5>{{ match.team2.name }}</h5>
|
||||
<ul class="team-members-list">
|
||||
{% 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 %}
|
||||
<li class="text-muted">No players assigned</li>
|
||||
{% endfor %}
|
||||
@@ -220,7 +220,7 @@
|
||||
{% for player in all_players %}
|
||||
<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 %}>
|
||||
{{ player.full_name }}
|
||||
{{ player.username }}
|
||||
<span class="disponibility-indicator" data-player-id="{{ player.id }}"></span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
@@ -388,7 +388,7 @@
|
||||
var playerDataById = {
|
||||
player_data: {
|
||||
{%- for p in all_players %}
|
||||
{{ p.id }}: "{{ p.full_name | escape }}",
|
||||
{{ p.id }}: "{{ p.username | escape }}",
|
||||
{%- endfor %}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<select name="player_id" id="player_id" class="form-select" required>
|
||||
<option value="">-- Select a Player --</option>
|
||||
{% for player in players %}
|
||||
<option value="{{ player.id }}">{{ player.full_name }}</option>
|
||||
<option value="{{ player.id }}">{{ player.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@@ -144,11 +144,11 @@
|
||||
{% for note in personal_notes %}
|
||||
<div class="detail-item full-width mb-4">
|
||||
<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>
|
||||
<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 %}
|
||||
<div class="mt-2">
|
||||
{% if note.match_id and note.match %}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
{% for note in team_notes %}
|
||||
<div class="detail-grid mt-4">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -35,7 +35,7 @@
|
||||
<div class="card-header">
|
||||
<h3><i class="fas fa-user"></i> Personal Notes</h3>
|
||||
{% if coach %}
|
||||
<span class="badge badge-coach">From: {{ coach.full_name }}</span>
|
||||
<span class="badge badge-coach">From: {{ coach.username }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@@ -43,7 +43,7 @@
|
||||
{% for note in personal_notes %}
|
||||
<div class="detail-grid mt-4">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -60,7 +60,7 @@
|
||||
<div class="card-header">
|
||||
<h3><i class="fas fa-calendar-check"></i> Request One on One Session</h3>
|
||||
{% if coach %}
|
||||
<span class="badge badge-info">Coach: {{ coach.full_name }}</span>
|
||||
<span class="badge badge-info">Coach: {{ coach.username }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<select name="player_id" id="player_id" class="form-select" required>
|
||||
<option value="">-- Select a Player --</option>
|
||||
{% for player in players %}
|
||||
<option value="{{ player.id }}">{{ player.full_name }}</option>
|
||||
<option value="{{ player.id }}">{{ player.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@@ -50,11 +50,11 @@
|
||||
{% for note in personal_notes %}
|
||||
<div class="detail-item full-width mb-4">
|
||||
<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>
|
||||
<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>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<div class="detail-grid mt-4">
|
||||
<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' }}
|
||||
<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>
|
||||
<div class="mt-2">
|
||||
@@ -62,7 +62,7 @@
|
||||
{% for note in team_notes %}
|
||||
<div class="detail-grid mt-4">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<div class="user-mini">
|
||||
<div class="avatar-sm">{{ entry.player.full_name[:2] | upper }}</div>
|
||||
<span>{{ entry.player.full_name }}</span>
|
||||
<div class="avatar-sm">{{ entry.player.username[:2] | upper }}</div>
|
||||
<span>{{ entry.player.username }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>{{ entry.player.email }}</td>
|
||||
|
||||
@@ -22,9 +22,10 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<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">
|
||||
<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>
|
||||
<p class="text-muted">Member since {{ user.created_at.strftime('%B %Y') }}</p>
|
||||
</div>
|
||||
|
||||
+12
-12
@@ -30,7 +30,7 @@
|
||||
<select id="coach_id" name="coach_id" class="form-select">
|
||||
<option value="">-- No coach assigned --</option>
|
||||
{% for coach in coaches %}
|
||||
<option value="{{ coach.id }}">{{ coach.full_name }}</option>
|
||||
<option value="{{ coach.id }}">{{ coach.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@@ -39,7 +39,7 @@
|
||||
<select id="manager_id" name="manager_id" class="form-select">
|
||||
<option value="">-- No manager assigned --</option>
|
||||
{% for manager in managers %}
|
||||
<option value="{{ manager.id }}">{{ manager.full_name }}</option>
|
||||
<option value="{{ manager.id }}">{{ manager.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@@ -61,9 +61,9 @@
|
||||
<div class="card-actions">
|
||||
<div class="team-staff">
|
||||
{% 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 %}
|
||||
<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() }}"/>
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Coach">
|
||||
<i class="fas fa-user-minus"></i>
|
||||
@@ -74,9 +74,9 @@
|
||||
<span class="text-muted">No coach assigned</span>
|
||||
{% endif %}
|
||||
{% 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 %}
|
||||
<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() }}"/>
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger" title="Remove Manager">
|
||||
<i class="fas fa-user-minus"></i>
|
||||
@@ -125,8 +125,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<div class="user-mini">
|
||||
<div class="avatar-sm">{{ entry.player.full_name[:2] | upper }}</div>
|
||||
<span>{{ entry.player.full_name }}</span>
|
||||
<div class="avatar-sm">{{ entry.player.username[:2] | upper }}</div>
|
||||
<span>{{ entry.player.username }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
@@ -148,7 +148,7 @@
|
||||
<td>{{ entry.player.phone or '-' }}</td>
|
||||
{% if can_manage_team %}
|
||||
<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() }}"/>
|
||||
<button type="submit" class="btn btn-sm btn-danger">
|
||||
<i class="fas fa-user-minus"></i> Remove
|
||||
@@ -184,7 +184,7 @@
|
||||
<option value="">-- Select a player --</option>
|
||||
{% for p in all_players %}
|
||||
{% 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 %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -237,7 +237,7 @@
|
||||
<select id="edit_coach_id" name="coach_id" class="form-select">
|
||||
<option value="">-- No coach assigned --</option>
|
||||
{% for coach in coaches %}
|
||||
<option value="{{ coach.id }}">{{ coach.full_name }}</option>
|
||||
<option value="{{ coach.id }}">{{ coach.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@@ -246,7 +246,7 @@
|
||||
<select id="edit_manager_id" name="manager_id" class="form-select">
|
||||
<option value="">-- No manager assigned --</option>
|
||||
{% for manager in managers %}
|
||||
<option value="{{ manager.id }}">{{ manager.full_name }}</option>
|
||||
<option value="{{ manager.id }}">{{ manager.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
<option value="">-- No target team --</option>
|
||||
{% for team in org_teams %}
|
||||
<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>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -67,7 +67,7 @@
|
||||
<option value="">-- No manager assigned --</option>
|
||||
{% for manager in managers %}
|
||||
<option value="{{ manager.id }}" {% if tryout and tryout.manager_id == manager.id %}selected{% endif %}>
|
||||
{{ manager.full_name }}
|
||||
{{ manager.username }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -80,7 +80,7 @@
|
||||
<option value="">-- No coach assigned --</option>
|
||||
{% for coach in coaches %}
|
||||
<option value="{{ coach.id }}" {% if tryout and tryout.coach_id == coach.id %}selected{% endif %}>
|
||||
{{ coach.full_name }}
|
||||
{{ coach.username }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<select id="player_id" name="player_id" class="form-select" required>
|
||||
<option value="">-- Select a player --</option>
|
||||
{% 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 %}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<div class="user-mini">
|
||||
<div class="avatar-sm">{{ u.full_name[:2] | upper }}</div>
|
||||
<span>{{ u.full_name }}</span>
|
||||
<div class="avatar-sm">{{ u.username[:2] | upper }}</div>
|
||||
<span>{{ u.username }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>{{ u.username }}</td>
|
||||
@@ -50,7 +50,7 @@
|
||||
<i class="fas fa-edit"></i> Edit
|
||||
</a>
|
||||
{% 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() }}"/>
|
||||
<button type="submit" class="btn btn-sm btn-danger">
|
||||
<i class="fas fa-trash"></i>
|
||||
|
||||
@@ -57,11 +57,11 @@
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<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 class="detail-item">
|
||||
<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 class="detail-item">
|
||||
<span class="detail-label">Registered Players</span>
|
||||
@@ -102,7 +102,7 @@
|
||||
<option value="">-- Select a player --</option>
|
||||
{% for p in all_players %}
|
||||
{% 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 %}
|
||||
</select>
|
||||
<button type="submit" class="btn btn-sm btn-primary ml-2">
|
||||
@@ -137,8 +137,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<div class="user-mini">
|
||||
<div class="avatar-sm">{{ p.full_name[:2] | upper }}</div>
|
||||
<span>{{ p.full_name }}</span>
|
||||
<div class="avatar-sm">{{ p.username[:2] | upper }}</div>
|
||||
<span>{{ p.username }}</span>
|
||||
</div>
|
||||
</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">
|
||||
<i class="fas fa-edit"></i> {% if player_eval_status.get(p.id) %}Edit{% else %}Evaluate{% endif %}
|
||||
</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>
|
||||
</a>
|
||||
</td>
|
||||
@@ -213,8 +213,8 @@
|
||||
<ul class="team-members">
|
||||
{% for member in team.members %}
|
||||
<li>
|
||||
<div class="avatar-sm">{{ member.player.full_name[:2] | upper }}</div>
|
||||
<span>{{ member.player.full_name }}</span>
|
||||
<div class="avatar-sm">{{ member.player.username[:2] | upper }}</div>
|
||||
<span>{{ member.player.username }}</span>
|
||||
{% if member.position %}
|
||||
<span class="position-tag">{{ member.position }}</span>
|
||||
{% endif %}
|
||||
@@ -231,7 +231,7 @@
|
||||
<option value="">Select player...</option>
|
||||
{% for p in registered_players %}
|
||||
{% 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 %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -429,8 +429,8 @@
|
||||
<tbody>
|
||||
{% for eval in evaluations %}
|
||||
<tr>
|
||||
<td>{{ eval.player.full_name }}</td>
|
||||
<td>{{ eval.evaluator.full_name }}</td>
|
||||
<td>{{ eval.player.username }}</td>
|
||||
<td>{{ eval.evaluator.username }}</td>
|
||||
<td>{{ eval.mecanics_score or '-' }}</td>
|
||||
<td>{{ eval.cohesion_score or '-' }}</td>
|
||||
<td>{{ eval.communication_score or '-' }}</td>
|
||||
|
||||
Reference in New Issue
Block a user