# -*- 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"""Ubicación: {item.nombre}
Lineas: {item.lineas}
Paradas dia de semana: {item.paradasl}
Paradas dia de sabado: {item.paradass}
Paradas dia de domingo: {item.paradasd}
Codigo paradero: {item.codigo}
Tamaño del paradero: {item.tamano}
Capacidad: {item.capacidad}
Techo: {item.techo}
Pared: {item.pared}
Piso: {item.piso}
RecorridosA: {item.recorridos}
RecorridosB: {item.recorridos2}"""
else:
data['mensaje'] = f"""Ubicación: {item.nombre}
Lineas: {item.lineas}
Paradas dia de semana: {item.paradasl}
Paradas dia de sabado: {item.paradass}
Paradas dia de domingo: {item.paradasd}
RecorridosA: {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"""Ubicación: {item.paradero.nombre}
Lineas: {item.paradero.lineas}
Paradas dia de semana: {item.paradero.paradasl}
Paradas dia de sabado: {item.paradero.paradass}
Paradas dia de domingo: {item.paradero.paradasd}
Codigo paradero: {item.paradero.codigo}
Tamaño del paradero: {item.paradero.tamano}
Capacidad: {item.paradero.capacidad}
Techo: {item.paradero.techo}
Pared: {item.paradero.pared}
Piso: {item.paradero.piso}
RecorridosA: {item.paradero.recorridos}
RecorridosB: {item.paradero.recorridos2}"""
else:
data['mensaje'] = f"""Ubicación: {item.paradero.nombre}
Lineas: {item.paradero.lineas}
Paradas dia de semana: {item.paradero.paradasl}
Paradas dia de sabado: {item.paradero.paradass}
Paradas dia de domingo: {item.paradero.paradasd}
RecorridosA: {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)
La línea tiene {paradas} paradas durante su extensión
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')