from django import forms from django.core import validators class LatLonWidget(forms.MultiWidget): """ A Widget that splits Point input into two latitude/longitude boxes. """ def __init__(self, attrs=None, date_format=None, time_format=None): widgets = (forms.HiddenInput(attrs=attrs), forms.HiddenInput(attrs=attrs)) super(LatLonWidget, self).__init__(widgets, attrs) def decompress(self, value): if value: return tuple(reversed(value.coords)) return (None, None) class LatLonField(forms.MultiValueField): widget = LatLonWidget srid = 4326 default_error_messages = { "invalid_latitude": (u"Entrez une latitude valide."), "invalid_longitude": (u"Entrez une longitude valide."), } def __init__(self, *args, **kwargs): fields = ( forms.FloatField(min_value=-90, max_value=90), forms.FloatField(min_value=-180, max_value=180), ) super(LatLonField, self).__init__(fields, *args, **kwargs) def compress(self, data_list): if data_list: # Raise a validation error if latitude or longitude is empty # (possible if LatLongField has required=False). if data_list[0] in validators.EMPTY_VALUES: raise forms.ValidationError(self.error_messages["invalid_latitude"]) if data_list[1] in validators.EMPTY_VALUES: raise forms.ValidationError(self.error_messages["invalid_longitude"]) # SRID=4326;POINT(1.12345789 1.123456789) srid_str = "SRID=%d" % self.srid point_str = "POINT(%f %f)" % tuple(reversed(data_list)) return ";".join([srid_str, point_str]) return None