kopia lustrzana https://github.com/glidernet/ogn-python
Fixed setup, removed deprecated code, this cancels #24
rodzic
9261e99cbf
commit
d135574ac8
|
@ -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
|
|
@ -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):
|
||||
|
|
4
setup.py
4
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',
|
||||
|
|
|
@ -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()
|
|
@ -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()
|
Ładowanie…
Reference in New Issue