feat: add scouting shortlist mvp
This commit is contained in:
@ -4,10 +4,13 @@ from decimal import Decimal
|
||||
|
||||
from django.core.paginator import Paginator
|
||||
from django.db.models import Exists, OuterRef, Prefetch
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.urls import reverse
|
||||
from django.views.decorators.http import require_POST
|
||||
|
||||
from .forms import PlayerSearchForm
|
||||
from .models import Player, PlayerSeason
|
||||
from .models import FavoritePlayer, Player, PlayerSeason
|
||||
|
||||
PAGE_SIZE = 20
|
||||
PLAYER_SORTS = {
|
||||
@ -25,6 +28,19 @@ CONTEXT_SORTS = {
|
||||
}
|
||||
|
||||
|
||||
def apply_favorite_state(players):
|
||||
favorite_ids = set(FavoritePlayer.objects.values_list("player_id", flat=True))
|
||||
for player in players:
|
||||
player.is_favorite = player.id in favorite_ids
|
||||
|
||||
|
||||
def redirect_to_next(request, fallback_url):
|
||||
next_url = request.POST.get("next")
|
||||
if next_url and next_url.startswith("/"):
|
||||
return HttpResponseRedirect(next_url)
|
||||
return HttpResponseRedirect(fallback_url)
|
||||
|
||||
|
||||
def sort_players(players, sort_key: str, context_filters_used: bool):
|
||||
if sort_key not in PLAYER_SORTS | set(CONTEXT_SORTS):
|
||||
sort_key = "name_asc"
|
||||
@ -232,6 +248,7 @@ def player_list(request):
|
||||
active_sort = sort_players(players, requested_sort, context_filters_used)
|
||||
paginator = Paginator(players, PAGE_SIZE)
|
||||
page_obj = paginator.get_page(request.GET.get("page"))
|
||||
apply_favorite_state(page_obj.object_list)
|
||||
query_without_page = request.GET.copy()
|
||||
query_without_page.pop("page", None)
|
||||
|
||||
@ -268,5 +285,39 @@ def player_detail(request, player_id: int):
|
||||
{
|
||||
"player": player,
|
||||
"contexts": contexts,
|
||||
"is_favorite": FavoritePlayer.objects.filter(player=player).exists(),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@require_POST
|
||||
def add_favorite(request, player_id: int):
|
||||
player = get_object_or_404(Player, pk=player_id)
|
||||
FavoritePlayer.objects.get_or_create(player=player)
|
||||
return redirect_to_next(request, reverse("scouting:player_detail", args=[player.id]))
|
||||
|
||||
|
||||
@require_POST
|
||||
def remove_favorite(request, player_id: int):
|
||||
player = get_object_or_404(Player, pk=player_id)
|
||||
FavoritePlayer.objects.filter(player=player).delete()
|
||||
return redirect_to_next(request, reverse("scouting:player_detail", args=[player.id]))
|
||||
|
||||
|
||||
def favorites_list(request):
|
||||
favorites = list(
|
||||
FavoritePlayer.objects.select_related("player")
|
||||
.prefetch_related("player__roles", "player__specialties")
|
||||
.order_by("-created_at", "player__full_name")
|
||||
)
|
||||
|
||||
for entry in favorites:
|
||||
entry.player.is_favorite = True
|
||||
|
||||
return render(
|
||||
request,
|
||||
"scouting/favorites_list.html",
|
||||
{
|
||||
"favorites": favorites,
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user