""" Script per inizializzare il database con dati di esempio """ import sys import os # 1. Ottieni il percorso assoluto della directory corrente dello script current_dir = os.path.dirname(os.path.abspath(__file__)) # 2. Risali di un livello per raggiungere la directory radice (quella che contiene 'app' e 'scripts') # Esempio: da /percorso/al/progetto/scripts a /percorso/al/progetto project_root = os.path.join(current_dir, '..') # 3. Aggiungi la directory radice al path di ricerca dei moduli di Python sys.path.append(project_root) # 4. Carica variabili d'ambiente dal file .env from dotenv import load_dotenv env_path = os.path.join(project_root, '.env') load_dotenv(env_path) from datetime import datetime, timezone from app.core.database import SessionLocal, engine, Base from app.models import Cliente, Sito, Utente, TipoSito, RuoloUtente from app.core.security import get_password_hash def init_database(): """Crea le tabelle e inserisce dati di esempio""" # Crea tutte le tabelle print("Creazione tabelle...") Base.metadata.create_all(bind=engine) print("✓ Tabelle create") db = SessionLocal() try: # Verifica se esistono già dati existing_cliente = db.query(Cliente).first() if existing_cliente: print("⚠ Database già inizializzato. Skip.") return # 1. Crea cliente di esempio print("\nCreazione cliente di esempio...") cliente = Cliente( nome="Azienda Monitoraggio SRL", ragione_sociale="Azienda Monitoraggio SRL", partita_iva="12345678901", email="info@aziendamonitoraggio.it", telefono="+39 02 1234567", indirizzo="Via Roma 1, 20100 Milano", attivo=True, ) db.add(cliente) db.flush() print(f"✓ Cliente creato: {cliente.nome} (ID: {cliente.id})") # 2. Crea siti di esempio print("\nCreazione siti monitorati...") siti = [ Sito( cliente_id=cliente.id, nome="Ponte Morandi", tipo=TipoSito.PONTE, descrizione="Ponte autostradale sulla A10", latitudine=44.4268, longitudine=8.9137, comune="Genova", provincia="GE", regione="Liguria", codice_identificativo="PON-001", ), Sito( cliente_id=cliente.id, nome="Galleria San Boldo", tipo=TipoSito.GALLERIA, descrizione="Galleria stradale sul passo San Boldo", latitudine=45.9811, longitudine=12.1064, comune="Cison di Valmarino", provincia="TV", regione="Veneto", codice_identificativo="GAL-002", ), Sito( cliente_id=cliente.id, nome="Diga del Vajont", tipo=TipoSito.DIGA, descrizione="Diga sul torrente Vajont", latitudine=46.2691, longitudine=12.3281, comune="Erto e Casso", provincia="PN", regione="Friuli-Venezia Giulia", codice_identificativo="DIG-003", ), Sito( cliente_id=cliente.id, nome="Versante Cà di Sotto", tipo=TipoSito.FRANA, descrizione="Area soggetta a movimento franoso", latitudine=44.3521, longitudine=10.8464, comune="Corniglio", provincia="PR", regione="Emilia-Romagna", codice_identificativo="FRA-004", ), ] for sito in siti: db.add(sito) print(f"✓ Sito creato: {sito.nome} ({sito.tipo})") db.flush() # 3. Crea utenti di esempio print("\nCreazione utenti...") utenti = [ Utente( cliente_id=cliente.id, email="admin@azienda.it", password_hash=get_password_hash("admin123"), nome="Mario", cognome="Rossi", telefono="+39 333 1234567", ruolo=RuoloUtente.ADMIN, attivo=True, email_verificata=True, ), Utente( cliente_id=cliente.id, email="operatore@azienda.it", password_hash=get_password_hash("operatore123"), nome="Luca", cognome="Bianchi", telefono="+39 333 7654321", ruolo=RuoloUtente.OPERATORE, attivo=True, email_verificata=True, ), Utente( cliente_id=cliente.id, email="viewer@azienda.it", password_hash=get_password_hash("viewer123"), nome="Anna", cognome="Verdi", telefono="+39 333 9876543", ruolo=RuoloUtente.VISUALIZZATORE, attivo=True, email_verificata=True, ), ] for utente in utenti: db.add(utente) print(f"✓ Utente creato: {utente.email} ({utente.ruolo})") # Commit finale db.commit() print("\n" + "=" * 60) print("✓ Database inizializzato con successo!") print("=" * 60) print("\nCredenziali di accesso:") print("-" * 60) for utente in utenti: pwd = "admin123" if utente.ruolo == RuoloUtente.ADMIN else \ "operatore123" if utente.ruolo == RuoloUtente.OPERATORE else "viewer123" print(f"Email: {utente.email:25} | Password: {pwd:15} | Ruolo: {utente.ruolo}") print("-" * 60) print(f"\nSiti monitorati creati: {len(siti)}") for i, sito in enumerate(siti, 1): print(f" {i}. {sito.nome} (ID: {sito.id}) - {sito.tipo}") print() except Exception as e: print(f"\n✗ Errore durante l'inizializzazione: {e}") db.rollback() raise finally: db.close() if __name__ == "__main__": print("=" * 60) print("INIZIALIZZAZIONE DATABASE - Terrain Monitor") print("=" * 60) init_database()