ogn-python/app/app.py

123 wiersze
4.0 KiB
Python

from datetime import datetime, timedelta
from flask import Flask, render_template
from flask.ext.script import Manager
from flask.ext.bootstrap import Bootstrap
from flask.ext.sqlalchemy import SQLAlchemy
from flask_nav import Nav
from flask_nav.elements import Navbar, View
import json
from ogn.model.address_origin import AddressOrigin
from ogn.model.flarm import Flarm
from ogn.db import session
from sqlalchemy import func, desc, and_
from sqlalchemy.sql.expression import label
from ogn.model.receiver_beacon import ReceiverBeacon
from ogn.model.receiver_device import ReceiverDevice
from ogn.model.aircraft_beacon import AircraftBeacon
from flask.json import jsonify
app = Flask(__name__)
manager = Manager(app)
bootstrap = Bootstrap(app)
nav = Nav()
nav.init_app(app)
mynavbar = Navbar(
'Open Glider Network',
View('Home', 'index'),
View('Live', 'live'),
View('Flarms', 'flarms'),
View('Receivers', 'receivers'),
View('Statistics', 'statistics'),
)
nav.register_element('top', mynavbar)
@app.route("/")
def index():
return render_template('index.html')
@app.route('/live')
def live():
return render_template('live.html')
@app.route('/aircraft_beacons')
def aircraft_beacons():
sq_last = session.query(AircraftBeacon.address, func.max(AircraftBeacon.timestamp).label('lastseen')) \
.filter(AircraftBeacon.timestamp > '2015-11-13 00:00:00') \
.group_by(AircraftBeacon.address) \
.subquery()
aircraft_beacons_query = session.query(AircraftBeacon.address, AircraftBeacon.latitude, AircraftBeacon.longitude, Flarm.registration, Flarm.aircraft) \
.outerjoin(Flarm, AircraftBeacon.address == Flarm.address) \
.filter(and_(AircraftBeacon.address == sq_last.c.address, AircraftBeacon.timestamp == sq_last.c.lastseen))
result = {}
for [address, latitude, longitude, registration, aircraft] in aircraft_beacons_query.all():
result[address] = {'lat': latitude, 'lng': longitude, 'registration': registration, 'aircraft': aircraft}
return(json.dumps({'aircraft_beacons': result}))
@app.route('/positions/<address>')
def positions(address):
positions_query = session.query(AircraftBeacon) \
.filter(AircraftBeacon.address == address) \
.filter(AircraftBeacon.ground_speed > 0)
result = []
for position in positions_query.all():
result.append({'lat': position.latitude, 'lng': position.longitude})
return(json.dumps({'positions': result}))
@app.route('/flarms')
def flarms():
flarm_query = session.query(Flarm.address, Flarm.aircraft, Flarm.registration, Flarm.competition).\
filter(Flarm.address_origin == AddressOrigin.userdefined).\
order_by(Flarm.address).all()
return render_template('flarms.html', flarms=flarm_query)
@app.route('/receivers')
def receivers():
back_24h = datetime.utcnow() - timedelta(days=1)
receiver_messages_per_24h = 24*60 / 5
sq_r_beacons = session.query(ReceiverBeacon.name, func.count(ReceiverBeacon.name).label('messages_count')).\
filter(ReceiverBeacon.timestamp > back_24h).\
group_by(ReceiverBeacon.name).\
subquery()
sq_a_beacons = session.query(AircraftBeacon.receiver_name, func.count(AircraftBeacon.receiver_name).label('beacons_count')).\
filter(AircraftBeacon.timestamp > back_24h).\
group_by(AircraftBeacon.receiver_name).\
subquery()
receiver_query = session.query(ReceiverDevice.country_code, ReceiverDevice.name, ReceiverDevice.lastseen, label('availability', 100*sq_r_beacons.c.messages_count/receiver_messages_per_24h), ReceiverDevice.version, ReceiverDevice.platform, sq_a_beacons.c.beacons_count).\
filter(ReceiverDevice.name == sq_r_beacons.c.name).\
filter(ReceiverDevice.name == sq_a_beacons.c.receiver_name).\
order_by(desc(sq_a_beacons.c.beacons_count)).all()
return render_template('receivers.html', receivers=receiver_query)
@app.route('/statistics')
def statistics():
return render_template('index.html')
if __name__ == "__main__":
app.run(debug=True)