From efe99e9a4a837893ed54afe5f92a340133f8e0e1 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 8 Feb 2026 22:02:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B0=D1=87=D0=B0=20?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D1=8B=D1=85=20=D0=B4=D0=BE=D1=80=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scenarios.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/scenarios.py b/src/scenarios.py index f71dd6b..4c581b2 100644 --- a/src/scenarios.py +++ b/src/scenarios.py @@ -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()