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