# -*- 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')