Fügt eine neue Seite hinzu, auf der Headcoaches Statistiken für ihre Teams einsehen können. Die Statistikseite umfasst: - W-L-Bilanz, Siegquote (PCT) und aktuelle Serie - Balkendiagramm für erzielte und zugelassene Runs (RS vs. RA) - "Luck-O-Meter" zum Vergleich der realen und pythagoreischen Siegquote - Inning-Heatmap zur Anzeige der erzielten Runs pro Inning Die Seite ist über einen neuen Button auf dem Dashboard für jedes vom Headcoach trainierte Team erreichbar.
94 lines
2.9 KiB
Python
94 lines
2.9 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, GameResult
|
|
|
|
@login_required
|
|
def team_statistics(request, team_id):
|
|
team = get_object_or_404(Team, pk=team_id)
|
|
|
|
# Check if the user is the head coach of the team
|
|
if request.user != team.head_coach:
|
|
return HttpResponseForbidden("You are not authorized to view this page.")
|
|
|
|
games = Game.objects.filter(team=team, result__isnull=False).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
|
|
|
|
home_score = sum(result.inning_results.get('home', []))
|
|
away_score = sum(result.inning_results.get('away', []))
|
|
|
|
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
|
|
|
|
# W-L Record and Streak
|
|
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'
|
|
|
|
# Inning Heatmap
|
|
team_innings = result.inning_results.get('home' if game.is_home_game else 'away', [])
|
|
for i, runs in enumerate(team_innings):
|
|
if i + 1 in inning_runs:
|
|
inning_runs[i + 1] += runs
|
|
|
|
# Winning Percentage (PCT)
|
|
total_games = wins + losses
|
|
pct = (wins / total_games) * 100 if total_games > 0 else 0
|
|
|
|
# Streak
|
|
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"
|
|
|
|
# Pythagorean Winning Percentage
|
|
if runs_scored > 0 or runs_allowed > 0:
|
|
pythagorean_pct = (runs_scored**2 / (runs_scored**2 + runs_allowed**2)) * 100
|
|
else:
|
|
pythagorean_pct = 0
|
|
|
|
context = {
|
|
'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,
|
|
}
|
|
|
|
return render(request, 'team_stats/team_statistics.html', context) |