Files
WFL/repositories/match_coach_repository.py

155 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from db import get_connection
def get_match_coaches_grouped(
match_id: int,
home_team_id: int | None = None,
away_team_id: int | None = None,
) -> dict:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT
mc.side,
mc.coach_id,
COALESCE(c.player, c.name, '') AS coach_name,
COALESCE(NULLIF(c.amplua, ''), mc.role, '') AS role
FROM match_coaches mc
JOIN coaches c
ON c.id = mc.coach_id
WHERE mc.match_id = %s
ORDER BY mc.side, mc.sort_order, mc.id
""",
(match_id,),
)
rows = cur.fetchall()
result = {
"home": [],
"away": [],
}
for row in rows:
item = {
"coach_id": row[1],
"coach_name": row[2] or "",
"role": row[3] or "",
}
if row[0] == "home":
result["home"].append(item)
elif row[0] == "away":
result["away"].append(item)
return result
finally:
conn.close()
def replace_match_coaches(match_id: int, *args) -> None:
"""
Поддерживает оба варианта вызова:
1) replace_match_coaches(match_id, coach_rows)
2) replace_match_coaches(match_id, home_team_id, away_team_id, home_coaches, away_coaches)
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"DELETE FROM match_coaches WHERE match_id = %s",
(match_id,),
)
if len(args) == 1:
coach_rows = args[0] or []
sort_counters = {
"home": 1,
"away": 1,
}
for coach in coach_rows:
side = coach.get("side")
if side not in ("home", "away"):
team_side = coach.get("team_id")
if team_side in ("home", "away"):
side = team_side
else:
continue
coach_id = coach.get("coach_id")
if not coach_id:
continue
cur.execute(
"""
INSERT INTO match_coaches (
match_id,
side,
sort_order,
coach_id,
role
)
VALUES (%s, %s, %s, %s, %s)
""",
(
match_id,
side,
sort_counters[side],
coach_id,
coach.get("role") or coach.get("amplua") or None,
),
)
sort_counters[side] += 1
elif len(args) == 4:
_home_team_id, _away_team_id, home_coaches, away_coaches = args
def insert_side(side: str, coaches: list[dict]) -> None:
sort_order = 1
for coach in coaches or []:
coach_id = coach.get("coach_id")
if not coach_id:
continue
cur.execute(
"""
INSERT INTO match_coaches (
match_id,
side,
sort_order,
coach_id,
amplua
)
VALUES (%s, %s, %s, %s, %s)
""",
(
match_id,
side,
sort_order,
coach_id,
coach.get("role") or coach.get("amplua") or None,
),
)
sort_order += 1
insert_side("home", home_coaches)
insert_side("away", away_coaches)
else:
raise TypeError(
"replace_match_coaches() expected either "
"(match_id, coach_rows) or "
"(match_id, home_team_id, away_team_id, home_coaches, away_coaches)"
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()