141 lines
4.1 KiB
Python
141 lines
4.1 KiB
Python
"""
|
|
Script de emergencia: Inyectar rutas directamente en la BD de producción
|
|
Ejecutar desde el servidor Render o con acceso directo a la BD.
|
|
|
|
USO: python inject_routes.py
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
# Añadir el path del backend
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
from sqlmodel import Session, create_engine, select, SQLModel
|
|
from app.models.route import Route, RouteStatus
|
|
from app.core.config import settings
|
|
|
|
# Rutas de bus más importantes de Boquete / Chiriquí
|
|
SAMPLE_ROUTES = [
|
|
{
|
|
"name": "Boquete - David",
|
|
"origin_city": "Boquete",
|
|
"destination_city": "David",
|
|
"color": "#FEE715",
|
|
"direction": "outbound",
|
|
"distance_km": 38.0,
|
|
"estimated_duration_minutes": 55,
|
|
"average_speed_kmh": 40.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "David - Boquete",
|
|
"origin_city": "David",
|
|
"destination_city": "Boquete",
|
|
"color": "#FEE715",
|
|
"direction": "inbound",
|
|
"distance_km": 38.0,
|
|
"estimated_duration_minutes": 55,
|
|
"average_speed_kmh": 40.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "Boquete - Caldera",
|
|
"origin_city": "Boquete",
|
|
"destination_city": "Caldera",
|
|
"color": "#4CAF50",
|
|
"direction": "outbound",
|
|
"distance_km": 22.0,
|
|
"estimated_duration_minutes": 35,
|
|
"average_speed_kmh": 38.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "Caldera - Boquete",
|
|
"origin_city": "Caldera",
|
|
"destination_city": "Boquete",
|
|
"color": "#4CAF50",
|
|
"direction": "inbound",
|
|
"distance_km": 22.0,
|
|
"estimated_duration_minutes": 35,
|
|
"average_speed_kmh": 38.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "David - Paso Canoas",
|
|
"origin_city": "David",
|
|
"destination_city": "Paso Canoas",
|
|
"color": "#2196F3",
|
|
"direction": "outbound",
|
|
"distance_km": 52.0,
|
|
"estimated_duration_minutes": 70,
|
|
"average_speed_kmh": 45.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "David - Cerro Punta",
|
|
"origin_city": "David",
|
|
"destination_city": "Cerro Punta",
|
|
"color": "#9C27B0",
|
|
"direction": "outbound",
|
|
"distance_km": 75.0,
|
|
"estimated_duration_minutes": 100,
|
|
"average_speed_kmh": 45.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "David - Volcán",
|
|
"origin_city": "David",
|
|
"destination_city": "Volcán",
|
|
"color": "#FF5722",
|
|
"direction": "outbound",
|
|
"distance_km": 62.0,
|
|
"estimated_duration_minutes": 85,
|
|
"average_speed_kmh": 44.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
{
|
|
"name": "Boquete - Dolega",
|
|
"origin_city": "Boquete",
|
|
"destination_city": "Dolega",
|
|
"color": "#00BCD4",
|
|
"direction": "outbound",
|
|
"distance_km": 28.0,
|
|
"estimated_duration_minutes": 40,
|
|
"average_speed_kmh": 42.0,
|
|
"status": RouteStatus.ACTIVE,
|
|
},
|
|
]
|
|
|
|
|
|
def inject_routes():
|
|
db_url = settings.get_database_url
|
|
engine = create_engine(db_url, echo=True)
|
|
|
|
with Session(engine) as session:
|
|
inserted = 0
|
|
skipped = 0
|
|
|
|
for route_data in SAMPLE_ROUTES:
|
|
# Verificar si ya existe
|
|
existing = session.exec(
|
|
select(Route).where(Route.name == route_data["name"])
|
|
).first()
|
|
|
|
if existing:
|
|
print(f" [SKIP] Ya existe: {route_data['name']}")
|
|
skipped += 1
|
|
continue
|
|
|
|
route = Route(**route_data)
|
|
session.add(route)
|
|
print(f" [ADD] {route_data['name']} ({route_data['origin_city']} → {route_data['destination_city']})")
|
|
inserted += 1
|
|
|
|
session.commit()
|
|
print(f"\n✅ Listo: {inserted} rutas insertadas, {skipped} ya existían.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("🚌 Inyectando rutas de bus en producción...\n")
|
|
inject_routes()
|