app backend prima

This commit is contained in:
2025-10-20 19:10:08 +02:00
commit 438255d27b
42 changed files with 4622 additions and 0 deletions

191
scripts/init_db.py Normal file
View File

@@ -0,0 +1,191 @@
"""
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()