summaryrefslogtreecommitdiff
path: root/ishtar_common/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r--ishtar_common/widgets.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py
index eb68bac2e..f5d32586c 100644
--- a/ishtar_common/widgets.py
+++ b/ishtar_common/widgets.py
@@ -45,6 +45,61 @@ logger = logging.getLogger(__name__)
reverse_lazy = lazy(reverse, unicode)
+class SelectReadonly(forms.Select):
+ template_name = 'blocks/readonly_input.html'
+ option_template_name = 'blocks/readonly_input_option.html'
+
+ def __init__(self, attrs=None, choices=(), model=None, available=None):
+ super(SelectReadonly, self).__init__(attrs, choices)
+ self.available = available
+ self.model = model
+
+ def get_choices(self, value):
+ q = self.model.objects
+ if self.available:
+ q = q.filter(available=True)
+ if value:
+ q = q.filter(pk=value)
+ for i in q.all():
+ if hasattr(self.model, 'verbose_name'):
+ label = i.verbose_name
+ else:
+ label = unicode(i)
+ yield (i.pk, label)
+
+ def render(self, name, value, attrs=None, choices=()):
+ if value:
+ self.choices = list(self.get_choices(value))
+ value = self.choices[0][0]
+ return super(SelectReadonly, self).render(name, value, attrs)
+
+
+class SelectReadonlyField(forms.ChoiceField):
+ def __init__(self, choices=(), required=True, widget=None, label=None,
+ initial=None, help_text='', *args, **kwargs):
+ self.available = False
+ self.model = None
+ if 'model' in kwargs:
+ self.model = kwargs.pop('model')
+ if 'available' in kwargs:
+ self.available = kwargs.pop('available')
+ widget = SelectReadonly(model=self.model, available=self.available)
+ super(SelectReadonlyField, self).__init__(
+ choices, required, widget, label, initial, help_text, *args,
+ **kwargs)
+
+ def get_q(self):
+ q = self.model.objects
+ if self.available:
+ q = q.filter(available=True)
+ return q
+
+ def valid_value(self, value):
+ if not self.model:
+ return super(SelectReadonlyField, self).valid_value(value)
+ return bool(self.get_q().filter(pk=value).count())
+
+
class Select2Multiple(forms.SelectMultiple):
def __init__(self, attrs=None, choices=(), remote=None, model=None,
available=None):