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 = 'project_ecc' players_per_group = 4 num_rounds = 1 instructions_template = 'project_ecc/Instructions.html' dictator_endowment = c(60) trust_endowment = c(10) trust_multiplier = 3 public_good_endowment = c(10) public_good_multiplier = 2 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 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): total_vote_p1 = models.IntegerField() total_vote_p2 = models.IntegerField() total_vote_p3 = models.IntegerField() total_vote_p4 = models.IntegerField() real_leader_offer = models.CurrencyField() total_sent_amount = models.CurrencyField() sent_back_amount1 = models.CurrencyField() sent_back_amount2 = models.CurrencyField() sent_back_amount3 = models.CurrencyField() total_contribution = models.CurrencyField() individual_share = models.CurrencyField() message = models.LongStringField(label='What message do you want to send to your employees?') public_good_suggested_amount = models.CurrencyField(min=0, max=Constants.public_good_endowment, label='Let us contribute:') 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' self.real_leader_offer = p1.dictator_leader_offer self.total_sent_amount = p4.sent_amount + p2.sent_amount + p3.sent_amount 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' self.real_leader_offer = p2.dictator_leader_offer self.total_sent_amount = p1.sent_amount + p4.sent_amount + p3.sent_amount 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' self.real_leader_offer = p3.dictator_leader_offer self.total_sent_amount = p1.sent_amount + p2.sent_amount + p4.sent_amount 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' self.real_leader_offer = p4.dictator_leader_offer self.total_sent_amount = p1.sent_amount + p2.sent_amount + p3.sent_amount self.total_contribution = sum([p.contribution for p in self.get_players()]) self.individual_share = self.total_contribution * Constants.public_good_multiplier / Constants.players_per_group for p in self.get_players(): p.payoff = (Constants.public_good_endowment - p.contribution) + self.individual_share def set_payoffs_trust(self): for p in self.get_players(): if p.role == 'Leader': p.payoff_trust = self.total_sent_amount + self.total_sent_amount + self.total_sent_amount - self.sent_back_amount1 - self.sent_back_amount2 - self.sent_back_amount3 elif p.role == 'Employee1': p.payoff_trust = Constants.trust_endowment - self.p.sent_amount + self.sent_back_amount1 elif p.role == 'Employee2': p.payoff_trust = Constants.trust_endowment - self.p.sent_amount + self.sent_back_amount2 elif p.role == 'Employee3': p.payoff_trust = Constants.trust_endowment - self.p.sent_amount + self.sent_back_amount3 class Player(BasePlayer): die_rolling = models.IntegerField(min=1, max=6) vote_number = models.IntegerField() cheat_treatment = models.StringField() cheat = models.BooleanField() 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) practice_question1 = models.IntegerField( doc="""correct answer is 5""", ) practice_question2 = models.IntegerField( doc="""correct answer is 45""", ) practice_question3 = models.IntegerField( doc="""correct answer is 13""", ) practice_question4 = models.IntegerField( doc="""correct answer is 30""", ) practice_question5 = models.IntegerField( doc="""correct answer is 16""", ) practice_question6 = models.IntegerField( doc="""correct answer is 16""", ) practice_question7 = models.IntegerField( doc="""correct answer is 18""", ) sent_amount = models.IntegerField( doc="""Amount sent by Employee""", ) is_winner = models.BooleanField() role = models.StringField() payoff_dictator = models.CurrencyField() 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.CurrencyField(min=0, max=Constants.public_good_endowment, label='How much will you contribute to the project (from 0 to 10)?') payoffs_public_good = models.CurrencyField() age = models.IntegerField( label='Year of birth: year', min=1980, max=2010) gender = models.StringField( choices=['Male', 'Female', 'Other'], label='Gender', widget=widgets.RadioSelect) grade = models.StringField( choices=['First', 'Second', 'Third', 'Forth'], label='What is your grade?', widget=widgets.RadioSelect) education = models.StringField( choices=['Han', 'Minority'], label='Your ethnic group:', widget=widgets.RadioSelect) major = models.StringField( label='''Major ''' ) 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' def real_leader_offer(self): if self.player.role == 'Leader': real_leader_off = self.player.dictator_leader_offer def payoff_dictator(self): for p in self.get_players(): if p.role == 'Leader': p.payoff_dictator = Constants.dictator_endowment - self.dictator_leader_offer - self.dictator_leader_offer - \ self.dictator_leader_offer if p.role != 'Leader': p.payoff_dictator = self.dictator_leader_offer