feat(v2-api): expose sortable search metrics in player list responses

This commit is contained in:
Alfredo Di Stasio
2026-03-20 16:05:56 +01:00
parent f2d5e20701
commit 90f83091ce
4 changed files with 65 additions and 4 deletions

View File

@ -45,6 +45,8 @@ class PlayerListSerializer(serializers.ModelSerializer):
inferred_role = serializers.CharField(source="inferred_role.name", allow_null=True)
origin_competition = serializers.CharField(source="origin_competition.name", allow_null=True)
origin_team = serializers.CharField(source="origin_team.name", allow_null=True)
ppg_value = serializers.SerializerMethodField()
mpg_value = serializers.SerializerMethodField()
class Meta:
model = Player
@ -59,10 +61,20 @@ class PlayerListSerializer(serializers.ModelSerializer):
"origin_team",
"height_cm",
"weight_kg",
"ppg_value",
"mpg_value",
"dominant_hand",
"is_active",
]
def get_ppg_value(self, obj):
value = getattr(obj, "ppg_value", None)
return str(value) if value is not None else None
def get_mpg_value(self, obj):
value = getattr(obj, "mpg_value", None)
return float(value) if value is not None else None
class PlayerAliasSerializer(serializers.Serializer):
alias = serializers.CharField()

View File

@ -9,6 +9,7 @@ from apps.players.forms import PlayerSearchForm
from apps.players.models import Player
from apps.players.services.search import (
METRIC_SORT_KEYS,
SEARCH_METRIC_SEMANTICS_TEXT,
annotate_player_metrics,
apply_sorting,
base_player_queryset,
@ -67,15 +68,18 @@ class PlayerSearchApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
form = self.get_search_form()
if form.is_bound and not form.is_valid():
return self._validation_error_response()
return super().list(request, *args, **kwargs)
response = super().list(request, *args, **kwargs)
response.data["sort"] = form.cleaned_data.get("sort", "name_asc")
response.data["metric_semantics"] = SEARCH_METRIC_SEMANTICS_TEXT
response.data["metric_sort_keys"] = sorted(METRIC_SORT_KEYS)
return response
def get_queryset(self):
form = self.get_search_form()
queryset = base_player_queryset()
queryset = filter_players(queryset, form.cleaned_data)
sort_key = form.cleaned_data.get("sort", "name_asc")
if sort_key in METRIC_SORT_KEYS:
queryset = annotate_player_metrics(queryset, form.cleaned_data)
queryset = annotate_player_metrics(queryset, form.cleaned_data)
queryset = apply_sorting(queryset, sort_key)
return queryset