from otree.api import * import random doc = """ This app is to be used with the Groups of 6 Participants, with a Supervisor. This is the Ingroup Leader Treatment. """ class C(BaseConstants): NAME_IN_URL = 'inl_6' PLAYERS_PER_GROUP = 6 NUM_ROUNDS = 20 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): payoff_round = models.IntegerField(initial=0) class Group(BaseGroup): total_claims_group = models.IntegerField(initial=0) collective_sanction = models.BooleanField(initial=False) success_probability = models.FloatField(initial=0.00) supervisor_message = models.LongStringField(initial=" ", blank=True) puzzle_payoff = models.FloatField() time_taken_puzzle = models.IntegerField() class Player(BasePlayer): instructions_quiz_status = models.BooleanField(initial=False) part_1_first_roll_report = models.IntegerField(min=1, max=6,) part_1_second_roll_report = models.IntegerField(min=1, max=6,) part_1_third_roll_report = models.IntegerField(min=1, max=6,) part_2_puzzle_status = models.StringField( initial='Not Completed', blank=True) part_2_puzzle_quiz_status = models.BooleanField(initial=False) time_elapsed_to_solve = models.StringField( initial='00:00', blank=True) part_3_quiz_status = models.BooleanField(initial=False) 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.IntegerField(initial=0) # PAGES class welcome(Page): @ staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.instructions_quiz_status == False class instructions_quiz_page(Page): form_model = "player" form_fields = ['instructions_quiz_status'] @ staticmethod def is_displayed(player: Player): return player.round_number == 1 and player.instructions_quiz_status == False class part_1_roll_1_page(Page): form_model = "player" form_fields = ['part_1_first_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 10 class part_1_roll_2_page(Page): form_model = "player" form_fields = ['part_1_second_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 10 class part_1_roll_3_page(Page): form_model = "player" form_fields = ['part_1_third_roll_report', ] @ staticmethod def is_displayed(player): return player.round_number <= 10 class part_1_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_1_first_roll_report + \ player_1.part_1_second_roll_report + player_1.part_1_third_roll_report player_2_total = player_2.part_1_first_roll_report + \ player_2.part_1_second_roll_report + player_2.part_1_third_roll_report player_3_total = player_3.part_1_first_roll_report + \ player_3.part_1_second_roll_report + player_3.part_1_third_roll_report player_4_total = player_4.part_1_first_roll_report + \ player_4.part_1_second_roll_report + player_4.part_1_third_roll_report player_5_total = player_5.part_1_first_roll_report + \ player_5.part_1_second_roll_report + player_5.part_1_third_roll_report player_6_total = player_6.part_1_first_roll_report + \ player_6.part_1_second_roll_report + player_6.part_1_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 <= 10 class part_1_results(Page): @ staticmethod def vars_for_template(player: Player): player_payoff_round = player.payoff_for_round return { 'player_payoff_round': player_payoff_round, } @ staticmethod def is_displayed(player): return player.round_number <= 10 class wait_for_round(WaitPage): template_name = "inl_6/wait_for_message.html" wait_for_all_groups = True @ staticmethod def is_displayed(player): return player.round_number == 11 class part_2_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 11 class part_2_puzzle_quiz(Page): form_model = "player" form_fields = ['part_2_puzzle_quiz_status'] @ staticmethod def is_displayed(player): return player.round_number == 11 class wait_before_puzzle(WaitPage): wait_for_all_groups = True @ staticmethod def is_displayed(player): return player.round_number == 11 class part_2_puzzle_page(Page): form_model = 'player' form_fields = ['part_2_puzzle_status', 'time_elapsed_to_solve',] timeout_seconds = 60*10 @staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession return { "group_id": group_id, } @ staticmethod def is_displayed(player): return player.round_number == 11 class part_3_welcome(Page): @ staticmethod def is_displayed(player): return player.round_number == 11 class part_3_quiz_page(Page): form_model = "player" form_fields = ['part_3_quiz_status'] @ staticmethod def before_next_page(player: Player, timeout_happened): player.part_3_quiz_status = True @ staticmethod def is_displayed(player: Player): return player.round_number == 11 and player.part_3_quiz_status == False class wait_for_message(WaitPage): template_name = "inl_6/wait_for_message.html" @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) and not (player.role == 'supervisor') class wait_for_round(WaitPage): template_name = "inl_6/wait_for_message.html" @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) class message_instructions_supervisor(Page): @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession return { 'group_id': group_id } def is_displayed(player): return player.round_number == 11 and player.role == 'supervisor' class message_instructions_worker(Page): @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession return { 'group_id': group_id } def is_displayed(player): return player.round_number == 11 and not (player.role == 'supervisor') class message_sender_supervisor(Page): form_model = "group" form_fields = ['supervisor_message', ] timeout_seconds = 60*1 @ staticmethod def vars_for_template(player: Player): group_id = player.group.id_in_subsession return { 'group_id': group_id, "round": player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) 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 try: if player.group.supervisor_message: supervisor_message = player.group.supervisor_message else: supervisor_message = "" except: supervisor_message = "There is some error. Please move forward" return { 'supervisor_message': supervisor_message, 'group_id': group_id, "round": player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) and not (player.role == 'supervisor') class part_3_roll_1_page(Page): form_model = "player" form_fields = ['part_3_first_roll_report', ] @ staticmethod def vars_for_template(player: Player): return { "round": player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) class part_3_roll_2_page(Page): form_model = "player" form_fields = ['part_3_second_roll_report', ] @ staticmethod def vars_for_template(player: Player): return { "round": player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) class part_3_roll_3_page(Page): form_model = "player" form_fields = ['part_3_third_roll_report', ] @ staticmethod def vars_for_template(player: Player): return { "round": player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) class part_3_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_3_first_roll_report + \ player_1.part_3_second_roll_report + player_1.part_3_third_roll_report player_2_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 player_1.round_number == 20: total_time_solve_group = 0 for i in range(0, len(players_list)): if players_list[i].in_round(11).part_2_puzzle_status == "Not Completed": players_list[i].group.puzzle_payoff = (0) total_time_solve_group = 99999 break elif players_list[i].in_round(11).part_2_puzzle_status == "Done": time_temp = players_list[i].in_round(11).time_elapsed_to_solve.split( ":") time_for_player = 600 - \ (int(time_temp[0])*60 + int(time_temp[1])) total_time_solve_group += time_for_player group.time_taken_puzzle = total_time_solve_group 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 if player_1.round_number == 20: if group.subsession.payoff_round == 0: group.subsession.payoff_round = random.randint(1, 20) else: pass @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) class part_3_results(Page): @ staticmethod def vars_for_template(player: Player): player_payoff_round = player.payoff_for_round groups_list = player.subsession.get_groups() try: group_1_time = groups_list[0].field_maybe_none('time_taken_puzzle') group_2_time = groups_list[1].field_maybe_none('time_taken_puzzle') if group_1_time < group_2_time: if group_1_time != 99999: player.participant.part_2_puzzle_payoff = groups_list[0].puzzle_payoff = ( 3) player.participant.part_2_puzzle_payoff = groups_list[1].puzzle_payoff = ( 0) else: player.participant.part_2_puzzle_payoff = groups_list[0].puzzle_payoff = ( 0) player.participant.part_2_puzzle_payoff = groups_list[1].puzzle_payoff = ( 0) elif group_1_time > group_2_time: if group_2_time != 99999: player.participant.part_2_puzzle_payoff = groups_list[0].puzzle_payoff = ( 3) player.participant.part_2_puzzle_payoff = groups_list[1].puzzle_payoff = ( 0) else: player.participant.part_2_puzzle_payoff = groups_list[0].puzzle_payoff = ( 0) player.participant.part_2_puzzle_payoff = groups_list[1].puzzle_payoff = ( 0) else: player.participant.part_2_puzzle_payoff = groups_list[0].puzzle_payoff = ( 0) player.participant.part_2_puzzle_payoff = groups_list[1].puzzle_payoff = ( 0) except: groups_list[0].puzzle_payoff = (0) groups_list[1].puzzle_payoff = (0) if (player.round_number == 20): payoff_round = player.participant.payoff_round = player.subsession.payoff_round if payoff_round <= 10 and payoff_round > 0: part_1_payoff = player.participant.part_1_payoff = player.in_round( payoff_round).payoff_for_round part_2_payoff = player.participant.part_2_puzzle_payoff = player.group.puzzle_payoff part_3_payoff = player.participant.part_3_payoff = 0 player.payoff = part_1_payoff + part_2_payoff + part_3_payoff elif payoff_round > 10 and payoff_round <= 20: part_1_payoff = player.participant.part_1_payoff = 0 part_2_payoff = player.participant.part_2_puzzle_payoff = player.group.puzzle_payoff part_3_payoff = player.participant.part_3_payoff = player.in_round( payoff_round).payoff_for_round player.payoff = part_1_payoff + part_2_payoff + part_3_payoff return { 'player_payoff_round': player_payoff_round, 'round': player.round_number-10, } @ staticmethod def is_displayed(player): return (player.round_number <= 20 and player.round_number > 10) page_sequence = [welcome, instructions_quiz_page, part_1_roll_1_page, part_1_roll_2_page, part_1_roll_3_page, part_1_ResultsWaitPage, part_1_results, part_2_welcome, part_2_puzzle_quiz, wait_before_puzzle, part_2_puzzle_page, part_3_welcome, part_3_quiz_page, message_instructions_supervisor, message_instructions_worker, message_sender_supervisor, wait_for_message, message_receiver_worker, wait_for_round, part_3_roll_1_page, part_3_roll_2_page, part_3_roll_3_page, part_3_ResultsWaitPage, part_3_results, ]