diff --git a/app/ogn_backend_app.py b/app/ogn_backend_app.py new file mode 100644 index 0000000..1a43b61 --- /dev/null +++ b/app/ogn_backend_app.py @@ -0,0 +1,81 @@ +from datetime import datetime, timedelta, date + +from flask import Flask +from flask import Response + +from ogn.db import session + +from sqlalchemy import func, and_, case, between +from ogn.model import ReceiverBeacon +from ogn.model import AircraftBeacon +from ogn.model import Flarm + +from flask import request + +app = Flask(__name__) + + +@app.route("/rec.php") +def index(): + sq = session.query(ReceiverBeacon.name, func.max(ReceiverBeacon.timestamp).label('lastseen')) \ + .group_by(ReceiverBeacon.name) \ + .subquery() + + last_10_minutes = datetime.utcnow() - timedelta(minutes=10) + receiver_query = session.query(ReceiverBeacon.name, ReceiverBeacon.latitude, ReceiverBeacon.longitude, case([(sq.c.lastseen>last_10_minutes, True)], else_=False).label('is_online')) \ + .filter(and_(ReceiverBeacon.name == sq.c.name, ReceiverBeacon.timestamp == sq.c.lastseen)) \ + .order_by(ReceiverBeacon.name) + + lines = list() + lines.append('') + lines.append('') + lines.append('') + for [name, latitude, longitude, is_online] in receiver_query.all(): + lines.append(''.format(name, latitude, longitude, is_online)) + + lines.append('') + xml = '\n'.join(lines) + return Response(xml, mimetype='text/xml') + + +@app.route('/lxml.php', methods=['GET', 'POST']) +def live(): + show_offline = request.args.get('a', False) + lat_max = request.args.get('b', 90) + lat_min = request.args.get('c', -90) + lon_max = request.args.get('d', 180) + lon_min = request.args.get('e', -180) + + if show_offline: + start_observation = date.today() + else: + start_observation = datetime.utcnow - timedelta(minutes=5) + + sq = session.query(AircraftBeacon.address, func.max(AircraftBeacon.timestamp).label('lastseen')) \ + .filter(and_(between(AircraftBeacon.latitude, lat_max, lat_min), between(AircraftBeacon.longitude, lon_max, lon_min))) \ + .filter(AircraftBeacon.timestamp > start_observation) \ + .group_by(AircraftBeacon.address) \ + .subquery() + + position_query = session.query(AircraftBeacon, Flarm) \ + .outerjoin(Flarm, AircraftBeacon.address == Flarm.address) \ + .filter(and_(AircraftBeacon.address == sq.c.address, AircraftBeacon.timestamp == sq.c.lastseen)) + + lines = list() + lines.append('') + lines.append('') + + hashcode = '4711abcd' + flarm_competition = lambda flarm_object: '_' + hashcode[6:7] if flarm_object is None else flarm_object.competition + flarm_registration = lambda flarm_object: hashcode if flarm_object is None else flarm_object.registration + flarm_address = lambda flarm_object: 0 if flarm_object is None else flarm_object.address + for [ab, flarm] in position_query.all(): + lines.append(''.format(ab.latitude, ab.longitude, flarm_competition(flarm), flarm_registration(flarm), ab.altitude, ab.timestamp, ab.track, ab.ground_speed, ab.climb_rate, ab.aircraft_type, ab.receiver_name, flarm_address(flarm), flarm_registration(flarm))) + + lines.append('') + xml = '\n'.join(lines) + return Response(xml, mimetype='text/xml') + + +if __name__ == "__main__": + app.run(debug=True)