import random import itertools import time from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Round2' PLAYERS_PER_GROUP = None NUM_ROUNDS = 50 NUM_LETTERS = 12 import random import copy fixed_payment = cu(2.50) var_payment_ve = cu(0.05) var_payment_e = cu(0.10) var_payment_m = cu(0.15) var_payment_d = cu(0.20) var_payment_vd = cu(0.25) var_payment_di = cu(0.30) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): complexity = models.IntegerField(label = "Occupation number (as per table above) - enter the corresponding number from 1 to 6", min=1, max=6) compl_group = models.IntegerField() letter_veasy_1 = models.IntegerField(label='A', min=0, max=9) letter_veasy_2 = models.IntegerField(label='A', min=0, max=9) letter_veasy_3 = models.IntegerField(label='A', min=0, max=9) letter_veasy_4 = models.IntegerField(label='A', min=0, max=9) letter_veasy_5 = models.IntegerField(label='A', min=0, max=9) letter_veasy_6 = models.IntegerField(label='A', min=0, max=9) letter_veasy_7 = models.IntegerField(label='N', min=0, max=9) letter_veasy_8 = models.IntegerField(label='N', min=0, max=9) letter_veasy_9 = models.IntegerField(label='N', min=0, max=9) letter_veasy_10 = models.IntegerField(label='N', min=0, max=9) letter_veasy_11 = models.IntegerField(label='N', min=0, max=9) letter_veasy_12 = models.IntegerField(label='N', min=0, max=9) letter_easy_1 = models.IntegerField(label='A', min=0, max=9) letter_easy_2 = models.IntegerField(label='A', min=0, max=9) letter_easy_3 = models.IntegerField(label='A', min=0, max=9) letter_easy_4 = models.IntegerField(label='A', min=0, max=9) letter_easy_5 = models.IntegerField(label='N', min=0, max=9) letter_easy_6 = models.IntegerField(label='N', min=0, max=9) letter_easy_7 = models.IntegerField(label='N', min=0, max=9) letter_easy_8 = models.IntegerField(label='N', min=0, max=9) letter_easy_9 = models.IntegerField(label='F', min=0, max=9) letter_easy_10 = models.IntegerField(label='F', min=0, max=9) letter_easy_11 = models.IntegerField(label='F', min=0, max=9) letter_easy_12 = models.IntegerField(label='F', min=0, max=9) letter_med_1 = models.IntegerField(label='A', min=0, max=9) letter_med_2 = models.IntegerField(label='A', min=0, max=9) letter_med_3 = models.IntegerField(label='A', min=0, max=9) letter_med_4 = models.IntegerField(label='N', min=0, max=9) letter_med_5 = models.IntegerField(label='N', min=0, max=9) letter_med_6 = models.IntegerField(label='N', min=0, max=9) letter_med_7 = models.IntegerField(label='F', min=0, max=9) letter_med_8 = models.IntegerField(label='F', min=0, max=9) letter_med_9 = models.IntegerField(label='F', min=0, max=9) letter_med_10 = models.IntegerField(label='S', min=0, max=9) letter_med_11 = models.IntegerField(label='S', min=0, max=9) letter_med_12 = models.IntegerField(label='S', min=0, max=9) letter_diff_1 = models.IntegerField(label='A', min=0, max=9) letter_diff_2 = models.IntegerField(label='A', min=0, max=9) letter_diff_3 = models.IntegerField(label='A', min=0, max=9) letter_diff_4 = models.IntegerField(label='N', min=0, max=9) letter_diff_5 = models.IntegerField(label='N', min=0, max=9) letter_diff_6 = models.IntegerField(label='F', min=0, max=9) letter_diff_7 = models.IntegerField(label='F', min=0, max=9) letter_diff_8 = models.IntegerField(label='S', min=0, max=9) letter_diff_9 = models.IntegerField(label='S', min=0, max=9) letter_diff_10 = models.IntegerField(label='K', min=0, max=9) letter_diff_11 = models.IntegerField(label='K', min=0, max=9) letter_diff_12 = models.IntegerField(label='K', min=0, max=9) letter_vdiff_1 = models.IntegerField(label='A', min=0, max=9) letter_vdiff_2 = models.IntegerField(label='A', min=0, max=9) letter_vdiff_3 = models.IntegerField(label='N', min=0, max=9) letter_vdiff_4 = models.IntegerField(label='N', min=0, max=9) letter_vdiff_5 = models.IntegerField(label='F', min=0, max=9) letter_vdiff_6 = models.IntegerField(label='F', min=0, max=9) letter_vdiff_7 = models.IntegerField(label='S', min=0, max=9) letter_vdiff_8 = models.IntegerField(label='S', min=0, max=9) letter_vdiff_9 = models.IntegerField(label='K', min=0, max=9) letter_vdiff_10 = models.IntegerField(label='K', min=0, max=9) letter_vdiff_11 = models.IntegerField(label='U', min=0, max=9) letter_vdiff_12 = models.IntegerField(label='U', min=0, max=9) letter_diab_1 = models.IntegerField(label='A', min=0, max=9) letter_diab_2 = models.IntegerField(label='A', min=0, max=9) letter_diab_3 = models.IntegerField(label='N', min=0, max=9) letter_diab_4 = models.IntegerField(label='N', min=0, max=9) letter_diab_5 = models.IntegerField(label='F', min=0, max=9) letter_diab_6 = models.IntegerField(label='S', min=0, max=9) letter_diab_7 = models.IntegerField(label='K', min=0, max=9) letter_diab_8 = models.IntegerField(label='K', min=0, max=9) letter_diab_9 = models.IntegerField(label='U', min=0, max=9) letter_diab_10 = models.IntegerField(label='U', min=0, max=9) letter_diab_11 = models.IntegerField(label='G', min=0, max=9) letter_diab_12 = models.IntegerField(label='G', min=0, max=9) # PAGES def get_timeout_seconds(player): participant = player.participant import time return participant.expiry - time.time() class r2_Instructions(Page): form_model = 'player' form_fields = ['complexity'] @staticmethod def is_displayed(player: Player): if player.round_number == 1: return True else: return False @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant participant.expiry = time.time() + 6 * 60 participant.compl_group = player.complexity class r2_Task_veasy(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 1): return True else: return False @staticmethod def vars_for_template(player: Player): return { 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, } @staticmethod def get_form_fields(player: Player): form_fields = ['letter_veasy_1', 'letter_veasy_2', 'letter_veasy_3', 'letter_veasy_4', 'letter_veasy_5', 'letter_veasy_6', 'letter_veasy_7', 'letter_veasy_8', 'letter_veasy_9', 'letter_veasy_10', 'letter_veasy_11', 'letter_veasy_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_veasy_1 == player.participant.le_1 and player.letter_veasy_2 == player.participant.le_1 and player.letter_veasy_3 == player.participant.le_1 and player.letter_veasy_4 == player.participant.le_1 and player.letter_veasy_5 == player.participant.le_1 and player.letter_veasy_6 == player.participant.le_1 and player.letter_veasy_7 == player.participant.le_2 and player.letter_veasy_8 == player.participant.le_2 and player.letter_veasy_9 == player.participant.le_2 and player.letter_veasy_10 == player.participant.le_2 and player.letter_veasy_11 == player.participant.le_2 and player.letter_veasy_12 == player.participant.le_2: player.payoff = C.var_payment_ve class r2_Task_easy(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 2): return True else: return False @staticmethod def vars_for_template(player: Player): return { 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, } @staticmethod def get_form_fields(player: Player): form_fields = ['letter_easy_1', 'letter_easy_2', 'letter_easy_3', 'letter_easy_4', 'letter_easy_5', 'letter_easy_6', 'letter_easy_7', 'letter_easy_8', 'letter_easy_9', 'letter_easy_10', 'letter_easy_11', 'letter_easy_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_easy_1 == player.participant.le_1 and player.letter_easy_2 == player.participant.le_1 and player.letter_easy_3 == player.participant.le_1 and player.letter_easy_4 == player.participant.le_1 and player.letter_easy_5 == player.participant.le_2 and player.letter_easy_6 == player.participant.le_2 and player.letter_easy_7 == player.participant.le_2 and player.letter_easy_8 == player.participant.le_2 and player.letter_easy_9 == player.participant.le_3 and player.letter_easy_10 == player.participant.le_3 and player.letter_easy_11 == player.participant.le_3 and player.letter_easy_12 == player.participant.le_3: player.payoff = C.var_payment_e class r2_Task_medium(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 3): return True else: return False @staticmethod def get_form_fields(player: Player): form_fields = ['letter_med_1', 'letter_med_2', 'letter_med_3', 'letter_med_4', 'letter_med_5', 'letter_med_6', 'letter_med_7', 'letter_med_8', 'letter_med_9', 'letter_med_10', 'letter_med_11', 'letter_med_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, 'letter 4': player.participant.le_4, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_med_1 == player.participant.le_1 and player.letter_med_2 == player.participant.le_1 and player.letter_med_3 == player.participant.le_1 and player.letter_med_4 == player.participant.le_2 and player.letter_med_5 == player.participant.le_2 and player.letter_med_6 == player.participant.le_2 and player.letter_med_7 == player.participant.le_3 and player.letter_med_8 == player.participant.le_3 and player.letter_med_9 == player.participant.le_3 and player.letter_med_10 == player.participant.le_4 and player.letter_med_11 == player.participant.le_4 and player.letter_med_12 == player.participant.le_4: player.payoff = C.var_payment_m class r2_Task_diff(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 4): return True else: return False @staticmethod def get_form_fields(player: Player): form_fields = ['letter_diff_1', 'letter_diff_2', 'letter_diff_3', 'letter_diff_4', 'letter_diff_5', 'letter_diff_6', 'letter_diff_7', 'letter_diff_8', 'letter_diff_9', 'letter_diff_10', 'letter_diff_11', 'letter_diff_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, 'letter 4': player.participant.le_4, 'letter 5': player.participant.le_5, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_diff_1 == player.participant.le_1 and player.letter_diff_2 == player.participant.le_1 and player.letter_diff_3 == player.participant.le_1 and player.letter_diff_4 == player.participant.le_2 and player.letter_diff_5 == player.participant.le_2 and player.letter_diff_6 == player.participant.le_3 and player.letter_diff_7 == player.participant.le_3 and player.letter_diff_8 == player.participant.le_4 and player.letter_diff_9 == player.participant.le_4 and player.letter_diff_10 == player.participant.le_5 and player.letter_diff_11 == player.participant.le_5 and player.letter_diff_12 == player.participant.le_5: player.payoff = C.var_payment_d class r2_Task_vdiff(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 5): return True else: return False @staticmethod def get_form_fields(player: Player): form_fields = ['letter_vdiff_1', 'letter_vdiff_2', 'letter_vdiff_3', 'letter_vdiff_4', 'letter_vdiff_5', 'letter_vdiff_6', 'letter_vdiff_7', 'letter_vdiff_8', 'letter_vdiff_9', 'letter_vdiff_10', 'letter_vdiff_11', 'letter_vdiff_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, 'letter 4': player.participant.le_4, 'letter 5': player.participant.le_5, 'letter 6': player.participant.le_6, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_vdiff_1 == player.participant.le_1 and player.letter_vdiff_2 == player.participant.le_1 and player.letter_vdiff_3 == player.participant.le_2 and player.letter_vdiff_4 == player.participant.le_2 and player.letter_vdiff_5 == player.participant.le_3 and player.letter_vdiff_6 == player.participant.le_3 and player.letter_vdiff_7 == player.participant.le_4 and player.letter_vdiff_8 == player.participant.le_4 and player.letter_vdiff_9 == player.participant.le_5 and player.letter_vdiff_10 == player.participant.le_5 and player.letter_vdiff_11 == player.participant.le_6 and player.letter_vdiff_12 == player.participant.le_6: player.payoff = C.var_payment_vd class r2_Task_diab(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 6): return True else: return False @staticmethod def get_form_fields(player: Player): form_fields = ['letter_diab_1', 'letter_diab_2', 'letter_diab_3', 'letter_diab_4', 'letter_diab_5', 'letter_diab_6', 'letter_diab_7', 'letter_diab_8', 'letter_diab_9', 'letter_diab_10', 'letter_diab_11', 'letter_diab_12', ] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player: Player): return { 'round_number': player.round_number, 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, 'letter 4': player.participant.le_4, 'letter 5': player.participant.le_5, 'letter 6': player.participant.le_6, 'letter 7': player.participant.le_7, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_diab_1 == player.participant.le_1 and player.letter_diab_2 == player.participant.le_1 and player.letter_diab_3 == player.participant.le_2 and player.letter_diab_4 == player.participant.le_2 and player.letter_diab_5 == player.participant.le_3 and player.letter_diab_6 == player.participant.le_4 and player.letter_diab_7 == player.participant.le_5 and player.letter_diab_8 == player.participant.le_5 and player.letter_diab_9 == player.participant.le_6 and player.letter_diab_10 == player.participant.le_6 and player.letter_diab_11 == player.participant.le_7 and player.letter_diab_12 == player.participant.le_7: player.payoff = C.var_payment_di class r2_feedback_veasy(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 1): return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } class r2_feedback_easy(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 2): return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } class r2_feedback_medium(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 3): return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } class r2_feedback_diff(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 4): return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } class r2_feedback_vdiff(Page): form_model = 'player' timer_text = 'Time left to complete the task:' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 5): return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } class r2_feedback_diab(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' get_timeout_seconds = get_timeout_seconds @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } @staticmethod def is_displayed(player: Player): participant = player.participant if (get_timeout_seconds(player) > 1) and (participant.compl_group == 6): return True else: return False class r2_feedback_final(Page): form_model = 'player' get_timeout_seconds = get_timeout_seconds @staticmethod def is_displayed(player: Player): participant = player.participant if get_timeout_seconds(player) < 1: return True else: return False @staticmethod def vars_for_template(player: Player): all_players = player.in_all_rounds() combined_payoff = 0 for temp_player in all_players: combined_payoff += temp_player.payoff return { "combined_payoff": combined_payoff, "total_payoff": C.fixed_payment + combined_payoff } page_sequence = [r2_Instructions, r2_Task_veasy, r2_Task_easy, r2_Task_medium, r2_Task_diff, r2_Task_vdiff, r2_Task_diab, r2_feedback_veasy, r2_feedback_easy, r2_feedback_medium, r2_feedback_diff, r2_feedback_vdiff, r2_feedback_diab, r2_feedback_final,]