diff options
Diffstat (limited to 'webapp/django/contrib/gis/forms/fields.py')
-rw-r--r-- | webapp/django/contrib/gis/forms/fields.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/webapp/django/contrib/gis/forms/fields.py b/webapp/django/contrib/gis/forms/fields.py new file mode 100644 index 0000000000..a65e76d5d4 --- /dev/null +++ b/webapp/django/contrib/gis/forms/fields.py @@ -0,0 +1,37 @@ +from django import forms +from django.contrib.gis.geos import GEOSGeometry, GEOSException +from django.utils.translation import ugettext_lazy as _ + +class GeometryField(forms.Field): + # By default a Textarea widget is used. + 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.'), + } + def __init__(self, **kwargs): + self.null = kwargs.pop('null') + self.geom_type = kwargs.pop('geom_type') + 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: + # The geometry column allows NULL, return None. + 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: + raise forms.ValidationError(self.error_messages['invalid_geom']) |