from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Public_Goods_Takehome_RJ' players_per_group = 2 num_rounds = 1 starting_wage = cu(100) multiplier = 1.5 class Subsession(BaseSubsession): pass def winner_generator(group): a_diff=abs(group.a_guess-group.random_number) b_diff=abs(group.b_guess-group.random_number) if a_diffb_diff: group.winner="Group Member B" import random if a_diff==b_diff: random_winner=random.randint(1,2) if random_winner==1: group.winner="Group Member A" else: group.winner="Group Member B" def earnings_generator(group): total_contrib=group.a_contrib+group.b_contrib total_earnings = total_contrib * Constants.multiplier individual_earnings = round(total_earnings/Constants.players_per_group, 2) group_member_a=group.get_player_by_id(1) group_member_b=group.get_player_by_id(2) group_member_a.earnings=Constants.starting_wage-group.a_contrib+individual_earnings group_member_b.earnings=Constants.starting_wage-group.b_contrib+individual_earnings class Group(BaseGroup): random_number = models.IntegerField() a_guess = models.IntegerField(label='"Please input your guess [You may guess any whole number between 0 and 100]"', max=100, min=0) b_guess = models.IntegerField(label='"Please input your guess [You may guess any whole number between 0 and 100]"', max=100, min=0) winner = models.LongStringField() a_contrib = models.CurrencyField(label='"How many points are you going to contribute to the joint project? [You may contribute any whole number of points between 0 and 100]"', max=100, min=0) b_contrib = models.CurrencyField(label='"How many points are you going to contribute to the joint project? [You may contribute any whole number of points between 0 and 100]"', max=100, min=0) class Player(BasePlayer): player_role = models.StringField() earnings = models.CurrencyField() class Player_A_Decision_1(Page): form_model = 'group' form_fields = ['a_guess'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==1 @staticmethod def before_next_page(player, timeout_happened): group = player.group import random group.random_number=random.randint(0,100) class Player_B_Decision_1(Page): form_model = 'group' form_fields = ['b_guess'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==2 class Waiting_Room_1(WaitPage): after_all_players_arrive = 'winner_generator' title_text = 'Waiting Room' body_text = 'Please wait for all group members to make their guess. ' class Results_1(Page): form_model = 'player' class Player_A_Decision_2(Page): form_model = 'group' form_fields = ['a_contrib'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==1 class Player_B_Decision_2(Page): form_model = 'group' form_fields = ['b_contrib'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group==2 class Waiting_Room_2(WaitPage): after_all_players_arrive = 'earnings_generator' title_text = 'Waiting Room' body_text = 'Please wait for all group members to make their decision.' class Results_2(Page): form_model = 'player' page_sequence = [Player_A_Decision_1, Player_B_Decision_1, Waiting_Room_1, Results_1, Player_A_Decision_2, Player_B_Decision_2, Waiting_Room_2, Results_2]