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()
|