Раздача точно не начатых дорожек

This commit is contained in:
2026-02-08 22:02:02 +03:00
parent b1f1465037
commit efe99e9a4a

View File

@@ -4,6 +4,7 @@ from pathlib import Path
from src.config import DATA_DIR, DATA_PARTIAL_DIR
from src.database import (
UserState,
create_replicas,
create_scenario,
get_connection,
@@ -12,6 +13,16 @@ from src.database import (
)
from src.logger import logger
# Состояния, в которых пользователь активно работает с дорожкой
_RECORDING_STATES = (
UserState.FIRST_REPLICA.value,
UserState.SHOW_REPLICA.value,
UserState.CONFIRM_RESTART.value,
UserState.CONFIRM_SAVE.value,
UserState.ASK_REPLICA_NUMBER.value,
UserState.REPEAT_REPLICA.value,
)
def load_scenario_from_json(scenario_id: str, json_data: list[dict]) -> int:
"""Загружает сценарий из JSON. Возвращает количество реплик."""
@@ -135,6 +146,22 @@ def find_available_track(user_id: int) -> tuple[str, int] | None:
track_recordings[key] = {}
track_recordings[key][row[2]] = row[3]
# Дорожки, назначенные другим пользователям через активные сессии
placeholders = ",".join("?" * len(_RECORDING_STATES))
session_rows = conn.execute(
f"""
SELECT scenario_id, speaker_id FROM user_sessions
WHERE user_id != ?
AND scenario_id IS NOT NULL
AND speaker_id IS NOT NULL
AND state IN ({placeholders})
""",
(user_id, *_RECORDING_STATES),
).fetchall()
assigned_tracks: set[tuple[str, int]] = {
(row[0], row[1]) for row in session_rows
}
# Категоризация дорожек
untouched: list[tuple[str, int]] = [] # никто не начал
in_progress: list[tuple[str, int]] = [] # начато, не закончено
@@ -154,7 +181,10 @@ def find_available_track(user_id: int) -> tuple[str, int] | None:
continue
if key not in track_recordings:
untouched.append(key)
if key in assigned_tracks:
in_progress.append(key)
else:
untouched.append(key)
else:
has_complete = any(
count == replica_count for count in track_recordings[key].values()