diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2014-12-28 01:15:07 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-05-06 15:38:32 +0200 |
commit | 086cb36acde4343f5e4dc8dc18a70cdbd8512c33 (patch) | |
tree | cf7782840ce79aee720cf3b6c55571ab0b2e7c8e /ishtar_common/widgets.py | |
parent | ee6a1eb3588da3c6c1c3f0e75691541cea2d37ab (diff) | |
download | Ishtar-086cb36acde4343f5e4dc8dc18a70cdbd8512c33.tar.bz2 Ishtar-086cb36acde4343f5e4dc8dc18a70cdbd8512c33.zip |
Work on dynamic (too much of ajax and JS...) person/organization widget
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r-- | ishtar_common/widgets.py | 103 |
1 files changed, 102 insertions, 1 deletions
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 0ba4061a8..91594edbd 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -26,6 +26,7 @@ from django.db.models import fields from django.forms import ClearableFileInput from django.forms.widgets import flatatt from django.template import Context, loader +from django.template.defaultfilters import slugify from django.utils.encoding import smart_unicode from django.utils.functional import lazy from django.utils.html import escape @@ -203,7 +204,7 @@ class JQueryAutoComplete(forms.TextInput): except: raise ValueError('source type is not valid') dct = {'source':mark_safe(source), - 'field_id':field_id} + 'field_id':field_id,} if self.options: dct['options'] = mark_safe('%s' % self.options) @@ -218,6 +219,7 @@ class JQueryAutoComplete(forms.TextInput): 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...") if value: hiddens = [] selects = [] @@ -281,6 +283,105 @@ class JQueryAutoComplete(forms.TextInput): } return html +class JQueryPersonOrganization(forms.TextInput): + """ + Complex widget which manage: + * link between person and organization + * display addresses of the person and of the organization + * create new person and new organization + """ + + def __init__(self, source, edit_source, model, options={}, + attrs={}, new=False, limit={}, + html_template = 'blocks/PersonOrganization.html', + js_template='blocks/JQueryPersonOrganization.js'): + self.options = None + self.attrs = {} + self.model = model + self.source = source + self.edit_source = edit_source + if len(options) > 0: + self.options = JSONEncoder().encode(options) + self.attrs.update(attrs) + self.new = new + self.limit = limit + self.js_template = js_template + self.html_template = html_template + + @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): + encoded_src = "'%s'" % escape(source) + else: + try: + encoded_src = "'" + unicode(source) + "'" + except: + raise ValueError('source type is not valid') + return encoded_src + + def render_js(self, field_id, selected=''): + source = self.encode_source(self.source) + edit_source = self.encode_source(self.edit_source) + dct = {'source':mark_safe(source), + 'edit_source':mark_safe(edit_source), + 'selected':selected, + 'safe_field_id':slugify(field_id).replace('-', '_'), + 'field_id':field_id} + if self.options: + dct['options'] = mark_safe('%s' % self.options) + js = loader.get_template(self.js_template).render(Context(dct)) + return js + + 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 = '' + 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) + if self.model: + try: + item = self.model.objects.get(pk=v) + selects[-1] = unicode(item) + selected = item.pk + except (self.model.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' + new = '' + dct = {'attrs_select':mark_safe(flatatt(attrs_select)), + 'attrs_hidden':mark_safe(flatatt(attrs_hidden)), + 'name':name, + 'js':self.render_js(name, selected), + 'new':mark_safe(new)} + html = loader.get_template(self.html_template).render(Context(dct)) + return html + class JQueryJqGrid(forms.RadioSelect): COL_TPL = "{name:'%(idx)s', index:'%(idx)s', sortable:true}" class Media: |