diff -r 000000000000 -r 0d40e90630ef web/lib/django/contrib/gis/forms/fields.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/forms/fields.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,67 @@ +from django import forms +from django.utils.translation import ugettext_lazy as _ + +# While this couples the geographic forms to the GEOS library, +# it decouples from database (by not importing SpatialBackend). +from django.contrib.gis.geos import GEOSGeometry + +class GeometryField(forms.Field): + """ + This is the basic form field for a Geometry. Any textual input that is + accepted by GEOSGeometry is accepted by this form. By default, + this includes WKT, HEXEWKB, WKB (in a buffer), 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.'), + 'transform_error' : _(u'An error occurred when transforming the geometry ' + 'to the SRID of the geometry form field.'), + } + + def __init__(self, **kwargs): + # Pop out attributes from the database field, or use sensible + # defaults (e.g., allow None). + self.srid = kwargs.pop('srid', None) + self.geom_type = kwargs.pop('geom_type', 'GEOMETRY') + self.null = kwargs.pop('null', True) + super(GeometryField, self).__init__(**kwargs) + + def clean(self, value): + """ + Validates that the input value can be converted to a Geometry + object (which is returned). A ValidationError is raised if + the value cannot be instantiated as a Geometry. + """ + if not value: + if self.null and not self.required: + # The geometry column allows NULL and is not required. + return None + else: + raise forms.ValidationError(self.error_messages['no_geom']) + + # Trying to create a Geometry object from the form value. + try: + geom = GEOSGeometry(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']) + + # Transforming the geometry if the SRID was set. + if self.srid: + if not geom.srid: + # Should match that of the field if not given. + geom.srid = self.srid + elif self.srid != -1 and self.srid != geom.srid: + try: + geom.transform(self.srid) + except: + raise forms.ValidationError(self.error_messages['transform_error']) + + return geom