Раздача точно не начатых дорожек
This commit is contained in:
@@ -4,6 +4,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
from src.config import DATA_DIR, DATA_PARTIAL_DIR
|
from src.config import DATA_DIR, DATA_PARTIAL_DIR
|
||||||
from src.database import (
|
from src.database import (
|
||||||
|
UserState,
|
||||||
create_replicas,
|
create_replicas,
|
||||||
create_scenario,
|
create_scenario,
|
||||||
get_connection,
|
get_connection,
|
||||||
@@ -12,6 +13,16 @@ from src.database import (
|
|||||||
)
|
)
|
||||||
from src.logger import logger
|
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:
|
def load_scenario_from_json(scenario_id: str, json_data: list[dict]) -> int:
|
||||||
"""Загружает сценарий из JSON. Возвращает количество реплик."""
|
"""Загружает сценарий из JSON. Возвращает количество реплик."""
|
||||||
@@ -135,6 +146,22 @@ def find_available_track(user_id: int) -> tuple[str, int] | None:
|
|||||||
track_recordings[key] = {}
|
track_recordings[key] = {}
|
||||||
track_recordings[key][row[2]] = row[3]
|
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]] = [] # никто не начал
|
untouched: list[tuple[str, int]] = [] # никто не начал
|
||||||
in_progress: 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
|
continue
|
||||||
|
|
||||||
if key not in track_recordings:
|
if key not in track_recordings:
|
||||||
untouched.append(key)
|
if key in assigned_tracks:
|
||||||
|
in_progress.append(key)
|
||||||
|
else:
|
||||||
|
untouched.append(key)
|
||||||
else:
|
else:
|
||||||
has_complete = any(
|
has_complete = any(
|
||||||
count == replica_count for count in track_recordings[key].values()
|
count == replica_count for count in track_recordings[key].values()
|
||||||
|
|||||||
Reference in New Issue
Block a user