47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
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
|