from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random doc = """ A demo of how rounds work in oTree, in the context of 'die rolling' """ class Constants(BaseConstants): name_in_url = 'voting_ecc' players_per_group = 4 num_rounds = 1 instructions_template = 'voting_ecc/Instructions.html' class Subsession(BaseSubsession): def creating_session(self): self.group_randomly(fixed_id_in_group=True) # randomize to treatments if self.round_number == 1: for p in self.get_players(): p.participant.vars['cheat_treatment'] = random.choice(['have the possibility to cheat', 'have no possibility to cheat']) if p.participant.vars['cheat_treatment'] == 'have the possibility to cheat': p.cheat = True else: p.cheat = False print('set p.cheat_treatment to', p.participant.vars['cheat_treatment']) class Group(BaseGroup): total_vote_p1 = models.IntegerField() total_vote_p2 = models.IntegerField() total_vote_p3 = models.IntegerField() total_vote_p4 = models.IntegerField() def set_payoffs(self): self.total_vote_p1 = sum([p.vote_p1 for p in self.get_players()]) self.total_vote_p2 = sum([p.vote_p2 for p in self.get_players()]) self.total_vote_p3 = sum([p.vote_p3 for p in self.get_players()]) self.total_vote_p4 = sum([p.vote_p4 for p in self.get_players()]) max_total_vote = max(self.total_vote_p1, self.total_vote_p2, self.total_vote_p3, self. total_vote_p4) p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) if self.total_vote_p1 == max_total_vote: p1.is_winner = True p2.is_winner = False p3.is_winner = False p4.is_winner = False p1.role = 'Leader' p2.role = 'Employee1' p3.role = 'Employee2' p4.role = 'Employee3' elif self.total_vote_p2 == max_total_vote: p1.is_winner = False p2.is_winner = True p3.is_winner = False p4.is_winner = False p1.role = 'Employee1' p2.role = 'Leader' p3.role = 'Employee2' p4.role = 'Employee3' elif self.total_vote_p3 == max_total_vote: p1.is_winner = False p2.is_winner = False p3.is_winner = True p4.is_winner = False p1.role = 'Employee1' p2.role = 'Employee2' p3.role = 'Leader' p4.role = 'Employee3' else: p1.is_winner = False p2.is_winner = False p3.is_winner = False p4.is_winner = True p1.role = 'Employee1' p2.role = 'Employee2' p3.role = 'Employee3' p4.role = 'Leader' p1.participant.vars['role1'] = p1.role p2.participant.vars['role2'] = p2.role p3.participant.vars['role3'] = p3.role p4.participant.vars['role4'] = p4.role class Player(BasePlayer): die_rolling = models.IntegerField(min=1, max=6) vote_number = models.IntegerField() cheat_treatment = models.StringField() cheat = models.BooleanField() participant_vars_role1 = models.StringField() participant_vars_role2 = models.StringField() participant_vars_role3 = models.StringField() participant_vars_role4 = models.StringField() vote_p1 = models.IntegerField( label='How much will you vote to the p1?', min=0, max=5) vote_p2 = models.IntegerField( label='How much will you vote to the p2?', min=0, max=5) vote_p3 = models.IntegerField( label='How much will you vote to the p3?', min=0, max=5) vote_p4 = models.IntegerField( label='How much will you vote to the p4?', min=0, max=5) is_winner = models.BooleanField() vote_check = models.IntegerField() def vote_number(self): if self.die_rolling == 1: return '1' elif self.die_rolling == 2: return '1' elif self.die_rolling == 3: return '1' elif self.die_rolling == 4: return '3' elif self.die_rolling == 5: return '5' else: return '0' def vote_check(self): if self.player.vote_number == sum([self.player.vote_p1, self.player.vote_p2, self.player.vote_p3, self.player.vote_p4]): return '1' else: return '2'