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 = 'csu_project_cn' players_per_group = 4 num_rounds = 10 dictator_endowment = c(300) public_good_endowment = c(20) public_good_multiplier = 2 class Subsession(BaseSubsession): def creating_session(self): self.group_randomly(fixed_id_in_group=True) # randomize to treatments def vars_for_admin_report(self): contributions = [p.contribution for p in self.get_players() if p.contribution != None] if contributions: return { 'avg_contribution': sum(contributions)/len(contributions), 'min_contribution': min(contributions), 'max_contribution': max(contributions), } else: return { 'avg_contribution': '(no data)', 'min_contribution': '(no data)', 'max_contribution': '(no data)', } class Group(BaseGroup): real_leader_offer = models.CurrencyField() total_contribution = models.IntegerField() individual_share = models.CurrencyField() total_public_good_payoffs = models.CurrencyField() leader_average_contribution = models.CurrencyField() group_return = models.CurrencyField() public_good_suggested_amount = models.IntegerField(min=0, max=Constants.public_good_endowment, label='让我们投入') def set_roles(self): 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) for p in self.get_players(): p1.total_vote = sum([p.vote_p1 for p in self.get_players()]) p2.total_vote = sum([p.vote_p2 for p in self.get_players()]) p3.total_vote = sum([p.vote_p3 for p in self.get_players()]) p4.total_vote = sum([p.vote_p4 for p in self.get_players()]) max_total_vote = max(p1.total_vote, p2.total_vote, p3.total_vote, p4.total_vote) if p.total_vote == max_total_vote: p.potential_winner = True else: p.potential_winner = False if self.round_number == 1: for p in self.get_players(): if p1.potential_winner == 1 and p2.potential_winner == 1 and p3.potential_winner == 1 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([1, 2, 3, 4]) elif p1.potential_winner == 1 and p2.potential_winner == 1 and p3.potential_winner == 1 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([1, 2, 3]) elif p1.potential_winner == 1 and p2.potential_winner == 1 and p3.potential_winner == 0 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([1, 2, 4]) elif p1.potential_winner == 0 and p2.potential_winner == 1 and p3.potential_winner == 1 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([3, 2, 4]) elif p1.potential_winner == 1 and p2.potential_winner == 1 and p3.potential_winner == 0 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([1, 2]) elif p1.potential_winner == 1 and p2.potential_winner == 0 and p3.potential_winner == 1 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([1, 3]) elif p1.potential_winner == 1 and p2.potential_winner == 0 and p3.potential_winner == 0 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([1, 4]) elif p1.potential_winner == 0 and p2.potential_winner == 1 and p3.potential_winner == 1 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([3, 2]) elif p1.potential_winner == 0 and p2.potential_winner == 1 and p3.potential_winner == 0 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([4, 2]) elif p1.potential_winner == 0 and p2.potential_winner == 0 and p3.potential_winner == 1 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([3, 4]) elif p1.potential_winner == 1 and p2.potential_winner == 0 and p3.potential_winner == 0 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([1]) elif p1.potential_winner == 0 and p2.potential_winner == 1 and p3.potential_winner == 0 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([2]) elif p1.potential_winner == 0 and p2.potential_winner == 0 and p3.potential_winner == 1 and p4.potential_winner == 0: p.participant.vars['leader_winner'] = random.choice([3]) elif p1.potential_winner == 0 and p2.potential_winner == 0 and p3.potential_winner == 0 and p4.potential_winner == 1: p.participant.vars['leader_winner'] = random.choice([4]) if p.participant.vars['leader_winner'] == 1: p1.is_winner = True p2.is_winner = False p3.is_winner = False p4.is_winner = False elif p.participant.vars['leader_winner'] == 2: p1.is_winner = False p2.is_winner = True p3.is_winner = False p4.is_winner = False elif p.participant.vars['leader_winner'] == 3: p1.is_winner = False p2.is_winner = False p3.is_winner = True p4.is_winner = False elif p.participant.vars['leader_winner'] == 4: p1.is_winner = False p2.is_winner = False p3.is_winner = False p4.is_winner = True def set_dictator_payoffs(self): 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 p1.is_winner == 1: self.real_leader_offer = p1.dictator_leader_offer p1.dictator_payoffs = Constants.dictator_endowment - p1.dictator_leader_offer - p1.dictator_leader_offer - p1.dictator_leader_offer p2.dictator_payoffs = p1.dictator_leader_offer p3.dictator_payoffs = p1.dictator_leader_offer p4.dictator_payoffs = p1.dictator_leader_offer elif p2.is_winner == 1: self.real_leader_offer = p2.dictator_leader_offer p2.dictator_payoffs = Constants.dictator_endowment - p2.dictator_leader_offer - p2.dictator_leader_offer - p2.dictator_leader_offer p1.dictator_payoffs = p2.dictator_leader_offer p3.dictator_payoffs = p2.dictator_leader_offer p4.dictator_payoffs = p2.dictator_leader_offer elif p3.is_winner == 1: self.real_leader_offer = p3.dictator_leader_offer p3.dictator_payoffs = Constants.dictator_endowment - p3.dictator_leader_offer - p3.dictator_leader_offer - p3.dictator_leader_offer p2.dictator_payoffs = p3.dictator_leader_offer p1.dictator_payoffs = p3.dictator_leader_offer p4.dictator_payoffs = p3.dictator_leader_offer else: self.real_leader_offer = p4.dictator_leader_offer p4.dictator_payoffs = Constants.dictator_endowment - p4.dictator_leader_offer - p4.dictator_leader_offer - p4.dictator_leader_offer p2.dictator_payoffs = p4.dictator_leader_offer p3.dictator_payoffs = p4.dictator_leader_offer p1.dictator_payoffs = p4.dictator_leader_offer def set_leader_average_contribution(self): for p in self.get_players(): if p.in_round(1).is_winner == 1: self.leader_average_contribution = (p.in_round(1).contribution + p.in_round(2).contribution + p.in_round(3).contribution + p.in_round(4).contribution + \ p.in_round(5).contribution + p.in_round(6).contribution + p.in_round(7).contribution + p.in_round(8).contribution + p.in_round( 9).contribution + p.in_round(10).contribution) / 10 def set_public_good_payoffs(self): self.total_contribution = sum([p.contribution for p in self.get_players()]) self.group_return = self.total_contribution/2 self.individual_share = self.total_contribution * Constants.public_good_multiplier / Constants.players_per_group for p in self.get_players(): p.public_good_payoffs = (Constants.public_good_endowment - p.contribution) + self.individual_share def set_correct_estimation_payoffs(self): for p in self.get_players(): if p.cooperation_belief == self.leader_average_contribution: p.correct_estimation_payoffs = 30 elif p.cooperation_belief == (self.leader_average_contribution - 1) or p.cooperation_belief == ( self.leader_average_contribution + 1): p.correct_estimation_payoffs = 20 elif p.cooperation_belief == (self.leader_average_contribution - 2) or p.cooperation_belief == ( self.leader_average_contribution + 2): p.correct_estimation_payoffs = 10 else: p.correct_estimation_payoffs = 0 def set_payoffs(self): for p in self.get_players(): if p.is_winner == 1: p.payoffs = p.in_round(1).public_good_payoffs + p.in_round(2).public_good_payoffs + p.in_round(3).public_good_payoffs +\ p.in_round(4).public_good_payoffs + p.in_round(5).public_good_payoffs + p.in_round(6).public_good_payoffs + \ p.in_round(7).public_good_payoffs + p.in_round(8).public_good_payoffs + p.in_round(9).public_good_payoffs + p.in_round(10).public_good_payoffs + p.in_round(1).dictator_payoffs p.payoff = 5 + p.payoffs / 10 p.payoffs_convert = 5 + int(p.payoffs)/10 elif p.is_winner != 1: p.payoffs = p.in_round(1).public_good_payoffs + p.in_round( 2).public_good_payoffs + p.in_round(3).public_good_payoffs + \ p.in_round(4).public_good_payoffs + p.in_round( 5).public_good_payoffs + p.in_round(6).public_good_payoffs + \ p.in_round(7).public_good_payoffs + p.in_round( 8).public_good_payoffs + p.in_round(9).public_good_payoffs + p.in_round( 10).public_good_payoffs + p.in_round(1).dictator_payoffs + p.correct_estimation_payoffs p.payoff = 5 + p.payoffs / 10 p.payoffs_convert = 5 + int(p.payoffs) / 10 class Player(BasePlayer): die_rolling = models.IntegerField(min=1, max=6) experiment_ID = models.IntegerField(min=1, max=24) vote_number = models.IntegerField() group_label = models.StringField() leader_winner = models.StringField() vote_p1 = models.IntegerField(label=' ', min=0, max=5) vote_p2 = models.IntegerField(label=' ', min=0, max=5) vote_p3 = models.IntegerField(label=' ', min=0, max=5) vote_p4 = models.IntegerField(label=' ', min=0, max=5) total_vote = models.IntegerField() potential_winner = models.BooleanField() is_winner = models.BooleanField() role = models.StringField() dictator_leader_offer = models.CurrencyField( doc="""Amount dictator decided to distribute for each of the employees""", min=0, max=Constants.dictator_endowment/3, ) contribution = models.IntegerField(min=0, max=Constants.public_good_endowment) average_contribution = models.CurrencyField() cooperation_belief = models.IntegerField(min=0, max=20, label=' 你的估计是(请输入0-20之间的整数) ') public_good_payoffs = models.CurrencyField() dictator_payoffs = models.CurrencyField() payoffs = models.CurrencyField() correct_estimation_payoffs = models.IntegerField() payoffs_convert = models.FloatField() age = models.IntegerField( label='出生年份', min=1940, max=2001) gender = models.StringField( choices=['男性', '女性'], label='性别', widget=widgets.RadioSelect) grade = models.StringField( choices=['一年级', '二年级', '三年级', '四年级', '五年级', '研究生'], label='你的年级', widget=widgets.RadioSelect) ethnic = models.StringField( choices=['汉族', '少数民族'], label='民族', widget=widgets.RadioSelect) major = models.StringField( label='''学院 ''' ) desire_power1 = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='对我个人而言,能够控制事情的发展是一件让我开心的事情', widget=widgets.RadioSelect) desire_power2 = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='对我个人而言,能够拥有更多的决定权是一件让我高兴的事情', widget=widgets.RadioSelect) desire_power3 = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='对我个人而言,能够拥有更多的责任是一件让我欢喜的事情', widget=widgets.RadioSelect) legitimacy1 = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='此次实验任务中,领导者的选择方式是很公平的', widget=widgets.RadioSelect) legitimacy2 = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='此次实验任务中,领导者当选的过程是很透明的', widget=widgets.RadioSelect) dishonesty = models.StringField( choices=['完全不同意', '非常不同意', '较不同意', '一般', '较同意', '非常同意', '完全同意'], label='此次任务中,我感觉领导者存在欺骗的可能性', widget=widgets.RadioSelect) dictator_rationale = models.StringField( label='''请回忆第二阶段对于300实验币的分配决策,简要阐述你的决策原因 ''' ) invest_rationale = models.StringField( label='''请回忆第三阶段对公共账户的投资决策,简要阐述你听从或不听从领导者建议的原因 ''' ) def group_label(self): if self.id_in_group == 1: return 'A' elif self.id_in_group == 2: return 'B' elif self.id_in_group == 3: return 'C' else: return 'D' 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'