From fb782d85dbfffa3ccbaedb47f73fa5de5d7d5a6a Mon Sep 17 00:00:00 2001 From: Matthias Nagel Date: Wed, 19 Nov 2025 21:14:21 +0100 Subject: [PATCH] Feat: Supporter-Team-Statistiken in der Team-Statistikansicht MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erweitert die Team-Statistikansicht um zwei neue Metriken: - 'Games with Supporters': Zeigt die Anzahl der Spiele an, die mit Unterstützung durch ein zweites Team (Supporter-Team) stattgefunden haben. - 'Avg. Supporter Share': Berechnet den durchschnittlichen Prozentsatz der Spieler, die in diesen Spielen vom Supporter-Team gestellt wurden. Diese Statistiken helfen, den Grad der Abhängigkeit von externer Spielerunterstützung zu analysieren. Die Anzeige erfolgt in einer neuen Karte auf der Team-Statistikseite. Änderungen umfassen: - Anpassung der Funktion in zur Berechnung der neuen Metriken unter Berücksichtigung von und . - Erweiterung des Templates um eine neue 'Supporter Stats'-Karte zur Anzeige der berechneten Werte. --- .../templates/team_stats/team_statistics.html | 19 +++++++++++--- team_stats/views.py | 25 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/team_stats/templates/team_stats/team_statistics.html b/team_stats/templates/team_stats/team_statistics.html index bea42ed..1120bd4 100644 --- a/team_stats/templates/team_stats/team_statistics.html +++ b/team_stats/templates/team_stats/team_statistics.html @@ -67,9 +67,9 @@ - +
-
+
Luck-O-Meter
@@ -78,7 +78,20 @@
-
+
+
+
Supporter Stats
+
+

Games with Supporters: {{ stats.games_with_supporters }}

+

Avg. Supporter Share: {{ stats.avg_supporter_player_percentage|floatformat:2 }}%

+
+
+
+
+ + +
+
Inning Heatmap (Runs Scored)
diff --git a/team_stats/views.py b/team_stats/views.py index 9e84019..a2f821e 100644 --- a/team_stats/views.py +++ b/team_stats/views.py @@ -2,13 +2,13 @@ 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 +from calendars.models import Game, EventParticipation def _calculate_statistics(team, season=None): """ Calculates statistics for a given team and season. """ - games_query = Game.objects.filter(team=team, result__isnull=False) + games_query = Game.objects.filter(team=team, result__isnull=False).prefetch_related('opened_for_teams') if season: games_query = games_query.filter(season=season) @@ -20,10 +20,25 @@ def _calculate_statistics(team, season=None): runs_allowed = 0 inning_runs = {i: 0 for i in range(1, 10)} streak_counter = 0 - current_streak_type = None last_game_result = None + + games_with_supporters = 0 + total_supporter_player_percentage = 0 for game in games: + # Supporter stats + if game.opened_for_teams.exists(): + games_with_supporters += 1 + + attending_players = EventParticipation.objects.filter(event=game, status='attending').select_related('user__team') + total_attendees = attending_players.count() + + if total_attendees > 0: + supporter_players_count = attending_players.exclude(user__team=game.team).count() + supporter_percentage = (supporter_players_count / total_attendees) * 100 + total_supporter_player_percentage += supporter_percentage + + # Standard game stats result = game.result sorted_items = sorted(result.inning_results.items(), key=lambda x: int(x[0].split('_')[1])) @@ -84,6 +99,8 @@ def _calculate_statistics(team, season=None): pythagorean_pct = (runs_scored**2 / (runs_scored**2 + runs_allowed**2)) * 100 else: pythagorean_pct = 0 + + avg_supporter_player_percentage = (total_supporter_player_percentage / games_with_supporters) if games_with_supporters > 0 else 0 return { 'team': team, @@ -96,6 +113,8 @@ def _calculate_statistics(team, season=None): 'pythagorean_pct': pythagorean_pct, 'inning_runs': inning_runs, 'total_games': total_games, + 'games_with_supporters': games_with_supporters, + 'avg_supporter_player_percentage': avg_supporter_player_percentage, } @login_required