1. добавил в админку сортировку игроков и Фото (если галочка стоит, то путь к фото генерируется автоматически)
2. фото обновляются прям в json
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user