diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-31 10:39:39 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-31 10:39:39 +0200 |
commit | e85a45cba767275a58b5c136091ce80d31045862 (patch) | |
tree | bb6acadd1f70294bdc1322a0e08aa51f650cfc5f /ishtar_common/widgets.py | |
parent | 2afd9314c74c26587c72caf92a4e12431789bded (diff) | |
download | Ishtar-e85a45cba767275a58b5c136091ce80d31045862.tar.bz2 Ishtar-e85a45cba767275a58b5c136091ce80d31045862.zip |
Target key forms: choose whom to associated with (refs #3725)
Diffstat (limited to 'ishtar_common/widgets.py')
-rw-r--r-- | ishtar_common/widgets.py | 55 |
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): |