Files
marianesaldana 80dbd947e5 Initial commit
2026-05-23 08:59:34 -06:00

162 lines
5.5 KiB
Python

"""
Script para poblar la base de datos con usuarios demo (ciudadano + empleado + admin).
Uso: python seed.py
"""
from sqlalchemy import text
from app.database import Base, engine, SessionLocal
from app.models import User, Address, Report, ServiceRating
from app.models.user import UserRole
from app.services.auth_service import hash_password
from app.services.eta_service import assign_route
import uuid
from datetime import datetime, timedelta
# Asegurar que todas las tablas existen (creará las nuevas columnas si no existen)
Base.metadata.create_all(bind=engine)
# Migración manual: si la BD ya existía sin la columna `role`, añadirla
with engine.connect() as conn:
try:
conn.execute(text("ALTER TABLE users ADD COLUMN role VARCHAR DEFAULT 'CIUDADANO'"))
conn.commit()
print("✓ Columna 'role' añadida a tabla users")
except Exception:
pass # Ya existía
db = SessionLocal()
# ─── Limpiar TODO para empezar fresco ────────────────────────────────────
print("Limpiando datos previos...")
db.query(ServiceRating).delete()
db.query(Report).delete()
db.query(Address).delete()
db.query(User).delete()
db.commit()
# ─── Definir usuarios demo ───────────────────────────────────────────────
USERS = [
{
"full_name": "María González Demo",
"email": "demo@celaya.gob.mx",
"phone": "461-123-4567",
"password": "Celaya2026",
"role": UserRole.CIUDADANO.value,
"addresses": [
{"label": "Casa", "street": "Calle Hidalgo 245", "colony": "Centro", "lat": 20.5215, "lng": -100.8142, "is_default": True},
{"label": "Trabajo", "street": "Av. Tecnológico 1500", "colony": "Ciudad Industrial", "lat": 20.5450, "lng": -100.7950, "is_default": False},
],
},
{
"full_name": "Carlos Hernández (Empleado)",
"email": "empleado@celaya.gob.mx",
"phone": "461-200-1000",
"password": "Empleado2026",
"role": UserRole.EMPLEADO.value,
"addresses": [],
},
{
"full_name": "Lic. Patricia Ramírez (Admin)",
"email": "admin@celaya.gob.mx",
"phone": "461-100-0001",
"password": "Admin2026",
"role": UserRole.ADMIN.value,
"addresses": [],
},
]
created_users = {}
for u in USERS:
user = User(
full_name=u["full_name"],
email=u["email"],
phone=u["phone"],
hashed_password=hash_password(u["password"]),
role=u["role"],
is_active=True,
)
db.add(user)
db.commit()
db.refresh(user)
created_users[u["role"]] = user
print(f"{u['role']}: {u['email']} (id={user.id})")
for addr in u["addresses"]:
route_id = assign_route(addr["lat"], addr["lng"])
a = Address(
user_id=user.id,
label=addr["label"],
street=addr["street"],
colony=addr["colony"],
city="Celaya",
lat=addr["lat"],
lng=addr["lng"],
route_id=route_id,
is_default=addr["is_default"],
)
db.add(a)
db.commit()
print(f" 📍 {addr['label']} en {addr['street']}{route_id}")
# ─── Reportes demo del ciudadano ─────────────────────────────────────────
ciudadano = created_users[UserRole.CIUDADANO.value]
addresses = db.query(Address).filter(Address.user_id == ciudadano.id).all()
reportes_demo = [
{"addr": 0, "type": "RETRASO", "desc": "El camión pasó 40 min tarde el viernes", "status": "RESUELTO", "days": 5},
{"addr": 0, "type": "NO_PASO", "desc": "Hoy el camión no pasó por la cuadra", "status": "EN_PROCESO", "days": 2},
{"addr": 1, "type": "ACUMULACION", "desc": "Basura acumulada en la esquina", "status": "PENDIENTE", "days": 1},
{"addr": 0, "type": "OTRO", "desc": "Solicito información sobre día festivo", "status": "PENDIENTE", "days": 0},
]
for r in reportes_demo:
folio = f"MRL-{datetime.utcnow().strftime('%Y%m%d')}-{str(uuid.uuid4())[:6].upper()}"
rep = Report(
user_id=ciudadano.id,
address_id=addresses[r["addr"]].id,
folio=folio,
report_type=r["type"],
description=r["desc"],
status=r["status"],
)
db.add(rep)
db.commit()
db.refresh(rep)
rep.created_at = datetime.utcnow() - timedelta(days=r["days"])
db.commit()
print(f" 📋 {folio} | {r['type']} | {r['status']}")
# Calificación
rating = ServiceRating(
user_id=ciudadano.id,
address_id=addresses[0].id,
rating=4,
comment="El servicio mejoró este mes, gracias",
)
db.add(rating)
db.commit()
print(f" ⭐ Calificación 4★")
db.close()
# ─── Resumen ─────────────────────────────────────────────────────────────
print()
print("" * 65)
print(" ✅ BASE DE DATOS POBLADA")
print("" * 65)
print()
print(" CREDENCIALES DE DEMO:")
print()
print(" 🧑 CIUDADANO")
print(" 📧 demo@celaya.gob.mx")
print(" 🔑 Celaya2026")
print()
print(" 👮 EMPLEADO (ve y resuelve reportes)")
print(" 📧 empleado@celaya.gob.mx")
print(" 🔑 Empleado2026")
print()
print(" 🛡️ ADMIN (acceso total + gestión de usuarios)")
print(" 📧 admin@celaya.gob.mx")
print(" 🔑 Admin2026")
print()