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