Удаление сценариев

This commit is contained in:
2026-02-02 22:57:27 +03:00
parent 73c6986645
commit d0445d4480
6 changed files with 305 additions and 10 deletions

View File

@@ -22,6 +22,7 @@ class UserState(Enum):
REPEAT_REPLICA = "repeat_replica"
ADMIN = "admin"
ADMIN_UPLOAD_CONFIRM = "admin_upload_confirm"
ADMIN_DELETE_CONFIRM = "admin_delete_confirm"
@dataclass
@@ -484,20 +485,69 @@ def get_stats() -> dict:
"SELECT COUNT(*) FROM recordings"
).fetchone()[0]
# Количество полностью озвученных дорожек (в data/)
# Это вычисляется по файловой системе, здесь примерная оценка
# Количество полностью озвученных дорожек
stats["completed_tracks"] = conn.execute("""
SELECT COUNT(*) FROM (
SELECT user_id, scenario_id, speaker_id, COUNT(*) as cnt
SELECT r.user_id, r.scenario_id, rep.speaker_id, COUNT(*) as cnt
FROM recordings r
JOIN replicas rep ON r.scenario_id = rep.scenario_id
AND r.replica_index = rep.replica_index
GROUP BY user_id, scenario_id, speaker_id
GROUP BY r.user_id, r.scenario_id, rep.speaker_id
HAVING cnt = (
SELECT COUNT(*) FROM replicas
WHERE scenario_id = r.scenario_id AND speaker_id = rep.speaker_id
SELECT COUNT(*) FROM replicas rp
WHERE rp.scenario_id = r.scenario_id
AND rp.speaker_id = rep.speaker_id
)
)
""").fetchone()[0]
return stats
def get_scenario_stats(scenario_id: str) -> dict:
"""Получает статистику конкретного сценария."""
with get_connection() as conn:
stats = {}
# Количество реплик
stats["total_replicas"] = conn.execute(
"SELECT COUNT(*) FROM replicas WHERE scenario_id = ?", (scenario_id,)
).fetchone()[0]
# Количество дорожек
stats["total_tracks"] = conn.execute(
"SELECT COUNT(DISTINCT speaker_id) FROM replicas WHERE scenario_id = ?",
(scenario_id,),
).fetchone()[0]
# Количество записей
stats["total_recordings"] = conn.execute(
"SELECT COUNT(*) FROM recordings WHERE scenario_id = ?", (scenario_id,)
).fetchone()[0]
return stats
def get_users_with_scenario(scenario_id: str) -> list[tuple[int, int]]:
"""Получает пользователей, озвучивающих сценарий."""
with get_connection() as conn:
cursor = conn.execute(
"""
SELECT DISTINCT u.id, u.telegram_id
FROM user_sessions us
JOIN users u ON us.user_id = u.id
WHERE us.scenario_id = ?
""",
(scenario_id,),
)
return [(row["id"], row["telegram_id"]) for row in cursor.fetchall()]
def delete_scenario_data(scenario_id: str) -> None:
"""Удаляет сценарий и все связанные данные из БД."""
with get_connection() as conn:
conn.execute("DELETE FROM recordings WHERE scenario_id = ?", (scenario_id,))
conn.execute("DELETE FROM replicas WHERE scenario_id = ?", (scenario_id,))
conn.execute("DELETE FROM scenarios WHERE id = ?", (scenario_id,))
conn.commit()
logger.info(f"Deleted scenario {scenario_id} from database")