Пол пользователя

This commit is contained in:
2026-02-04 13:00:20 +03:00
parent 05c4773a50
commit d51bbe04ba
6 changed files with 154 additions and 48 deletions

View File

@@ -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()
# Статистика записей по дорожкам