Skip to content

Commit 29d3bf7

Browse files
Merge pull request #220 from jazzband/development
Development
2 parents 1e9e24f + 49547bc commit 29d3bf7

20 files changed

+148
-103
lines changed

.travis.yml

+21-13
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
sudo: false
22
language: python
3-
python:
4-
- '3.7'
53
matrix:
64
allow_failures:
75
- env: TOXENV=py37-djangodev-sqlite
86
- env: TOXENV=py37-djangodev-mysql
97
- env: TOXENV=py37-djangodev-postgresql
10-
env:
11-
matrix:
12-
- TOXENV=py27-django111-sqlite
13-
- TOXENV=py37-django111-sqlite
14-
- TOXENV=py37-django20-sqlite
15-
- TOXENV=py37-django30-sqlite
16-
- TOXENV=py37-djangodev-sqlite
17-
- TOXENV=py37-djangodev-mysql
18-
- TOXENV=py37-djangodev-postgresql
19-
- TOXENV=checkqa
20-
- TOXENV=docs
8+
include:
9+
- python: 3.7
10+
env: TOXENV=py37-django111-sqlite
11+
- python: 3.7
12+
env: TOXENV=py37-django20-sqlite
13+
- python: 3.7
14+
env: TOXENV=py37-django22-sqlite
15+
- python: 3.7
16+
env: TOXENV=py37-django30-sqlite
17+
- python: 3.8
18+
env: TOXENV=py38-django30-sqlite
19+
- python: 3.7
20+
env: TOXENV=py37-djangodev-sqlite
21+
- python: 3.7
22+
env: TOXENV=py37-djangodev-mysql
23+
- python: 3.7
24+
env: TOXENV=py37-djangodev-postgresql
25+
- python: 3.7
26+
env: TOXENV=checkqa
27+
- python: 3.7
28+
env: TOXENV=docs
2129
install:
2230
- pip install -U pip
2331
- pip install tox codecov

cities_light/abstract_models.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from django.db import models
1111
from django.db.models import lookups
12-
from django.utils.encoding import force_text
12+
from django.utils.encoding import force_str
1313
from django.conf import settings
1414
from django.utils.translation import ugettext_lazy as _
1515

