Better celery messages

pull/78/head
Konstantin Gründger 2019-03-30 17:50:29 +01:00
rodzic ba588f54e9
commit 0c152cac5b
13 zmienionych plików z 116 dodań i 30 usunięć

Wyświetl plik

@ -76,7 +76,19 @@ For best performance you should use [TimescaleDB](https://www.timescale.com), wh
```
raster2pgsql -s 4326 -c -C -I -M -t 100x100 elevation_data.tif public.elevation | psql -d ogn
```
11. Import Airports (needed for takeoff and landing calculation). A cup file is provided under tests:
```
flask database import_airports tests/SeeYou.cup
```
12. Import DDB (needed for registration signs in the logbook).
```
flask database import_ddb
```
There is also a [Vagrant](https://www.vagrantup.com/) environment for the development of ogn-python.
You can create and start this virtual machine with `vagrant up` and login with `vagrant ssh`.
The code of ogn-python will be available in the shared folder `/vagrant`.

Wyświetl plik

@ -25,7 +25,8 @@ def update_takeoff_landings(last_minutes):
end = datetime.datetime.utcnow()
start = end - datetime.timedelta(minutes=last_minutes)
takeoff_update_entries(session=db.session, start=start, end=end, logger=logger)
result = takeoff_update_entries(session=db.session, start=start, end=end, logger=logger)
return result
@celery.task(name='update_logbook_entries')
@ -33,28 +34,32 @@ def update_logbook_entries():
"""Add/update logbook entries."""
today = datetime.datetime.today()
logbook_update_entries(session=db.session, date=today, logger=logger)
result = logbook_update_entries(session=db.session, date=today, logger=logger)
return result
@celery.task(name='update_logbook_max_altitude')
def update_logbook_max_altitude():
"""Add max altitudes in logbook when flight is complete (takeoff and landing)."""
logbook_update_max_altitudes(session=db.session, logger=logger)
result = logbook_update_max_altitudes(session=db.session, logger=logger)
return result
@celery.task(name='import_ddb')
def import_ddb():
"""Import registered devices from the DDB."""
device_infos_import_ddb(session=db.session, logger=logger)
result = device_infos_import_ddb(session=db.session, logger=logger)
return result
@celery.task(name='update_receivers_country_code')
def update_receivers_country_code():
"""Update country code in receivers table if None."""
receivers_update_country_code(session=db.session, logger=logger)
result = receivers_update_country_code(session=db.session, logger=logger)
return result
@celery.task(name='purge_old_data')

Wyświetl plik

@ -23,7 +23,7 @@ def upsert(session, model, rows, update_cols):
# print(compile_query(on_conflict_stmt))
session.execute(on_conflict_stmt)
def update_device_infos(session, address_origin, path=None):
if address_origin == DeviceInfoOrigin.flarmnet:
@ -53,9 +53,10 @@ def import_ddb(session, logger=None):
logger.info("Import registered devices fom the DDB...")
counter = update_device_infos(session, DeviceInfoOrigin.ogn_ddb)
logger.info("Imported {} devices.".format(counter))
return "Imported {} devices.".format(counter)
finish_message = "DeviceInfo: {} inserted.".format(counter)
logger.info(finish_message)
return finish_message
def update_country_code(session, logger=None):
@ -70,6 +71,7 @@ def update_country_code(session, logger=None):
synchronize_session='fetch')
session.commit()
logger.info("Updated {} AircraftBeacons".format(update_receivers))
return "Updated country for {} Receivers".format(update_receivers)
finish_message = "Receivers (country): {} updated".format(update_receivers)
logger.info(finish_message)
return finish_message

Wyświetl plik

@ -137,9 +137,10 @@ def update_entries(session, date, logger=None):
result = session.execute(ins)
insert_counter = result.rowcount
session.commit()
logger.debug("New logbook entries: {}".format(insert_counter))
return "Logbook entries: {} inserted, {} updated".format(insert_counter, update_counter)
finish_message = "Logbook: {} inserted, {} updated".format(insert_counter, update_counter)
logger.debug(finish_message)
return finish_message
def update_max_altitudes(session, logger=None):
@ -173,6 +174,7 @@ def update_max_altitudes(session, logger=None):
synchronize_session='fetch')
session.commit()
logger.info("Logbook: {} entries updated.".format(update_logbook))
return "Logbook: {} entries updated.".format(update_logbook)
finish_message = "Logbook (altitude): {} entries updated.".format(update_logbook)
logger.info(finish_message)
return finish_message

