Matthias Nagel 56e7393524 feat: Team-Statistik-Dashboard für Headcoaches
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.
2025-11-19 05:31:52 +01:00

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)