summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Bronn <jbronn@gmail.com>2008-08-26 00:34:34 +0000
committerJustin Bronn <jbronn@gmail.com>2008-08-26 00:34:34 +0000
commit8a88379b2a32ec704b7fe6bde4c87eff8d2b1335 (patch)
tree739f143406569137ee28f471c33c6efde59c9a9d
parentb47c25ef91f606219c827888f15fbb067f409165 (diff)
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
-rw-r--r--django/contrib/gis/forms/fields.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/django/contrib/gis/forms/fields.py b/django/contrib/gis/forms/fields.py
index a65e76d5d4..f60c722f76 100644
--- a/django/contrib/gis/forms/fields.py
+++ b/django/contrib/gis/forms/fields.py
@@ -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