from otree.api import * import random import time doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Round2' PLAYERS_PER_GROUP = None NUM_ROUNDS = 70 fixed_payment = cu(3.00) var_payment_ve = cu(0.05) var_payment_e = cu(0.10) var_payment_m = cu(0.15) var_payment_d = cu(0.20) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): complexity = models.IntegerField(label = "Difficulty level (as per table above) - enter the corresponding number from 1 to 4", min=1, max=4) 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) def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() # PAGES class 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.compl_group = player.complexity participant.expiry = time.time() + 7*60 class Task_veasy(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 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 == 1 and player.letter_veasy_2 == 1 and player.letter_veasy_3 == 1 and player.letter_veasy_4 == 1 and player.letter_veasy_5 == 1 and player.letter_veasy_6 == 1 and player.letter_veasy_7 == 9 and player.letter_veasy_8 == 9 and player.letter_veasy_9 == 9 and player.letter_veasy_10 == 9 and player.letter_veasy_11 == 9 and player.letter_veasy_12 == 9: player.payoff = C.var_payment_ve class Task_easy(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 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 == 1 and player.letter_easy_2 == 1 and player.letter_easy_3 == 1 and player.letter_easy_4 == 1 and player.letter_easy_5 == 9 and player.letter_easy_6 == 9 and player.letter_easy_7 == 9 and player.letter_easy_8 == 9 and player.letter_easy_9 == 5 and player.letter_easy_10 == 5 and player.letter_easy_11 == 5 and player.letter_easy_12 == 5: player.payoff = C.var_payment_e class Task_medium(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_med_1 == 1 and player.letter_med_2 == 1 and player.letter_med_3 == 1 and player.letter_med_4 == 9 and player.letter_med_5 == 9 and player.letter_med_6 == 9 and player.letter_med_7 == 5 and player.letter_med_8 == 5 and player.letter_med_9 == 5 and player.letter_med_10 == 6 and player.letter_med_11 == 6 and player.letter_med_12 == 6: player.payoff = C.var_payment_m class Task_diff(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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, } @staticmethod def before_next_page(player: Player, timeout_happened): if player.letter_diff_1 == 1 and player.letter_diff_2 == 1 and player.letter_diff_3 == 1 and player.letter_diff_4 == 9 and player.letter_diff_5 == 9 and player.letter_diff_6 == 5 and player.letter_diff_7 == 5 and player.letter_diff_8 == 6 and player.letter_diff_9 == 6 and player.letter_diff_10 == 4 and player.letter_diff_11 == 4 and player.letter_diff_12 == 4: player.payoff = C.var_payment_d class feedback_veasy(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 class feedback_easy(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 class feedback_medium(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 class feedback_diff(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 class feedback_final(Page): form_model = 'player' timer_text = 'Time left to complete the task round:' 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 = [Instructions, Task_veasy, Task_easy, Task_medium, Task_diff, feedback_veasy, feedback_easy, feedback_medium, feedback_diff, feedback_final,]