все остальные апдейты на Кубок России
This commit is contained in:
@@ -222,6 +222,104 @@ def get_player_id_by_external_id(external_id: str) -> int | None:
|
||||
conn.close()
|
||||
|
||||
|
||||
|
||||
def _split_full_name_for_autocreate(full_name: str) -> tuple[str, str]:
|
||||
"""Аккуратно делит имя с сайта на first_name / last_name для новых записей."""
|
||||
parts = [p.strip() for p in str(full_name or "").replace("\xa0", " ").split() if p.strip()]
|
||||
if not parts:
|
||||
return "", ""
|
||||
if len(parts) == 1:
|
||||
return "", parts[0]
|
||||
|
||||
# На сайте чаще приходит "Имя Фамилия". Полное имя всё равно сохраняем отдельно,
|
||||
# поэтому даже при другом порядке данные можно быстро поправить в справочнике.
|
||||
first_name = parts[0]
|
||||
last_name = " ".join(parts[1:])
|
||||
return first_name, last_name
|
||||
|
||||
|
||||
def create_player_from_lineup(
|
||||
team_id: int,
|
||||
external_id: str = "",
|
||||
full_name: str = "",
|
||||
number: str = "",
|
||||
position: str = "",
|
||||
) -> tuple[int | None, str | None]:
|
||||
"""Создаёт минимальную карточку игрока из протокола матча и возвращает (id, position).
|
||||
|
||||
Используется при загрузке составов с сайта, когда игрока ещё нет в справочнике.
|
||||
"""
|
||||
full_name = str(full_name or "").strip()
|
||||
if not full_name:
|
||||
return None, None
|
||||
|
||||
first_name, last_name = _split_full_name_for_autocreate(full_name)
|
||||
external_id = str(external_id or "").strip()
|
||||
number = str(number or "").strip()
|
||||
position = str(position or "").strip()
|
||||
|
||||
query = """
|
||||
INSERT INTO players (
|
||||
external_id,
|
||||
team_id,
|
||||
full_name,
|
||||
first_name,
|
||||
last_name,
|
||||
number,
|
||||
position,
|
||||
pos,
|
||||
amplua,
|
||||
is_active,
|
||||
photo_enabled,
|
||||
created_at,
|
||||
updated_at
|
||||
)
|
||||
VALUES (
|
||||
NULLIF(%s, ''), %s, %s, %s, %s, %s, %s, %s, %s, TRUE, FALSE,
|
||||
NOW(), NOW()
|
||||
)
|
||||
ON CONFLICT (external_id)
|
||||
DO UPDATE SET
|
||||
team_id = EXCLUDED.team_id,
|
||||
full_name = COALESCE(NULLIF(EXCLUDED.full_name, ''), players.full_name),
|
||||
first_name = COALESCE(NULLIF(EXCLUDED.first_name, ''), players.first_name),
|
||||
last_name = COALESCE(NULLIF(EXCLUDED.last_name, ''), players.last_name),
|
||||
number = COALESCE(NULLIF(EXCLUDED.number, ''), players.number),
|
||||
position = COALESCE(NULLIF(EXCLUDED.position, ''), players.position),
|
||||
pos = COALESCE(NULLIF(EXCLUDED.pos, ''), players.pos),
|
||||
amplua = COALESCE(NULLIF(EXCLUDED.amplua, ''), players.amplua),
|
||||
is_active = TRUE,
|
||||
updated_at = NOW()
|
||||
RETURNING id, position;
|
||||
"""
|
||||
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
query,
|
||||
(
|
||||
external_id,
|
||||
team_id,
|
||||
full_name,
|
||||
first_name,
|
||||
last_name,
|
||||
number,
|
||||
position,
|
||||
position,
|
||||
position,
|
||||
),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
conn.commit()
|
||||
return row if row else (None, None)
|
||||
except Exception:
|
||||
conn.rollback()
|
||||
raise
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
PLAYER_ADMIN_SORT_COLUMNS = {
|
||||
"id": "p.id",
|
||||
"full_name": "p.full_name",
|
||||
|
||||
Reference in New Issue
Block a user