diff --git a/app/backend/liveglidernet.py b/app/backend/liveglidernet.py deleted file mode 100644 index 3dd7a77..0000000 --- a/app/backend/liveglidernet.py +++ /dev/null @@ -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('') - lines.append("") - lines.append('') - for receiver_beacon in last_seen_query: - if receiver_beacon.location is None or receiver_beacon.name.startswith("FNB"): - continue - lines.append( - ''.format( - receiver_beacon.name, receiver_beacon.location.latitude, receiver_beacon.location.longitude, receiver_beacon.timestamp < min_online_timestamp - ) - ) - - lines.append("") - 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('') - lines.append("") - - 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( - ' '.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("") - xml = "\n".join(lines) - - return xml diff --git a/app/gateway/beacon_conversion.py b/app/gateway/beacon_conversion.py index 8421835..4e7be5f 100644 --- a/app/gateway/beacon_conversion.py +++ b/app/gateway/beacon_conversion.py @@ -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): diff --git a/setup.py b/setup.py index fcc8acd..3461288 100644 --- a/setup.py +++ b/setup.py @@ -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', diff --git a/tests/backend/__init__.py b/tests/backend/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/backend/test_backends.py b/tests/backend/test_backends.py deleted file mode 100644 index 28f3d8f..0000000 --- a/tests/backend/test_backends.py +++ /dev/null @@ -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 = """ - - - - - - - """.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 = """ - - - - - """.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() diff --git a/tests/test_timescale_views.py b/tests/test_timescale_views.py deleted file mode 100644 index f2712ec..0000000 --- a/tests/test_timescale_views.py +++ /dev/null @@ -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()