diff options
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):  | 
