summaryrefslogtreecommitdiff
path: root/ishtar_common/widgets.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2014-12-30 16:59:44 +0100
committerÉtienne Loks <etienne.loks@proxience.com>2015-05-06 15:38:32 +0200
commitfea9c2d83c910d890ee1600545a61d88e9df6851 (patch)
tree52e8f0c1333377628b60f0feefad64861980519f /ishtar_common/widgets.py
parentfa7d0e715228ccec391f6cc87b69abd50f442ef9 (diff)
downloadIshtar-fea9c2d83c910d890ee1600545a61d88e9df6851.tar.bz2
Ishtar-fea9c2d83c910d890ee1600545a61d88e9df6851.zip
Work on new town field (with state and department) - work on new UI for files
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r--ishtar_common/widgets.py101
1 files changed, 100 insertions, 1 deletions
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: