diff options
Diffstat (limited to 'chimere/widgets.py')
-rw-r--r-- | chimere/widgets.py | 106 |
1 files changed, 101 insertions, 5 deletions
diff --git a/chimere/widgets.py b/chimere/widgets.py index 2d0c189..4f09c62 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -27,6 +27,9 @@ from django.contrib.gis.db import models from django.contrib.gis.geos import fromstr from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.forms.widgets import RadioInput, RadioFieldRenderer +from django.utils.encoding import force_unicode +from django.utils.html import conditional_escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.template.loader import render_to_string @@ -71,18 +74,23 @@ def get_map_layers(area_name=''): pass map_layers, default = [], None if area and area.layers.count(): - map_layers = [layer.layer_code + map_layers = [[layer.name, layer.layer_code, False] for layer in area.layers.order_by('arealayers__order').all()] def_layer = area.layers.filter(arealayers__default=True) if def_layer.count(): def_layer = def_layer.all()[0] for order, map_layer in enumerate(map_layers): - if map_layer == def_layer.layer_code: + if map_layer[1] == def_layer.layer_code: default = order + map_layers[order][2] = True + else: + map_layers[0][2] = True elif settings.CHIMERE_DEFAULT_MAP_LAYER: - map_layers = [settings.CHIMERE_DEFAULT_MAP_LAYER] + map_layers = [(_(u"Default layer"), settings.CHIMERE_DEFAULT_MAP_LAYER, + True)] else: - map_layers = ["new OpenLayers.Layer.OSM.Mapnik('Mapnik')"] + map_layers = [(u"Mapnik", "new OpenLayers.Layer.OSM.Mapnik('Mapnik')", + True)] return map_layers, default class ChosenSelectWidget(forms.Select): @@ -104,6 +112,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 ImporterChoicesWidget(forms.Select): ''' Importer select widget. @@ -126,6 +169,33 @@ class TextareaWidgetBase(forms.Textarea): rendered = super(TextareaWidgetBase, self).render(*args, **kwargs) return mark_safe(rendered) +class FullTextareaWidget(TextareaWidgetBase): + """ + Manage the edition of a text using TinyMCE + """ + class Media: + js = ["%stiny_mce.js" % settings.TINYMCE_URL] + + def render(self, *args, **kwargs): + if 'attrs' not in kwargs: + kwargs['attrs'] = {} + if 'class' not in kwargs['attrs']: + kwargs['attrs']['class'] = '' + else: + kwargs['attrs']['class'] += ' ' + kwargs['attrs']['class'] += 'mceEditor' + rendered = super(FullTextareaWidget, self).render(*args, **kwargs) + rendered += u"""<script type='text/javascript'> +tinyMCE.init({ + mode : "textareas", + theme : "advanced", + relative_urls : false, + editor_selector : "mceEditor" +}); +</script> +""" + return mark_safe(rendered) + class TextareaWidget(TextareaWidgetBase): """ Manage the edition of a text using TinyMCE @@ -152,6 +222,27 @@ 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' value=""/> +<label class='nominatim-label' id='nominatim_%(id)s_label'> </label> +<script type='text/javascript'> +var default_nominatim_lbl = "%(label)s"; +var nominatim_url = "%(nominatim_url)s"; +$("#nominatim_%(id)s").val(default_nominatim_lbl); +$("#nominatim_%(id)s").click(function(){ + $("#nominatim_%(id)s").val(''); +}); +</script> +""" % {'id':name, 'nominatim_url':settings.NOMINATIM_URL, + 'label':_(u"Street, City, Country")} + return mark_safe(tpl) + class PointChooserWidget(forms.TextInput): """ Manage the edition of point on a map @@ -183,6 +274,7 @@ class PointChooserWidget(forms.TextInput): else: value = None map_layers, default_area = get_map_layers(area_name) + map_layers = [js for n, js, default in map_layers] #TODO: manage area return mark_safe( render_to_string('chimere/blocks/live_coordinates.html', @@ -238,7 +330,11 @@ class RouteChooserWidget(forms.TextInput): ''' tpl = getMapJS(area_name) map_layers, default_area = get_map_layers(area_name) + map_layers = [js for nm, js, default in map_layers] js = """ + var resolutions; + var zoomOffset; + var extra_url = "%s"; OpenLayers.ImgPath = '%schimere/img/'; var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s'); @@ -251,7 +347,7 @@ class RouteChooserWidget(forms.TextInput): chimere_init_options['edition'] = true; chimere_init_options['edition_type_is_route'] = true; chimere_init_options["checked_categories"] = []; - """ % ( reverse("chimere:index"), settings.STATIC_URL, + """ % (reverse("chimere:index"), settings.STATIC_URL, settings.CHIMERE_EPSG_DISPLAY_PROJECTION, settings.CHIMERE_EPSG_PROJECTION, settings.CHIMERE_DEFAULT_CENTER, settings.CHIMERE_DEFAULT_ZOOM, ", ".join(map_layers)) |