Changed address origin handling

pull/52/head
Konstantin Gründger 2016-05-22 07:26:02 +02:00
rodzic 132ae96499
commit 89b9daf26c
3 zmienionych plików z 49 dodań i 16 usunięć

Wyświetl plik

@ -1,3 +1,5 @@
from sqlalchemy.sql import null
from celery.utils.log import get_task_logger from celery.utils.log import get_task_logger
from ogn.model import Device, AddressOrigin from ogn.model import Device, AddressOrigin
@ -8,13 +10,42 @@ from ogn.collect.celery import app
logger = get_task_logger(__name__) logger = get_task_logger(__name__)
temp_address_origin = 7
def add_devices(session, origin):
before_sq = session.query(Device.address) \
.filter(Device.address_origin == origin) \
.subquery()
add_query = session.query(Device) \
.filter(Device.address_origin == temp_address_origin) \
.filter(~Device.address.in_(before_sq))
result = add_query.update({Device.address_origin: origin},
synchronize_session='fetch')
return result
def update_devices(session, origin, devices): def update_devices(session, origin, devices):
session.query(Device) \ session.query(Device) \
.filter(Device.address_origin == origin) \ .filter(Device.address_origin == temp_address_origin) \
.delete() .delete()
session.bulk_save_objects(devices) session.bulk_save_objects(devices)
# mark temporary added devices
session.query(Device) \
.filter(Device.address_origin == null()) \
.update({Device.address_origin: temp_address_origin})
logger.info('Added {} devices'.format(add_devices(session, origin)))
# delete temporary added devices
session.query(Device) \
.filter(Device.address_origin == temp_address_origin) \
.delete()
session.commit() session.commit()
return len(devices) return len(devices)

Wyświetl plik

@ -2,9 +2,10 @@ class AddressOrigin:
ogn_ddb = 1 ogn_ddb = 1
flarmnet = 2 flarmnet = 2
user_defined = 3 user_defined = 3
seen = 4
def __init__(self, origin): def __init__(self, origin):
if origin in [1, 2, 3]: if origin in [1, 2, 3, 4]:
self.origin = origin self.origin = origin
else: else:
raise ValueError('no address origin with id {} known'.format(origin)) raise ValueError('no address origin with id {} known'.format(origin))
@ -16,4 +17,6 @@ class AddressOrigin:
return 'FlarmNet' return 'FlarmNet'
elif self.origin == self.user_defined: elif self.origin == self.user_defined:
return 'user-defined' return 'user-defined'
elif self.origin == self.seen:
return 'seen'
return '' return ''

Wyświetl plik

@ -2,7 +2,7 @@ import requests
import csv import csv
from io import StringIO from io import StringIO
from .model import Device, AddressOrigin, Airport, Location from .model import Device, Airport, Location
from geopy.geocoders import Nominatim from geopy.geocoders import Nominatim
from geopy.exc import GeopyError from geopy.exc import GeopyError
@ -25,28 +25,24 @@ def get_ddb(csvfile=None):
if csvfile is None: if csvfile is None:
r = requests.get(DDB_URL) r = requests.get(DDB_URL)
rows = '\n'.join(i for i in r.text.splitlines() if i[0] != '#') rows = '\n'.join(i for i in r.text.splitlines() if i[0] != '#')
address_origin = AddressOrigin.ogn_ddb
else: else:
r = open(csvfile, 'r') r = open(csvfile, 'r')
rows = ''.join(i for i in r.readlines() if i[0] != '#') rows = ''.join(i for i in r.readlines() if i[0] != '#')
address_origin = AddressOrigin.user_defined
data = csv.reader(StringIO(rows), quotechar="'", quoting=csv.QUOTE_ALL) data = csv.reader(StringIO(rows), quotechar="'", quoting=csv.QUOTE_ALL)
devices = list() devices = list()
for row in data: for row in data:
flarm = Device() device = Device()
flarm.address_type = row[0] device.address_type = row[0]
flarm.address = row[1] device.address = row[1]
flarm.aircraft = row[2] device.aircraft = row[2]
flarm.registration = row[3] device.registration = row[3]
flarm.competition = row[4] device.competition = row[4]
flarm.tracked = row[5] == 'Y' device.tracked = row[5] == 'Y'
flarm.identified = row[6] == 'Y' device.identified = row[6] == 'Y'
flarm.address_origin = address_origin devices.append(device)
devices.append(flarm)
return devices return devices
@ -77,6 +73,9 @@ def get_airports(cupfile):
for line in f: for line in f:
try: try:
for waypoint in Reader([line]): for waypoint in Reader([line]):
if waypoint['style'] > 5: # reject unlandable places
continue
airport = Airport() airport = Airport()
airport.name = waypoint['name'] airport.name = waypoint['name']
airport.code = waypoint['code'] airport.code = waypoint['code']