Erweitert die Team-Statistikansicht, sodass Head Coaches von übergeordneten Teams auch die Statistiken ihrer untergeordneten Teams einsehen können. Jedes Team wird mit seinen eigenen Statistiken separat dargestellt. Zusätzlich wurde eine Filterfunktion implementiert, die es ermöglicht, die Statistiken nach Saison zu filtern.
131 lines
4.1 KiB
Python
131 lines
4.1 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpResponseForbidden
|
|
from clubs.models import Team
|
|
from calendars.models import Game
|
|
|
|
def _calculate_statistics(team, season=None):
|
|
"""
|
|
Calculates statistics for a given team and season.
|
|
"""
|
|
games_query = Game.objects.filter(team=team, result__isnull=False)
|
|
if season:
|
|
games_query = games_query.filter(season=season)
|
|
|
|
games = games_query.order_by('start_time')
|
|
|
|
wins = 0
|
|
losses = 0
|
|
runs_scored = 0
|
|
runs_allowed = 0
|
|
inning_runs = {i: 0 for i in range(1, 10)}
|
|
streak_counter = 0
|
|
current_streak_type = None
|
|
last_game_result = None
|
|
|
|
for game in games:
|
|
result = game.result
|
|
|
|
sorted_items = sorted(result.inning_results.items(), key=lambda x: int(x[0].split('_')[1]))
|
|
home_innings = [
|
|
item[1].get('home')
|
|
for item in sorted_items
|
|
if isinstance(item[1].get('home'), int)
|
|
]
|
|
away_innings = [
|
|
item[1].get('guest')
|
|
for item in sorted_items
|
|
if isinstance(item[1].get('guest'), int)
|
|
]
|
|
home_score = sum(home_innings)
|
|
away_score = sum(away_innings)
|
|
|
|
if game.is_home_game:
|
|
team_score = home_score
|
|
opponent_score = away_score
|
|
else:
|
|
team_score = away_score
|
|
opponent_score = home_score
|
|
|
|
runs_scored += team_score
|
|
runs_allowed += opponent_score
|
|
|
|
if team_score > opponent_score:
|
|
wins += 1
|
|
if last_game_result == 'win':
|
|
streak_counter += 1
|
|
else:
|
|
streak_counter = 1
|
|
last_game_result = 'win'
|
|
elif team_score < opponent_score:
|
|
losses += 1
|
|
if last_game_result == 'loss':
|
|
streak_counter += 1
|
|
else:
|
|
streak_counter = 1
|
|
last_game_result = 'loss'
|
|
|
|
team_innings = home_innings if game.is_home_game else away_innings
|
|
for i, runs in enumerate(team_innings):
|
|
if i + 1 in inning_runs:
|
|
inning_runs[i + 1] += runs
|
|
|
|
total_games = wins + losses
|
|
pct = (wins / total_games) * 100 if total_games > 0 else 0
|
|
|
|
if last_game_result == 'win':
|
|
streak_str = f"Won {streak_counter}"
|
|
elif last_game_result == 'loss':
|
|
streak_str = f"Lost {streak_counter}"
|
|
else:
|
|
streak_str = "N/A"
|
|
|
|
if runs_scored > 0 or runs_allowed > 0:
|
|
pythagorean_pct = (runs_scored**2 / (runs_scored**2 + runs_allowed**2)) * 100
|
|
else:
|
|
pythagorean_pct = 0
|
|
|
|
return {
|
|
'team': team,
|
|
'wins': wins,
|
|
'losses': losses,
|
|
'pct': pct,
|
|
'streak': streak_str,
|
|
'runs_scored': runs_scored,
|
|
'runs_allowed': runs_allowed,
|
|
'pythagorean_pct': pythagorean_pct,
|
|
'inning_runs': inning_runs,
|
|
'total_games': total_games,
|
|
}
|
|
|
|
@login_required
|
|
def team_statistics(request, team_id):
|
|
team = get_object_or_404(Team, pk=team_id)
|
|
|
|
# User must be the head coach of the parent team to view the stats
|
|
if request.user != team.head_coach:
|
|
return HttpResponseForbidden("You are not authorized to view this page.")
|
|
|
|
selected_season = request.GET.get('season')
|
|
|
|
# Create a list of the parent team and all its child teams
|
|
teams_to_display = [team] + list(team.child_teams.all())
|
|
|
|
# Calculate statistics for each team
|
|
teams_stats = []
|
|
for t in teams_to_display:
|
|
stats = _calculate_statistics(t, selected_season)
|
|
teams_stats.append(stats)
|
|
|
|
# Get all available seasons for the filter dropdown
|
|
available_seasons = Game.objects.values_list('season', flat=True).distinct().order_by('season')
|
|
|
|
context = {
|
|
'team': team, # Primary team for page header/auth
|
|
'teams_stats': teams_stats,
|
|
'available_seasons': available_seasons,
|
|
'selected_season': selected_season,
|
|
}
|
|
|
|
return render(request, 'team_stats/team_statistics.html', context)
|