Wyświetl plik

@ -80,6 +80,7 @@ def create_receiver_coverage(session, date, logger=None):
result = session.execute(ins)
insert_counter = result.rowcount
session.commit()
logger.debug("New receiver coverage entries: {}".format(insert_counter))
return "Receiver coverage entries: {} inserted, {} updated".format(insert_counter, update_counter)
finish_message = "ReceiverCoverage: {} inserted, {} updated".format(insert_counter, update_counter)
logger.debug(finish_message)
return finish_message

Wyświetl plik

@ -134,6 +134,7 @@ def update_entries(session, start, end, logger=None):
result = session.execute(ins)
session.commit()
insert_counter = result.rowcount
logger.info("Inserted {} TakeoffLandings".format(insert_counter))
return "Inserted {} TakeoffLandings".format(insert_counter)
finish_message = "TakeoffLandings: Inserted {}".format(insert_counter)
logger.info(finish_message)
return finish_message

Wyświetl plik

@ -1,3 +1,5 @@
import datetime
from sqlalchemy.ext.hybrid import hybrid_property
from ogn_python import db
@ -36,3 +38,29 @@ class Device(db.Model):
.order_by(DeviceInfo.address_origin)
return query.first()
EXPIRY_DATES = {
6.67: datetime.date(2020, 10, 31),
6.63: datetime.date(2020, 5, 31),
6.62: datetime.date(2020, 5, 31),
6.6: datetime.date(2020, 1, 31),
6.42: datetime.date(2019, 10, 31),
6.41: datetime.date(2019, 1, 31),
6.4: datetime.date(2019, 1, 31),
6.09: datetime.date(2018, 9, 30),
6.08: datetime.date(2018, 9, 30),
6.07: datetime.date(2018, 3, 31),
6.06: datetime.date(2017, 9, 30),
6.05: datetime.date(2017, 3, 31),
}
def expiry_date(self):
if self.name.startswith('FLR'):
if self.software_version in self.EXPIRY_DATES:
return self.EXPIRY_DATES[self.software_version]
else:
return datetime.date(2000, 1, 1)
else:
return None

Wyświetl plik

@ -1,3 +1,5 @@
import datetime
from flask import request, render_template
from sqlalchemy import func, and_, or_
@ -87,7 +89,7 @@ def airports():
.order_by(Country.iso2)
if sel_country:
airports = db.session.query(Airport) \
airports = db.session.query(Airport, Receiver).outerjoin(Receiver) \
.filter(and_(or_(Logbook.takeoff_airport_id == Airport.id, Logbook.landing_airport_id == Airport.id), Airport.country_code == sel_country)) \
.group_by(Airport.id) \
.order_by(Airport.name)
@ -197,10 +199,16 @@ def logbook():
@app.route('/statistics.html')
def statistics():
receiverstats = db.session.query(ReceiverStats) \
.limit(10)
return render_template('statistics.html', receiverstats=receiverstats)
today = datetime.date.today()
today = datetime.date(2018, 7, 31)
receiverstats = db.session.query(ReceiverStats) \
.filter(ReceiverStats.date == today)
return render_template('statistics.html',
title='Receiver Statistics',
receiverstats=receiverstats)
# Backend routes for other sites

Wyświetl plik

