carga_gtfs/webinterface/content/main.py

214 lines
9.6 KiB
Python

# -*- coding: utf-8 -*-
import os
from flask import Flask, Blueprint, abort, current_app, request, render_template, send_from_directory, jsonify
from webinterface.models.granconcepcion import Agencia, Servicio, Paradero, Parada, Ruta, Linea
from webinterface import db
from sqlalchemy import func
from datetime import datetime, date
from webinterface.models.modelodatos import load_paraderos, load_estaciones, load_recorrido, listado_recorridos
from webinterface.content.utils import haversine
main = Blueprint('main', __name__)
@main.route('/listado_estaciones')
def listado_estaciones():
return jsonify(load_estaciones())
@main.route('/listado_paraderos')
def listado_paraderos():
current_app.logger.debug('Funcion listado_paralelos <- inicia')
paradas = []
for item in Paradero.query.all():
data = {}
data['latitude'] = item.latitud
data['longitude'] = item.longitud
data['codigo'] = item.nombre
data['lineas'] = item.lineas
if item.codigo is not None:
data['mensaje'] = f"""<b>Ubicación:</b> {item.nombre}<br>
<b>Lineas:</b> {item.lineas}<br>
<b>Paradas dia de semana:</b> {item.paradasl}<br>
<b>Paradas dia de sabado:</b> {item.paradass}<br>
<b>Paradas dia de domingo:</b> {item.paradasd}<br>
<b>Codigo paradero:</b> {item.codigo}<br>
<br>
<b>Tamaño del paradero:</b> {item.tamano}<br>
<b>Capacidad:</b> {item.capacidad}<br>
Techo:</b> {item.techo}<br>
<b>Pared:</b> {item.pared}<br>
<b>Piso:</b> {item.piso}<br>
<br>
<b>RecorridosA:</b> {item.recorridos}<br>
<b>RecorridosB:</b> {item.recorridos2}"""
else:
data['mensaje'] = f"""<b>Ubicación:</b> {item.nombre}<br>
<b>Lineas:</b> {item.lineas}<br>
<b>Paradas dia de semana:</b> {item.paradasl}<br>
<b>Paradas dia de sabado:</b> {item.paradass}<br>
<b>Paradas dia de domingo:</b> {item.paradasd}<br>
<br>
<b>RecorridosA:</b> {item.recorridos}"""
paradas.append(data)
current_app.logger.debug('Funcion listado_paralelos <- finaliza')
return jsonify(paradas)
@main.route('/ruta_recorrido', methods=['POST'])
def ruta_recorrido():
retval = {}
retval['recorrido'] = []
retval['paradas'] = []
servicio = Servicio.query.filter(Servicio.rutaid==request.form['rutaid']).first()
if servicio is not None:
lng = 0
lat = 0
points = 0
distancia = 0
prevpoint = (0,0)
for item in Ruta.query.filter(Ruta.rutaid==request.form['rutaid']).order_by(Ruta.secuencia.asc()).all():
points += 1
lng += item.longitud
lat += item.latitud
retval['recorrido'].append({ 'lat': item.latitud, 'lng': item.longitud })
if prevpoint != (0,0):
distancia += haversine(item.longitud, item.latitud, prevpoint[0], prevpoint[1])
prevpoint = (item.longitud, item.latitud)
distancia = round(distancia, 2)
retval['latitude'] = lat / points
retval['longitude'] = lng / points
retval['color'] = f"#{servicio.linea.color}"
salida = -1
llegada = 0
for item in Parada.query.filter(Parada.servicioid==servicio.id).order_by(Parada.secuencia.asc()).all():
data = {}
if salida == -1:
salida = item.salida
llegada = item.llegada
elif llegada < item.llegada:
llegada = item.llegada
data['latitude'] = item.paradero.latitud
data['longitude'] = item.paradero.longitud
data['codigo'] = item.paradero.nombre
data['lineas'] = item.paradero.lineas
if item.paradero.codigo is not None:
data['mensaje'] = f"""<b>Ubicación:</b> {item.paradero.nombre}<br>
<b>Lineas:</b> {item.paradero.lineas}<br>
<b>Paradas dia de semana:</b> {item.paradero.paradasl}<br>
<b>Paradas dia de sabado:</b> {item.paradero.paradass}<br>
<b>Paradas dia de domingo:</b> {item.paradero.paradasd}<br>
<b>Codigo paradero:</b> {item.paradero.codigo}<br>
<br>
<b>Tamaño del paradero:</b> {item.paradero.tamano}<br>
<b>Capacidad:</b> {item.paradero.capacidad}<br>
Techo:</b> {item.paradero.techo}<br>
<b>Pared:</b> {item.paradero.pared}<br>
<b>Piso:</b> {item.paradero.piso}<br>
<br>
<b>RecorridosA:</b> {item.paradero.recorridos}<br>
<b>RecorridosB:</b> {item.paradero.recorridos2}"""
else:
data['mensaje'] = f"""<b>Ubicación:</b> {item.paradero.nombre}<br>
<b>Lineas:</b> {item.paradero.lineas}<br>
<b>Paradas dia de semana:</b> {item.paradero.paradasl}<br>
<b>Paradas dia de sabado:</b> {item.paradero.paradass}<br>
<b>Paradas dia de domingo:</b> {item.paradero.paradasd}<br>
<br>
<b>RecorridosA:</b> {item.paradero.recorridos}"""
retval['paradas'].append(data)
delta = datetime.combine(date.today(), llegada) - datetime.combine(date.today(), salida)
deltah = delta.seconds /3600
vprom = round(distancia / deltah, 2)
deltah = round(deltah, 3)
paradas = len(retval['paradas'])
normal = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='L').count()
nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='L')
nhoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()
sabado = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='S').count()
nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='S')
shoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()
domingo = Servicio.query.filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='D').count()
nomalsq = db.session.query(Servicio.id).filter(Servicio.rutaid==request.form['rutaid'], Servicio.dotw=='D')
dhoras = db.session.query(func.max(Parada.llegada), func.min(Parada.llegada)).filter(Parada.secuencia==1, Parada.servicioid.in_(nomalsq)).all()
retval['mensaje'] = f"""La línea tiene una extensión de {distancia} Km, recorridos en {deltah} Horas (Promedio velocidad: {vprom} Km/h)<br>
La línea tiene {paradas} paradas durante su extensión<br>
La línea tiene {normal} servicios en día de semana(de {nhoras[0][1]} a {nhoras[0][0]}), {sabado} los sabados(de {shoras[0][1]} a {shoras[0][0]}) y {domingo} los domingos(de {dhoras[0][1]} a {dhoras[0][0]})."""
return jsonify(retval)
else:
return abort(404)
@main.route('/about')
def about():
return render_template('about.html')
@main.route('/')
def home():
paraderos = db.session.query(func.count(Paradero.id)).scalar()
lineas = db.session.query(func.count(Linea.id)).scalar()
servicios = db.session.query(func.count(Servicio.id)).scalar()
detenciones = db.session.query(func.count(Parada.id)).scalar()
return render_template('home.html', paraderos=paraderos, lineas=lineas, servicios=servicios, detenciones=detenciones)
@main.route('/paraderos')
def paraderos():
return render_template('paraderosdb.html')
@main.route('/estaciones')
def estaciones():
return render_template('estaciones.html')
@main.route('/recorridos')
def recorridos():
lineas = []
recorridos = {}
for item in Servicio.query.all():
linea = (item.lineaid, item.direccionid)
if linea in lineas:
continue
lineas.append(linea)
if item.direccionid == 0:
recorridos[item.rutaid] = f"{item.linea.codigo} ida: {item.destino}"
else:
recorridos[item.rutaid] = f"{item.linea.codigo} regreso: {item.destino}"
return render_template('lineas.html', recorridos=dict(sorted(recorridos.items(), key=lambda item: item[1])))
@main.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(current_app.root_path, 'static'), 'public.ico', mimetype='image/vnd.microsoft.icon')