from otree.api import * import random doc = """ This app is to be used with the Groups of 6 Participants, with a Supervisor. This is for the Outgroup Leader Treatment. """ class C(BaseConstants): NAME_IN_URL = 'outl_6' PLAYERS_PER_GROUP = 6 NUM_ROUNDS = 6 WORKER_1_ROLE = 'worker_1' SUPERVISOR_ROLE = 'supervisor' WORKER_2_ROLE = 'worker_2' WORKER_3_ROLE = 'worker_3' WORKER_4_ROLE = 'worker_4' WORKER_5_ROLE = 'worker_5' class Subsession(BaseSubsession): supervisor_red_message = models.LongStringField(initial=" ") supervisor_blue_message = models.LongStringField(initial=" ") supervisor_red_roll_total = models.IntegerField(initial=0) supervisor_blue_roll_total = models.IntegerField(initial=0) class Group(BaseGroup): total_claims_group = models.CurrencyField(initial=0) collective_sanction = models.BooleanField(initial=False) success_probability = models.FloatField(initial=0.00) payoff_round = models.IntegerField(initial=0) supervisor_message = models.LongStringField(blank=True, initial=" ") rectangle_group = models.StringField() class Player(BasePlayer): zeroth_roll_report = models.IntegerField(min=1, max=6,) part_1_payoff = models.CurrencyField() quiz_status = models.BooleanField(initial=False) estimation_roll_1 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 1 as their die roll outcome?", min=0, max=100,) estimation_roll_2 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 2 as their die roll outcome?", min=0, max=100,) estimation_roll_3 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 3 as their die roll outcome?", min=0, max=100,) estimation_roll_4 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 4 as their die roll outcome?", min=0, max=100,) estimation_roll_5 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 5 as their die roll outcome?", min=0, max=100,) estimation_roll_6 = models.FloatField(decimal_places=2, label="What percentage of participants do you think reported 6 as their die roll outcome?", min=0, max=100,) part_2_first_roll_report = models.IntegerField(min=1, max=6,) part_2_second_roll_report = models.IntegerField(min=1, max=6,) part_2_third_roll_report = models.IntegerField(min=1, max=6,) part_3_first_roll_report = models.IntegerField(min=1, max=6,) part_3_second_roll_report = models.IntegerField(min=1, max=6,) part_3_third_roll_report = models.IntegerField(min=1, max=6,) payoff_for_round = models.CurrencyField(initial=0) total_claims_participant = models.CurrencyField(initial=0) puzzle_status = models.StringField(initial='Not Completed', blank=True) time_elapsed_to_solve = models.StringField( initial='Not Completed', blank=True) # PAGES class welcome(Page): @ staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.quiz_status == False class quiz_page(Page): @ staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.quiz_status == False @ staticmethod def before_next_page(player: Player, timeout_happened): player.quiz_status = True class part_1_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 1 class round_0_page(Page): form_model = "player" form_fields = ['zeroth_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number == 1 class estimation_report(Page): form_model = "player" form_fields = ['estimation_roll_1', 'estimation_roll_2', 'estimation_roll_3', 'estimation_roll_4', 'estimation_roll_5', 'estimation_roll_6', ] @ staticmethod def error_message(player: Player, values): estimation_total = values['estimation_roll_1'] + values['estimation_roll_2'] + values['estimation_roll_3'] + \ values['estimation_roll_4'] + \ values['estimation_roll_5'] + values['estimation_roll_6'] print(estimation_total) if estimation_total != 100.00: return 'Your total is not 100.00%' @ staticmethod def is_displayed(player): return player.round_number == 1 class results_round_0(Page): @ staticmethod def vars_for_template(player: Player): zeroth_roll_payoff = (player.zeroth_roll_report) return { 'zeroth_roll_report': player.zeroth_roll_report, 'zeroth_roll_payoff': zeroth_roll_payoff, } @ staticmethod def is_displayed(player): return player.round_number == 1 class part_2_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 1 class part_2_round_1_page(Page): form_model = "player" form_fields = ['part_2_first_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 3 class part_2_round_2_page(Page): form_model = "player" form_fields = ['part_2_second_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 3 class part_2_round_3_page(Page): form_model = "player" form_fields = ['part_2_third_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 3 class part_2_ResultsWaitPage(WaitPage): @ staticmethod def after_all_players_arrive(group: Group): players_list = group.get_players() player_1 = players_list[0] player_2 = players_list[1] player_3 = players_list[2] player_4 = players_list[3] player_5 = players_list[4] player_6 = players_list[5] player_1_total = player_1.part_2_first_roll_report + \ player_1.part_2_second_roll_report + player_1.part_2_third_roll_report player_2_total = player_2.part_2_first_roll_report + \ player_2.part_2_second_roll_report + player_2.part_2_third_roll_report player_3_total = player_3.part_2_first_roll_report + \ player_3.part_2_second_roll_report + player_3.part_2_third_roll_report player_4_total = player_4.part_2_first_roll_report + \ player_4.part_2_second_roll_report + player_4.part_2_third_roll_report player_5_total = player_5.part_2_first_roll_report + \ player_5.part_2_second_roll_report + player_5.part_2_third_roll_report player_6_total = player_6.part_2_first_roll_report + \ player_6.part_2_second_roll_report + player_6.part_2_third_roll_report group.total_claims_group = player_1_total + \ player_2_total + player_3_total + player_4_total + player_5_total + player_6_total if group.total_claims_group >= 72: group.collective_sanction = True group.success_probability = round(random.uniform(0, 1), 4) if group.success_probability > 0.6: player_1.payoff_for_round = player_1_total player_2.payoff_for_round = player_2_total player_3.payoff_for_round = player_3_total player_4.payoff_for_round = player_4_total player_5.payoff_for_round = player_5_total player_6.payoff_for_round = player_6_total elif group.success_probability <= 0.6: player_1.payoff_for_round = 0 player_2.payoff_for_round = 0 player_3.payoff_for_round = 0 player_4.payoff_for_round = 0 player_5.payoff_for_round = 0 player_6.payoff_for_round = 0 else: group.collective_sanction = False player_1.payoff_for_round = player_1_total player_2.payoff_for_round = player_2_total player_3.payoff_for_round = player_3_total player_4.payoff_for_round = player_4_total player_5.payoff_for_round = player_5_total player_6.payoff_for_round = player_6_total @ staticmethod def is_displayed(player): return player.round_number <= 3 class part_2_results(Page): @ staticmethod def vars_for_template(player: Player): player_payoff_round = player.payoff_for_round player.total_claims_participant = player.total_claims_participant + player_payoff_round if player.in_round(1).field_maybe_none('zeroth_roll_report'): player.zeroth_roll_report = player.in_round(1).zeroth_roll_report else: player.zeroth_roll_report = 0 return { 'player_payoff_round': player_payoff_round, } @ staticmethod def is_displayed(player): return player.round_number <= 3 class part_3_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 4 class puzzle_page(Page): form_model = 'player' form_fields = ['puzzle_status', 'time_elapsed_to_solve',] timeout_seconds = 60*10 @ staticmethod def before_next_page(player, timeout_happened): if timeout_happened: None @ staticmethod def is_displayed(player): return player.round_number == 4 class part_4_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 4 # class wait_for_message(WaitPage): # template_name = "l_6/wait_for_message.html" # @ staticmethod # def is_displayed(player): # return (player.round_number <= 6 and player.round_number > 3) and not (player.role == 'supervisor') class wait_for_round(WaitPage): template_name = "l_6/wait_for_message.html" @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) class wait_for_message(WaitPage): template_name = "l_6/wait_for_message.html" wait_for_all_groups = True @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) and not (player.role == 'supervisor') class message_instructions_supervisor(Page): @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession if group_id == 1: player.group.rectangle_group = "red_rectangle" elif group_id == 2: player.group.rectangle_group = "blue_rectangle" else: player.group.rectangle_group = "red_rectangle" return { 'group_id': group_id } def is_displayed(player): return player.round_number == 4 and player.role == 'supervisor' class message_instructions_worker(Page): @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession if group_id == 1: player.group.rectangle_group = "red_rectangle" elif group_id == 2: player.group.rectangle_group = "blue_rectangle" else: player.group.rectangle_group = "red_rectangle" return { 'group_id': group_id } def is_displayed(player): return player.round_number == 4 and not (player.role == 'supervisor') class message_sender_supervisor(Page): form_model = "group" form_fields = ['supervisor_message', ] timeout_seconds = 60 @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession if group_id == 1: player.group.rectangle_group = "red_rectangle" elif group_id == 2: player.group.rectangle_group = "blue_rectangle" else: player.group.rectangle_group = "red_rectangle" return { 'group_id': group_id } @ staticmethod def before_next_page(player: Player, timeout_happened): group_id = player.group.id_in_subsession if group_id == 1: player.subsession.supervisor_red_message = player.group.supervisor_message elif group_id == 2: player.subsession.supervisor_blue_message = player.group.supervisor_message else: player.subsession.supervisor_red_message = " " player.subsession.supervisor_blue_message = " " if timeout_happened: player.group.supervisor_message = "" @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) and player.role == 'supervisor' class message_receiver_worker(Page): @ staticmethod def is_displayed(player): return not (player.role == 'supervisor') def vars_for_template(player: Player): group_id = player.group.id_in_subsession if group_id == 1: supervisor_message = player.subsession.field_maybe_none( 'supervisor_blue_message') elif group_id == 2: supervisor_message = player.subsession.field_maybe_none( 'supervisor_red_message') return { 'supervisor_message': supervisor_message, 'group_id': group_id, } @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) and not (player.role == 'supervisor') class part_3_round_1_page(Page): form_model = "player" form_fields = ['part_3_first_roll_report', ] @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) class part_3_round_2_page(Page): form_model = "player" form_fields = ['part_3_second_roll_report', ] @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) class part_3_round_3_page(Page): form_model = "player" form_fields = ['part_3_third_roll_report', ] @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) class part_3_ResultsWaitPage(WaitPage): wait_for_all_groups = True @ staticmethod def after_all_players_arrive(subsession: Subsession): groups_list = subsession.get_groups() group_1 = groups_list[0] group_2 = groups_list[1] if group_1: players_list = group_1.get_players() print(players_list) player_1 = players_list[0] player_2 = players_list[1] player_3 = players_list[2] player_4 = players_list[3] player_5 = players_list[4] player_6 = players_list[5] player_1_total = player_1.part_3_first_roll_report + \ player_1.part_3_second_roll_report + player_1.part_3_third_roll_report player_2_total = subsession.supervisor_red_roll_total = player_2.part_3_first_roll_report + \ player_2.part_3_second_roll_report + player_2.part_3_third_roll_report player_3_total = player_3.part_3_first_roll_report + \ player_3.part_3_second_roll_report + player_3.part_3_third_roll_report player_4_total = player_4.part_3_first_roll_report + \ player_4.part_3_second_roll_report + player_4.part_3_third_roll_report player_5_total = player_5.part_3_first_roll_report + \ player_5.part_3_second_roll_report + player_5.part_3_third_roll_report player_6_total = player_6.part_3_first_roll_report + \ player_6.part_3_second_roll_report + player_6.part_3_third_roll_report if group_2: players_list = group_2.get_players() print(players_list) player_7 = players_list[0] player_8 = players_list[1] player_9 = players_list[2] player_10 = players_list[3] player_11 = players_list[4] player_12 = players_list[5] player_7_total = player_7.part_3_first_roll_report + \ player_7.part_3_second_roll_report + player_7.part_3_third_roll_report player_8_total = subsession.supervisor_blue_roll_total = player_8.part_3_first_roll_report + \ player_8.part_3_second_roll_report + player_8.part_3_third_roll_report player_9_total = player_9.part_3_first_roll_report + \ player_9.part_3_second_roll_report + player_9.part_3_third_roll_report player_10_total = player_10.part_3_first_roll_report + \ player_10.part_3_second_roll_report + player_10.part_3_third_roll_report player_11_total = player_11.part_3_first_roll_report + \ player_11.part_3_second_roll_report + player_11.part_3_third_roll_report player_12_total = player_12.part_3_first_roll_report + \ player_12.part_3_second_roll_report + player_12.part_3_third_roll_report group_1.total_claims_group = player_1_total + \ player_8_total + player_3_total + \ player_4_total + player_5_total + player_6_total group_2.total_claims_group = player_7_total + \ player_2_total + player_9_total + \ player_10_total + player_11_total + player_12_total if group_1.total_claims_group >= 72: group_1.collective_sanction = True group_1.success_probability = round(random.uniform(0, 1), 4) if group_1.success_probability > 0.6: player_1.payoff_for_round = player_1_total player_8.payoff_for_round = player_8_total player_3.payoff_for_round = player_3_total player_4.payoff_for_round = player_4_total player_5.payoff_for_round = player_5_total player_6.payoff_for_round = player_6_total elif group_1.success_probability <= 0.6: player_1.payoff_for_round = 0 player_8.payoff_for_round = 0 player_3.payoff_for_round = 0 player_4.payoff_for_round = 0 player_5.payoff_for_round = 0 player_6.payoff_for_round = 0 else: group_1.collective_sanction = False player_1.payoff_for_round = player_1_total player_8.payoff_for_round = player_8_total player_3.payoff_for_round = player_3_total player_4.payoff_for_round = player_4_total player_5.payoff_for_round = player_5_total player_6.payoff_for_round = player_6_total if group_2.total_claims_group >= 72: group_2.collective_sanction = True group_2.success_probability = round(random.uniform(0, 1), 4) if group_2.success_probability > 0.6: player_7.payoff_for_round = player_7_total player_2.payoff_for_round = player_2_total player_9.payoff_for_round = player_9_total player_10.payoff_for_round = player_10_total player_11.payoff_for_round = player_11_total player_12.payoff_for_round = player_12_total elif group_2.success_probability <= 0.6: player_7.payoff_for_round = 0 player_2.payoff_for_round = 0 player_9.payoff_for_round = 0 player_10.payoff_for_round = 0 player_11.payoff_for_round = 0 player_12.payoff_for_round = 0 else: group_2.collective_sanction = False player_7.payoff_for_round = player_7_total player_2.payoff_for_round = player_2_total player_9.payoff_for_round = player_9_total player_10.payoff_for_round = player_10_total player_11.payoff_for_round = player_11_total player_12.payoff_for_round = player_12_total @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) class part_3_results(Page): @ staticmethod def vars_for_template(player: Player): player_payoff_round = player.payoff_for_round player.total_claims_participant = player.total_claims_participant + player_payoff_round if player.in_round(1).field_maybe_none('zeroth_roll_report'): player.zeroth_roll_report = player.in_round(1).zeroth_roll_report else: player.zeroth_roll_report = 0 if (player.round_number == 6): payoff_round = player.group.payoff_round = player.participant.payoff_round = random.randint( 1, 6) player.part_1_payoff = player.participant.part_1_payoff = player.zeroth_roll_report if payoff_round <= 3 and payoff_round > 0: part_2_payoff = player.participant.part_2_payoff = player.in_round( payoff_round).total_claims_participant part_3_payoff = player.participant.part_3_payoff = 0 player.payoff = player.part_1_payoff + part_2_payoff + part_3_payoff elif payoff_round > 3 and payoff_round <= 6: part_2_payoff = player.participant.part_2_payoff = 0 part_3_payoff = player.participant.part_3_payoff = player.in_round( payoff_round).total_claims_participant player.payoff = player.part_1_payoff + part_2_payoff + part_3_payoff return { 'player_payoff_round': player_payoff_round, } @ staticmethod def is_displayed(player): return (player.round_number <= 6 and player.round_number > 3) page_sequence = [welcome, quiz_page, part_1_welcome, round_0_page, estimation_report, results_round_0, part_2_welcome, part_2_round_1_page, part_2_round_2_page, part_2_round_3_page, part_2_ResultsWaitPage, part_2_results, part_3_welcome, puzzle_page, part_4_welcome, message_instructions_supervisor, message_instructions_worker, message_sender_supervisor, wait_for_message, message_receiver_worker, wait_for_round, part_3_round_1_page, part_3_round_2_page, part_3_round_3_page, part_3_ResultsWaitPage, part_3_results, ]