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')
|
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')
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 = []
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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 '' }}">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user