ajout des disponibilités de joueurs et ajouts d'un tableau qui montre les dispo des joueurs lors de la création d'un match
This commit is contained in:
+103
-11
@@ -1,8 +1,8 @@
|
||||
from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify
|
||||
from flask_login import login_required, current_user
|
||||
from extensions import db
|
||||
from models import User, Tryout, Match, MatchParticipant, Team, TeamMember, OrgTeam, TryoutRegistration
|
||||
from datetime import datetime, time
|
||||
from models import User, Tryout, Match, MatchParticipant, Team, TeamMember, OrgTeam, TryoutRegistration, PlayerDisponibility
|
||||
from datetime import datetime, time, timedelta
|
||||
|
||||
matches_bp = Blueprint('matches', __name__, url_prefix='/matches')
|
||||
|
||||
@@ -60,7 +60,10 @@ def api_events():
|
||||
match_desc = participants_str + (f"<br>{match.description}" if match.description else '')
|
||||
else:
|
||||
# Player scrim - show all participants
|
||||
player_names = [p.player.full_name for p in match.participants.all()]
|
||||
player_names = []
|
||||
for p in match.participants.all():
|
||||
player_name = p.player.full_name 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 '')
|
||||
|
||||
@@ -153,14 +156,23 @@ def api_events_for_tryout(tryout_id):
|
||||
participants_str = f"{' vs '.join(teams)}"
|
||||
elif match.match_type == 'player_vs_player':
|
||||
# Get players grouped by team side
|
||||
team1_players = [p.player.full_name for p in match.participants.filter_by(team_side=1).all()]
|
||||
team2_players = [p.player.full_name for p in match.participants.filter_by(team_side=2).all()]
|
||||
team1_players = []
|
||||
for p in match.participants.filter_by(team_side=1).all():
|
||||
if p.player:
|
||||
team1_players.append(p.player.full_name)
|
||||
team2_players = []
|
||||
for p in match.participants.filter_by(team_side=2).all():
|
||||
if p.player:
|
||||
team2_players.append(p.player.full_name)
|
||||
if team1_players and team2_players:
|
||||
participants_str = f"{', '.join(team1_players)} vs {', '.join(team2_players)}"
|
||||
else:
|
||||
participants_str = 'TBD vs TBD'
|
||||
else:
|
||||
player_names = [p.player.full_name for p in match.participants.all()]
|
||||
player_names = []
|
||||
for p in match.participants.all():
|
||||
player_name = p.player.full_name if p.player else 'Unknown Player'
|
||||
player_names.append(player_name)
|
||||
participants_str = ', '.join(player_names) if player_names else 'No players'
|
||||
|
||||
# Include time for calendar display
|
||||
@@ -244,6 +256,11 @@ def create_match(tryout_id):
|
||||
location = request.form.get('location')
|
||||
match_type = request.form.get('match_type')
|
||||
|
||||
# Start time is now mandatory
|
||||
if not start_time_str:
|
||||
flash('Start time is required. Please select a time slot.', 'danger')
|
||||
return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players)
|
||||
|
||||
try:
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else tryout.date
|
||||
except (ValueError, TypeError):
|
||||
@@ -253,10 +270,15 @@ def create_match(tryout_id):
|
||||
start_time = None
|
||||
end_time = None
|
||||
try:
|
||||
if start_time_str:
|
||||
start_time = datetime.strptime(start_time_str, '%H:%M').time()
|
||||
start_time = datetime.strptime(start_time_str, '%H:%M').time()
|
||||
# Auto-calculate end time if not provided (start + 30 minutes)
|
||||
if end_time_str:
|
||||
end_time = datetime.strptime(end_time_str, '%H:%M').time()
|
||||
else:
|
||||
# Auto-calculate end time as start + 30 minutes
|
||||
start_dt = datetime.combine(date_obj, start_time)
|
||||
end_dt = start_dt + timedelta(minutes=30)
|
||||
end_time = end_dt.time()
|
||||
except ValueError:
|
||||
flash('Invalid time format.', 'danger')
|
||||
return render_template('pages/create_match.html', tryout=tryout, teams=teams, all_players=all_players)
|
||||
@@ -340,11 +362,21 @@ def edit_match(match_id):
|
||||
flash('Invalid date format.', 'danger')
|
||||
return render_template('pages/edit_match.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids)
|
||||
|
||||
# Start time is now mandatory
|
||||
if not start_time_str:
|
||||
flash('Start time is required. Please select a time slot.', 'danger')
|
||||
return render_template('pages/edit_match.html', match=match, tryout=tryout, teams=teams, all_players=all_players, current_player_ids=current_player_ids)
|
||||
|
||||
try:
|
||||
if start_time_str:
|
||||
match.start_time = datetime.strptime(start_time_str, '%H:%M').time()
|
||||
match.start_time = datetime.strptime(start_time_str, '%H:%M').time()
|
||||
# Auto-calculate end time if not provided (start + 30 minutes)
|
||||
if end_time_str:
|
||||
match.end_time = datetime.strptime(end_time_str, '%H:%M').time()
|
||||
else:
|
||||
# Auto-calculate end time as start + 30 minutes
|
||||
start_dt = datetime.combine(match.date, match.start_time)
|
||||
end_dt = start_dt + timedelta(minutes=30)
|
||||
match.end_time = end_dt.time()
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
@@ -400,4 +432,64 @@ def delete_match(match_id):
|
||||
db.session.delete(match)
|
||||
db.session.commit()
|
||||
flash('Match deleted successfully.', 'success')
|
||||
return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id))
|
||||
return redirect(url_for('tryouts.view_tryout', tryout_id=tryout.id))
|
||||
|
||||
|
||||
def get_players_available_at_time(date_str, time_str):
|
||||
"""Get list of player IDs available at a specific date and time.
|
||||
|
||||
Args:
|
||||
date_str: Date in YYYY-MM-DD format
|
||||
time_str: Time in HH:MM format
|
||||
|
||||
Returns:
|
||||
List of player IDs who are available at that time
|
||||
"""
|
||||
try:
|
||||
date_obj = datetime.strptime(date_str, '%Y-%m-%d').date()
|
||||
time_obj = datetime.strptime(time_str, '%H:%M').time()
|
||||
except (ValueError, TypeError):
|
||||
return []
|
||||
|
||||
# Calculate day of week (Python: 0=Monday, 6=Sunday)
|
||||
# JavaScript: 0=Sunday, 6=Saturday, so we convert
|
||||
date_parts = date_str.split('-')
|
||||
date_for_day = datetime(int(date_parts[0]), int(date_parts[1]), int(date_parts[2]))
|
||||
js_day = date_for_day.weekday()
|
||||
|
||||
# Convert Python weekday (Mon=0) to our format (Mon=0)
|
||||
day_of_week = js_day
|
||||
|
||||
# Get all active players
|
||||
players = User.query.filter_by(role='player', is_active_account=True).all()
|
||||
|
||||
available_players = []
|
||||
for player in players:
|
||||
# Check if player has disponibility at this time
|
||||
disponibilities = PlayerDisponibility.query.filter_by(
|
||||
player_id=player.id,
|
||||
day_of_week=day_of_week
|
||||
).all()
|
||||
|
||||
for disp in disponibilities:
|
||||
# Check if time falls within disponibility block
|
||||
disp_start = disp.start_time.hour * 60 + disp.start_time.minute
|
||||
disp_end = disp.end_time.hour * 60 + disp.end_time.minute
|
||||
match_time = time_obj.hour * 60 + time_obj.minute
|
||||
|
||||
if disp_start <= match_time < disp_end:
|
||||
available_players.append(player.id)
|
||||
break
|
||||
|
||||
return available_players
|
||||
|
||||
|
||||
@matches_bp.route('/api/available_players/<date>/<time>')
|
||||
@login_required
|
||||
def api_available_players(date, time):
|
||||
"""API endpoint to get players available at a specific date/time slot."""
|
||||
if not current_user.can_manage_teams() and not current_user.can_schedule_matches():
|
||||
return jsonify({'error': 'Unauthorized'}), 403
|
||||
|
||||
player_ids = get_players_available_at_time(date, time)
|
||||
return jsonify({'available_player_ids': player_ids})
|
||||
|
||||
Reference in New Issue
Block a user