summaryrefslogtreecommitdiff
path: root/chimere/widgets.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-08-17 13:13:15 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-08-22 02:08:33 +0200
commit1091d481584af4662488ee83d7fa1421f8d1700c (patch)
tree0fb060c8cc3c7280a4f9d643db34216597a0b302 /chimere/widgets.py
parent232a1de132fa75431b45c008b72dafbcc6130b14 (diff)
downloadChimère-1091d481584af4662488ee83d7fa1421f8d1700c.tar.bz2
Chimère-1091d481584af4662488ee83d7fa1421f8d1700c.zip
Improve routing interface and functionalities
* fix POI clicking * create a nominatim widget to get coordinates from text * create a JQuery UI button select widget * create a routing form to get itinerary from a textual form * CSS for the routing form * Reverse nominatim: when a point is get for routing on the map label for this point is get from nominatim * Add transport management by user choice * Update french translation
Diffstat (limited to 'chimere/widgets.py')
-rw-r--r--chimere/widgets.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/chimere/widgets.py b/chimere/widgets.py
index 8e2b8ad..b520fcd 100644
--- a/chimere/widgets.py
+++ b/chimere/widgets.py
@@ -26,6 +26,9 @@ from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings
from django.contrib.gis.db import models
from django.contrib.gis.geos import fromstr
+from django.utils.html import conditional_escape
+from django.forms.widgets import RadioInput, RadioFieldRenderer
+from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
@@ -100,6 +103,41 @@ class ChosenSelectWidget(forms.Select):
u"</script>\n" % kwargs['attrs']['id']
return mark_safe(rendered)
+"""
+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
+ attrs = attrs or self.attrs
+ if 'id' in self.attrs:
+ label_for = ' for="%s_%s"' % (self.attrs['id'], self.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))
+class ButtonRadioFieldRenderer(RadioFieldRenderer):
+ def __iter__(self):
+ for i, choice in enumerate(self.choices):
+ yield ButtonRadioInput(self.name, self.value, self.attrs.copy(),
+ choice, i)
+ def render(self):
+ return mark_safe(u'\n'.join([force_unicode(w) for w in self]))
+class ButtonSelectWidget(forms.RadioSelect):
+ def __init__(self, *args, **kwargs):
+ self.renderer = ButtonRadioFieldRenderer
+ super(ButtonSelectWidget, self).__init__(*args, **kwargs)
+
+ 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']
+ return mark_safe(rendered)
+
class TextareaWidget(forms.Textarea):
"""
Manage the edition of a text using TinyMCE
@@ -121,6 +159,21 @@ class DatePickerWidget(forms.TextInput):
u"</script>\n" % kwargs['attrs']['id']
return mark_safe(rendered)
+class NominatimWidget(forms.TextInput):
+ class Media:
+ js = ["%schimere/js/nominatim-widget.js" % settings.STATIC_URL]
+ def render(self, name, value, attrs=None, area_name=''):
+ tpl = u"""
+<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' id='nominatim_%(id)s'/>
+<label class='nominatim-label' id='nominatim_%(id)s_label'>&nbsp;</label>
+<script type='text/javascript'>
+var nominatim_url = "%(nominatim_url)s";
+</script>
+""" % {'id':name, 'nominatim_url':settings.NOMINATIM_URL}
+ return mark_safe(tpl)
+
class PointChooserWidget(forms.TextInput):
"""
Manage the edition of point on a map