feat(players): add origin competition/team model and filtering
This commit is contained in:
46
apps/players/services/origin.py
Normal file
46
apps/players/services/origin.py
Normal file
@ -0,0 +1,46 @@
|
||||
from django.db.models import F, Q, QuerySet
|
||||
|
||||
from apps.players.models import Player, PlayerCareerEntry
|
||||
|
||||
|
||||
def get_origin_career_entry(player: Player) -> PlayerCareerEntry | None:
|
||||
"""Earliest meaningful career entry, ordered by start_date then season start date."""
|
||||
return (
|
||||
PlayerCareerEntry.objects.select_related("competition", "team", "season")
|
||||
.filter(player=player)
|
||||
.filter(Q(competition__isnull=False) | Q(team__isnull=False))
|
||||
.order_by(
|
||||
F("start_date").asc(nulls_last=True),
|
||||
F("season__start_date").asc(nulls_last=True),
|
||||
"id",
|
||||
)
|
||||
.first()
|
||||
)
|
||||
|
||||
|
||||
def refresh_player_origin(player: Player, *, save: bool = True) -> bool:
|
||||
"""Update origin fields from earliest meaningful career entry."""
|
||||
entry = get_origin_career_entry(player)
|
||||
origin_competition = entry.competition if entry else None
|
||||
origin_team = entry.team if entry else None
|
||||
|
||||
changed = (
|
||||
player.origin_competition_id != (origin_competition.id if origin_competition else None)
|
||||
or player.origin_team_id != (origin_team.id if origin_team else None)
|
||||
)
|
||||
if changed:
|
||||
player.origin_competition = origin_competition
|
||||
player.origin_team = origin_team
|
||||
if save:
|
||||
player.save(update_fields=["origin_competition", "origin_team", "updated_at"])
|
||||
return changed
|
||||
|
||||
|
||||
def refresh_player_origins(queryset: QuerySet[Player] | None = None) -> int:
|
||||
"""Backfill/recompute origin fields for players in queryset."""
|
||||
players = queryset if queryset is not None else Player.objects.all()
|
||||
updated = 0
|
||||
for player in players.iterator():
|
||||
if refresh_player_origin(player):
|
||||
updated += 1
|
||||
return updated
|
||||
@ -47,6 +47,10 @@ def filter_players(queryset, data: dict):
|
||||
queryset = queryset.filter(inferred_role=data["inferred_role"])
|
||||
if data.get("nationality"):
|
||||
queryset = queryset.filter(nationality=data["nationality"])
|
||||
if data.get("origin_competition"):
|
||||
queryset = queryset.filter(origin_competition=data["origin_competition"])
|
||||
if data.get("origin_team"):
|
||||
queryset = queryset.filter(origin_team=data["origin_team"])
|
||||
|
||||
if data.get("team"):
|
||||
queryset = queryset.filter(player_seasons__team=data["team"])
|
||||
@ -185,4 +189,6 @@ def base_player_queryset():
|
||||
"nationality",
|
||||
"nominal_position",
|
||||
"inferred_role",
|
||||
"origin_competition",
|
||||
"origin_team",
|
||||
).prefetch_related("aliases")
|
||||
|
||||
Reference in New Issue
Block a user