Skip to content

Commit 7d30696

Browse files
authored
Merge pull request #75 from jwhitlock/django-2.0
Support Django 2.0
2 parents f104c09 + 21d55d7 commit 7d30696

File tree

8 files changed

+49
-16
lines changed

8 files changed

+49
-16
lines changed

.dockerignore

+3
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,6 @@ docs/_build
5050
feeds/
5151
!feeds/import/README.md
5252
!feeds/export/README.md
53+
54+
# Pyenv
55+
.python-version

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,6 @@ docs/_build
5050
feeds/
5151
!feeds/import/README.md
5252
!feeds/export/README.md
53+
54+
# Pyenv
55+
.python-version

.travis.yml

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
language: python
2+
dist: trusty
23
sudo: false
4+
addons:
5+
postgresql: "9.5"
6+
apt:
7+
packages:
8+
- postgresql-9.5-postgis-2.3
39
install: pip install tox coveralls
410
script: tox -e $TOX_ENV
511
after_success: coveralls
@@ -26,6 +32,10 @@ matrix:
2632
python: "2.7"
2733
- env: TOX_ENV=py36-django111-postgis
2834
python: "3.6"
35+
- env: TOX_ENV=py35-django20-postgis
36+
python: "3.5"
37+
- env: TOX_ENV=py36-django20-postgis
38+
python: "3.6"
2939
- env: TOX_ENV=py35-django-master-postgis
3040
python: "3.5"
3141
- env: TOX_ENV=py36-django-master-postgis

README.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export your GTFS feeds in the original version, update multigtfs and your code,
3636
and re-import.
3737

3838
multigtfs works with Django 1.8 (the long-term support, or LTS, release)
39-
through 1.11. Support will follow the Django supported releases, as well as
40-
the Python versions supported by those releases.
39+
through 1.11 (the next LTS release), and 2.0. Support will follow the Django
40+
supported releases, as well as the Python versions supported by those releases.
4141

4242
All valid GTFS feeds are supported for import and export. This includes
4343
feeds with extra columns not yet included in the GTFS spec, and feeds that

multigtfs/compat.py

+15
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,18 @@ def write_text_rows(writer, rows):
101101
else:
102102
new_row.append(item)
103103
writer.writerow(new_row)
104+
105+
106+
# The GeoQuerySet is deprecated in Django 1.8
107+
# https://docs.djangoproject.com/en/dev/releases/1.9/#django-contrib-gis
108+
# The GeoManager is deprecated in Django 1.9
109+
# https://docs.djangoproject.com/en/dev/releases/1.9/#geomanager-and-geoqueryset-custom-methods
110+
# They are removed in Django 2.0
111+
# https://docs.djangoproject.com/en/dev/releases/2.0/#features-removed-in-2-0
112+
if DJ_VERSION >= LooseVersion('2.0'):
113+
from django.db.models import Manager, QuerySet
114+
else:
115+
from django.contrib.gis.db.models import GeoManager as Manager
116+
from django.contrib.gis.db.models.query import GeoQuerySet as QuerySet
117+
assert Manager
118+
assert QuerySet

multigtfs/models/base.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
import re
2222

2323
from django.contrib.gis.db import models
24-
from django.contrib.gis.db.models.query import GeoQuerySet
2524
from django.db.models.fields.related import ManyToManyField
2625
from django.utils.six import StringIO, text_type, PY3
2726

28-
from multigtfs.compat import get_blank_value, write_text_rows
27+
from multigtfs.compat import (
28+
get_blank_value, write_text_rows, Manager, QuerySet)
2929

3030
logger = getLogger(__name__)
3131
re_point = re.compile(r'(?P<name>point)\[(?P<index>\d)\]')
@@ -34,7 +34,7 @@
3434
CSV_BOM = BOM_UTF8.decode('utf-8') if PY3 else BOM_UTF8
3535

3636

