""" 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()