Удаление сценариев
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user