blob: a65e76d5d42fa173e4c6bba874cb1417d28f2b38 [file] [log] [blame]
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'])