first commit

This commit is contained in:
2026-04-20 11:56:11 +03:00
commit 8d80fadb56
103 changed files with 19756 additions and 0 deletions

View File

@@ -0,0 +1,286 @@
from db import get_connection
from repositories.team_repository import get_team_id_by_external_id
def upsert_coach(
external_id: str,
team_external_id: str,
player: str,
lastname: str = "",
name: str = "",
born: str = "",
amplua: str = "",
is_active: bool = True,
) -> None:
team_id = get_team_id_by_external_id(str(team_external_id).strip())
if team_id is None:
raise ValueError(f"Team not found by external_id: {team_external_id}")
query = """
INSERT INTO coaches (
external_id,
team_id,
player,
lastname,
name,
born,
amplua,
is_active,
created_at,
updated_at
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())
ON CONFLICT (external_id)
DO UPDATE SET
team_id = EXCLUDED.team_id,
player = EXCLUDED.player,
lastname = EXCLUDED.lastname,
name = EXCLUDED.name,
born = EXCLUDED.born,
amplua = EXCLUDED.amplua,
is_active = EXCLUDED.is_active,
updated_at = NOW();
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
query,
(
str(external_id).strip(),
team_id,
player.strip(),
lastname.strip(),
name.strip(),
born.strip(),
amplua.strip(),
is_active,
),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def get_player_id_by_name_and_team(full_name: str, team_id: int) -> int | None:
query = """
SELECT id
FROM players
WHERE team_id = %s
AND LOWER(full_name) = LOWER(%s)
LIMIT 1;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(query, (team_id, full_name.strip()))
row = cur.fetchone()
return row[0] if row else None
finally:
conn.close()
def get_coach_id_by_name_and_team(full_name: str, team_id: int) -> int | None:
query = """
SELECT id
FROM coaches
WHERE team_id = %s
AND LOWER(player) = LOWER(%s)
LIMIT 1;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(query, (team_id, full_name.strip()))
row = cur.fetchone()
return row[0] if row else None
finally:
conn.close()
def get_coach_id_by_external_id(external_id: str) -> int | None:
query = """
SELECT id
FROM coaches
WHERE external_id = %s
LIMIT 1;
"""
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(query, (str(external_id).strip(),))
row = cur.fetchone()
return row[0] if row else None
finally:
conn.close()
def search_coaches_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
c.id,
c.player,
c.external_id,
c.amplua,
t.name AS team_name
FROM coaches c
LEFT JOIN teams t ON t.id = c.team_id
WHERE
c.player ILIKE %s
OR COALESCE(c.external_id, '') ILIKE %s
OR COALESCE(c.amplua, '') ILIKE %s
OR COALESCE(t.name, '') ILIKE %s
ORDER BY c.player ASC, c.id ASC
LIMIT 200
""",
(pattern, pattern, pattern, pattern),
)
else:
cur.execute(
"""
SELECT
c.id,
c.player,
c.external_id,
c.amplua,
t.name AS team_name
FROM coaches c
LEFT JOIN teams t ON t.id = c.team_id
ORDER BY c.id DESC
LIMIT 200
"""
)
rows = cur.fetchall()
return [
{
"id": row[0],
"full_name": row[1] or "",
"external_id": row[2] or "",
"role": row[3] or "",
"team_name": row[4] or "",
}
for row in rows
]
finally:
conn.close()
def get_coach_by_id(coach_id: int) -> dict | None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT
c.id,
c.player,
c.external_id,
c.amplua,
c.team_id,
t.name AS team_name
FROM coaches c
LEFT JOIN teams t ON t.id = c.team_id
WHERE c.id = %s
LIMIT 1
""",
(coach_id,),
)
row = cur.fetchone()
if not row:
return None
return {
"id": row[0],
"full_name": row[1] or "",
"external_id": row[2] or "",
"role": row[3] or "",
"team_id": row[4],
"team_name": row[5] or "",
}
finally:
conn.close()
def get_coach_by_id(coach_id: int) -> dict | None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT
c.id,
c.player,
c.external_id,
c.amplua,
c.team_id,
t.name AS team_name
FROM coaches c
LEFT JOIN teams t ON t.id = c.team_id
WHERE c.id = %s
LIMIT 1
""",
(coach_id,),
)
row = cur.fetchone()
if not row:
return None
return {
"id": row[0],
"full_name": row[1] or "",
"external_id": row[2] or "",
"role": row[3] or "",
"team_id": row[4],
"team_name": row[5] or "",
}
finally:
conn.close()
def update_coach_admin(
coach_id: int,
full_name: str = "",
external_id: str = "",
role: str = "",
) -> None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute(
"""
UPDATE coaches
SET
player = %s,
external_id = NULLIF(%s, ''),
amplua = %s
WHERE id = %s
""",
(
full_name.strip(),
external_id.strip(),
role.strip(),
coach_id,
),
)
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()