162 lines
5.5 KiB
Python
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()
|