feat: add shared scouting notes mvp

This commit is contained in:
bisco
2026-04-07 17:41:53 +02:00
parent 4f869c1c02
commit 4651746427
9 changed files with 176 additions and 5 deletions

View File

@ -3,14 +3,14 @@ from __future__ import annotations
from decimal import Decimal
from django.core.paginator import Paginator
from django.db.models import Exists, OuterRef, Prefetch
from django.db.models import Count, 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 FavoritePlayer, Player, PlayerSeason
from .models import FavoritePlayer, Player, PlayerNote, PlayerSeason
PAGE_SIZE = 20
PLAYER_SORTS = {
@ -269,7 +269,7 @@ def player_list(request):
def player_detail(request, player_id: int):
player = get_object_or_404(
Player.objects.prefetch_related("roles", "specialties"),
Player.objects.prefetch_related("roles", "specialties", "notes"),
pk=player_id,
)
@ -278,6 +278,7 @@ def player_detail(request, player_id: int):
.select_related("season", "team", "competition", "stats")
.order_by("-season__start_year", "team__name", "competition__name")
)
notes = player.notes.all()
return render(
request,
@ -285,6 +286,7 @@ def player_detail(request, player_id: int):
{
"player": player,
"contexts": contexts,
"notes": notes,
"is_favorite": FavoritePlayer.objects.filter(player=player).exists(),
},
)
@ -304,10 +306,27 @@ def remove_favorite(request, player_id: int):
return redirect_to_next(request, reverse("scouting:player_detail", args=[player.id]))
@require_POST
def add_note(request, player_id: int):
player = get_object_or_404(Player, pk=player_id)
body = (request.POST.get("body") or "").strip()
if body:
PlayerNote.objects.create(player=player, body=body)
return redirect_to_next(request, reverse("scouting:player_detail", args=[player.id]))
@require_POST
def delete_note(request, player_id: int, note_id: int):
player = get_object_or_404(Player, pk=player_id)
PlayerNote.objects.filter(player=player, pk=note_id).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")
.annotate(note_count=Count("player__notes"))
.order_by("-created_at", "player__full_name")
)