37-
class BaseQuerySet(GeoQuerySet):
37+
class BaseQuerySet(QuerySet):
3838
def populated_column_map(self):
3939
'''Return the _column_map without unused optional fields'''
4040
column_map = []
@@ -63,7 +63,7 @@ def populated_column_map(self):
6363
return column_map
6464

6565

66-
class BaseManager(models.GeoManager):
66+
class BaseManager(Manager):
6767
def get_queryset(self):
6868
'''Return the custom queryset.'''
6969
return BaseQuerySet(self.model)
@@ -141,22 +141,23 @@ def get_value_or_default(value):
141141
def instance_convert(field, feed, rel_name):
142142
def get_instance(value):
143143
if value.strip():
144-
key1 = "{}:{}".format(field.rel.to.__name__, rel_name)
144+
related = field.related_model
145+
key1 = "{}:{}".format(related.__name__, rel_name)
145146
key2 = text_type(value)
146147

147148
# Load existing objects
148149
if key1 not in cache:
149-
pairs = field.rel.to.objects.filter(
150-
**{field.rel.to._rel_to_feed: feed}).values_list(
150+
pairs = related.objects.filter(
151+
**{related._rel_to_feed: feed}).values_list(
151152
rel_name, 'id')
152153
cache[key1] = dict((text_type(x), i) for x, i in pairs)
153154

154155
# Create new?
155156
if key2 not in cache[key1]:
156157
kwargs = {
157-
field.rel.to._rel_to_feed: feed,
158+
related._rel_to_feed: feed,
158159
rel_name: value}
159-
cache[key1][key2] = field.rel.to.objects.create(
160+
cache[key1][key2] = related.objects.create(
160161
**kwargs).id
161162
return cache[key1][key2]
162163
else:
@@ -199,7 +200,7 @@ def get_instance(value):
199200
converter = bool_convert
200201
elif isinstance(field, models.CharField):
201202
converter = char_convert
202-
elif field.rel:
203+
elif field.is_relation:
203204
converter = instance_convert(field, feed, rel_name)
204205
assert not isinstance(field, models.ManyToManyField)
205206
elif field.null:
@@ -350,7 +351,7 @@ def export_txt(cls, feed):
350351
if '__' in field_name:
351352
local_field_name, subfield_name = field_name.split('__', 1)
352353
field = cls._meta.get_field(local_field_name)
353-
field_type = field.rel.to
354+
field_type = field.related_model
354355
model_name = field_type.__name__
355356
if model_name in model_to_field_name:
356357
# Already loaded this model under a different field name

multigtfs/models/route.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class Route(Base):
7272
def update_geometry(self):
7373
"""Update the geometry from the Trips"""
7474
original = self.geometry
75-
trips = self.trip_set.exclude(geometry=None)
75+
trips = self.trip_set.exclude(geometry__isnull=True)
7676
unique_coords = set()
7777
unique_geom = list()
7878
for t in trips:

tox.ini

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ envlist =
33
py{27,34}-django18-{postgis,spatiallite}
44
py{27,34,35}-django{19,110}-{postgis,spatiallite}
55
py{27,34,35,36}-django111-{postgis,spatiallite}
6-
py{35,36}-django-master-{postgis,spatiallite}
6+
py{35,36}-django{20,-master}-{postgis,spatiallite}
77

88
[flake8]
99
exclude = .tox/*,.build/*,.dist/*,build/*
@@ -15,8 +15,9 @@ setenv =
1515
deps=
1616
django18: Django>=1.8,<1.9
1717
django19: Django>=1.9,<1.10
18-
django110: Django==1.10,<1.11
18+
django110: Django>=1.10,<1.11
1919
django111: Django>=1.11,<2.0
20+
django20: Django>=2.0,<2.1
2021
django-master: https://github.com/django/django/archive/master.tar.gz
2122
postgis: psycopg2
2223
nose

0 commit comments

Comments
 (0)