summaryrefslogtreecommitdiff
path: root/ricky/param/multiselect.py
blob: ac5c9e7ed7dceb186297b4f4b38fb2ba3cefa0f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import random
from ricky.param import Param


class MultiSelect(Param):
    def __init__(self, **kwargs):
        self._options = kwargs.get('options') or []
        super(MultiSelect, self).__init__(**kwargs)
        if len(self._options):
            self._validate_options()
            """default value is the option with the heaviest weight"""
            self.default(self._choose_heaviest())

    def options(self):
        return self._options

    def _validate_options(self):
        try:
            int(self._options[0]['weight'])
            self._options[0]['value']
        except Exception:
            raise ValueError('Unable to validate %s\n:' % self.name)

    def value_get(self):
        return super(MultiSelect, self).value_get()

    def value_set(self, value):
        import sys
        sys.stderr.write("in value set right now for some reason...\n")
        sys.stderr.write("%s\n" % self.name)
        sys.stderr.write("%s\n" % value)
        if not any([value == i['value'] for i in self._options]) and \
            value is not None:
            raise ValueError
        super(MultiSelect, self).value_set(value)

    value = property(value_get, value_set)

    def randomize(self):
        weights_total = sum(map(lambda x: x["weight"], self.options()))
        choice = random.randint(0, weights_total)
        position = 0
        for elem in self.options():
            position += elem["weight"]
            if position >= choice:
                self.value = elem["value"]
                break

    def _choose_heaviest(self):
        heaviest_idx = 0
        heaviest_weight = 0
        idx = 0
        if (len(self.options())):
            for elem in self.options():
                if elem["weight"] > heaviest_weight:
                    heaviest_weight = elem["weight"]
                    heaviest_idx = idx
                idx += 1
            return self.options()[heaviest_idx]["value"]
        else:
            self.randomize()

    def heaviest(self):
        self.value = self._choose_heaviest()