summaryrefslogtreecommitdiffstats
path: root/webapp/django/contrib/gis/forms/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/contrib/gis/forms/fields.py')
-rw-r--r--webapp/django/contrib/gis/forms/fields.py37
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'])