from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random author = 'Filip Gonschorek, Mingxian Jin' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'cutcake_practice_cutmiddle' players_per_group = 2 num_rounds = 1 class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: self.group_randomly() class Group(BaseGroup): resolving_cut = models.IntegerField(initial=0) def delete_overlapping(self): choice_list = [p.choice for p in self.get_players()] e = 0 for value in choice_list: e += value if e != 1: players = [p.id_in_group for p in self.get_players() ] random_right = random.sample(players, 1) for i in self.get_players(): if [i.id_in_group] == random_right: i.choice = 1 else: i.choice = 0 class Player(BasePlayer): cut_value = models.IntegerField(initial=0) left_piece = models.IntegerField(initial=0) right_piece = models.IntegerField(initial=0) value_own_piece = models.IntegerField(initial=0) value_other_piece = models.IntegerField(initial=0) choice = models.IntegerField() payoff_help = models.CurrencyField(initial=0) planned_leftpiece = models.IntegerField() truth_telling = models.BooleanField() envy = models.BooleanField() def set_cut_value(self): self.group.resolving_cut = int(sum(p.cut_value for p in self.group.get_players())/Constants.players_per_group) def decide_side(self): if self.cut_value > self.group.resolving_cut: self.choice = 1 else: self.choice = 0 def set_pieces(self): if self.id_in_group == 1: if self.group.resolving_cut <= 230: self.left_piece = 0 elif self.group.resolving_cut <= 260: self.left_piece = self.group.resolving_cut - 230 elif self.group.resolving_cut <= 270: self.left_piece = 30 elif self.group.resolving_cut <= 300: self.left_piece = self.group.resolving_cut - 240 elif self.group.resolving_cut <= 310: self.left_piece = 60 elif self.group.resolving_cut <= 320: self.left_piece = self.group.resolving_cut - 250 elif self.group.resolving_cut <= 470: self.left_piece = 70 elif self.group.resolving_cut <= 490: self.left_piece = self.group.resolving_cut - 400 elif self.group.resolving_cut <= 510: self.left_piece = 90 elif self.group.resolving_cut <= 540: self.left_piece = self.group.resolving_cut - 420 else: self.left_piece = 120 if self.id_in_group == 2: if self.group.resolving_cut <= 140: self.left_piece = 0 elif self.group.resolving_cut <= 170: self.left_piece = self.group.resolving_cut - 140 elif self.group.resolving_cut <= 190: self.left_piece = 30 elif self.group.resolving_cut <= 220: self.left_piece = self.group.resolving_cut - 160 elif self.group.resolving_cut <= 230: self.left_piece = 60 elif self.group.resolving_cut <= 240: self.left_piece = self.group.resolving_cut - 170 elif self.group.resolving_cut <= 310: self.left_piece = 70 elif self.group.resolving_cut <= 330: self.left_piece = self.group.resolving_cut - 240 elif self.group.resolving_cut <= 360: self.left_piece = 90 elif self.group.resolving_cut <= 390: self.left_piece = self.group.resolving_cut - 270 else: self.left_piece = 120 self.right_piece = 120 - self.left_piece def set_own_piece(self): if self.choice == 0: self.value_own_piece = self.left_piece self.value_other_piece = self.right_piece else: self.value_own_piece = self.right_piece self.value_other_piece = self.left_piece self.payoff = c(self.value_own_piece) def set_envy(self): if self.value_own_piece >= self.value_other_piece: self.envy = False else: self.envy = True def set_planned_leftpiece(self): if self.id_in_group == 1: if self.cut_value <= 230: self.planned_leftpiece = 0 elif self.cut_value <= 260: self.planned_leftpiece = self.cut_value - 230 elif self.cut_value <= 270: self.planned_leftpiece = 30 elif self.cut_value <= 300: self.planned_leftpiece = self.cut_value - 240 elif self.cut_value <= 310: self.planned_leftpiece = 60 elif self.cut_value <= 320: self.planned_leftpiece = self.cut_value - 250 elif self.cut_value <= 470: self.planned_leftpiece = 70 elif self.cut_value <= 490: self.planned_leftpiece = self.cut_value - 400 elif self.group.resolving_cut <= 510: self.planned_leftpiece = 90 elif self.cut_value <= 540: self.planned_leftpiece = self.cut_value - 420 else: self.planned_leftpiece = 120 if self.id_in_group == 2: if self.cut_value <= 140: self.planned_leftpiece = 0 elif self.cut_value <= 170: self.planned_leftpiece = self.cut_value - 140 elif self.cut_value <= 190: self.planned_leftpiece = 30 elif self.cut_value <= 220: self.planned_leftpiece = self.cut_value - 160 elif self.cut_value <= 230: self.planned_leftpiece = 60 elif self.cut_value <= 240: self.planned_leftpiece = self.cut_value - 170 elif self.cut_value <= 310: self.planned_leftpiece = 70 elif self.cut_value <= 330: self.planned_leftpiece = self.cut_value - 240 elif self.cut_value <= 360: self.planned_leftpiece = 90 elif self.cut_value <= 390: self.planned_leftpiece = self.cut_value - 270 else: self.planned_leftpiece = 120 def set_truthtelling(self): if self.planned_leftpiece <= 65 and self.planned_leftpiece>= 55: self.truth_telling = True else: self.truth_telling = False