Fixed setup, removed deprecated code, this cancels #24

pull/78/head
Konstantin Gründger 2020-11-19 09:03:48 +01:00
rodzic 9261e99cbf
commit d135574ac8
6 zmienionych plików z 4 dodań i 324 usunięć

Wyświetl plik

@ -1,103 +0,0 @@
from datetime import datetime, timezone
from app.model import AircraftBeacon, ReceiverBeacon
from app import db
def utc_to_local(utc_dt):
return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)
def encode(address):
return "xx" + address
def decode(code):
return code[2:9]
def rec(min_timestamp, min_online_timestamp):
last_seen_query = (
db.session.query(ReceiverBeacon).filter(ReceiverBeacon.timestamp > min_timestamp).order_by(ReceiverBeacon.receiver_id, ReceiverBeacon.timestamp).distinct(ReceiverBeacon.receiver_id)
)
lines = []
lines.append('<?xml version="1.0" encoding="UTF-8"?>')
lines.append("<markers>")
lines.append('<m e="0"/>')
for receiver_beacon in last_seen_query:
if receiver_beacon.location is None or receiver_beacon.name.startswith("FNB"):
continue
lines.append(
'<m a="{0}" b="{1:.7f}" c="{2:.7f}" d="{3:1d}"/>'.format(
receiver_beacon.name, receiver_beacon.location.latitude, receiver_beacon.location.longitude, receiver_beacon.timestamp < min_online_timestamp
)
)
lines.append("</markers>")
xml = "\n".join(lines)
return xml
def lxml(show_offline=False, lat_max=90, lat_min=-90, lon_max=180, lon_min=-180):
timestamp_range_filter = [db.between(AircraftBeacon.timestamp, datetime(2018, 7, 31, 11, 55, 0), datetime(2018, 7, 31, 12, 5, 0))]
last_seen_query = db.session.query(AircraftBeacon).filter(*timestamp_range_filter).order_by(AircraftBeacon.device_id, AircraftBeacon.timestamp).distinct(AircraftBeacon.device_id)
lines = list()
lines.append('<?xml version="1.0" encoding="UTF-8"?>')
lines.append("<markers>")
for aircraft_beacon in last_seen_query:
device = aircraft_beacon.device
code = encode(device.address)
if device.info:
if not device.info.tracked or not device.info.identified:
continue
if not device.info.competition:
competition = device.info.registration[-2:]
else:
competition = device.info.competition
if not device.info.registration:
registration = "???"
else:
registration = device.info.registration
address = device.address
else:
competition = ("_" + code[-2:]).lower()
registration = code
address = 0
elapsed_time = datetime.utcnow() - aircraft_beacon.timestamp
elapsed_seconds = int(elapsed_time.total_seconds())
lines.append(
' <m a="{0:.7f},{1:.7f},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}"/>'.format(
aircraft_beacon.location.latitude,
aircraft_beacon.location.longitude,
competition,
registration,
int(aircraft_beacon.altitude),
utc_to_local(aircraft_beacon.timestamp).strftime("%H:%M:%S"),
elapsed_seconds,
int(aircraft_beacon.track),
int(aircraft_beacon.ground_speed),
int(aircraft_beacon.climb_rate * 10) / 10,
aircraft_beacon.aircraft_type,
aircraft_beacon.receiver_name,
address,
code,
)
)
lines.append("</markers>")
xml = "\n".join(lines)
return xml

Wyświetl plik

@ -1,13 +1,13 @@
from mgrs import MGRS
import rasterio as rs
from ogn.parser import parse
from app.model import AircraftType
#import rasterio as rs
#elevation_dataset = rs.open('/Volumes/LaCieBlack/Wtf4.tiff')
mgrs = MGRS()
#elevation_dataset = rs.open('/Volumes/LaCieBlack/Wtf4.tiff')
def aprs_string_to_message(aprs_string):

Wyświetl plik

