Files
WFL/repositories/team_repository.py

268 lines
7.1 KiB
Python

from db import get_connection
from parsers.parser_sources import extract_logo_filename
def upsert_team(
external_id: str,
name: str,
short_name: str | None = None,
logo_url: str | None = None,
games: int | None = 0,
wins: int | None = 0,
goals: int | None = 0,
tournaments: int | None = 0,
) -> None:
query = """
INSERT INTO teams (
external_id,
name,
short_name,
logo_url,
games,
wins,
goals,
tournaments,
created_at,
updated_at
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
ON CONFLICT (external_id)
DO UPDATE SET
name = EXCLUDED.name,
short_name = EXCLUDED.short_name,
logo_url = EXCLUDED.logo_url,
games = EXCLUDED.games,
wins = EXCLUDED.wins,
goals = EXCLUDED.goals,
tournaments = EXCLUDED.tournaments,
updated_at = NOW();
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
query,
(
external_id,
name,
short_name,
logo_url,
games,
wins,
goals,
tournaments,
),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def get_team_external_id_by_name(name: str) -> str | None:
query = """
SELECT external_id
FROM teams
WHERE LOWER(name) = LOWER(%s)
LIMIT 1;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(query, (name,))
row = cur.fetchone()
return row[0] if row else None
finally:
conn.close()
def get_team_id_by_external_id(external_id: str) -> int | None:
external_id = str(external_id).strip()
query = """
SELECT id
FROM teams
WHERE TRIM(external_id) = %s
LIMIT 1;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
print(f"[get_team_id_by_external_id] search external_id = '{external_id}'")
cur.execute(query, (external_id,))
row = cur.fetchone()
print(f"[get_team_id_by_external_id] result = {row}")
return row[0] if row else None
finally:
conn.close()
def search_teams_for_admin(q: str = "") -> list[dict]:
conn = get_connection()
try:
with conn.cursor() as cur:
if q.strip():
pattern = f"%{q.strip()}%"
cur.execute(
"""
SELECT
t.id,
t.name,
t.full_name,
t.short_name_3,
t.city,
t.logo_path,
t.external_id
FROM teams t
WHERE
t.name ILIKE %s
OR COALESCE(t.full_name, '') ILIKE %s
OR COALESCE(t.short_name_3, '') ILIKE %s
OR COALESCE(t.city, '') ILIKE %s
OR COALESCE(t.external_id, '') ILIKE %s
ORDER BY t.name ASC, t.id ASC
LIMIT 200
""",
(pattern, pattern, pattern, pattern, pattern),
)
else:
cur.execute(
"""
SELECT
t.id,
t.name,
t.full_name,
t.short_name_3,
t.city,
t.logo_path,
t.external_id
FROM teams t
ORDER BY t.id DESC
LIMIT 200
"""
)
rows = cur.fetchall()
return [
{
"id": row[0],
"name": row[1] or "",
"full_name": row[2] or "",
"short_name_3": row[3] or "",
"city": row[4] or "",
"logo_path": extract_logo_filename(row[5]),
"external_id": row[6] or "",
}
for row in rows
]
finally:
conn.close()
def get_team_by_id(team_id: int) -> dict | None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT
t.id,
t.name,
t.full_name,
t.short_name_3,
t.city,
t.logo_path,
t.external_id
FROM teams t
WHERE t.id = %s
LIMIT 1
""",
(team_id,),
)
row = cur.fetchone()
if not row:
return None
return {
"id": row[0],
"name": row[1] or "",
"full_name": row[2] or "",
"short_name_3": row[3] or "",
"city": row[4] or "",
"logo_path": extract_logo_filename(row[5]),
"external_id": row[6] or "",
}
finally:
conn.close()
def update_team_admin(
team_id: int,
name: str = "",
full_name: str = "",
short_name_3: str = "",
city: str = "",
logo_path: str = "",
external_id: str = "",
) -> None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
UPDATE teams
SET
name = %s,
full_name = %s,
short_name_3 = %s,
city = NULLIF(%s, ''),
logo_path = %s,
external_id = NULLIF(%s, '')
WHERE id = %s
""",
(
name.strip(),
full_name.strip(),
short_name_3.strip().upper(),
city.strip(),
extract_logo_filename(logo_path),
external_id.strip(),
team_id,
),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def list_teams_for_admin_select() -> list[dict]:
"""Возвращает полный компактный список команд для выпадающих списков админки."""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT id, name, short_name_3, city
FROM teams
ORDER BY name ASC, id ASC
"""
)
rows = cur.fetchall()
return [
{
"id": row[0],
"name": row[1] or "",
"short_name_3": row[2] or "",
"city": row[3] or "",
}
for row in rows
]
finally:
conn.close()