generated from bisco/codex-bootstrap
114 lines
3.5 KiB
Python
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
|