1. добавил в админку сортировку игроков и Фото (если галочка стоит, то путь к фото генерируется автоматически)
2. фото обновляются прям в json
This commit is contained in:
@@ -230,9 +230,12 @@ def get_match_lineup_for_vmix(
|
||||
COALESCE(mlp.number::text, '') AS number,
|
||||
COALESCE(p.position, '') AS position,
|
||||
COALESCE(mlp.is_captain, FALSE) AS is_captain,
|
||||
COALESCE(p.position, '') AS pos
|
||||
COALESCE(p.position, '') AS pos,
|
||||
p.photo,
|
||||
COALESCE(p.photo_enabled, FALSE) AS photo_enabled,
|
||||
CASE WHEN mlp.side = 'home' THEN %s ELSE %s END AS team_id
|
||||
FROM match_lineup_players mlp
|
||||
JOIN players p
|
||||
LEFT JOIN players p
|
||||
ON p.id = mlp.player_id
|
||||
WHERE mlp.match_id = %s
|
||||
ORDER BY
|
||||
@@ -248,7 +251,7 @@ def get_match_lineup_for_vmix(
|
||||
COALESCE(p.first_name, ''),
|
||||
p.id
|
||||
""",
|
||||
(match_id,),
|
||||
(home_team_id, away_team_id, match_id),
|
||||
)
|
||||
player_rows = cur.fetchall()
|
||||
|
||||
@@ -293,6 +296,9 @@ def get_match_lineup_for_vmix(
|
||||
"position": row[8] or "",
|
||||
"is_captain": bool(row[9]),
|
||||
"pos": row[10] or "",
|
||||
"photo": row[11] or "",
|
||||
"photo_enabled": bool(row[12]),
|
||||
"team_id": row[13],
|
||||
}
|
||||
|
||||
side = row[0]
|
||||
|
||||
@@ -13,7 +13,9 @@ def get_match_lineups_grouped(match_id: int, home_team_id: int, away_team_id: in
|
||||
ml.is_captain,
|
||||
p.last_name,
|
||||
p.first_name,
|
||||
p.position as pos
|
||||
p.position as pos,
|
||||
p.photo,
|
||||
COALESCE(p.photo_enabled, FALSE) AS photo_enabled
|
||||
FROM match_lineups ml
|
||||
LEFT JOIN players p ON p.id = ml.player_id
|
||||
WHERE ml.match_id = %s;
|
||||
@@ -46,10 +48,13 @@ def get_match_lineups_grouped(match_id: int, home_team_id: int, away_team_id: in
|
||||
last_name,
|
||||
first_name,
|
||||
pos,
|
||||
photo,
|
||||
photo_enabled,
|
||||
) = row
|
||||
|
||||
item = {
|
||||
"player_id": player_id,
|
||||
"team_id": team_id,
|
||||
"number": number or "",
|
||||
"last_name": last_name or "",
|
||||
"first_name": first_name or "",
|
||||
@@ -57,6 +62,8 @@ def get_match_lineups_grouped(match_id: int, home_team_id: int, away_team_id: in
|
||||
"position": position or "",
|
||||
"is_captain": bool(is_captain),
|
||||
"pos": pos,
|
||||
"photo": photo or "",
|
||||
"photo_enabled": bool(photo_enabled),
|
||||
}
|
||||
|
||||
if team_id == home_team_id and lineup_type == "starting":
|
||||
|
||||
@@ -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