Fixed the `GeometryField` form to catch more than just GEOS exceptions.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8565 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
b47c25ef91
commit
8a88379b2a
|
@ -1,16 +1,21 @@
|
|||
from django import forms
|
||||
from django.contrib.gis.geos import GEOSGeometry, GEOSException
|
||||
from django.contrib.gis.db.backend import SpatialBackend
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
class GeometryField(forms.Field):
|
||||
# By default a Textarea widget is used.
|
||||
"""
|
||||
This is the basic form field for a Geometry. Any textual input that is
|
||||
accepted by SpatialBackend.Geometry is accepted by this form. By default,
|
||||
this is GEOSGeometry, which accepts WKT, HEXEWKB, WKB, and GeoJSON.
|
||||
"""
|
||||
widget = forms.Textarea
|
||||
|
||||
default_error_messages = {
|
||||
'no_geom' : _(u'No geometry value provided.'),
|
||||
'invalid_geom' : _(u'Invalid Geometry value.'),
|
||||
'invalid_geom_type' : _(u'Invalid Geometry type.'),
|
||||
'invalid_geom' : _(u'Invalid geometry value.'),
|
||||
'invalid_geom_type' : _(u'Invalid geometry type.'),
|
||||
}
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.null = kwargs.pop('null')
|
||||
self.geom_type = kwargs.pop('geom_type')
|
||||
|
@ -28,10 +33,16 @@ class GeometryField(forms.Field):
|
|||
return None
|
||||
else:
|
||||
raise forms.ValidationError(self.error_messages['no_geom'])
|
||||
|
||||
try:
|
||||
geom = GEOSGeometry(value)
|
||||
if geom.geom_type.upper() != self.geom_type:
|
||||
raise forms.ValidationError(self.error_messages['invalid_geom_type'])
|
||||
return geom
|
||||
except GEOSException:
|
||||
# Trying to create a Geometry object from the form value.
|
||||
geom = SpatialBackend.Geometry(value)
|
||||
except:
|
||||
raise forms.ValidationError(self.error_messages['invalid_geom'])
|
||||
|
||||
# Ensuring that the geometry is of the correct type (indicated
|
||||
# using the OGC string label).
|
||||
if str(geom.geom_type).upper() != self.geom_type and not self.geom_type == 'GEOMETRY':
|
||||
raise forms.ValidationError(self.error_messages['invalid_geom_type'])
|
||||
|
||||
return geom
|
||||
|
|
Loading…
Reference in New Issue