summaryrefslogtreecommitdiff
path: root/chimere/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/widgets.py')
-rw-r--r--chimere/widgets.py242
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"])