feat: show matching season context in player results
This commit is contained in:
@ -14,6 +14,7 @@ def player_list(request):
|
||||
.prefetch_related("roles", "specialties")
|
||||
.order_by("full_name")
|
||||
)
|
||||
context_filters_used = False
|
||||
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
@ -64,13 +65,17 @@ def player_list(request):
|
||||
|
||||
if context_filters_used:
|
||||
context_qs = PlayerSeason.objects.filter(player=OuterRef("pk"))
|
||||
matching_contexts = PlayerSeason.objects.all()
|
||||
|
||||
if data["competition"]:
|
||||
context_qs = context_qs.filter(competition=data["competition"])
|
||||
matching_contexts = matching_contexts.filter(competition=data["competition"])
|
||||
if data["season"]:
|
||||
context_qs = context_qs.filter(season=data["season"])
|
||||
matching_contexts = matching_contexts.filter(season=data["season"])
|
||||
if data["team"]:
|
||||
context_qs = context_qs.filter(team=data["team"])
|
||||
matching_contexts = matching_contexts.filter(team=data["team"])
|
||||
|
||||
stats_filters_used = any(
|
||||
data[field] is not None
|
||||
@ -89,38 +94,71 @@ def player_list(request):
|
||||
)
|
||||
if stats_filters_used:
|
||||
context_qs = context_qs.filter(stats__isnull=False)
|
||||
matching_contexts = matching_contexts.filter(stats__isnull=False)
|
||||
|
||||
if data["min_points"] is not None:
|
||||
context_qs = context_qs.filter(stats__points__gte=data["min_points"])
|
||||
matching_contexts = matching_contexts.filter(stats__points__gte=data["min_points"])
|
||||
if data["min_assists"] is not None:
|
||||
context_qs = context_qs.filter(stats__assists__gte=data["min_assists"])
|
||||
matching_contexts = matching_contexts.filter(stats__assists__gte=data["min_assists"])
|
||||
if data["min_steals"] is not None:
|
||||
context_qs = context_qs.filter(stats__steals__gte=data["min_steals"])
|
||||
matching_contexts = matching_contexts.filter(stats__steals__gte=data["min_steals"])
|
||||
if data["max_turnovers"] is not None:
|
||||
context_qs = context_qs.filter(stats__turnovers__lte=data["max_turnovers"])
|
||||
matching_contexts = matching_contexts.filter(stats__turnovers__lte=data["max_turnovers"])
|
||||
if data["min_blocks"] is not None:
|
||||
context_qs = context_qs.filter(stats__blocks__gte=data["min_blocks"])
|
||||
matching_contexts = matching_contexts.filter(stats__blocks__gte=data["min_blocks"])
|
||||
if data["min_efg_pct"] is not None:
|
||||
context_qs = context_qs.filter(stats__efg_pct__gte=data["min_efg_pct"])
|
||||
matching_contexts = matching_contexts.filter(stats__efg_pct__gte=data["min_efg_pct"])
|
||||
if data["min_ts_pct"] is not None:
|
||||
context_qs = context_qs.filter(stats__ts_pct__gte=data["min_ts_pct"])
|
||||
matching_contexts = matching_contexts.filter(stats__ts_pct__gte=data["min_ts_pct"])
|
||||
if data["min_plus_minus"] is not None:
|
||||
context_qs = context_qs.filter(stats__plus_minus__gte=data["min_plus_minus"])
|
||||
matching_contexts = matching_contexts.filter(stats__plus_minus__gte=data["min_plus_minus"])
|
||||
if data["min_offensive_rating"] is not None:
|
||||
context_qs = context_qs.filter(stats__offensive_rating__gte=data["min_offensive_rating"])
|
||||
matching_contexts = matching_contexts.filter(
|
||||
stats__offensive_rating__gte=data["min_offensive_rating"]
|
||||
)
|
||||
if data["max_defensive_rating"] is not None:
|
||||
context_qs = context_qs.filter(stats__defensive_rating__lte=data["max_defensive_rating"])
|
||||
matching_contexts = matching_contexts.filter(
|
||||
stats__defensive_rating__lte=data["max_defensive_rating"]
|
||||
)
|
||||
|
||||
queryset = queryset.annotate(has_matching_context=Exists(context_qs)).filter(has_matching_context=True)
|
||||
# Reuse the same filtered PlayerSeason scope and take the first ordered row
|
||||
# so the displayed context is deterministic and tied to the actual match.
|
||||
matching_contexts = (
|
||||
matching_contexts.select_related("season", "team", "competition", "stats")
|
||||
.order_by("-season__start_year", "team__name", "competition__name", "pk")
|
||||
)
|
||||
queryset = queryset.prefetch_related(
|
||||
Prefetch(
|
||||
"player_seasons",
|
||||
queryset=matching_contexts,
|
||||
to_attr="matching_contexts",
|
||||
)
|
||||
)
|
||||
|
||||
queryset = queryset.distinct()
|
||||
players = list(queryset)
|
||||
|
||||
if context_filters_used:
|
||||
for player in players:
|
||||
player.matching_context = next(iter(player.matching_contexts), None)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"scouting/player_list.html",
|
||||
{
|
||||
"form": form,
|
||||
"players": queryset,
|
||||
"players": players,
|
||||
},
|
||||
)
|
||||
|
||||
@ -133,8 +171,7 @@ def player_detail(request, player_id: int):
|
||||
|
||||
contexts = (
|
||||
PlayerSeason.objects.filter(player=player)
|
||||
.select_related("season", "team", "competition")
|
||||
.prefetch_related(Prefetch("stats"))
|
||||
.select_related("season", "team", "competition", "stats")
|
||||
.order_by("-season__start_year", "team__name", "competition__name")
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user