Skip to content

Commit

Permalink
python 3 support fix #6, fix #7
Browse files Browse the repository at this point in the history
  • Loading branch information
bashu committed Aug 6, 2015
1 parent c197f4e commit 4774059
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 40 deletions.
78 changes: 40 additions & 38 deletions airports/management/commands/airports.py
@@ -1,7 +1,5 @@
# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import os
import csv
import sys
Expand All @@ -21,7 +19,7 @@

from ...models import Airport

ENDPOINT_URL = "https://sourceforge.net/p/openflights/code/HEAD/tree/openflights/data/airports.dat?format=raw"
ENDPOINT_URL = "https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat"

APP_DIR = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', '..'))

Expand All @@ -47,33 +45,37 @@ def handle(self, *args, **options):
self.flush_airports()
else:
columns = self.default_format.split(',')
columns = dict(itertools.izip(columns, itertools.count()))
columns = dict(list(zip(columns, itertools.count())))

try:
with open(self.download(), 'rb') as f:
self.stdout.flush()
try:
importer = DataImporter(columns, self.stdout, self.stderr)
except Exception:
raise CommandError('Can not continue processing')
with open(self.download(), 'rt') as f:
self.stdout.flush()
try:
importer = DataImporter(columns, self.stdout, self.stderr)
except Exception:
raise CommandError('Can not continue processing')

importer.start(f)
except IOError as e:
raise CommandError('Can not open file: {0}'.format(e))
importer.start(f)

def download(self, filename='airports.dat'):
logger.info("Downloading: " + filename)
response = requests.post(ENDPOINT_URL, data={})

filepath = os.path.join(self.data_dir, filename)
if not os.path.exists(self.data_dir):
os.makedirs(self.data_dir)
if response.status_code != 200:
response.raise_for_status()

try:
filepath = os.path.join(self.data_dir, filename)
if not os.path.exists(self.data_dir):
os.makedirs(self.data_dir)

fobj = open(filepath, 'w')
fobj.write(response.text.encode('utf-8'))
fobj.close()
fobj = open(filepath, 'wb')
fobj.write(response.text.encode('utf-8'))
fobj.close()

return filepath
return filepath

except IOError as e:
raise CommandError('Can not open file: {0}'.format(e))

def flush_airports(self):
logger.info("Flushing airports data")
Expand All @@ -90,53 +92,53 @@ def __init__(self, columns, stdout=sys.stdout, stderr=sys.stderr):
self.countries = self.cities = {} # cache
self.saved_airports = set()

def start(self, f, encoding='utf8'):
def start(self, f): #, encoding='utf8'):
logger.info("Importing airports data")
columns = self.columns

dialect = csv.Sniffer().sniff(f.read(1024))
f.seek(0)
if encoding:
try:
f.readline().decode(encoding)
except UnicodeDecodeError as e:
raise Exception('Invalid encoding: {0}'.format(encoding))
# if encoding:
# try:
# f.readline().decode(encoding)
# except UnicodeDecodeError:
# raise Exception('Invalid encoding: {0}'.format(encoding))
# except AttributeError:
# pass
f.seek(0)
reader = csv.reader(f, dialect)

rows = 0
for row in reader:
try:
if (encoding):
row = map(lambda c: c.decode(encoding), row)
# if (encoding):
# row = [c.decode(encoding) for c in row]

airport_id = row[columns['airport_id']]
if airport_id in self.saved_airports:
continue # already saved

country = self.get_country(row[columns['country_name']], row)
if not bool(country):
logger.warning("Airport: {0}: Cannot find country: {1} -- skipping".format(
row[columns['name']], row[columns['country_name']]))
logger.warning("Airport: %s: Cannot find country: %s -- skipping",
row[columns['name']], row[columns['country_name']])
continue # unable to get related country

city = self.get_city(row[columns['city_name']], row, country)
if not bool(city):
logger.warning("Airport: {0}: Cannot find city: {1} -- skipping".format(
row[columns['name']], row[columns['city_name']]))
logger.warning("Airport: %s: Cannot find city: %s -- skipping",
row[columns['name']], row[columns['city_name']])
continue # unable to get related city

airport = self.get_airport(airport_id, row, city)
if not airport:
continue

logger.debug("Added airport: {0}".format(airport))
logger.debug("Added airport: %s", airport)

if airport_id not in self.saved_airports:
self.saved_airports.add(airport_id)

rows += 1
except IndexError as e:
except IndexError:
pass

def get_country(self, name, row):
Expand Down Expand Up @@ -196,7 +198,7 @@ def get_airport(self, airport_id, row, city):
if icao == r'\N': icao = ''
try:
altitude = round(int(row[cols['altitude']].strip()) * 0.3048, 2)
except:
except Exception:
altitude = 0.0

return Airport.objects.create(
Expand Down
10 changes: 8 additions & 2 deletions airports/models.py
@@ -1,10 +1,16 @@
# -*- coding: utf-8 -*-

from django.contrib.gis.db import models
try:
from django.utils.encoding import force_unicode as force_text
except (NameError, ImportError):
from django.utils.encoding import force_text
from django.utils.encoding import python_2_unicode_compatible
from django.core.validators import MinLengthValidator
from django.utils.translation import gettext_lazy as _


@python_2_unicode_compatible
class Airport(models.Model):

airport_id = models.PositiveIntegerField(primary_key=True, editable=False)
Expand All @@ -27,5 +33,5 @@ class Airport(models.Model):
class Meta: # pylint: disable=C1001
ordering = ['airport_id']

def __unicode__(self):
return self.name
def __str__(self):
return force_text(self.name)

0 comments on commit 4774059

Please sign in to comment.