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:
Justin Bronn 2008-08-26 00:34:34 +00:00
parent b47c25ef91
commit 8a88379b2a
1 changed files with 20 additions and 9 deletions

View File

@ -1,16 +1,21 @@
from django import forms 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 _ from django.utils.translation import ugettext_lazy as _
class GeometryField(forms.Field): 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 widget = forms.Textarea
default_error_messages = { default_error_messages = {
'no_geom' : _(u'No geometry value provided.'), 'no_geom' : _(u'No geometry value provided.'),
'invalid_geom' : _(u'Invalid Geometry value.'), 'invalid_geom' : _(u'Invalid geometry value.'),
'invalid_geom_type' : _(u'Invalid Geometry type.'), 'invalid_geom_type' : _(u'Invalid geometry type.'),
} }
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.null = kwargs.pop('null') self.null = kwargs.pop('null')
self.geom_type = kwargs.pop('geom_type') self.geom_type = kwargs.pop('geom_type')
@ -28,10 +33,16 @@ class GeometryField(forms.Field):
return None return None
else: else:
raise forms.ValidationError(self.error_messages['no_geom']) raise forms.ValidationError(self.error_messages['no_geom'])
try: try:
geom = GEOSGeometry(value) # Trying to create a Geometry object from the form value.
if geom.geom_type.upper() != self.geom_type: geom = SpatialBackend.Geometry(value)
raise forms.ValidationError(self.error_messages['invalid_geom_type']) except:
return geom
except GEOSException:
raise forms.ValidationError(self.error_messages['invalid_geom']) 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