fix(v2-ingestion): harden LBA/BCL snapshot contract for public data
This commit is contained in:
@ -62,6 +62,21 @@ def _parse_season_dates(label: str) -> tuple[date, date]:
|
||||
return date(year, 9, 1), date(year + 1, 7, 31)
|
||||
|
||||
|
||||
def _parse_optional_birth_date(value: str | None) -> date | None:
|
||||
if value in (None, ""):
|
||||
return None
|
||||
return parse_date(value)
|
||||
|
||||
|
||||
def _split_name_parts(full_name: str) -> tuple[str, str]:
|
||||
parts = full_name.strip().split(maxsplit=1)
|
||||
if not parts:
|
||||
return "", ""
|
||||
if len(parts) == 1:
|
||||
return parts[0], ""
|
||||
return parts[0], parts[1]
|
||||
|
||||
|
||||
def _resolve_nationality(value: str | None) -> Nationality | None:
|
||||
if not value:
|
||||
return None
|
||||
@ -152,10 +167,13 @@ def _upsert_record(record: dict[str, Any], *, source_name: str, snapshot_date: d
|
||||
},
|
||||
)
|
||||
|
||||
position, _ = Position.objects.get_or_create(
|
||||
code=_position_code(record["position"]),
|
||||
defaults={"name": record["position"]},
|
||||
)
|
||||
position_value = record.get("position")
|
||||
position = None
|
||||
if position_value:
|
||||
position, _ = Position.objects.get_or_create(
|
||||
code=_position_code(position_value),
|
||||
defaults={"name": position_value},
|
||||
)
|
||||
role = None
|
||||
if record.get("role"):
|
||||
role, _ = Role.objects.get_or_create(
|
||||
@ -163,19 +181,24 @@ def _upsert_record(record: dict[str, Any], *, source_name: str, snapshot_date: d
|
||||
defaults={"name": record["role"]},
|
||||
)
|
||||
|
||||
first_name = record.get("first_name") or ""
|
||||
last_name = record.get("last_name") or ""
|
||||
if not first_name and not last_name:
|
||||
first_name, last_name = _split_name_parts(record["full_name"])
|
||||
|
||||
player, _ = Player.objects.update_or_create(
|
||||
source_name=source_key,
|
||||
source_uid=record["player_external_id"],
|
||||
defaults={
|
||||
"first_name": record["first_name"],
|
||||
"last_name": record["last_name"],
|
||||
"first_name": first_name,
|
||||
"last_name": last_name,
|
||||
"full_name": record["full_name"],
|
||||
"birth_date": parse_date(record["birth_date"]),
|
||||
"birth_date": _parse_optional_birth_date(record.get("birth_date")),
|
||||
"nationality": _resolve_nationality(record.get("nationality")),
|
||||
"nominal_position": position,
|
||||
"inferred_role": role,
|
||||
"height_cm": record["height_cm"],
|
||||
"weight_kg": record["weight_kg"],
|
||||
"height_cm": record.get("height_cm"),
|
||||
"weight_kg": record.get("weight_kg"),
|
||||
"is_active": True,
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user