@ -35,7 +35,7 @@
<td><a href="{{ url_for('device_detail', id=device.id) }}">{{ device.address }}</a></td>
<td>{% if device.info is none %}-{% else %}{{ device.info.registration }}{% endif %}</a></td>
<td>{% if device.takeoff_landings %}{% set last_action = device.takeoff_landings|last %}{% if last_action.is_takeoff == True %}↗{% else %}↘{% endif %} @ {{ last_action.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}{% endif %}
<td>{{ device.software_version }}</td>
<td>{% if device.software_version is not none %}{{ device.software_version }}{% else %}-{% endif %}</td>
</tr>
{% endfor %}
</table>

Wyświetl plik

@ -55,8 +55,8 @@
<td>{% if entry.duration is not none %}{{ entry.duration }}{% endif %}</td>
<td>{% if entry.max_altitude is not none %}{{ '%0.1f'|format(entry.max_altitude - entry.takeoff_airport.altitude) }} m{% endif %}</td>
<td>
{% if entry.takeoff_airport is not none and entry.takeoff_airport.id|string() != sel_airport %}Take Off: <a href="{{ url_for('logbook', airport=entry.takeoff_airport.id) }}">{{ entry.takeoff_airport.name }}</a>
{% elif entry.landing_airport is not none and entry.landing_airport.id|string() != sel_airport %}Landing: <a href="{{ url_for('logbook', airport=entry.landing_airport.id) }}">{{ entry.landing_airport.name }}</a>
{% if entry.takeoff_airport is not none and entry.takeoff_airport.id|string() != sel_airport %}Take Off: <img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ entry.takeoff_airport.country_code|lower }}" alt="{{ entry.takeoff_airport.country_code }}"/> <a href="{{ url_for('logbook', airport=entry.takeoff_airport.id) }}">{{ entry.takeoff_airport.name }}</a>
{% elif entry.landing_airport is not none and entry.landing_airport.id|string() != sel_airport %}Landing: <img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ entry.landing_airport.country_code|lower }}" alt="{{ entry.landing_airport.country_code }}"/> <a href="{{ url_for('logbook', airport=entry.landing_airport.id) }}">{{ entry.landing_airport.name }}</a>
{% endif %}
</td>
</tr>

Wyświetl plik

@ -13,7 +13,7 @@
<tr><td>Name:</td><td><img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ receiver.country.iso2|lower }}" alt="{{ receiver.country.iso2 }}"/> {{ receiver.name }}</td></tr>
<tr><td>Airport:</td>
<td>{% if airport is not none %}<img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ airport.country_code|lower }}" alt="{{ airport.country_code }}"/>
{% if airport.takeoff_landings %}<a href="{{ url_for('logbook', airport=airport.id) }}">{{ airport.name }}</a>{% else %}{{ airport.name }}{% endif %}
{% if airport.takeoff_landings %}<a href="{{ url_for('airport_detail', airport=airport.id) }}">{{ airport.name }}</a>{% else %}{{ airport.name }}{% endif %}
{% else %}-{% endif %}
</td>
</tr>

Wyświetl plik

@ -11,15 +11,13 @@
<table class="datatable table table-striped table-bordered">
<tr>
<th>Receiver</th>
<th>Country</th>
<th>Aircrafts</th>
<th>Beacons</th>
</tr>
{% for receiverstat in receiverstats %}
<tr>
<td>{{ receiverstat.receiver.name }}</td>
<td><img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ receiverstat.receiver.country.iso2|lower }}" alt="{{ receiverstat.receiver.country.iso2 }}"/></td>
<td><img src="{{ url_for('static', filename='img/Transparent.gif') }}" class="flag flag-{{ receiverstat.receiver.country.iso2|lower }}" alt="{{ receiverstat.receiver.country.iso2 }}"/> {{ receiverstat.receiver.name }}</td>
<td>{{ receiverstat.aircraft_count }}</td>
<td>{{ receiverstat.beacon_count }}</td>
</tr>

Wyświetl plik

@ -0,0 +1,29 @@
import datetime
import unittest
from tests.base import TestBaseDB, db
from ogn_python.model import Device, DeviceInfo
class TestStringMethods(TestBaseDB):
def test_device_info(self):
device = Device(name='FLRDD0815', address='DD0815')
device_info1 = DeviceInfo(address='DD0815', address_origin=1, registration='D-0815')
device_info2 = DeviceInfo(address='DD0815', address_origin=2, registration='15')
db.session.add(device)
db.session.add(device_info1)
db.session.add(device_info2)
db.session.commit()
self.assertEqual(device.info, device_info1)
def test_expiry_date(self):
device = Device(name='FLRDD0815', address='DD0815', software_version=6.42)
self.assertEqual(device.expiry_date(), datetime.date(2019, 10, 31))
if __name__ == '__main__':
unittest.main()