feat(v2-api): expose sortable search metrics in player list responses
This commit is contained in:
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user