Skip to content

Commit 3903921

Browse files
committed
[feature] Allow geometry-less models #282
fixes #282
1 parent f743b1c commit 3903921

File tree

11 files changed

+67
-231
lines changed

11 files changed

+67
-231
lines changed

.pre-commit-config.yaml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
repos:
2+
# Remove unused imports/variables
3+
- repo: https://github.com/myint/autoflake
4+
rev: v2.2.0
5+
hooks:
6+
- id: autoflake
7+
args:
8+
- "--in-place"
9+
- "--remove-all-unused-imports"
10+
- "--remove-unused-variables"
11+
12+
- repo: https://github.com/pycqa/flake8
13+
rev: "6.1.0"
14+
hooks:
15+
- id: flake8
16+
exclude: |
17+
./tests/.*settings.*.py
18+
docs/.*
19+
args:
20+
- '--max-line-length=110'
21+
- '--ignore=W605,W503,W504'
22+
23+
- repo: https://github.com/pycqa/isort
24+
rev: "5.12.0"
25+
hooks:
26+
- id: isort
27+
args:
28+
- 'multi_line_output=3'
29+
- 'use_parentheses=True'
30+
- 'include_trailing_comma=True'
31+
- 'force_grid_wrap=0'
32+
- 'line_length=88'

README.rst

+3
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ to be serialized as the "geometry". For example:
250250
# as with a ModelSerializer.
251251
fields = ('id', 'address', 'city', 'state')
252252
253+
If your model is geometry-less, you can set ``geo_field`` to ``None``
254+
and a null geometry will be produced.
255+
253256
Using GeometrySerializerMethodField as "geo_field"
254257
##################################################
255258

rest_framework_gis/fields.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def to_internal_value(self, value):
6565
value = json.dumps(value)
6666
try:
6767
return GEOSGeometry(value)
68-
except (GEOSException):
68+
except GEOSException:
6969
raise ValidationError(
7070
_(
7171
'Invalid format: string or unicode input unrecognized as GeoJSON, WKT EWKT or HEXEWKB.'

rest_framework_gis/serializers.py

-223
This file was deleted.

tests/django_restframework_gis_tests/migrations/0001_initial.py

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88

99
class Migration(migrations.Migration):
10-
1110
initial = True
1211

1312
dependencies = []

tests/django_restframework_gis_tests/migrations/0002_nullable.py

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66

77
class Migration(migrations.Migration):
8-
98
dependencies = [
109
('django_restframework_gis_tests', '0001_initial'),
1110
]

tests/django_restframework_gis_tests/models.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ class BaseModel(models.Model):
2020
name = models.CharField(max_length=32)
2121
slug = models.SlugField(max_length=128, unique=True, blank=True)
2222
timestamp = models.DateTimeField(null=True, blank=True)
23-
geometry = models.GeometryField()
2423

2524
class Meta:
2625
abstract = True
@@ -45,14 +44,14 @@ def save(self, *args, **kwargs):
4544

4645

4746
class Location(BaseModel):
48-
pass
47+
geometry = models.GeometryField()
4948

5049

51-
class LocatedFile(BaseModel):
50+
class LocatedFile(Location):
5251
file = models.FileField(upload_to='located_files', blank=True, null=True)
5352

5453

55-
class BoxedLocation(BaseModel):
54+
class BoxedLocation(Location):
5655
bbox_geometry = models.PolygonField()
5756

5857

tests/django_restframework_gis_tests/serializers.py

+7
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ class Meta:
185185
fields = ['name', 'slug', 'id']
186186

187187

188+
class NoGeoFeatureMethodSerializer(gis_serializers.GeoFeatureModelSerializer):
189+
class Meta:
190+
model = Location
191+
geo_field = None
192+
fields = ['name', 'slug', 'id']
193+
194+
188195
class PointSerializer(gis_serializers.GeoFeatureModelSerializer):
189196
class Meta:
190197
model = PointModel

tests/django_restframework_gis_tests/tests.py

+10
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,16 @@ def test_geometry_serializer_method_field_none(self):
634634
self.assertEqual(response.data['properties']['name'], 'None value')
635635
self.assertEqual(response.data['geometry'], None)
636636

637+
def test_geometry_serializer_method_field_nogeo(self):
638+
location = Location.objects.create(name='No geometry value')
639+
location_loaded = Location.objects.get(pk=location.id)
640+
self.assertEqual(location_loaded.name, "No geometry value")
641+
url = reverse('api_geojson_location_details_nogeo', args=[location.id])
642+
response = self.client.generic('GET', url, content_type='application/json')
643+
self.assertEqual(response.status_code, 200)
644+
self.assertEqual(response.data['properties']['name'], 'No geometry value')
645+
self.assertEqual(response.data['geometry'], None)
646+
637647
def test_nullable_empty_geometry(self):
638648
empty = Nullable(name='empty', geometry='POINT EMPTY')
639649
empty.full_clean()

tests/django_restframework_gis_tests/views.py

+10
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
LocationGeoFeatureSlugSerializer,
2424
LocationGeoFeatureWritableIdSerializer,
2525
LocationGeoSerializer,
26+
NoGeoFeatureMethodSerializer,
2627
NoneGeoFeatureMethodSerializer,
2728
PaginatedLocationGeoSerializer,
2829
PolygonModelSerializer,
@@ -167,6 +168,15 @@ class GeojsonLocationDetailsNone(generics.RetrieveUpdateDestroyAPIView):
167168
geojson_location_details_none = GeojsonLocationDetailsNone.as_view()
168169

169170

171+
class GeojsonLocationDetailsNoGeo(generics.RetrieveUpdateDestroyAPIView):
172+
model = Location
173+
serializer_class = NoGeoFeatureMethodSerializer
174+
queryset = Location.objects.all()
175+
176+
177+
geojson_location_details_nogeo = GeojsonLocationDetailsNoGeo.as_view()
178+
179+
170180
class GeojsonLocationSlugDetails(generics.RetrieveUpdateDestroyAPIView):
171181
model = Location
172182
lookup_field = 'slug'

tests/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,6 @@
8181

8282
# local settings must be imported before test runner otherwise they'll be ignored
8383
try:
84-
from local_settings import *
84+
pass
8585
except ImportError:
8686
pass

0 commit comments

Comments
 (0)