@@ -43,7 +43,7 @@ def to_ascii(value):
4343
4444
For example, 'République Françaisen' would become 'Republique Francaisen'
4545
"""
46-
return force_text(unidecode(value))
46+
return force_str(unidecode(value))
4747

4848

4949
def to_search(value):
@@ -148,6 +148,7 @@ class AbstractSubRegion(Base):
148148
country = models.ForeignKey(CITIES_LIGHT_APP_NAME + '.Country',
149149
on_delete=models.CASCADE)
150150
region = models.ForeignKey(CITIES_LIGHT_APP_NAME + '.Region',
151+
null=True, blank=True,
151152
on_delete=models.CASCADE)
152153

153154
class Meta(Base.Meta):
@@ -198,7 +199,8 @@ class AbstractCity(Base):
198199
db_index=True, validators=[timezone_validator])
199200

200201
class Meta(Base.Meta):
201-
unique_together = (('region', 'name'), ('region', 'slug'))
202+
unique_together = (('region', 'subregion', 'name'),
203+
('region', 'subregion', 'slug'))
202204
verbose_name_plural = _('cities')
203205
abstract = True
204206

cities_light/admin.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
from django.contrib import admin
66
from django.contrib.admin.views.main import ChangeList
77

8-
from .forms import *
9-
from .settings import *
108
from .abstract_models import to_search
9+
from . import forms
1110
from .loading import get_cities_models
1211

1312
Country, Region, SubRegion, City = get_cities_models()
@@ -38,7 +37,7 @@ class CountryAdmin(admin.ModelAdmin):
3837
list_filter = (
3938
'continent',
4039
)
41-
form = CountryForm
40+
form = forms.CountryForm
4241

4342

4443
admin.site.register(Country, CountryAdmin)
@@ -62,7 +61,7 @@ class RegionAdmin(admin.ModelAdmin):
6261
'country',
6362
'geoname_id',
6463
)
65-
form = RegionForm
64+
form = forms.RegionForm
6665

6766

6867
admin.site.register(Region, RegionAdmin)
@@ -72,6 +71,7 @@ class SubRegionAdmin(admin.ModelAdmin):
7271
"""
7372
ModelAdmin for SubRegion.
7473
"""
74+
raw_id_fields = ["region"]
7575
list_filter = (
7676
'country__continent',
7777
'country',
@@ -88,24 +88,25 @@ class SubRegionAdmin(admin.ModelAdmin):
8888
'region',
8989
'geoname_id',
9090
)
91-
form = SubRegionForm
91+
form = forms.SubRegionForm
9292

9393

9494
admin.site.register(SubRegion, SubRegionAdmin)
9595

9696

9797
class CityChangeList(ChangeList):
98-
def get_query_set(self, request):
98+
def get_queryset(self, request):
9999
if 'q' in list(request.GET.keys()):
100100
request.GET = copy(request.GET)
101101
request.GET['q'] = to_search(request.GET['q'])
102-
return super(CityChangeList, self).get_query_set(request)
102+
return super(CityChangeList, self).get_queryset(request)
103103

104104

105105
class CityAdmin(admin.ModelAdmin):
106106
"""
107107
ModelAdmin for City.
108108
"""
109+
raw_id_fields = ["subregion", "region"]
109110
list_display = (
110111
'name',
111112
'subregion',
@@ -124,7 +125,7 @@ class CityAdmin(admin.ModelAdmin):
124125
'country',
125126
'timezone'
126127
)
127-
form = CityForm
128+
form = forms.CityForm
128129

129130
def get_changelist(self, request, **kwargs):
130131
return CityChangeList

cities_light/downloader.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@
66
import time
77
import os
88

9-
try:
10-
from urllib.request import urlopen
11-
from urllib.parse import urlparse
12-
except ImportError:
13-
from urllib import urlopen
14-
from urlparse import urlparse
9+
from urllib.request import urlopen
10+
from urllib.parse import urlparse
11+
1512

1613
from .exceptions import SourceFileDoesNotExist
1714

cities_light/geonames.py

+2-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import unicode_literals
22

3-
import six
43
import os.path
54
import zipfile
65
import logging
@@ -61,16 +60,10 @@ def extract(self, zip_path, file_name):
6160
zip_file.extract(file_name, DATA_DIR)
6261

6362
def parse(self):
64-
if not six.PY3:
65-
file = open(self.file_path, 'r')
66-
else:
67-
file = open(self.file_path, encoding='utf-8', mode='r')
63+
file = open(self.file_path, encoding='utf-8', mode='r')
6864
line = True
6965

7066
for line in file:
71-
if not six.PY3:
72-
# In python3 this is already an unicode
73-
line = line.decode('utf8')
7467

7568
line = line.strip()
7669
# If the line is blank/empty or a comment, skip it and continue
@@ -80,7 +73,4 @@ def parse(self):
8073
yield [e.strip() for e in line.split('\t')]
8174

8275
def num_lines(self):
83-
if not six.PY3:
84-
return sum(1 for line in open(self.file_path))
85-
else:
86-
return sum(1 for line in open(self.file_path, encoding='utf-8'))
76+
return sum(1 for line in open(self.file_path, encoding='utf-8'))

cities_light/loading.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
import django
21
from .settings import CITIES_LIGHT_APP_NAME
3-
4-
5-
if django.VERSION < (1, 7):
6-
from django.db.models import get_model
7-
else:
8-
from django.apps import apps
9-
get_model = apps.get_model
2+
from django.apps import apps
3+
get_model = apps.get_model
104

115

126
def get_cities_model(model_name, *args, **kwargs):

cities_light/management/commands/cities_light.py

+31-21
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import logging
88
from argparse import RawTextHelpFormatter
99
import sys
10+
1011
if sys.platform != 'win32':
1112
import resource
1213

@@ -71,34 +72,40 @@ def create_parser(self, *args, **kwargs):
7172
return parser
7273

7374
def add_arguments(self, parser):
74-
parser.add_argument('--force-import-all', action='store_true',
75+
parser.add_argument(
76+
'--force-import-all', action='store_true',
7577
default=False, help='Import even if files are up-to-date.'
7678
),
77-
parser.add_argument('--force-all', action='store_true', default=False,
79+
parser.add_argument(
80+
'--force-all', action='store_true', default=False,
7881
help='Download and import if files are up-to-date.'
7982
),
80-
parser.add_argument('--force-import', action='append', default=[],
83+
parser.add_argument(
84+
'--force-import', action='append', default=[],
8185
help='Import even if files matching files are up-to-date'
8286
),
83-
parser.add_argument('--force', action='append', default=[],
87+
parser.add_argument(
88+
'--force', action='append', default=[],
8489
help='Download and import even if matching files are up-to-date'
8590
),
8691
parser.add_argument('--noinsert', action='store_true',
87-
default=False,
88-
help='Update existing data only'
89-
),
90-
parser.add_argument('--hack-translations', action='store_true',
92+
default=False,
93+
help='Update existing data only'
94+
),
95+
parser.add_argument(
96+
'--hack-translations', action='store_true',
9197
default=False,
9298
help='Set this if you intend to import translations a lot'
9399
),
94-
parser.add_argument('--keep-slugs', action='store_true',
100+
parser.add_argument(
101+
'--keep-slugs', action='store_true',
95102
default=False,
96103
help='Do not update slugs'
97104
),
98105
parser.add_argument('--progress', action='store_true',
99-
default=False,
100-
help='Show progress bar'
101-
),
106+
default=False,
107+
help='Show progress bar'
108+
),
102109

103110
def progress_init(self):
104111
"""Initialize progress bar."""
@@ -281,10 +288,12 @@ def _get_subregion_id(self, country_code2, region_id, subregion_id):
281288
if region_id not in self._region_codes[country_id]:
282289
self._region_codes[country_id][region_id] = Region.objects.get(
283290
country_id=country_id, geoname_code=region_id).pk
291+
284292
if subregion_id not in self._subregion_codes[country_id]:
285293
self._subregion_codes[country_id][subregion_id] = \
286294
SubRegion.objects.get(
287-
country_id=country_id, geoname_code=subregion_id).pk
295+
region_id=self._region_codes[country_id][region_id],
296+
geoname_code=subregion_id).pk
288297
return self._subregion_codes[country_id][subregion_id]
289298

290299
def country_import(self, items):
@@ -293,9 +302,10 @@ def country_import(self, items):
293302
except InvalidItems:
294303
return
295304

305+
force_insert = False
306+
force_update = False
296307
try:
297-
force_insert = False
298-
force_update = False
308+
299309
country = Country.objects.get(geoname_id=items[ICountry.geonameid])
300310
force_update = True
301311
except Country.DoesNotExist:
@@ -336,9 +346,9 @@ def region_import(self, items):
336346
except InvalidItems:
337347
return
338348

349+
force_insert = False
350+
force_update = False
339351
try:
340-
force_insert = False
341-
force_update = False
342352
region = Region.objects.get(geoname_id=items[IRegion.geonameid])
343353
force_update = True
344354
except Region.DoesNotExist:
@@ -393,8 +403,8 @@ def subregion_import(self, items):
393403
except InvalidItems:
394404
return
395405

406+
force_insert = force_update = False
396407
try:
397-
force_insert = force_update = False
398408
subregion = SubRegion.objects.filter(
399409
geoname_id=items[ISubRegion.geonameid]).first()
400410
if subregion:
@@ -471,9 +481,9 @@ def city_import(self, items):
471481
except InvalidItems:
472482
return
473483

484+
force_insert = False
485+
force_update = False
474486
try:
475-
force_insert = False
476-
force_update = False
477487
city = City.objects.get(geoname_id=items[ICity.geonameid])
478488
force_update = True
479489
except City.DoesNotExist:
@@ -504,7 +514,7 @@ def city_import(self, items):
504514
items[ICity.admin1Code],
505515
items[ICity.admin2Code]
506516
)
507-
except SubRegion.DoesNotExist:
517+
except (SubRegion.DoesNotExist, Region.DoesNotExist):
508518
subregion_id = None
509519

510520
save = False
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 3.0.5 on 2020-05-08 18:51
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('cities_light', '0009_add_subregion'),
11+
]
12+
13+
operations = [
14+
migrations.AlterUniqueTogether(
15+
name='city',
16+
unique_together={('region', 'subregion', 'slug'), ('region', 'subregion', 'name')},
17+
),
18+
migrations.AlterField(
19+
model_name='subregion',
20+
name='region',
21+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
22+
to='cities_light.Region'),
23+
),
24+
]

0 commit comments

Comments
 (0)