generated from bisco/codex-bootstrap
feat: bootstrap HoopScout scouting app
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
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
|
||||
Reference in New Issue
Block a user