1. добавил в админку сортировку игроков и Фото (если галочка стоит, то путь к фото генерируется автоматически)

2. фото обновляются прям в json
This commit is contained in:
2026-06-22 15:31:07 +03:00
parent cd370cf04f
commit f63061a06d
10 changed files with 620 additions and 98 deletions

View File

@@ -222,50 +222,91 @@ def get_player_id_by_external_id(external_id: str) -> int | None:
conn.close()
from db import get_connection
PLAYER_ADMIN_SORT_COLUMNS = {
"id": "p.id",
"full_name": "p.full_name",
"first_name": "p.first_name",
"last_name": "p.last_name",
"external_id": "p.external_id",
"position": "p.position",
"team_name": "t.name",
"photo": "p.photo_enabled",
}
def search_players_for_admin(q: str = "") -> list[dict]:
def ensure_player_photo_enabled_column() -> None:
"""Добавляет флаг использования фото игрока, если база ещё не обновлена."""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
ALTER TABLE players
ADD COLUMN IF NOT EXISTS photo_enabled BOOLEAN NOT NULL DEFAULT FALSE;
"""
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def _normalize_player_sort(sort_by: str = "id", sort_dir: str = "desc") -> tuple[str, str, str, str]:
sort_by = (sort_by or "id").strip()
if sort_by not in PLAYER_ADMIN_SORT_COLUMNS:
sort_by = "id"
sort_dir = (sort_dir or "desc").strip().lower()
if sort_dir not in {"asc", "desc"}:
sort_dir = "desc"
return sort_by, sort_dir, PLAYER_ADMIN_SORT_COLUMNS[sort_by], sort_dir.upper()
def search_players_for_admin(q: str = "", sort_by: str = "id", sort_dir: str = "desc") -> list[dict]:
sort_by, sort_dir, order_column, order_direction = _normalize_player_sort(sort_by, sort_dir)
limit = 200
conn = get_connection()
try:
with conn.cursor() as cur:
params: list = []
where_sql = ""
if q.strip():
pattern = f"%{q.strip()}%"
cur.execute(
"""
SELECT
p.id,
p.full_name,
p.first_name,
p.last_name,
p.external_id,
p.position
FROM players p
where_sql = """
WHERE
p.full_name ILIKE %s
OR p.first_name ILIKE %s
OR p.last_name ILIKE %s
OR COALESCE(p.external_id, '') ILIKE %s
ORDER BY p.full_name ASC, p.id ASC
LIMIT 200
""",
(pattern, pattern, pattern, pattern),
)
else:
cur.execute(
"""
SELECT
p.id,
p.full_name,
p.first_name,
p.last_name,
p.external_id,
p.position
FROM players p
ORDER BY p.id DESC
LIMIT 200
"""
)
OR COALESCE(t.name, '') ILIKE %s
"""
params.extend([pattern, pattern, pattern, pattern, pattern])
params.append(limit)
cur.execute(
f"""
SELECT
p.id,
p.full_name,
p.first_name,
p.last_name,
p.external_id,
p.position,
COALESCE(t.name, '') AS team_name,
COALESCE(p.photo_enabled, FALSE) AS photo_enabled
FROM players p
LEFT JOIN teams t ON t.id = p.team_id
{where_sql}
ORDER BY {order_column} {order_direction} NULLS LAST, p.id ASC
LIMIT %s
""",
tuple(params),
)
rows = cur.fetchall()
@@ -277,6 +318,8 @@ def search_players_for_admin(q: str = "") -> list[dict]:
"last_name": row[3] or "",
"external_id": row[4] or "",
"position": row[5] or "",
"team_name": row[6] or "",
"photo_enabled": bool(row[7]),
}
for row in rows
]
@@ -299,8 +342,11 @@ def get_player_by_id(player_id: int) -> dict | None:
p.position,
p.born,
p.photo,
p.video
p.video,
COALESCE(t.name, '') AS team_name,
COALESCE(p.photo_enabled, FALSE) AS photo_enabled
FROM players p
LEFT JOIN teams t ON t.id = p.team_id
WHERE p.id = %s
LIMIT 1
""",
@@ -321,6 +367,8 @@ def get_player_by_id(player_id: int) -> dict | None:
"birth_date": normalize_birth_date_for_input(row[6]),
"photo": row[7] or "",
"video": row[8] or "",
"team_name": row[9] or "",
"photo_enabled": bool(row[10]),
}
finally:
conn.close()
@@ -336,6 +384,7 @@ def update_player_admin(
birth_date: str = "",
photo: str = "",
video: str = "",
photo_enabled: bool = False,
) -> None:
conn = get_connection()
try:
@@ -351,7 +400,9 @@ def update_player_admin(
position = %s,
born = NULLIF(%s, '')::date,
photo = NULLIF(%s, ''),
video = NULLIF(%s, '')
video = NULLIF(%s, ''),
photo_enabled = %s,
updated_at = NOW()
WHERE id = %s
""",
(
@@ -363,6 +414,7 @@ def update_player_admin(
birth_date.strip(),
photo.strip(),
video.strip(),
bool(photo_enabled),
player_id,
),
)
@@ -372,3 +424,25 @@ def update_player_admin(
raise
finally:
conn.close()
def update_player_photo_enabled(player_id: int, photo_enabled: bool = False) -> None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
UPDATE players
SET
photo_enabled = %s,
updated_at = NOW()
WHERE id = %s
""",
(bool(photo_enabled), player_id),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()