Files
hoopscout-v3/backend/scouting/serializers.py
T
2026-06-03 21:37:15 +02:00

114 lines
3.5 KiB
Python

from rest_framework import serializers
from .models import League, Player, PlayerGameLog, PlayerSeasonStat, Team
class LeagueSerializer(serializers.ModelSerializer):
class Meta:
model = League
fields = ["name", "code", "region", "country"]
class TeamSerializer(serializers.ModelSerializer):
class Meta:
model = Team
fields = ["name", "country"]
class PlayerSeasonStatSerializer(serializers.ModelSerializer):
class Meta:
model = PlayerSeasonStat
fields = [
"games_played",
"minutes_per_game",
"points_per_game",
"assists_per_game",
"rebounds_per_game",
"steals_per_game",
"blocks_per_game",
"turnovers_per_game",
"field_goal_percentage",
"three_point_percentage",
"free_throw_percentage",
"efficiency_rating",
"true_shooting_percentage",
"usage_percentage",
"total_points",
"total_assists",
"total_rebounds",
]
class PlayerGameLogSerializer(serializers.ModelSerializer):
class Meta:
model = PlayerGameLog
fields = [
"game_date",
"opponent",
"points",
"assists",
"rebounds",
"steals",
"blocks",
"turnovers",
"efficiency_rating",
]
class PlayerListSerializer(serializers.ModelSerializer):
name = serializers.CharField(read_only=True)
league = serializers.SerializerMethodField()
team = serializers.SerializerMethodField()
stats = serializers.SerializerMethodField()
class Meta:
model = Player
fields = [
"id",
"name",
"position",
"role",
"birth_year",
"height_cm",
"weight_kg",
"nationality",
"league",
"team",
"stats",
]
def get_league(self, player: Player) -> dict | None:
stat = self._current_stat(player)
return LeagueSerializer(stat.league).data if stat else None
def get_team(self, player: Player) -> dict | None:
stat = self._current_stat(player)
team = stat.team if stat else player.current_team
return TeamSerializer(team).data if team else None
def get_stats(self, player: Player) -> dict | None:
stat = self._current_stat(player)
return PlayerSeasonStatSerializer(stat).data if stat else None
def _current_stat(self, player: Player) -> PlayerSeasonStat | None:
prefetched = getattr(player, "prefetched_stats", None)
if prefetched is not None:
return prefetched[0] if prefetched else None
return player.season_stats.select_related("league", "team", "season").first()
class PlayerDetailSerializer(PlayerListSerializer):
best_game = serializers.SerializerMethodField()
worst_game = serializers.SerializerMethodField()
class Meta(PlayerListSerializer.Meta):
fields = PlayerListSerializer.Meta.fields + ["external_source", "profile_url", "best_game", "worst_game"]
def get_best_game(self, player: Player) -> dict | None:
game = player.game_logs.order_by("-efficiency_rating", "-points").first()
return PlayerGameLogSerializer(game).data if game else None
def get_worst_game(self, player: Player) -> dict | None:
game = player.game_logs.order_by("efficiency_rating", "points").first()
return PlayerGameLogSerializer(game).data if game else None