summaryrefslogtreecommitdiff
path: root/ishtar_common/widgets.py
diff options
context:
space:
mode:
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
commit3b557c928dc57942d4e9496b7730504bc44ad1eb (patch)
treecf7782840ce79aee720cf3b6c55571ab0b2e7c8e /ishtar_common/widgets.py
parent16fbb32b8ba00325a7b813825f288cb097699c98 (diff)
downloadIshtar-3b557c928dc57942d4e9496b7730504bc44ad1eb.tar.bz2
Ishtar-3b557c928dc57942d4e9496b7730504bc44ad1eb.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.py103
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: