from flask.cli import AppGroup import click from datetime import datetime, timedelta from sqlalchemy.sql import func from app.collect.database import update_device_infos, update_country_code from app.model import * from app.utils import get_airports, get_days from app import app from app import db user_cli = AppGroup("database") user_cli.help = "Database creation and handling." ALEMBIC_CONFIG_FILE = "alembic.ini" def get_database_days(start, end): """Returns the first and the last day in aircraft_beacons table.""" if start is None and end is None: days_from_db = db.session.query(func.min(AircraftBeacon.timestamp).label("first_day"), func.max(AircraftBeacon.timestamp).label("last_day")).one() start = days_from_db[0].date() end = days_from_db[1].date() else: start = datetime.strptime(start, "%Y-%m-%d").date() end = datetime.strptime(end, "%Y-%m-%d").date()
import click from datetime import datetime from app.collect.logbook import update_entries as logbook_update_entries from app.collect.takeoff_landings import update_entries as takeoff_landings_update_entries from app.model import Airport, Logbook from sqlalchemy.sql import func from tqdm import tqdm from app.commands.database import get_database_days from app.utils import date_to_timestamps from app import db user_cli = AppGroup("logbook") user_cli.help = "Handling of logbook data." @user_cli.command("compute_takeoff_landing") @click.argument("start") @click.argument("end") def compute_takeoff_landing(start, end): """Compute takeoffs and landings.""" days = get_database_days(start, end) pbar = tqdm(days) for single_date in pbar: pbar.set_description(datetime.strftime(single_date, "%Y-%m-%d")) (start, end) = date_to_timestamps(single_date) result = takeoff_landings_update_entries(session=db.session,
from flask.cli import AppGroup import click from datetime import datetime from tqdm import tqdm from app.commands.database import get_database_days from app import db user_cli = AppGroup("flights") user_cli.help = "Create 2D flight paths from data." NOTHING = "" CONTEST_RELEVANT = "AND agl < 1000" LOW_PASS = "******" def compute_gaps(session, date): query = """ INSERT INTO flights2d(date, flight_type, device_id, path) SELECT '{date}' AS date, 3 AS flight_type, sq3.device_id, ST_Collect(sq3.path) FROM ( SELECT sq2.d1 device_id, ST_MakeLine(sq2.l1, sq2.l2) path FROM ( SELECT sq.timestamp t1, LAG(sq.timestamp) OVER ( PARTITION BY sq.timestamp::DATE, sq.device_id ORDER BY sq.timestamp) t2,
import os import datetime from flask import current_app from flask.cli import AppGroup import click from ogn.client import AprsClient from app.gateway.bulkimport import convert, DbFeeder user_cli = AppGroup("gateway") user_cli.help = "Connection to APRS servers." @user_cli.command("run") def run(aprs_user="******"): """Run the aprs client and feed the DB with incoming data.""" # User input validation if len(aprs_user) < 3 or len(aprs_user) > 9: print("aprs_user must be a string of 3-9 characters.") return current_app.logger.warning("Start ogn gateway") client = AprsClient(aprs_user) client.connect() with DbFeeder(prefix='continuous_import', reference_timestamp=datetime.utcnow, reference_timestamp_autoupdate=True) as feeder: try: client.run(callback=lambda x: feeder.add(x), autoreconnect=True)
from flask.cli import AppGroup import click from tqdm import tqdm from mgrs import MGRS from ogn.parser import parse, ParseError from app.model import AircraftBeacon, ReceiverBeacon, Location from app.utils import open_file from app.gateway.process_tools import * from app import db from app import app user_cli = AppGroup("bulkimport") user_cli.help = "Tools for accelerated data import." # define message types we want to proceed AIRCRAFT_BEACON_TYPES = [ "aprs_aircraft", "flarm", "tracker", "fanet", "lt24", "naviter", "skylines", "spider", "spot", "flymaster" ] RECEIVER_BEACON_TYPES = ["aprs_receiver", "receiver"] # define fields we want to proceed BEACON_KEY_FIELDS = ["name", "receiver_name", "timestamp"] AIRCRAFT_BEACON_FIELDS = [ "location", "altitude", "dstcall", "relay",
create_receiver_stats, create_relation_stats, create_country_stats, update_qualities, update_receivers as update_receivers_command, update_devices as update_devices_command, update_device_stats_jumps, ) from app.collect.ognrange import update_entries as update_receiver_coverages from app.model import Device from app import db user_cli = AppGroup("stats") user_cli.help = "Handling of statistical data." @user_cli.command("create") @click.argument("start") @click.argument("end") def create(start, end): """Create DeviceStats, ReceiverStats and RelationStats.""" days = get_database_days(start, end) pbar = tqdm(days) for single_date in pbar: pbar.set_description(datetime.strftime(single_date, "%Y-%m-%d")) result = create_device_stats(session=db.session, date=single_date) result = update_device_stats_jumps(session=db.session,
from flask.cli import AppGroup import click import datetime import re import csv from aerofiles.igc import Writer from app.model import * from app import db user_cli = AppGroup("export") user_cli.help = "Export data in several file formats." @user_cli.command("cup") def cup(): """Export receiver waypoints as '.cup'.""" sql = """ SELECT 'OGN-' || sq.name AS name, sq.name AS code, c.iso2 AS country, CASE WHEN sq.lat_deg < 10 THEN '0' ELSE '' END || CAST((sq.lat_deg*100 + sq.lat_min) AS decimal(18, 5)) || sq.lat_sig AS lat, CASE WHEN sq.lon_deg < 10 THEN '00' WHEN sq.lon_deg < 100 THEN '0' ELSE '' END || CAST(sq.lon_deg*100 + sq.lon_min AS decimal(18, 5)) || sq.lon_sig AS lon, altitude || 'm' AS elev, '8' AS style, '' AS rwdir, '' AS rwlen, '' AS freq,
from flask.cli import AppGroup import click from datetime import datetime from app.collect.logbook import update_takeoff_landings, update_logbook from tqdm import tqdm from app.commands.database import get_database_days from app.utils import date_to_timestamps user_cli = AppGroup("logbook") user_cli.help = "Handling of takeoff/landings and logbook data." @user_cli.command("compute_takeoff_landing") @click.argument("start") @click.argument("end") def compute_takeoff_landing(start, end): """Compute takeoffs and landings.""" days = get_database_days(start, end) pbar = tqdm(days) for single_date in pbar: pbar.set_description(datetime.strftime(single_date, "%Y-%m-%d")) (start, end) = date_to_timestamps(single_date) result = update_takeoff_landings(start=start, end=end) @user_cli.command("compute_logbook") @click.argument("start")