diff options
Diffstat (limited to 'chimere/widgets.py')
-rw-r--r-- | chimere/widgets.py | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/chimere/widgets.py b/chimere/widgets.py index 78d7508..2672ba0 100644 --- a/chimere/widgets.py +++ b/chimere/widgets.py @@ -20,15 +20,18 @@ """ Extra widgets and fields """ + +from json import JSONEncoder + from django import forms from django.conf import settings 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.forms.widgets import RadioInput, RadioFieldRenderer, flatatt +from django.utils.encoding import force_unicode, smart_unicode +from django.utils.html import conditional_escape, escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.template.loader import render_to_string @@ -262,6 +265,66 @@ class DatePickerWidget(forms.TextInput): return mark_safe(rendered) +class JQueryAutoComplete(forms.TextInput): + TEMPLATE = "chimere/blocks/JQueryAutoComplete.html" + + def __init__(self, slug, options={}, attrs={}): + """ + Source can be a list containing the autocomplete values or a + string containing the url used for the request. + """ + self.options = None + self.attrs = {} + self.slug = slug + if len(options) > 0: + self.options = JSONEncoder().encode(options) + self.attrs.update(attrs) + + def get_source(self): + # Strange... to be fixed + source = reverse('chimere:property-choices', + kwargs={'property_slug': self.slug}) + return "'{}'".format(source) + + def render(self, name, value=None, attrs=None): + attrs_hidden = self.build_attrs(attrs, name=name) + attrs_select = self.build_attrs(attrs) + selected_value, rendered_value = "", "" + + if value: + val = escape(smart_unicode(value)) + attrs_hidden['value'] = val + attrs_select['value'] = val + selected_value = val + if val: + from chimere.models import PropertyModelChoice + try: + attrs_select['value'] = unicode( + PropertyModelChoice.objects.get( + pk=value, propertymodel__slug=self.slug)) + rendered_value = attrs_select['value'] + except: + attrs_select['value'] = "" + if 'id' not in self.attrs: + attrs_hidden['id'] = 'id_%s' % name + attrs_select['id'] = 'id_select_%s' % name + if 'class' not in attrs_select: + attrs_select['class'] = 'autocomplete' + dct = { + 'attrs_select': flatatt(attrs_select), + 'attrs_hidden': flatatt(attrs_hidden), + 'field_id': name, + 'min_field_id': name.replace('_', ''), + 'options': self.options, + 'source': self.get_source(), + 'selected_value': selected_value, + 'rendered_value': rendered_value + } + + return mark_safe( + render_to_string(self.TEMPLATE, dct)) + + class NominatimWidget(forms.TextInput): class Media: js = ["%schimere/js/nominatim-widget.js" % settings.STATIC_URL] |