Skip to content

Commit

Permalink
Fixed #29978 -- Catched GDALException in GeometryField.to_python
Browse files Browse the repository at this point in the history
  • Loading branch information
claudep committed Nov 23, 2018
1 parent 3140844 commit d7e18a5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
6 changes: 5 additions & 1 deletion django/contrib/gis/forms/fields.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django import forms
from django.contrib.gis.gdal import GDALException
from django.contrib.gis.geos import GEOSException, GEOSGeometry
from django.utils.translation import gettext_lazy as _

Expand Down Expand Up @@ -36,7 +37,10 @@ def to_python(self, value):

if not isinstance(value, GEOSGeometry):
if hasattr(self.widget, 'deserialize'):
value = self.widget.deserialize(value)
try:
value = self.widget.deserialize(value)
except GDALException:
value = None
else:
try:
value = GEOSGeometry(value)
Expand Down
28 changes: 20 additions & 8 deletions tests/gis_tests/test_geoforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,19 +69,31 @@ def test_geom_type(self):

def test_to_python(self):
"""
Testing to_python returns a correct GEOSGeometry object or
a ValidationError
to_python() either returns a correct GEOSGeometry object or
a ValidationError.
"""
good_inputs = [
'POINT(5 23)',
'MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))',
'LINESTRING(0 0, 1 1)',
]
bad_inputs = [
'POINT(5)',
'MULTI POLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))',
'BLAH(0 0, 1 1)',
'{"type": "FeatureCollection", "features": ['
'{"geometry": {"type": "Point", "coordinates": [508375, 148905]}, "type": "Feature"}]}',
]
fld = forms.GeometryField()
# to_python returns the same GEOSGeometry for a WKT
for wkt in ('POINT(5 23)', 'MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))', 'LINESTRING(0 0, 1 1)'):
with self.subTest(wkt=wkt):
self.assertEqual(GEOSGeometry(wkt, srid=fld.widget.map_srid), fld.to_python(wkt))
for geo_input in good_inputs:
with self.subTest(geo_input=geo_input):
self.assertEqual(GEOSGeometry(geo_input, srid=fld.widget.map_srid), fld.to_python(geo_input))
# but raises a ValidationError for any other string
for wkt in ('POINT(5)', 'MULTI POLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))', 'BLAH(0 0, 1 1)'):
with self.subTest(wkt=wkt):
for geo_input in bad_inputs:
with self.subTest(geo_input=geo_input):
with self.assertRaises(forms.ValidationError):
fld.to_python(wkt)
fld.to_python(geo_input)

def test_to_python_different_map_srid(self):
f = forms.GeometryField(widget=OpenLayersWidget)
Expand Down

0 comments on commit d7e18a5

Please sign in to comment.