#!/usr/bin/env python3 """ Script per il reset completo o parziale del database MediaTrack. ATTENZIONE: Questo script elimina definitivamente i dati. Utilizzare SOLO in ambiente di sviluppo o per inizializzare il database. """ import sys import os import sqlite3 from datetime import datetime # Aggiungi backend al path sys.path.insert(0, 'backend') DB_PATH = 'database/mediatrack.db' BACKUP_DIR = 'database/backups' def create_backup(): """Crea backup del database prima del reset""" if not os.path.exists(DB_PATH): print("[INFO] Database non trovato, niente da backuppare") return None # Crea directory backup os.makedirs(BACKUP_DIR, exist_ok=True) # Nome backup con timestamp timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') backup_path = os.path.join(BACKUP_DIR, f'mediatrack_backup_{timestamp}.db') # Copia database import shutil shutil.copy2(DB_PATH, backup_path) print(f"[OK] Backup creato: {backup_path}") return backup_path def reset_sessions_only(): """Reset solo tabelle sessioni e carrello (mantiene prodotti MediaTrack)""" print("\n" + "=" * 60) print("RESET SESSIONI E CARRELLO") print("=" * 60) con = sqlite3.connect(DB_PATH) cur = con.cursor() try: # Elimina dati carrello cur.execute("DELETE FROM CarrelloImport") deleted_cart = cur.rowcount print(f"[OK] Eliminati {deleted_cart} items dal carrello") # Elimina sessioni cur.execute("DELETE FROM SessioniImport") deleted_sessions = cur.rowcount print(f"[OK] Eliminate {deleted_sessions} sessioni") # Reset autoincrement cur.execute("DELETE FROM sqlite_sequence WHERE name='CarrelloImport'") con.commit() print("\n[SUCCESS] Reset sessioni completato!") except Exception as e: con.rollback() print(f"\n[ERROR] Errore durante reset: {e}") finally: con.close() def reset_all_data(): """Reset TOTALE: elimina TUTTI i dati (prodotti, eventi, distributori, sessioni)""" print("\n" + "=" * 60) print("RESET TOTALE DATABASE") print("=" * 60) print("[WARNING] Questo eliminerĂ  TUTTI i dati dal database!") con = sqlite3.connect(DB_PATH) cur = con.cursor() try: # Disabilita foreign keys temporaneamente cur.execute("PRAGMA foreign_keys = OFF") # Tabelle da svuotare (ordine importante per foreign keys) tables = [ 'CarrelloImport', 'SessioniImport', 'LogAggiornamenti', 'Eventi', 'AnagraficaMedia', 'Distributori', 'TipiEvento' ] total_deleted = 0 for table in tables: try: cur.execute(f"DELETE FROM {table}") deleted = cur.rowcount total_deleted += deleted print(f"[OK] {table}: {deleted} righe eliminate") except sqlite3.OperationalError as e: print(f"[SKIP] {table}: {e}") # Reset autoincrement cur.execute("DELETE FROM sqlite_sequence") # Riabilita foreign keys cur.execute("PRAGMA foreign_keys = ON") con.commit() print(f"\n[SUCCESS] Reset totale completato! {total_deleted} righe eliminate") except Exception as e: con.rollback() print(f"\n[ERROR] Errore durante reset: {e}") finally: con.close() def reset_test_data(): """Elimina solo i dati di test (sessioni test, prodotti test)""" print("\n" + "=" * 60) print("RESET DATI DI TEST") print("=" * 60) con = sqlite3.connect(DB_PATH) cur = con.cursor() try: # Elimina sessioni di test cur.execute("DELETE FROM SessioniImport WHERE nome_mercato LIKE '%test%' OR nome_mercato LIKE '%Test%'") deleted_sessions = cur.rowcount print(f"[OK] Eliminate {deleted_sessions} sessioni di test") # Elimina carrello associato (cascade dovrebbe farlo automaticamente) cur.execute("DELETE FROM CarrelloImport WHERE id_sessione NOT IN (SELECT id_sessione FROM SessioniImport)") deleted_cart = cur.rowcount print(f"[OK] Eliminati {deleted_cart} items carrello orfani") # Elimina prodotti test (opzionale) cur.execute("DELETE FROM AnagraficaMedia WHERE titolo_ufficiale LIKE 'TEST%'") deleted_products = cur.rowcount print(f"[OK] Eliminati {deleted_products} prodotti di test") con.commit() print("\n[SUCCESS] Dati di test eliminati!") except Exception as e: con.rollback() print(f"\n[ERROR] Errore durante reset: {e}") finally: con.close() def show_database_stats(): """Mostra statistiche database""" print("\n" + "=" * 60) print("STATISTICHE DATABASE") print("=" * 60) con = sqlite3.connect(DB_PATH) cur = con.cursor() stats = { 'Prodotti MediaTrack': "SELECT COUNT(*) FROM AnagraficaMedia", 'Eventi': "SELECT COUNT(*) FROM Eventi", 'Distributori': "SELECT COUNT(*) FROM Distributori", 'Sessioni Import': "SELECT COUNT(*) FROM SessioniImport", 'Carrello Items': "SELECT COUNT(*) FROM CarrelloImport", 'Log Aggiornamenti': "SELECT COUNT(*) FROM LogAggiornamenti" } for label, query in stats.items(): try: cur.execute(query) count = cur.fetchone()[0] print(f" {label}: {count}") except Exception as e: print(f" {label}: ERROR - {e}") con.close() def interactive_menu(): """Menu interattivo per scegliere tipo di reset""" print("\n") print("=" * 60) print(" MEDIATRACK - DATABASE RESET UTILITY") print("=" * 60) print() # Mostra stats attuali show_database_stats() print("\n" + "=" * 60) print("OPZIONI RESET") print("=" * 60) print("1. Reset SESSIONI e CARRELLO (mantiene prodotti MediaTrack)") print("2. Reset DATI DI TEST (solo sessioni/prodotti test)") print("3. Reset TOTALE (ELIMINA TUTTO)") print("4. Mostra solo statistiche") print("5. Esci") print() choice = input("Scegli opzione [1-5]: ").strip() if choice == '1': confirm = input("\n[!] Confermi reset sessioni e carrello? [s/N]: ").strip().lower() if confirm == 's': backup_path = create_backup() reset_sessions_only() show_database_stats() else: print("[INFO] Operazione annullata") elif choice == '2': confirm = input("\n[!] Confermi reset dati di test? [s/N]: ").strip().lower() if confirm == 's': backup_path = create_backup() reset_test_data() show_database_stats() else: print("[INFO] Operazione annullata") elif choice == '3': print("\n" + "!" * 60) print("ATTENZIONE: RESET TOTALE") print("Questa operazione eliminerĂ  TUTTI i dati dal database!") print("!" * 60) confirm = input("\nDigita 'RESET TOTALE' per confermare: ").strip() if confirm == 'RESET TOTALE': backup_path = create_backup() reset_all_data() show_database_stats() else: print("[INFO] Operazione annullata") elif choice == '4': show_database_stats() elif choice == '5': print("[INFO] Uscita...") sys.exit(0) else: print("[ERROR] Opzione non valida") if __name__ == '__main__': if not os.path.exists(DB_PATH): print(f"[ERROR] Database non trovato: {DB_PATH}") sys.exit(1) interactive_menu()