summaryrefslogtreecommitdiff
path: root/ishtar_common/widgets.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-13 17:32:00 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-13 17:32:00 +0200
commit641045c67cfc159633be81f676d0574a6481c871 (patch)
treef02896a885a6011f4518270d9494ac4aeb0c699a /ishtar_common/widgets.py
parentbcda82df67ff32d946ba13769af90af4d53a4355 (diff)
downloadIshtar-641045c67cfc159633be81f676d0574a6481c871.tar.bz2
Ishtar-641045c67cfc159633be81f676d0574a6481c871.zip
Simple selection widget and field for Select2
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r--ishtar_common/widgets.py38
1 files changed, 30 insertions, 8 deletions
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py
index d1f6e49d3..8788920af 100644
--- a/ishtar_common/widgets.py
+++ b/ishtar_common/widgets.py
@@ -181,14 +181,14 @@ class Select2DynamicField(forms.ChoiceField):
return super(Select2DynamicField, self).to_python(value).strip()
-class Select2Multiple(Select2Media, forms.SelectMultiple):
+class Select2Base(Select2Media):
def __init__(self, attrs=None, choices=(), remote=None, model=None,
new=None, available=None):
- super(Select2Multiple, self).__init__(attrs, choices)
self.remote = remote
self.available = available
self.model = model
self.new = new
+ super(Select2Base, self).__init__(attrs, choices)
def get_q(self):
q = self.model.objects
@@ -273,7 +273,7 @@ class Select2Multiple(Select2Media, forms.SelectMultiple):
u'<a href="#" class="add-button input-group-text" ' \
u'onclick="open_window(\'%s\');">+</a></span></div>' % url_new
- html += super(Select2Multiple, self).render(name, value, attrs)
+ html += super(Select2Base, self).render(name, value, attrs)
html += new
html += """<script type="text/javascript">
$(document).ready(function() {{
@@ -283,6 +283,14 @@ class Select2Multiple(Select2Media, forms.SelectMultiple):
return mark_safe(html)
+class Select2Simple(Select2Base, forms.Select):
+ pass
+
+
+class Select2Multiple(Select2Base, forms.SelectMultiple):
+ pass
+
+
class CheckboxSelectMultiple(CheckboxSelectMultipleBase):
"""
Fix initialization bug.
@@ -297,7 +305,9 @@ class CheckboxSelectMultiple(CheckboxSelectMultipleBase):
return super(CheckboxSelectMultiple, self).render(name, value, attrs)
-class Select2MultipleField(forms.MultipleChoiceField):
+class Select2BaseField(object):
+ multiple = False
+
def __init__(self, *args, **kwargs):
new = None
if 'new' in kwargs:
@@ -321,11 +331,15 @@ class Select2MultipleField(forms.MultipleChoiceField):
if long_widget:
attrs['cols'] = True
attrs['full-width'] = True
- kwargs['widget'] = Select2Multiple(
+ if self.multiple:
+ widget = Select2Multiple
+ else:
+ widget = Select2Simple
+ kwargs['widget'] = widget(
model=self.model, available=self.available, remote=self.remote,
new=new, attrs=attrs
)
- super(Select2MultipleField, self).__init__(*args, **kwargs)
+ super(Select2BaseField, self).__init__(*args, **kwargs)
def get_q(self):
q = self.model.objects
@@ -335,10 +349,18 @@ class Select2MultipleField(forms.MultipleChoiceField):
def valid_value(self, value):
if not self.model:
- return super(Select2MultipleField, self).valid_value(value)
+ return super(Select2BaseField, self).valid_value(value)
return bool(self.get_q().filter(pk=value).count())
+class Select2MultipleField(Select2BaseField, forms.MultipleChoiceField):
+ multiple = True
+
+
+class Select2SimpleField(Select2BaseField, forms.ChoiceField):
+ pass
+
+
class DeleteWidget(forms.CheckboxInput):
def render(self, name, value, attrs=None, renderer=None):
final_attrs = flatatt(
@@ -867,7 +889,7 @@ class JQueryPersonOrganization(forms.TextInput):
return html
-class DataTable(forms.RadioSelect):
+class DataTable(Select2Media, forms.RadioSelect):
def __init__(self, source, form, associated_model, attrs={},
table_cols='TABLE_COLS', multiple=False, multiple_cols=[2],
new=False, new_message="", source_full=None,