diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-26 19:50:43 +0100 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-26 19:50:43 +0100 |
| commit | 43b0c50accfa1017ee323ba121ac53920d1cdbf5 (patch) | |
| tree | 9f554b2e55dfa8a36209363c82ddaa4915c3448f /chimere/widgets.py | |
| parent | f769930eca0a0bbccf991e52c6c6abbba6414390 (diff) | |
| parent | a95b7d7e58b6d8e0847b9a49e3afe0ac7a939a39 (diff) | |
| download | Chimère-43b0c50accfa1017ee323ba121ac53920d1cdbf5.tar.bz2 Chimère-43b0c50accfa1017ee323ba121ac53920d1cdbf5.zip | |
Merge branch 'master' into saclay
Conflicts:
chimere/admin.py
chimere/fixtures/initial_data.json
chimere/forms.py
chimere/locale/fr/LC_MESSAGES/django.po
chimere/static/chimere/css/styles.css
chimere/templates/chimere/blocks/alternate_multimedia.html
chimere/templates/chimere/blocks/categories.html
chimere/widgets.py
Diffstat (limited to 'chimere/widgets.py')
| -rw-r--r-- | chimere/widgets.py | 178 |
1 files changed, 146 insertions, 32 deletions
diff --git a/chimere/widgets.py b/chimere/widgets.py index 185d134..481a5c9 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -33,6 +33,8 @@ from django.utils.html import conditional_escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ +import re + def getMapJS(area_name=''): '''Variable initialization for drawing the map ''' @@ -144,6 +146,13 @@ class ButtonSelectWidget(forms.RadioSelect): u"</script>\n</div>\n" % kwargs['attrs']['id'] return mark_safe(rendered) +class ImporterChoicesWidget(forms.Select): + ''' + Importer select widget. + ''' + class Media: + js = ["%schimere/js/importer_interface.js" % settings.STATIC_URL,] + class TextareaWidgetBase(forms.Textarea): """ Manage the edition of a text using TinyMCE @@ -290,7 +299,7 @@ class PointChooserWidget(forms.TextInput): #TODO: manage area tpl = u"<script type='text/javascript'><!--\n"\ u"%s// !--></script>\n" % js - tpl += u"<div id='map_edit'></div>"\ + tpl += u"</div><div id='map_edit'></div>"\ u"<div id='live_lonlat'>"\ u" <p><label for='live_latitude'>%s</label>"\ u" <input type='texte' name='live_latitude' id='live_latitude' "\ @@ -298,7 +307,6 @@ class PointChooserWidget(forms.TextInput): u"<p><label for='live_longitude'>%s</label><input type='texte' "\ u"name='live_longitude' id='live_longitude' size='8' "\ u"disabled='true' value='%f'/></p>"\ - u"</div>"\ u"<input type='hidden' name='%s' id='id_%s' value='%s'/>" % ( _("Latitude"), value_y, _("Longitude"), value_x, name, name, val) @@ -310,8 +318,7 @@ class PointChooserWidget(forms.TextInput): u' mylonlat.transform(EPSG_DISPLAY_PROJECTION, \n'\ u' EPSG_PROJECTION), true);\n' % ( value_x, value_y) - tpl += "// --></script>\n"\ - u"<hr class='spacer'/>\n" + tpl += "// --></script>\n" return mark_safe(tpl) class PointField(models.PointField): @@ -477,34 +484,44 @@ class AreaWidget(forms.TextInput): "%schimere/js/edit_area.js" % settings.STATIC_URL, "%schimere/js/base.js" % settings.STATIC_URL,] - def render(self, name, value, attrs=None): + def get_bounding_box_from_value(self, value): + ''' + Return upper left lat/lon and lower lat/lon from the input value + ''' + upper_left_lat, upper_left_lon = 0, 0 + lower_right_lat, lower_right_lon = 0, 0 + if not value: + return upper_left_lat, upper_left_lon, lower_right_lat, \ + lower_right_lon + 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 + elif len(upper_left) == 2: + try: + upper_left_lon = float(upper_left[0]) + upper_left_lat = float(upper_left[1]) + except ValueError: + pass + if hasattr(lower_right, 'x') and hasattr(lower_right, 'y'): + lower_right_lon, lower_right_lat = lower_right.x, \ + lower_right.y + elif len(lower_right) == 2: + lower_right_lon, lower_right_lat = lower_right + try: + lower_right_lon = float(lower_right[0]) + lower_right_lat = float(lower_right[1]) + except ValueError: + pass + return upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon + + def render(self, name, value, attrs=None, initialized=True): """ 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 - elif len(upper_left) == 2: - try: - upper_left_lon = float(upper_left[0]) - upper_left_lat = float(upper_left[1]) - except ValueError: - pass - if hasattr(lower_right, 'x') and hasattr(lower_right, 'y'): - lower_right_lon, lower_right_lat = lower_right.x, \ - lower_right.y - elif len(lower_right) == 2: - lower_right_lon, lower_right_lat = lower_right - try: - lower_right_lon = float(lower_right[0]) - lower_right_lat = float(lower_right[1]) - except ValueError: - pass + upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon = \ + self.get_bounding_box_from_value(value) tpl = getMapJS() tpl += u"</div>\n"\ u"<input type='hidden' name='upper_left_lat' id='upper_left_lat' "\ @@ -517,9 +534,9 @@ class AreaWidget(forms.TextInput): u"value='%f'/>\n" % ( upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon) help_msg = _(u"Hold CTRL, click and drag to select area on the map") - tpl += u"<p>%s</p>\n" % help_msg + tpl += u"<p class='help-osm'>%s</p>\n" % help_msg tpl += u"<script type='text/javascript'>\n" - tpl += u"$(document).ready(function($) {\ninit();\n" + tpl += u"function init_map_form (){\ninit();\n" if value: tpl += u"var extent = new OpenLayers.Bounds(%f, %f, %f, %f);\n"\ u"extent.transform(epsg_display_projection, epsg_projection);\n"\ @@ -527,7 +544,10 @@ class AreaWidget(forms.TextInput): u"map.zoomToExtent(extent, true);\n"\ u"map.zoomOut();" % (upper_left_lon, upper_left_lat, lower_right_lon, lower_right_lat) - tpl += u"});\n</script>\n<hr class='spacer'/>\n" + tpl += u"}\n" + if initialized: + tpl += u"$(document).ready(function($) {init_map_form()});\n" + tpl += u"</script>\n" tpl += u"<div id='map_edit'>\n" return mark_safe(tpl) @@ -547,6 +567,100 @@ class AreaWidget(forms.TextInput): values.append(value) return values +RE_XAPI = re.compile('(node|way)\[(.*=.*)\]\[bbox='\ + '(-*[0-9]*.[0-9]*,-*[0-9]*.[0-9]*,-*[0-9]*.[0-9]*,-*[0-9]*.[0-9]*)\]') + +class ImportFiltrWidget(AreaWidget): + """ + Manage the edition of the import source field + """ + class Media: + css = { + "all": settings.OSM_CSS_URLS + \ + ["%schimere/css/forms.css" % settings.STATIC_URL,] + } + js = settings.OSM_JS_URLS + [ + "%schimere/js/edit_area.js" % settings.STATIC_URL, + "%schimere/js/base.js" % settings.STATIC_URL,] + + def render(self, name, value, attrs=None): + """ + Render a map + """ + tpl = super(ImportFiltrWidget, self).render(name, value, attrs, + initialized=False) + tpl += u"</div><hr class='spacer'/>" + vals = {'lbl':_(u"Type:"), 'name':name, 'node':_(u"Node"), + 'way':_(u"Way")} + vals['way_selected'] = ' checked="checked"'\ + if self.xapi_type == 'way' else '' + vals['node_selected'] = ' checked="checked"'\ + if self.xapi_type == 'node' else '' + tpl += u"<div class='input-osm'><label>%(lbl)s</label>"\ + u"<input type='radio' name='id_%(name)s_type' id='id_%(name)s_node'"\ + u" value='node'%(node_selected)s/> <label for='id_%(name)s_node'>"\ + u"%(node)s</label> <input type='radio' name='id_%(name)s_type' "\ + u"id='id_%(name)s_way' value='way'%(way_selected)s/> <label "\ + u"for='id_%(name)s_way'>%(way)s</label></div>" % vals + help_msg = _(u"Enter an OSM \"tag=value\" string such as "\ + u"\"amenity=pub\". A list of common tag is available "\ + u"<a href='https://wiki.openstreetmap.org/wiki/Map_Features' "\ + u" target='_blank'>here</a>.") + tpl += u"<p class='help-osm'>%s</p>\n" % help_msg + tpl += u"<div class='input-osm'><label for='id_%s_tag'>%s</label>"\ + u"<input type='text' id='id_%s_tag' value=\"%s\"/></div>" % ( + name, _(u"Tag:"), name, self.xapi_tag) + tpl += u"<script type='text/javascript'>\n" + tpl += u"var default_xapi='%s';" % settings.CHIMERE_XAPI_URL + tpl += u'var msg_missing_area = "%s";' % \ + _(u"You have to select an area.") + tpl += u'var msg_missing_type = "%s";' % \ + _(u"You have to select a type.") + tpl += u'var msg_missing_filtr = "%s";' % \ + _(u"You have to insert a filter tag.") + tpl += u"</script>\n" + help_msg = _(u"If you change the above form don't forget to refresh "\ + u"before submit!") + tpl += u"<p class='help-osm errornote'>%s</p>\n" % help_msg + help_msg = _(u"You can put a Folder name of the KML file to filter on "\ + u"it.") + tpl += u"<p class='help-kml'>%s</p>\n" % help_msg + if not value: + value = '' + tpl += u"<div><input type='text' id='id_%s' name='id_%s' "\ + u"value=\"%s\"/> <input type='button' id='id_refresh_%s' "\ + u"value='%s' class='input-osm'/>" % (name, name, value, name, + _(u"Refresh")) + return mark_safe(tpl) + + def value_from_datadict(self, data, files, name): + """ + Return the appropriate values + """ + return data.get('id_'+name, None) + + def get_bounding_box_from_value(self, value): + ''' + Return upper left lat/lon, lower lat/lon from the input value. + Get also xapi type and xapi tag + ''' + upper_left_lat, upper_left_lon = 0, 0 + lower_right_lat, lower_right_lon = 0, 0 + self.xapi_type, self.xapi_tag, self.bounding_box = None, '', None + if not value: + return upper_left_lat, upper_left_lon, lower_right_lat, \ + lower_right_lon + xapi_m = RE_XAPI.match(value) + if not xapi_m: + return upper_left_lat, upper_left_lon, lower_right_lat, \ + lower_right_lon + # as the regexp pass, we could be pretty confident + self.xapi_type, self.xapi_tag, self.bounding_box = xapi_m.groups() + upper_left_lon, lower_right_lat, lower_right_lon, upper_left_lat = \ + self.bounding_box.split(',') + return float(upper_left_lat), float(upper_left_lon), \ + float(lower_right_lat), float(lower_right_lon) + class AreaField(forms.MultiValueField): ''' Set the widget for the form field |
