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"])  | 
