80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
from rest_framework import generics
|
|
from rest_framework.pagination import PageNumberPagination
|
|
from rest_framework.throttling import AnonRateThrottle, UserRateThrottle
|
|
|
|
from apps.competitions.models import Competition, Season
|
|
from apps.players.forms import PlayerSearchForm
|
|
from apps.players.models import Player
|
|
from apps.players.services.search import (
|
|
METRIC_SORT_KEYS,
|
|
annotate_player_metrics,
|
|
apply_sorting,
|
|
base_player_queryset,
|
|
filter_players,
|
|
)
|
|
from apps.teams.models import Team
|
|
|
|
from .permissions import ReadOnlyOrDeny
|
|
from .serializers import (
|
|
CompetitionSerializer,
|
|
PlayerDetailSerializer,
|
|
PlayerListSerializer,
|
|
SeasonSerializer,
|
|
TeamSerializer,
|
|
)
|
|
|
|
|
|
class ApiPagination(PageNumberPagination):
|
|
page_size = 20
|
|
page_size_query_param = "page_size"
|
|
max_page_size = 100
|
|
|
|
|
|
class ReadOnlyBaseAPIView:
|
|
permission_classes = [ReadOnlyOrDeny]
|
|
throttle_classes = [AnonRateThrottle, UserRateThrottle]
|
|
|
|
|
|
class PlayerSearchApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
|
|
serializer_class = PlayerListSerializer
|
|
pagination_class = ApiPagination
|
|
|
|
def get_queryset(self):
|
|
form = PlayerSearchForm(self.request.query_params or None)
|
|
queryset = base_player_queryset()
|
|
if form.is_valid():
|
|
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 = apply_sorting(queryset, sort_key)
|
|
else:
|
|
queryset = queryset.order_by("full_name", "id")
|
|
return queryset
|
|
|
|
|
|
class PlayerDetailApiView(ReadOnlyBaseAPIView, generics.RetrieveAPIView):
|
|
serializer_class = PlayerDetailSerializer
|
|
queryset = Player.objects.select_related(
|
|
"nationality",
|
|
"nominal_position",
|
|
"inferred_role",
|
|
"origin_competition",
|
|
"origin_team",
|
|
).prefetch_related("aliases")
|
|
|
|
|
|
class CompetitionListApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
|
|
serializer_class = CompetitionSerializer
|
|
queryset = Competition.objects.select_related("country").order_by("name")
|
|
|
|
|
|
class TeamListApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
|
|
serializer_class = TeamSerializer
|
|
queryset = Team.objects.select_related("country").order_by("name")
|
|
|
|
|
|
class SeasonListApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
|
|
serializer_class = SeasonSerializer
|
|
queryset = Season.objects.order_by("-start_date")
|