214 lines
9.6 KiB
Python
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') |