@ -54,8 +54,8 @@ setup(
'xmlunittest==0.5.0',
'flower==0.9.5',
'tqdm==4.51.0',
'requests==2.25.0',
'matplotlib=3.3.3'
'requests==2.25.0',
'matplotlib==3.3.3'
],
test_require=[
'pytest==5.0.1',

Wyświetl plik

@ -1,194 +0,0 @@
import json
from datetime import datetime, date
import unittest
from unittest import mock
from xmlunittest import XmlTestMixin
from tests.base import TestBaseDB, db
from app.model import AircraftBeacon, AircraftType, Receiver, Sender, DeviceInfo, ReceiverCoverage
from app.backend.liveglidernet import rec, lxml
from app.backend.ognrange import stations2_filtered_pl, max_tile_mgrs_pl
class TestDB(TestBaseDB, XmlTestMixin):
def setUp(self):
super().setUp()
# Prepare Beacons
self.r01 = Receiver(name="Koenigsdf", location_wkt="0101000020E610000061E8FED7A6EE26407F20661C10EA4740", lastseen="2017-12-20 10:00:00", altitude=601, version="0.2.5", platform="ARM")
self.r02 = Receiver(name="Bene", location_wkt="0101000020E6100000D5E76A2BF6C72640D4063A6DA0DB4740", lastseen="2017-12-20 09:45:00", altitude=609, version="0.2.7", platform="x64")
self.r03 = Receiver(name="Ohlstadt", location_wkt="0101000020E6100000057E678EBF772640A142883E32D44740", lastseen="2017-12-20 10:05:00", altitude=655, version="0.2.6", platform="ARM")
db.session.add(self.r01)
db.session.add(self.r02)
db.session.add(self.r03)
db.session.commit()
self.d01 = Sender(address="DD4711", lastseen="2017-12-20 10:00:02")
self.d02 = Sender(address="DD0815", lastseen="2017-12-20 09:56:00")
db.session.add(self.d01)
db.session.add(self.d02)
db.session.commit()
self.di01 = DeviceInfo(registration="D-4711", competition="Hi", tracked=True, identified=True)
db.session.add(self.di01)
db.session.commit()
self.ab11 = AircraftBeacon(
name="FLRDD4711",
receiver_name="Koenigsdf",
location_wkt="0101000020E6100000211FF46C56ED26402650D7EDC6E94740",
aircraft_type=AircraftType.GLIDER_OR_MOTOR_GLIDER,
timestamp="2017-12-20 10:00:01",
track=105,
ground_speed=57,
climb_rate=-0.5,
)
self.ab12 = AircraftBeacon(
name="FLRDD4711",
receiver_name="Koenigsdf",
location_wkt="0101000020E6100000806DEA295FED2640347D898BB6E94740",
aircraft_type=AircraftType.GLIDER_OR_MOTOR_GLIDER,
timestamp="2017-12-20 10:00:02",
track=123,
ground_speed=55,
climb_rate=-0.4,
altitude=209,
)
self.ab21 = AircraftBeacon(
name="FLRDD0815",
receiver_name="Koenigsdf",
location_wkt="0101000020E6100000F38B25BF58F22640448B6CE7FBE94740",
aircraft_type=AircraftType.POWERED_AIRCRAFT,
timestamp="2017-12-20 09:54:30",
track=280,
ground_speed=80,
climb_rate=-2.9,
)
self.ab22 = AircraftBeacon(
name="FLRDD0815",
receiver_name="Bene",
location_wkt="0101000020E6100000A5E8482EFFF12640DC1EAA16FEE94740",
aircraft_type=AircraftType.POWERED_AIRCRAFT,
timestamp="2017-12-20 09:56:00",
track=270,
ground_speed=77,
climb_rate=-1.5,
altitude=543,
)
db.session.add(self.ab11)
db.session.add(self.ab12)
db.session.add(self.ab21)
db.session.add(self.ab22)
db.session.commit()
self.rc11 = ReceiverCoverage(
location_mgrs_short="32TPU8312", date=date(2017, 12, 20), max_signal_quality=10, max_altitude=1000, min_altitude=600, aircraft_beacon_count=20, device_count=2, receiver=self.r01
)
self.rc12 = ReceiverCoverage(
location_mgrs_short="32TPU8434", date=date(2017, 12, 20), max_signal_quality=10, max_altitude=1000, min_altitude=600, aircraft_beacon_count=20, device_count=2, receiver=self.r01
)
self.rc12 = ReceiverCoverage(
location_mgrs_short="32TPU8434", date=date(2017, 12, 21), max_signal_quality=10, max_altitude=1000, min_altitude=600, aircraft_beacon_count=20, device_count=2, receiver=self.r01
)
self.rc21 = ReceiverCoverage(
location_mgrs_short="32TPU8512", date=date(2017, 12, 20), max_signal_quality=10, max_altitude=1000, min_altitude=600, aircraft_beacon_count=20, device_count=2, receiver=self.r02
)
db.session.add(self.rc11)
db.session.add(self.rc12)
db.session.add(self.rc21)
db.session.commit()
@unittest.skip("broken")
def test_rec(self):
data = rec(min_timestamp=datetime(2017, 12, 19, 10, 0), min_online_timestamp=datetime(2017, 12, 20, 10, 0)).encode(encoding="utf-8")
# Check the document
root = self.assertXmlDocument(data)
self.assertXmlNode(root, tag="markers")
self.assertXpathsOnlyOne(root, ('./m[@a="Koenigsdf"]', './m[@a="Bene"]', './m[@a="Ohlstadt"]'))
# Check the complete document
expected = """<?xml version="1.0" encoding="UTF-8"?>
<markers>
<m e="0"/>
<m a="Bene" b="47.7158333" c="11.3905500" d="0"/>
<m a="Koenigsdf" b="47.8286167" c="11.4661167" d="1"/>
<m a="Ohlstadt" b="47.6577833" c="11.2338833" d="1"/>
</markers>
""".encode(
encoding="utf-8"
)
self.assertXmlEquivalentOutputs(data, expected)
@unittest.skip("broken")
def test_lxml(self):
data = lxml().encode(encoding="utf-8")
# Check the complete document
expected = """<?xml version="1.0" encoding="UTF-8"?>
<markers>
<m a="47.8280667,11.4726500,_15,xxDD0815,543,09:56:00,245,270,77,-1.5,8,Bene,0,xxDD0815"/>
<m a="47.8258833,11.4636167,Hi,D-4711,209,10:00:02,3,123,55,-0.4,1,Koenigsdf,DD4711,xxDD4711"/>
</markers>
""".encode(
encoding="utf-8"
)
self.assertXmlEquivalentOutputs(data, expected)
@mock.patch("app.backend.ognrange.datetime")
def test_stations2_filtered_pl(self, datetime_mock):
datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0)
result = stations2_filtered_pl(start=date(2017, 12, 15), end=date(2017, 12, 25))
data = json.loads(result)
stations = data["stations"]
self.assertEqual(len(stations), 3)
s1 = stations[0]
s2 = stations[1]
s3 = stations[2]
self.assertEqual(s1["s"], "Bene")
self.assertEqual(s1["lt"], 47.7158)
self.assertEqual(s1["lg"], 11.3906)
self.assertEqual(s1["u"], "D") # Down, because last beacon > 10min. ago
self.assertEqual(s1["ut"], "2017-12-20 09:45")
# self.assertEqual(s1["b"], 0)
self.assertEqual(s1["v"], "0.2.7.x64")
self.assertEqual(s2["s"], "Koenigsdf")
self.assertEqual(s2["lt"], 47.8286)
self.assertEqual(s2["lg"], 11.4661)
self.assertEqual(s2["u"], "U")
self.assertEqual(s2["ut"], "2017-12-20 10:00")
# self.assertEqual(s2["b"], 0)
self.assertEqual(s2["v"], "0.2.5.ARM")
self.assertEqual(s3["s"], "Ohlstadt")
def test_max_tile_mgrs_pl(self):
result = max_tile_mgrs_pl(station="Koenigsdf", start=date(2017, 12, 15), end=date(2017, 12, 25), squares="32TPU")
data = json.loads(result)
self.assertEqual(data["t"], "32TPU")
self.assertEqual(data["p"][0], "8312/1")
self.assertEqual(data["p"][1], "8434/2")
result = max_tile_mgrs_pl(station="Bene", start=date(2017, 12, 15), end=date(2017, 12, 25), squares="32TPU")
data = json.loads(result)
self.assertEqual(data["t"], "32TPU")
self.assertEqual(data["p"][0], "8512/1")
if __name__ == "__main__":
unittest.main()

Wyświetl plik

@ -1,23 +0,0 @@
import unittest
from tests.base import TestBaseDB, db
from app.model import AircraftBeacon
class TestDatabase(TestBaseDB):
def test_view(self):
from app.timescale_views import MyView
self.insert_airports_and_devices()
self.insert_aircraft_beacons_broken_rope()
db.session.execute("REFRESH MATERIALIZED VIEW device_stats;")
stats = db.session.query(MyView).all()
for stat in stats:
print(stat)
if __name__ == "__main__":
unittest.main()