119 lines
3.8 KiB
Python
119 lines
3.8 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
|
|
print("DEBUGGER:"+str(result))
|
|
print("INNING_RESULTS:"+str(result.inning_results))
|
|
|
|
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)
|
|
]
|
|
sorted_items = sorted(result.inning_results.items(),key=lambda x: int(x[0].split('_')[1]))
|
|
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)
|
|
print("HOMEINNING:"+str(home_innings))
|
|
if game.is_home_game:
|
|
print("HEIMSPIEL")
|
|
team_score = home_score
|
|
opponent_score = away_score
|
|
print("Teamscore"+str(team_score))
|
|
print("Gegnerscore"+str(opponent_score))
|
|
else:
|
|
print("Auswerts")
|
|
team_score = away_score
|
|
opponent_score = home_score
|
|
print("Teamscore"+str(team_score))
|
|
print("Gegnerscore"+str(opponent_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'
|
|
print("Win:"+str(wins))
|
|
print("Looses:"+str(losses))
|
|
# Inning Heatmap
|
|
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
|
|
|
|
# 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,
|
|
}
|
|
print("DebuggeR:"+str(context))
|
|
|
|
return render(request, 'team_stats/team_statistics.html', context)
|