diff options
| author | Justin Bronn <jbronn@gmail.com> | 2008-08-26 00:34:34 +0000 |
|---|---|---|
| committer | Justin Bronn <jbronn@gmail.com> | 2008-08-26 00:34:34 +0000 |
| commit | 8a88379b2a32ec704b7fe6bde4c87eff8d2b1335 (patch) | |
| tree | 739f143406569137ee28f471c33c6efde59c9a9d | |
| parent | b47c25ef91f606219c827888f15fbb067f409165 (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.py | 29 |
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 |
