kopia lustrzana https://github.com/glidernet/ogn-python
Changed address origin handling
rodzic
132ae96499
commit
89b9daf26c
|
@ -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)
|
||||||
|
|
|
@ -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 ''
|
||||||
|
|
27
ogn/utils.py
27
ogn/utils.py
|
@ -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']
|
||||||
|
|
Ładowanie…
Reference in New Issue