Пол пользователя
This commit is contained in:
@@ -18,11 +18,11 @@ def load_scenario_from_json(scenario_id: str, json_data: list[dict]) -> int:
|
||||
if get_scenario(scenario_id):
|
||||
raise ValueError(f"Сценарий {scenario_id} уже существует")
|
||||
|
||||
replicas_data: list[tuple[int, int, str]] = []
|
||||
replicas_data: list[tuple[int, int, str, str]] = []
|
||||
for idx, item in enumerate(json_data):
|
||||
if "text" not in item or "speaker_id" not in item:
|
||||
if "text" not in item or "speaker_id" not in item or "gender" not in item:
|
||||
raise ValueError(f"Некорректный формат реплики #{idx}")
|
||||
replicas_data.append((item["speaker_id"], idx, item["text"]))
|
||||
replicas_data.append((item["speaker_id"], idx, item["text"], item["gender"]))
|
||||
|
||||
create_scenario(scenario_id)
|
||||
create_replicas(scenario_id, replicas_data)
|
||||
@@ -53,6 +53,13 @@ def parse_scenario_file(file_content: bytes) -> tuple[list[dict], str | None]:
|
||||
return [], f"Реплика #{idx}: отсутствует поле 'speaker_id'"
|
||||
if not isinstance(item["speaker_id"], int):
|
||||
return [], f"Реплика #{idx}: 'speaker_id' должен быть числом"
|
||||
if "gender" not in item:
|
||||
return [], f"Реплика #{idx}: отсутствует поле 'gender'"
|
||||
if item["gender"] not in ["male", "female"]:
|
||||
return (
|
||||
[],
|
||||
f"Реплика #{idx}: 'gender' должен быть 'male' или 'female'",
|
||||
)
|
||||
|
||||
return data, None
|
||||
|
||||
@@ -69,16 +76,25 @@ def get_scenario_info(json_data: list[dict]) -> dict:
|
||||
|
||||
def find_available_track(user_id: int) -> tuple[str, int] | None:
|
||||
"""
|
||||
Находит доступную дорожку для пользователя.
|
||||
Находит доступную дорожку для пользователя с учётом пола.
|
||||
Приоритет:
|
||||
1. Дорожки, которые никто не начал озвучивать
|
||||
2. Дорожки, которые кто-то начал, но не закончил
|
||||
3. Дорожки с готовой озвучкой (для дополнительных записей)
|
||||
|
||||
Пользователь не может озвучивать две разные дорожки в одном сценарии.
|
||||
Учитывается пол пользователя и пол дорожек.
|
||||
Возвращает (scenario_id, speaker_id) или None.
|
||||
"""
|
||||
with get_connection() as conn:
|
||||
# Получаем пол пользователя
|
||||
user_gender_row = conn.execute(
|
||||
"SELECT gender FROM users WHERE id = ?", (user_id,)
|
||||
).fetchone()
|
||||
if not user_gender_row or not user_gender_row[0]:
|
||||
return None
|
||||
user_gender = user_gender_row[0]
|
||||
|
||||
# Сценарии, в которых пользователь уже записывает дорожку
|
||||
user_scenarios = conn.execute(
|
||||
"""
|
||||
@@ -88,13 +104,16 @@ def find_available_track(user_id: int) -> tuple[str, int] | None:
|
||||
).fetchall()
|
||||
user_scenario_ids = {row[0] for row in user_scenarios}
|
||||
|
||||
# Все дорожки (scenario_id, speaker_id) с количеством реплик
|
||||
# Все дорожки (scenario_id, speaker_id) с количеством реплик и полом
|
||||
# Учитываем только дорожки, где пол совпадает с полом пользователя
|
||||
all_tracks = conn.execute(
|
||||
"""
|
||||
SELECT scenario_id, speaker_id, COUNT(*) as replica_count
|
||||
SELECT scenario_id, speaker_id, COUNT(*) as replica_count, gender
|
||||
FROM replicas
|
||||
WHERE gender = ?
|
||||
GROUP BY scenario_id, speaker_id
|
||||
"""
|
||||
""",
|
||||
(user_gender,),
|
||||
).fetchall()
|
||||
|
||||
# Статистика записей по дорожкам
|
||||
|
||||
Reference in New Issue
Block a user