summaryrefslogtreecommitdiffstats
path: root/webapp/django/contrib/gis/forms/fields.py
blob: a65e76d5d42fa173e4c6bba874cb1417d28f2b38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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'])