Commit 8a88379b authored by Justin Bronn's avatar Justin Bronn
Browse files

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
parent b47c25ef
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
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:
            # 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
        except GEOSException:
            raise forms.ValidationError(self.error_messages['invalid_geom'])