summaryrefslogtreecommitdiff
path: root/Pb_Api/Param/MultiSelect.py
blob: b84d75b6d35e46beef441600715241c96352b6a9 (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
import random
from Pb_Api.Param import Pb_Api_Param 

class Pb_Api_Param_MultiSelect(Pb_Api_Param):
    def __init__(self, *args, **kwargs):
      self._options = kwargs['options'] if options in kwargs else []
      super(Pb_Api_Param_MultiSelect, self).__init__(*args, **kwargs) 
      if len(self._options): 
        self._validate_options()
        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 as e:
        raise ValueError

    @property
    def value(self):
      return super(Pb_Api_Param_MultiSelect, self).get_value()
    @value.setter
    def value(self, value):
      if not any([ value == i['value'] for i in self.options() ]) and value != None:
        raise ValueError 
      super(Pb_Api_Param_MultiSelect, self).set_value(value)

    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
         self.value = self.options()[heaviest_idx]["value"]
       else:
         self.randomize()
    def heaviest(self):
       self.value = self._choose_heaviest()