kopia lustrzana https://github.com/glidernet/ogn-python
Repair db scheme for ognrange
rodzic
7367f43dd4
commit
6fffa09e20
|
@ -132,6 +132,7 @@ available commands:
|
||||||
|
|
||||||
[stats]
|
[stats]
|
||||||
create Create DeviceStats, ReceiverStats and RelationStats.
|
create Create DeviceStats, ReceiverStats and RelationStats.
|
||||||
|
create_ognrange Create stats for Melissa's ognrange.
|
||||||
update_devices Update devices with data from stats.
|
update_devices Update devices with data from stats.
|
||||||
update_receivers Update receivers with data from stats.
|
update_receivers Update receivers with data from stats.
|
||||||
```
|
```
|
||||||
|
|
|
@ -7,9 +7,10 @@ from ogn.model import Receiver
|
||||||
|
|
||||||
|
|
||||||
def alchemyencoder(obj):
|
def alchemyencoder(obj):
|
||||||
|
"""JSON encoder function for SQLAlchemy special classes."""
|
||||||
|
|
||||||
import decimal
|
import decimal
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
"""JSON encoder function for SQLAlchemy special classes."""
|
|
||||||
if isinstance(obj, datetime):
|
if isinstance(obj, datetime):
|
||||||
return obj.strftime('%Y-%m-%d %H:%M')
|
return obj.strftime('%Y-%m-%d %H:%M')
|
||||||
elif isinstance(obj, decimal.Decimal):
|
elif isinstance(obj, decimal.Decimal):
|
||||||
|
|
|
@ -1,24 +1,31 @@
|
||||||
from celery.utils.log import get_task_logger
|
from celery.utils.log import get_task_logger
|
||||||
|
|
||||||
from sqlalchemy import String
|
from sqlalchemy import String
|
||||||
from sqlalchemy import and_, insert, update, exists
|
from sqlalchemy import and_, insert, update, exists, between
|
||||||
from sqlalchemy.sql import func, null
|
from sqlalchemy.sql import func, null
|
||||||
|
|
||||||
from ogn.collect.celery import app
|
from ogn.collect.celery import app
|
||||||
from ogn.model import AircraftBeacon, ReceiverCoverage
|
from ogn.model import AircraftBeacon, ReceiverCoverage
|
||||||
|
from ogn.utils import date_to_timestamps
|
||||||
|
|
||||||
logger = get_task_logger(__name__)
|
logger = get_task_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@app.task
|
@app.task
|
||||||
def update_receiver_coverage(session=None):
|
def create_receiver_coverage(session=None, date=None):
|
||||||
"""Add/update receiver coverages."""
|
"""Create receiver coverages."""
|
||||||
|
|
||||||
logger.info("Compute receiver coverages.")
|
logger.info("Compute receiver coverages.")
|
||||||
|
|
||||||
if session is None:
|
if session is None:
|
||||||
session = app.session
|
session = app.session
|
||||||
|
|
||||||
|
if not date:
|
||||||
|
logger.warn("A date is needed for calculating stats. Exiting")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
(start, end) = date_to_timestamps(date)
|
||||||
|
|
||||||
# Filter aircraft beacons and shrink precision of MGRS from 1m to 1km resolution: 30UXC 00061 18429 -> 30UXC 00 18
|
# Filter aircraft beacons and shrink precision of MGRS from 1m to 1km resolution: 30UXC 00061 18429 -> 30UXC 00 18
|
||||||
sq = session.query((func.left(AircraftBeacon.location_mgrs, 5, type_=String) + func.substring(AircraftBeacon.location_mgrs, 6, 2, type_=String) + func.substring(AircraftBeacon.location_mgrs, 11, 2, type_=String)).label('reduced_mgrs'),
|
sq = session.query((func.left(AircraftBeacon.location_mgrs, 5, type_=String) + func.substring(AircraftBeacon.location_mgrs, 6, 2, type_=String) + func.substring(AircraftBeacon.location_mgrs, 11, 2, type_=String)).label('reduced_mgrs'),
|
||||||
AircraftBeacon.receiver_id,
|
AircraftBeacon.receiver_id,
|
||||||
|
@ -26,7 +33,8 @@ def update_receiver_coverage(session=None):
|
||||||
AircraftBeacon.signal_quality,
|
AircraftBeacon.signal_quality,
|
||||||
AircraftBeacon.altitude,
|
AircraftBeacon.altitude,
|
||||||
AircraftBeacon.device_id) \
|
AircraftBeacon.device_id) \
|
||||||
.filter(and_(AircraftBeacon.location_mgrs != null(),
|
.filter(and_(between(AircraftBeacon.timestamp, start, end),
|
||||||
|
AircraftBeacon.location_mgrs != null(),
|
||||||
AircraftBeacon.receiver_id != null(),
|
AircraftBeacon.receiver_id != null(),
|
||||||
AircraftBeacon.device_id != null())) \
|
AircraftBeacon.device_id != null())) \
|
||||||
.subquery()
|
.subquery()
|
||||||
|
|
|
@ -8,6 +8,8 @@ from ogn.collect.stats import create_device_stats, create_receiver_stats, create
|
||||||
update_qualities, update_receivers as update_receivers_command, update_devices as update_devices_command,\
|
update_qualities, update_receivers as update_receivers_command, update_devices as update_devices_command,\
|
||||||
update_device_stats_jumps
|
update_device_stats_jumps
|
||||||
|
|
||||||
|
from ogn.collect.ognrange import create_receiver_coverage
|
||||||
|
|
||||||
manager = Manager()
|
manager = Manager()
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,3 +43,15 @@ def update_devices():
|
||||||
|
|
||||||
result = update_devices_command(session=session)
|
result = update_devices_command(session=session)
|
||||||
print(result)
|
print(result)
|
||||||
|
|
||||||
|
|
||||||
|
@manager.command
|
||||||
|
def create_ognrange(start=None, end=None):
|
||||||
|
"""Create stats for Melissas ognrange."""
|
||||||
|
|
||||||
|
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_receiver_coverage(session=session, date=single_date)
|
|
@ -9,7 +9,6 @@ class ReceiverCoverage(Base):
|
||||||
__tablename__ = "receiver_coverages"
|
__tablename__ = "receiver_coverages"
|
||||||
|
|
||||||
location_mgrs = Column(String(9), primary_key=True)
|
location_mgrs = Column(String(9), primary_key=True)
|
||||||
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), primary_key=True)
|
|
||||||
date = Column(Date, primary_key=True)
|
date = Column(Date, primary_key=True)
|
||||||
|
|
||||||
max_signal_quality = Column(Float)
|
max_signal_quality = Column(Float)
|
||||||
|
@ -20,5 +19,5 @@ class ReceiverCoverage(Base):
|
||||||
device_count = Column(SmallInteger)
|
device_count = Column(SmallInteger)
|
||||||
|
|
||||||
# Relations
|
# Relations
|
||||||
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), index=True)
|
receiver_id = Column(Integer, ForeignKey('receivers.id', ondelete='SET NULL'), primary_key=True)
|
||||||
receiver = relationship('Receiver', foreign_keys=[receiver_id], backref=backref('receiver_coverages', order_by='ReceiverCoverage.date.asc()'))
|
receiver = relationship('Receiver', foreign_keys=[receiver_id], backref=backref('receiver_coverages', order_by='ReceiverCoverage.date.asc()'))
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import unittest
|
import unittest
|
||||||
import os
|
import os
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
from ogn.model import AircraftBeacon, Receiver, ReceiverCoverage, Device
|
from ogn.model import AircraftBeacon, Receiver, ReceiverCoverage, Device
|
||||||
from ogn.collect.ognrange import update_receiver_coverage
|
from ogn.collect.ognrange import create_receiver_coverage
|
||||||
|
|
||||||
|
|
||||||
class TestDB(unittest.TestCase):
|
class TestDB(unittest.TestCase):
|
||||||
|
@ -51,7 +52,7 @@ class TestDB(unittest.TestCase):
|
||||||
def test_update_receiver_coverage(self):
|
def test_update_receiver_coverage(self):
|
||||||
session = self.session
|
session = self.session
|
||||||
|
|
||||||
update_receiver_coverage(session)
|
create_receiver_coverage(session, date=date(2017, 12, 10))
|
||||||
|
|
||||||
coverages = session.query(ReceiverCoverage).all()
|
coverages = session.query(ReceiverCoverage).all()
|
||||||
self.assertEqual(len(coverages), 1)
|
self.assertEqual(len(coverages), 1)
|
||||||
|
|
Ładowanie…
Reference in New Issue