diff --git a/ogn_python/backend/ognrange.py b/ogn_python/backend/ognrange.py index 468e470..31038b7 100644 --- a/ogn_python/backend/ognrange.py +++ b/ogn_python/backend/ognrange.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta from sqlalchemy import func, case from sqlalchemy.sql.expression import label -from ogn_python.model import Receiver +from ogn_python.model import Receiver, ReceiverCoverage from ogn_python import db @@ -19,20 +19,36 @@ def alchemyencoder(obj): return float(obj) -def stations2_filtered_pl(): +def stations2_filtered_pl(start, end): last_10_minutes = datetime.utcnow() - timedelta(minutes=10) query = db.session.query( - Receiver.name.label('s'), - label('lt', func.round(func.ST_Y(Receiver.location_wkt) * 10000) / 10000), - label('lg', func.round(func.ST_X(Receiver.location_wkt) * 10000) / 10000), - case([(Receiver.lastseen > last_10_minutes, "U")], - else_="D").label('u'), - Receiver.lastseen.label('ut'), - label('v', Receiver.version + '.' + Receiver.platform)) \ - .order_by(Receiver.lastseen) + Receiver.name.label('s'), + label('lt', func.round(func.ST_Y(Receiver.location_wkt) * 10000) / 10000), + label('lg', func.round(func.ST_X(Receiver.location_wkt) * 10000) / 10000), + case([(Receiver.lastseen > last_10_minutes, "U")], + else_="D").label('u'), + Receiver.lastseen.label('ut'), + label('v', Receiver.version + '.' + Receiver.platform)) \ + .order_by(Receiver.lastseen) \ + .filter(db.or_(db.and_(start < Receiver.firstseen, end > Receiver.firstseen), + db.and_(start < Receiver.lastseen, end > Receiver.lastseen))) res = db.session.execute(query) stations = json.dumps({'stations': [dict(r) for r in res]}, default=alchemyencoder) return stations + + +def max_tile_mgrs_pl(station, start, end, squares): + query = db.session.query( + func.right(ReceiverCoverage.location_mgrs_short, 4), + func.count(ReceiverCoverage.location_mgrs_short) + ) \ + .filter(db.and_(Receiver.id == ReceiverCoverage.receiver_id, Receiver.name == station)) \ + .filter(ReceiverCoverage.location_mgrs_short.like(squares + '%')) \ + .group_by(func.right(ReceiverCoverage.location_mgrs_short, 4)) + + res = {'t': squares, + 'p': ['{}/{}'.format(r[0], r[1]) for r in query.all()]} + return json.dumps(res) \ No newline at end of file diff --git a/tests/backend/test_backends.py b/tests/backend/test_backends.py index 26284a1..8cc985c 100644 --- a/tests/backend/test_backends.py +++ b/tests/backend/test_backends.py @@ -1,5 +1,5 @@ import json -from datetime import datetime +from datetime import datetime, date import unittest from unittest import mock @@ -8,10 +8,10 @@ from xmlunittest import XmlTestMixin from tests.base import TestBaseDB, db -from ogn_python.model import AircraftBeacon, AircraftType, Receiver, Device, DeviceInfo +from ogn_python.model import AircraftBeacon, AircraftType, Receiver, Device, DeviceInfo, ReceiverCoverage from ogn_python.backend.liveglidernet import rec, lxml -from ogn_python.backend.ognrange import stations2_filtered_pl +from ogn_python.backend.ognrange import stations2_filtered_pl, max_tile_mgrs_pl class TestDB(TestBaseDB, XmlTestMixin): @@ -47,6 +47,15 @@ class TestDB(TestBaseDB, XmlTestMixin): 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() + @mock.patch('ogn_python.backend.liveglidernet.datetime') def test_rec(self, datetime_mock): datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0) @@ -91,7 +100,7 @@ class TestDB(TestBaseDB, XmlTestMixin): def test_stations2_filtered_pl(self, datetime_mock): datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0) - result = stations2_filtered_pl() + result = stations2_filtered_pl(start=date(2017, 12, 15), end=date(2017, 12, 25)) data = json.loads(result) @@ -119,6 +128,22 @@ class TestDB(TestBaseDB, XmlTestMixin): 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()