diff options
author | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2009-01-19 23:26:50 +0000 |
---|---|---|
committer | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2009-01-19 23:26:50 +0000 |
commit | 6221a562642f80c7de0bc3e406b551528f45d06a (patch) | |
tree | 87b961f1fb9b55fdc11dd371b501746620667fef /main/widgets.py | |
parent | b332544e3748b43f36e666fb643cd6ff1c2c81fd (diff) | |
download | Chimère-6221a562642f80c7de0bc3e406b551528f45d06a.tar.bz2 Chimère-6221a562642f80c7de0bc3e406b551528f45d06a.zip |
Defining areas on the administration
git-svn-id: http://www.peacefrogs.net/svn/chimere/trunk@21 9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864
Diffstat (limited to 'main/widgets.py')
-rw-r--r-- | main/widgets.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/main/widgets.py b/main/widgets.py index 21dd464..53f365a 100644 --- a/main/widgets.py +++ b/main/widgets.py @@ -112,6 +112,11 @@ class PointField(models.PointField): keys.update(defaults) return super(PointField, self).formfield(**keys) + def clean(self, value): + if len(value) != 2 and self.required: + raise ValidationError(_("Invalid point")) + return value + class RouteChooserWidget(forms.TextInput): """ Manage the edition of route on a map @@ -191,3 +196,74 @@ class RouteField(models.LineStringField): defaults = {'widget': RouteChooserWidget} keys.update(defaults) return super(RouteField, self).formfield(**keys) + +class AreaWidget(forms.TextInput): + """ + Manage the edition of an area on the map + """ + class Media: + css = { + "all": URL_OSM_CSS + ["%sforms.css" % settings.MEDIA_URL,] + } + js = URL_OSM_JS + ["%sedit_area.js" % settings.MEDIA_URL, + "%sbase.js" % settings.MEDIA_URL,] + + def render(self, name, value, attrs=None): + """ + Render a map + """ + upper_left_lat, upper_left_lon = 0, 0 + lower_right_lat, lower_right_lon = 0, 0 + if value: + if len(value) == 2: + upper_left = value[0] + lower_right = value[1] + if hasattr(upper_left, 'x') and hasattr(upper_left, 'y'): + upper_left_lon, upper_left_lat = upper_left.x, upper_left.y + if hasattr(lower_right, 'x') and hasattr(lower_right, 'y'): + lower_right_lon, lower_right_lat = lower_right.x, \ + lower_right.y + tpl = getMapJS() + tpl += u"""<div id='map_edit'></div> +<input type='hidden' name='upper_left_lat' id='upper_left_lat' value='%f'/> +<input type='hidden' name='upper_left_lon' id='upper_left_lon' value='%f'/> +<input type='hidden' name='lower_right_lat' id='lower_right_lat' value='%f'/> +<input type='hidden' name='lower_right_lon' id='lower_right_lon' value='%f'/> +""" % (upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon) + tpl += """<script type='text/javascript'><!-- +init();""" + if value: + tpl += """var extent = new OpenLayers.Bounds(%f, %f, %f, %f); +map.zoomToExtent(extent, true);""" % (upper_left_lat, upper_left_lon, lower_right_lat, + lower_right_lon) + tpl += """// --></script> +<hr class='spacer'/> +""" + return mark_safe(tpl) + + def value_from_datadict(self, data, files, name): + """ + Return the appropriate values + """ + values = [] + for keys in (('upper_left_lat', 'upper_left_lon',), + ('lower_right_lat', 'lower_right_lon')): + value = [] + for key in keys: + val = data.get(key, None) + if not val: + return [] + value.append(val) + values.append(value) + return values + +class AreaField(forms.MultiValueField): + ''' + Set the widget for the form field + ''' + widget = AreaWidget + + def compress(self, data_list): + if not data_list: + return None + return data_list
\ No newline at end of file |