Skip to content

Commit 8198f63

Browse files
committed
django 2.0 compatibility
1 parent 39d39dc commit 8198f63

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

djgeojson/serializers.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ def hasattr_lazy(obj, name):
5656
return name in dir(obj)
5757

5858

59+
def get_field_remote_field(field):
60+
""" For Django 1.8/2.0 compatibility """
61+
if django.VERSION < (1, 9):
62+
return field.rel
63+
else:
64+
return field.remote_field
65+
66+
5967
class DjangoGeoJSONEncoder(DjangoJSONEncoder):
6068

6169
def default(self, o):
@@ -321,17 +329,22 @@ def handle_fk_field(self, obj, field):
321329
if self.use_natural_keys and hasattr(related, 'natural_key'):
322330
related = related.natural_key()
323331
else:
324-
if field.rel.field_name == related._meta.pk.name:
332+
if get_field_remote_field(field).field_name == related._meta.pk.name:
325333
# Related to remote object via primary key
326334
related = related._get_pk_val()
327335
else:
328336
# Related to remote object via other field
329-
related = smart_text(getattr(related, field.rel.field_name), strings_only=True)
337+
related = smart_text(getattr(related, get_field_remote_field(field).field_name), strings_only=True)
330338
self._current['properties'][field.name] = related
331339

332340
def handle_m2m_field(self, obj, field):
333-
if field.rel.through._meta.auto_created:
334-
if self.use_natural_keys and hasattr(field.rel.to, 'natural_key'):
341+
if get_field_remote_field(field).through._meta.auto_created:
342+
remote_field = get_field_remote_field(field)
343+
if django.VERSION < (1, 9): # Django 1.8/2.0 compatibility
344+
remote_model = remote_field.to
345+
else:
346+
remote_model = remote_field.related_model
347+
if self.use_natural_keys and hasattr(remote_model, 'natural_key'):
335348
def m2m_value(value):
336349
return value.natural_key()
337350
else:
@@ -413,7 +426,7 @@ def serialize_queryset(self, queryset):
413426
continue
414427

415428
if field.serialize or field.primary_key:
416-
if field.rel is None:
429+
if get_field_remote_field(field) is None:
417430
if self.properties is None or field.attname in self.properties:
418431
self.handle_field(obj, field.name)
419432
else:
@@ -427,7 +440,7 @@ def serialize_queryset(self, queryset):
427440

428441
for field in reversed_fields:
429442
if field.serialize:
430-
field_name = field.rel.related_name or opts.object_name.lower()
443+
field_name = get_field_remote_field(field).related_name or opts.object_name.lower()
431444
if self.properties is None or field_name in self.properties:
432445
self.handle_reverse_field(obj, field, field_name)
433446
self.end_object(obj)

djgeojson/tests.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import json
44

5+
import django
56
from django.test import TestCase
67
from django.conf import settings
78
from django.core import serializers
@@ -26,10 +27,21 @@ def picture(self):
2627
return 'image.png'
2728

2829

30+
class Country(models.Model):
31+
label = models.CharField(max_length=20)
32+
geom = models.PolygonField(spatial_index=False, srid=4326)
33+
34+
if django.VERSION < (1, 9):
35+
objects = models.GeoManager()
36+
37+
def natural_key(self):
38+
return self.label
39+
40+
2941
class Route(PictureMixin, models.Model):
3042
name = models.CharField(max_length=20)
3143
geom = models.LineStringField(spatial_index=False, srid=4326)
32-
countries = models.ManyToManyField('Country')
44+
countries = models.ManyToManyField(Country)
3345

3446
def natural_key(self):
3547
return self.name
@@ -38,12 +50,13 @@ def natural_key(self):
3850
def upper_name(self):
3951
return self.name.upper()
4052

41-
objects = models.GeoManager()
53+
if django.VERSION < (1, 9):
54+
objects = models.GeoManager()
4255

4356

4457
class Sign(models.Model):
4558
label = models.CharField(max_length=20)
46-
route = models.ForeignKey(Route, related_name='signs')
59+
route = models.ForeignKey(Route, related_name='signs', on_delete=models.PROTECT)
4760

4861
def natural_key(self):
4962
return self.label
@@ -53,15 +66,6 @@ def geom(self):
5366
return self.route.geom.centroid
5467

5568

56-
class Country(models.Model):
57-
label = models.CharField(max_length=20)
58-
geom = models.PolygonField(spatial_index=False, srid=4326)
59-
objects = models.GeoManager()
60-
61-
def natural_key(self):
62-
return self.label
63-
64-
6569
class GeoJsonDeSerializerTest(TestCase):
6670

6771
def test_basic(self):

djgeojson/views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import math
22

3+
import django
4+
5+
try:
6+
from django.contrib.gis.db.models.functions import Intersection
7+
except ImportError:
8+
pass
39
from django.views.generic import ListView
410
from django.utils.decorators import method_decorator
511
from django.views.decorators.gzip import gzip_page
@@ -142,7 +148,10 @@ def get_queryset(self):
142148
self.trim_to_boundary = (self.trim_to_boundary and
143149
not isinstance(model_field, PointField))
144150
if self.trim_to_boundary:
145-
qs = qs.intersection(bbox)
151+
if django.VERSION < (1, 9):
152+
qs = qs.intersection(bbox)
153+
else:
154+
qs = qs.annotate(intersection=Intersection(self.geometry_field, bbox))
146155
self.geometry_field = 'intersection'
147156

148157
return qs

0 commit comments

Comments
 (0)