from otree.api import * c = cu doc = '\nThis is the ultimatum game. One player makes an offer and the other either accepts or rejects it.' class Constants(BaseConstants): name_in_url = 'Repeated_PD' players_per_group = 2 num_rounds = 3 turns_round_1 = 6 turns_round_2 = 3 turns_round_3 = 10 both_cooperate_payoff = 2 both_defect_payoff = 1 sucker_payoff = 0 defector_payoff = 3 instructions_template = 'Repeated_PD/instructions.html' def creating_session(subsession): session = subsession.session subsession.group_randomly() class Subsession(BaseSubsession): pass def set_payoffs(group): for p in group.get_players(): set_payoff(p) class Group(BaseGroup): Player_1_decision = models.StringField(choices=[['Cooperate', 'Cooperate'], ['Defect', 'Defect']], label='', widget=widgets.RadioSelect) Player_2_decision = models.StringField(choices=[['Cooperate', 'Cooperate'], ['Defect', 'Defect']], label='', widget=widgets.RadioSelect) Player_1_Round_Payoff = models.CurrencyField(initial=0) Player_2_Round_Payoff = models.CurrencyField(initial=0) def other_player(player): group = player.group return player.get_others_in_group()[0] def set_payoff(player): group = player.group if player.id_in_group == 1: if group.Player_1_decision == "Cooperate": if group.Player_2_decision == "Cooperate": player.R1_payoff = Constants.both_cooperate_payoff player.Total_payoff = player.Total_payoff + Constants.both_cooperate_payoff else: player.R1_payoff = Constants.sucker_payoff player.Total_payoff = player.Total_payoff + Constants.sucker_payoff else: if group.Player_2_decision == "Cooperate": player.R1_payoff = Constants.defector_payoff player.Total_payoff = player.Total_payoff + Constants.defector_payoff else: player.R1_payoff = Constants.both_defect_payoff player.Total_payoff = player.Total_payoff + Constants.both_defect_payoff if player.id_in_group == 2: if group.Player_2_decision == "Cooperate": if group.Player_1_decision == "Cooperate": player.R1_payoff = Constants.both_cooperate_payoff player.Total_payoff = player.Total_payoff + Constants.both_cooperate_payoff else: player.R1_payoff = Constants.sucker_payoff player.Total_payoff = player.Total_payoff + Constants.sucker_payoff else: if group.Player_1_decision == "Cooperate": player.R1_payoff = Constants.defector_payoff player.Total_payoff = player.Total_payoff + Constants.defector_payoff else: player.R1_payoff = Constants.both_defect_payoff player.Total_payoff = player.Total_payoff + Constants.both_defect_payoff class Player(BasePlayer): R1_payoff = models.CurrencyField(initial=0) Total_payoff = models.CurrencyField(initial=0) class Introduction(Page): form_model = 'player' timeout_seconds = 100 @staticmethod def is_displayed(player): return player.round_number == 1 class Decision_R1_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Decision_R1_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class R1_WaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results_Page_R1(Page): form_model = 'group' class Decision_R2_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Decision_R2_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class R2_WaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results_Page_R2(Page): form_model = 'player' class Decision_R3_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Decision_R3_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class R3_WaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results_Page_R3(Page): form_model = 'player' class Decision_R4_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number != 3 class Decision_R4_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number != 3 class R4_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Results_Page_R4(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Decision_R5_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number != 3 class Decision_R5_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number != 3 class R5_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Results_Page_R5(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Decision_R6_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number != 3 class Decision_R6_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number != 3 class R6_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Results_Page_R6(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number != 3 class Decision_R7_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number == 2 class Decision_R7_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number == 2 class R7_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Results_Page_R7(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Decision_R8_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number == 2 class Decision_R8_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number == 2 class R8_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Results_Page_R8(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Decision_R9_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number == 2 class Decision_R9_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number == 2 class R9_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Results_Page_R9(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Decision_R10_P1(Page): form_model = 'group' form_fields = ['Player_1_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 1 and subsession.round_number == 2 class Decision_R10_P2(Page): form_model = 'group' form_fields = ['Player_2_decision'] @staticmethod def is_displayed(player): session = player.session subsession = player.subsession group = player.group return player.id_in_group == 2 and subsession.round_number == 2 class R10_WaitPage(WaitPage): after_all_players_arrive = set_payoffs @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Results_Page_R10(Page): form_model = 'player' @staticmethod def is_displayed(player): session = player.session subsession = player.subsession return subsession.round_number == 2 class Final_Results_Page(Page): form_model = 'player' page_sequence = [Introduction, Decision_R1_P1, Decision_R1_P2, R1_WaitPage, Results_Page_R1, Decision_R2_P1, Decision_R2_P2, R2_WaitPage, Results_Page_R2, Decision_R3_P1, Decision_R3_P2, R3_WaitPage, Results_Page_R3, Decision_R4_P1, Decision_R4_P2, R4_WaitPage, Results_Page_R4, Decision_R5_P1, Decision_R5_P2, R5_WaitPage, Results_Page_R5, Decision_R6_P1, Decision_R6_P2, R6_WaitPage, Results_Page_R6, Decision_R7_P1, Decision_R7_P2, R7_WaitPage, Results_Page_R7, Decision_R8_P1, Decision_R8_P2, R8_WaitPage, Results_Page_R8, Decision_R9_P1, Decision_R9_P2, R9_WaitPage, Results_Page_R9, Decision_R10_P1, Decision_R10_P2, R10_WaitPage, Results_Page_R10, Final_Results_Page]