diff options
Diffstat (limited to 'chimere/widgets.py')
-rw-r--r-- | chimere/widgets.py | 242 |
1 files changed, 121 insertions, 121 deletions
diff --git a/chimere/widgets.py b/chimere/widgets.py index 465ec7f..8464d47 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2008-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> @@ -28,8 +28,7 @@ from django.conf import settings from django.contrib.gis.db import models from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse -from django.forms.widgets import RadioInput, RadioFieldRenderer, flatatt -from django.utils.encoding import force_unicode, smart_unicode +from django.forms.widgets import RadioSelect, RadioFieldRenderer, flatatt from django.utils.html import conditional_escape, escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -58,22 +57,22 @@ def getMapJS(area_name=''): '''Variable initialization for drawing the map ''' # projection, center and bounds definitions - js = u"var epsg_display_projection = 'EPSG:%d';\n" \ + js = "var epsg_display_projection = 'EPSG:%d';\n" \ % settings.CHIMERE_EPSG_DISPLAY_PROJECTION - js += u"var epsg_projection = 'EPSG:%d';\n" % \ + js += "var epsg_projection = 'EPSG:%d';\n" % \ settings.CHIMERE_EPSG_PROJECTION - js += u"var centerLonLat = ol.proj.transform("\ - u"[%f, %f], epsg_display_projection, epsg_projection);\n" % \ + js += "var centerLonLat = ol.proj.transform("\ + "[%f, %f], epsg_display_projection, epsg_projection);\n" % \ settings.CHIMERE_DEFAULT_CENTER - js += u"var media_path = '%s';\n" % settings.MEDIA_URL - js += u"var static_path = '%s';\n" % settings.STATIC_URL - js += u"var map_layer = %s;\n" % settings.CHIMERE_DEFAULT_MAP_LAYER - js += u"var restricted_extent;\n" + js += "var media_path = '%s';\n" % settings.MEDIA_URL + js += "var static_path = '%s';\n" % settings.STATIC_URL + js += "var map_layer = %s;\n" % settings.CHIMERE_DEFAULT_MAP_LAYER + js += "var restricted_extent;\n" if area_name: - js += u"var area_name='%s';\n" % area_name - js = u"<script type='text/javascript'><!--\n"\ - u"%s// !--></script>\n" % js + js += "var area_name='%s';\n" % area_name + js = "<script type='text/javascript'><!--\n"\ + "%s// !--></script>\n" % js return js @@ -105,10 +104,10 @@ def get_map_layers(area_name='', get_area_zoom=False): else: map_layers[0][2] = True elif settings.CHIMERE_DEFAULT_MAP_LAYER: - map_layers = [(_(u"Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, + map_layers = [(_("Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, True, '')] else: - map_layers = [(u"OSM", """new ol.layer.Tile({ + map_layers = [("OSM", """new ol.layer.Tile({ style: 'Road', source: new ol.source.OSM() })""", True, '')] @@ -136,9 +135,9 @@ class ChosenSelectWidget(forms.Select): kwargs['attrs'] = {} kwargs['attrs'].update({'class': 'chzn-select'}) rendered = super(ChosenSelectWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $('#%s').chosen();\n"\ - u"</script>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $('#%s').chosen();\n"\ + "</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) """ @@ -146,28 +145,35 @@ JQuery UI button select widget. """ -class ButtonRadioInput(RadioInput): - def render(self, name=None, value=None, attrs=None, choices=()): - name = name or self.name - value = value or self.value +class ButtonRadioInput(RadioSelect): + def tag(self, name, value): + selected = str(value) == str(self.choices[0][0]) + return '<input type="radio" name="{}" value="{}"{}>'.format( + name, self.choices[0][0], + ' selected="selected"' if selected else '') + + def render(self, name=None, value=None, attrs=None, choices=(), + index=0): attrs = attrs or self.attrs if 'id' in self.attrs: - label_for = ' for="%s_%s"' % (self.attrs['id'], self.index) + label_for = ' for="%s_%s"' % (self.attrs['id'], index) else: label_for = '' - choice_label = conditional_escape(force_unicode(self.choice_label)) - return mark_safe(u'%s <label%s>%s</label>' % (self.tag(), label_for, - choice_label)) + choice_label = conditional_escape(str(self.choices[0][1])) + return mark_safe('%s <label%s>%s</label>' % (self.tag(name, value), + label_for, + choice_label)) class ButtonRadioFieldRenderer(RadioFieldRenderer): def __iter__(self): for i, choice in enumerate(self.choices): - yield ButtonRadioInput(self.name, self.value, self.attrs.copy(), - choice, i) + yield ButtonRadioInput(self.attrs.copy(), [choice]) def render(self): - return mark_safe(u'\n'.join([force_unicode(w) for w in self])) + return mark_safe('\n'.join([ + w.render(self.name, self.value, index=idx) + for idx, w in enumerate(self)])) class ButtonSelectWidget(forms.RadioSelect): @@ -178,9 +184,9 @@ class ButtonSelectWidget(forms.RadioSelect): def render(self, *args, **kwargs): rendered = "<div id='%s'>\n" % kwargs['attrs']['id'] rendered += super(ButtonSelectWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $('#%s').buttonset();\n"\ - u"</script>\n</div>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $('#%s').buttonset();\n"\ + "</script>\n</div>\n" % kwargs['attrs']['id'] return mark_safe(rendered) @@ -240,7 +246,7 @@ class FullTextareaWidget(TextareaWidgetBase): kwargs['attrs']['class'] += ' ' kwargs['attrs']['class'] += 'mceEditor' rendered = super(FullTextareaWidget, self).render(*args, **kwargs) - rendered += u"""<script type='text/javascript'> + rendered += """<script type='text/javascript'> tinyMCE.init({ mode : "textareas", theme : "advanced", @@ -273,10 +279,10 @@ class DatePickerWidget(forms.TextInput): """ def render(self, *args, **kwargs): rendered = super(DatePickerWidget, self).render(*args, **kwargs) - rendered += u"\n<script type='text/javascript'>\n"\ - u" $(function() {$('#%s').datepicker("\ - u"{ dateFormat: 'yy-mm-dd' });});\n"\ - u"</script>\n" % kwargs['attrs']['id'] + rendered += "\n<script type='text/javascript'>\n"\ + " $(function() {$('#%s').datepicker("\ + "{ dateFormat: 'yy-mm-dd' });});\n"\ + "</script>\n" % kwargs['attrs']['id'] return mark_safe(rendered) @@ -307,14 +313,14 @@ class JQueryAutoComplete(forms.TextInput): selected_value, rendered_value = "", "" if value: - val = escape(smart_unicode(value)) + val = escape(str(value)) attrs_hidden['value'] = val attrs_select['value'] = val selected_value = val if val: from chimere.models import PropertyModelChoice try: - attrs_select['value'] = unicode( + attrs_select['value'] = str( PropertyModelChoice.objects.get( pk=value, propertymodel__slug=self.slug)) rendered_value = attrs_select['value'] @@ -346,9 +352,9 @@ class NominatimWidget(forms.TextInput): def render(self, name, value, attrs=None, area_name=''): dct = {'id': name, 'nominatim_url': settings.NOMINATIM_URL, - 'label': _(u"Street, City, Country")} + 'label': _("Street, City, Country")} - tpl = u""" + tpl = """ <input type='hidden' name='nominatim_%(id)s_lat' id='nominatim_%(id)s_lat'/> <input type='hidden' name='nominatim_%(id)s_lon' id='nominatim_%(id)s_lon'/> <input type='text' class='nominatim-widget' name='nominatim_%(id)s' @@ -384,7 +390,7 @@ class PointChooserWidget(forms.TextInput): val = str(value) if hasattr(value, 'x') and hasattr(value, 'y'): value_x, value_y = value.x, value.y - elif isinstance(value, unicode) and value.startswith('POINT('): + elif isinstance(value, str) and value.startswith('POINT('): try: value_x, value_y = value.split('(')[1][:-1].split(' ') value_x, value_y = float(value_x), float(value_y) @@ -487,8 +493,8 @@ class RouteChooserWidget(forms.TextInput): center=list(settings.CHIMERE_DEFAULT_CENTER), zoom=zoom, edition_type="route", - map_layers=u", ".join(map_layers), - extra_js=u"\n".join(extra_js), + map_layers=", ".join(map_layers), + extra_js="\n".join(extra_js), )) @@ -549,32 +555,32 @@ class AreaWidget(forms.TextInput): 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' "\ - u"value='%f'/>\n"\ - u"<input type='hidden' name='upper_left_lon' id='upper_left_lon' "\ - u"value='%f'/>\n"\ - u"<input type='hidden' name='lower_right_lat' id='lower_right_lat'"\ - u" value='%f'/>\n"\ - u"<input type='hidden' name='lower_right_lon' id='lower_right_lon'"\ - u" value='%f'/>\n" % ( + tpl += "</div>\n"\ + "<input type='hidden' name='upper_left_lat' id='upper_left_lat' "\ + "value='%f'/>\n"\ + "<input type='hidden' name='upper_left_lon' id='upper_left_lon' "\ + "value='%f'/>\n"\ + "<input type='hidden' name='lower_right_lat' id='lower_right_lat'"\ + " value='%f'/>\n"\ + "<input type='hidden' name='lower_right_lon' id='lower_right_lon'"\ + " 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 class='help-osm'>%s</p>\n" % help_msg - tpl += u"<script type='text/javascript'>\n" - tpl += u"function init_map_form (){\ninit('map_edit_area');\n" + help_msg = _("Hold CTRL, click and drag to select area on the map") + tpl += "<p class='help-osm'>%s</p>\n" % help_msg + tpl += "<script type='text/javascript'>\n" + tpl += "function init_map_form (){\ninit('map_edit_area');\n" if value: - tpl += u"extent = ol.proj.transformExtent([%f, %f, %f, %f], "\ - u"epsg_display_projection, epsg_projection);\n"\ - u"initArea(extent);\n" % ( + tpl += "extent = ol.proj.transformExtent([%f, %f, %f, %f], "\ + "epsg_display_projection, epsg_projection);\n"\ + "initArea(extent);\n" % ( upper_left_lon, upper_left_lat, lower_right_lon, lower_right_lat) - tpl += u"}\n" + tpl += "}\n" if initialized: - tpl += u"$(document).ready(function($) {init_map_form()});\n" - tpl += u"</script>\n" - tpl += u"<div id='map_edit_area'>\n" + tpl += "$(document).ready(function($) {init_map_form()});\n" + tpl += "</script>\n" + tpl += "<div id='map_edit_area'>\n" return mark_safe(tpl) def value_from_datadict(self, data, files, name): @@ -627,8 +633,8 @@ class PolygonChooserWidget(forms.TextInput): center=list(settings.CHIMERE_DEFAULT_CENTER), zoom=zoom, edition_type="polygon", - map_layers=u", ".join(map_layers), - extra_js=u"\n".join(extra_js), + map_layers=", ".join(map_layers), + extra_js="\n".join(extra_js), )) @@ -660,50 +666,50 @@ class ImportFiltrWidget(AreaWidget): """ 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")} + tpl += "</div><hr class='spacer'/>" + vals = {'lbl': _("Type:"), 'name': name, 'node': _("Node"), + 'way': _("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' "\ - u"id='id_%(name)s_node' value='node'%(node_selected)s/> "\ - u"<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 + tpl += "<div class='input-osm'><label>%(lbl)s</label>"\ + "<input type='radio' name='id_%(name)s_type' "\ + "id='id_%(name)s_node' value='node'%(node_selected)s/> "\ + "<label for='id_%(name)s_node'>"\ + "%(node)s</label> <input type='radio' name='id_%(name)s_type' "\ + "id='id_%(name)s_way' value='way'%(way_selected)s/> <label "\ + "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 + "Enter an OSM \"tag=value\" string such as " + "\"amenity=pub\". A list of common tag is available " + "<a href='https://wiki.openstreetmap.org/wiki/Map_Features' " + " target='_blank'>here</a>.") + tpl += "<p class='help-osm'>%s</p>\n" % help_msg + tpl += "<div class='input-osm'><label for='id_%s_tag'>%s</label>"\ + "<input type='text' id='id_%s_tag' value=\"%s\"/></div>" % ( + name, _("Tag:"), name, self.xapi_tag) + tpl += "<script type='text/javascript'>\n" + tpl += "var default_xapi='%s';" % settings.CHIMERE_XAPI_URL + tpl += 'var msg_missing_area = "%s";' % \ + _("You have to select an area.") + tpl += 'var msg_missing_type = "%s";' % \ + _("You have to select a type.") + tpl += 'var msg_missing_filtr = "%s";' % \ + _("You have to insert a filter tag.") + tpl += "</script>\n" + help_msg = _("If you change the above form don't forget to refresh " + "before submit!") + tpl += "<p class='help-osm errornote'>%s</p>\n" % help_msg + help_msg = _("You can put a Folder name of the KML file to filter on " + "it.") + tpl += "<p class='help-kml'>%s</p>\n" % help_msg if not value: value = '' - tpl += u"<div><textarea id='id_%s' name='id_%s' "\ - u">%s</textarea> <input type='button' id='id_refresh_%s' "\ - u"value='%s' class='input-osm'/>" % (name, name, value, name, - _(u"Refresh")) + tpl += "<div><textarea id='id_%s' name='id_%s' "\ + ">%s</textarea> <input type='button' id='id_refresh_%s' "\ + "value='%s' class='input-osm'/>" % (name, name, value, name, + _("Refresh")) return mark_safe(tpl) def value_from_datadict(self, data, files, name): @@ -762,17 +768,17 @@ class MultiSelectWidget(forms.SelectMultiple): def render(self, name, value, attrs=None): rendered = super(MultiSelectWidget, self).render(name, value, attrs) - rendered += u"<hr class='spacer'/><script type='text/javascript'>\n"\ - u"$.bsmSelect.conf['title'] = \"%(title)s\";\n"\ - u"$(\"#id_%(name)s\").bsmSelect({\n"\ - u" removeLabel: '<strong>X</strong>',\n"\ - u" containerClass: 'bsmContainer',\n"\ - u" listClass: 'bsmList-custom',\n"\ - u" listItemClass: 'bsmListItem-custom',\n"\ - u" listItemLabelClass: 'bsmListItemLabel-custom',\n"\ - u" removeClass: 'bsmListItemRemove-custom'\n"\ - u"});\n"\ - u"</script>\n" % {'name': name, 'title': _("Select...")} + rendered += "<hr class='spacer'/><script type='text/javascript'>\n"\ + "$.bsmSelect.conf['title'] = \"%(title)s\";\n"\ + "$(\"#id_%(name)s\").bsmSelect({\n"\ + " removeLabel: '<strong>X</strong>',\n"\ + " containerClass: 'bsmContainer',\n"\ + " listClass: 'bsmList-custom',\n"\ + " listItemClass: 'bsmListItem-custom',\n"\ + " listItemLabelClass: 'bsmListItemLabel-custom',\n"\ + " removeClass: 'bsmListItemRemove-custom'\n"\ + "});\n"\ + "</script>\n" % {'name': name, 'title': _("Select...")} return mark_safe(rendered) @@ -785,9 +791,3 @@ class SelectMultipleField(models.ManyToManyField): defaults = {'widget': MultiSelectWidget} keys.update(defaults) return super(SelectMultipleField, self).formfield(**keys) - -from south.modelsinspector import add_introspection_rules -add_introspection_rules([], ["^chimere\.widgets\.PointField"]) -add_introspection_rules([], ["^chimere\.widgets\.SelectMultipleField"]) -add_introspection_rules([], ["^chimere\.widgets\.RouteField"]) -add_introspection_rules([], ["^chimere\.widgets\.PolygonField"]) |