From 25ec2a9794786ac83fa8ce743078305682d8298d Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 30 Dec 2014 16:59:44 +0100 Subject: Work on new town field (with state and department) - work on new UI for files --- ishtar_common/widgets.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) (limited to 'ishtar_common/widgets.py') diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 91594edbd..ba7e61e46 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -34,7 +34,7 @@ from django.utils.safestring import mark_safe from django.utils.simplejson import JSONEncoder from django.utils.translation import ugettext_lazy as _ -import models +from ishtar_common import models reverse_lazy = lazy(reverse, unicode) @@ -283,6 +283,105 @@ class JQueryAutoComplete(forms.TextInput): } return html +class JQueryTown(forms.TextInput): + """ + Town fields whith state and department pre-selections + """ + + def __init__(self, source, options={}, + attrs={}, new=False, limit={}): + self.options = None + self.attrs = {} + self.source = source + if len(options) > 0: + self.options = JSONEncoder().encode(options) + self.attrs.update(attrs) + self.new = new + self.limit = limit + + @classmethod + def encode_source(cls, source): + encoded_src = '' + if isinstance(source, list): + encoded_src = JSONEncoder().encode(source) + elif isinstance(source, str) \ + or isinstance(source, unicode): + src = escape(source) + if not src.endswith('/'): + src += "/" + encoded_src = "'%s'" % src + else: + try: + src = unicode(source) + if not src.endswith('/'): + src += "/" + encoded_src = "'%s'" % src + except: + raise ValueError('source type is not valid') + return encoded_src + + def render(self, name, value=None, attrs=None): + attrs_hidden = self.build_attrs(attrs, name=name) + attrs_select = self.build_attrs(attrs) + attrs_select['placeholder'] = _(u"Search...") + selected = '' + selected_state = '' + selected_department = '' + if value: + hiddens = [] + selects = [] + if type(value) not in (list, tuple): + values = unicode(escape(smart_unicode(value))) + values = values.replace('[', '').replace(']', '') + values = values.split(',') + else: + values = [] + for v in value: + values += v.split(',') + for v in values: + if not v: + continue + hiddens.append(v) + selects.append(v) + try: + item = models.Town.objects.get(pk=v) + selects[-1] = unicode(item) + if item.departement: + selected_department = item.departement.number + if item.departement.state: + selected_state = item.departement.state.number + selected = item.pk + except (models.Town.DoesNotExist, ValueError): + selects.pop() + hiddens.pop() + if hiddens and selects: + attrs_hidden['value'] = hiddens[0] + attrs_select['value'] = selects[0] + if not self.attrs.has_key('id'): + attrs_hidden['id'] = 'id_%s' % name + attrs_select['id'] = 'id_select_%s' % name + if 'class' not in attrs_select: + attrs_select['class'] = 'autocomplete' + + source = self.encode_source(self.source) + dct = {'source':mark_safe(source), + 'selected':selected, + 'safe_field_id':slugify(name).replace('-', '_'), + 'field_id':name} + if self.options: + dct['options'] = mark_safe('%s' % self.options) + + dct.update({'attrs_select':mark_safe(flatatt(attrs_select)), + 'attrs_hidden':mark_safe(flatatt(attrs_hidden)), + 'name':name, + 'states':models.State.objects.all().order_by('label'), + 'selected_department':selected_department, + 'selected_state':selected_state + }) + html = loader.get_template('blocks/JQueryAdvancedTown.html').render( + Context(dct)) + return html + class JQueryPersonOrganization(forms.TextInput): """ Complex widget which manage: -- cgit v1.2.3