Пример #1
0
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()
Пример #2
0
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,
Пример #3
0
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,
Пример #4
0
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)
Пример #5
0
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",
Пример #6
0
    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,
Пример #7
0
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,
Пример #8
0
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")