| 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']) |