import datetime from flask import request, render_template, send_file from flask_cors import cross_origin from ogn_python import app from ogn_python import db from ogn_python import cache from ogn_python.model import * @cache.cached(key_prefix='countries_in_receivers') def get_countries_in_receivers(): query = db.session.query(Country.iso2) \ .filter(Country.gid == Receiver.country_id) \ .order_by(Country.iso2) \ .distinct(Country.iso2) return [{'iso2': country[0]} for country in query.all()] @cache.cached(key_prefix='countries_in_logbook') def get_countries_in_logbook(): query = db.session.query(Country.iso2) \ .filter(Country.iso2 == Airport.country_code) \ .filter(Logbook.takeoff_airport_id == Airport.id) \ .order_by(Country.iso2) \ .distinct(Country.iso2) return [{'iso2': country[0]} for country in query.all()] @cache.memoize() def get_airports_in_country(sel_country): query = db.session.query(Airport.id, Airport.name) \ .filter(Airport.country_code == sel_country) \ .filter(Logbook.takeoff_airport_id == Airport.id) \ .order_by(Airport.name) \ .distinct(Airport.name) return [{'id': airport[0], 'name': airport[1]} for airport in query.all()] @cache.memoize() def get_dates_for_airport(sel_airport): query = db.session.query(db.func.date(Logbook.reftime), db.func.count(Logbook.id).label('logbook_count')) \ .filter(Airport.id == sel_airport) \ .filter(db.or_(Airport.id == Logbook.takeoff_airport_id, Airport.id == Logbook.landing_airport_id)) \ .group_by(db.func.date(Logbook.reftime)) \ .order_by(db.func.date(Logbook.reftime).desc()) return [{'date': date, 'logbook_count': logbook_count} for (date, logbook_count) in query.all()] @app.route('/') @app.route('/index.html') def index(): return render_template('base.html') @app.route('/devices.html', methods=['GET', 'POST']) def devices(): devices = db.session.query(Device) \ .order_by(Device.address) \ .limit(100) return render_template('devices.html', devices=devices) @app.route('/device_detail.html', methods=['GET', 'POST']) def device_detail(): device_id = request.args.get('id') device = db.session.query(Device) \ .filter(Device.id == device_id) \ .one() return render_template('device_detail.html', title='Device', device=device) @app.route('/receivers.html') def receivers(): sel_country = request.args.get('country') countries = get_countries_in_receivers() # Get receiver selection list if sel_country: receivers = db.session.query(Receiver) \ .filter(db.and_(Receiver.country_id == Country.gid, Country.iso2 == sel_country)) \ .order_by(Receiver.name) else: receivers = db.session.query(Receiver) \ .order_by(Receiver.name) return render_template('receivers.html', title='Receivers', sel_country=sel_country, countries=countries, receivers=receivers) @app.route('/receiver_detail.html') def receiver_detail(): sel_receiver_id = request.args.get('receiver_id') receiver = db.session.query(Receiver) \ .filter(Receiver.id == sel_receiver_id) \ .one() airport = db.session.query(Airport) \ .filter(db.and_(Receiver.id == sel_receiver_id, db.func.st_contains(db.func.st_buffer(Receiver.location_wkt, 0.5), Airport.location_wkt), db.func.st_distance_sphere(Airport.location_wkt, Receiver.location_wkt) < 1000)) \ .filter(Airport.style.in_((2,4,5))) \ return render_template('receiver_detail.html', title='Receiver Detail', receiver=receiver, airport=airport.first()) @app.route('/airports.html', methods=['GET', 'POST']) def airports(): sel_country = request.args.get('country') countries = get_countries_in_logbook() if sel_country: airports = get_airports_in_country(sel_country) else: airports = [] page = request.args.get('page', 1, type=int) return render_template('airports.html', sel_country=sel_country, countries=countries, airports=airports) @app.route('/airport_detail.html') def airport_detail(): sel_airport = request.args.get('airport') airport = db.session.query(Airport) \ .filter(Airport.id == sel_airport) devices = db.session.query(Device).join(Logbook) \ .filter(Logbook.takeoff_airport_id == sel_airport) \ .order_by(Device.address) return render_template('airport_detail.html', title='Airport Detail', airport=airport.one(), devices=devices) @app.route('/logbook.html', methods=['GET', 'POST']) def logbook(): sel_country = request.args.get('country') sel_airport = request.args.get('airport') sel_date = request.args.get('date') sel_device_id = request.args.get('device_id') countries = get_countries_in_logbook() if sel_country: airports = get_airports_in_country(sel_country) else: airports = [] if sel_airport: sel_airport = int(sel_airport) if sel_airport not in [airport['id'] for airport in airports]: sel_airport = None sel_date = None dates = get_dates_for_airport(sel_airport) else: dates = [] if sel_date: sel_date = datetime.datetime.strptime(sel_date, '%Y-%m-%d').date() if sel_date not in [entry['date'] for entry in dates]: sel_date = dates[0]['date'] elif len(dates) > 0: sel_date = dates[0]['date'] # Get Logbook filters = [] if sel_airport: filters.append(db.or_(Logbook.takeoff_airport_id == sel_airport, Logbook.landing_airport_id == sel_airport)) if sel_date: filters.append(db.func.date(Logbook.reftime) == sel_date) if sel_device_id: filters.append(Logbook.device_id == sel_device_id) if len(filters) > 0: logbook = db.session.query(Logbook) \ .filter(*filters) \ .order_by(Logbook.reftime) else: logbook = None return render_template('logbook.html', title='Logbook', sel_country=sel_country, countries=countries, sel_airport=sel_airport, airports=airports, sel_date=sel_date, dates=dates, logbook=logbook) @app.route('/download.html') def download_flight(): from io import StringIO buffer = StringIO() buffer.write('Moin moin\nAlter Verwalter') buffer.seek(0) return send_file(buffer, as_attachment=True, attachment_filename='wtf.igc', mimetype = 'text/plain') @app.route('/statistics.html') def statistics(): today = datetime.date.today() today = datetime.date(2018, 7, 31) receiverstats = db.session.query(ReceiverStats) \ .filter(ReceiverStats.date == today) return render_template('statistics.html', title='Receiver Statistics', receiverstats=receiverstats)