import random import itertools import time from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'Round1' 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) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): 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) tr_group = models.IntegerField() # FUNCTIONS def creating_session(subsession): #if subsession.round_number == 1: treatments = itertools.cycle([1, 2, 3, 4, 5, 6,]) for player in subsession.get_players(): player.tr_group = next(treatments) player.participant.tr_group = player.tr_group import random for player in subsession.get_players(): player.participant.le_1 = random.randint(0, 9) player.participant.le_2 = random.randint(0, 9) player.participant.le_3 = random.randint(0, 9) player.participant.le_4 = random.randint(0, 9) player.participant.le_5 = random.randint(0, 9) player.participant.le_6 = random.randint(0, 9) player.participant.le_7 = random.randint(0, 9) # PAGES def get_timeout_seconds(player): participant = player.participant import time return participant.expiry - time.time() class Instructions(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): if player.round_number == 1: return True else: return False class key(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): if player.round_number == 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, '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): participant = player.participant participant.expiry = time.time() + 6 * 60 class 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 (participant.tr_group == 1) and (get_timeout_seconds(player) > 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, 'round_number': player.round_number, } @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 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 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 (participant.tr_group == 2) and (get_timeout_seconds(player) > 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, 'letter 3': player.participant.le_3, 'round_number': player.round_number, } @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 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 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.tr_group == 3)) or ((get_timeout_seconds(player) > 1) and (participant.tr_group == 5)) or ((get_timeout_seconds(player) > 1) and (participant.tr_group == 6)): 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 { 'letter 1': player.participant.le_1, 'letter 2': player.participant.le_2, 'letter 3': player.participant.le_3, 'letter 4': player.participant.le_4, 'round_number': player.round_number, } @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 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 (participant.tr_group == 4) and (get_timeout_seconds(player) > 1): 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 { '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, 'round_number': player.round_number, } @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 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.tr_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 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.tr_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 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.tr_group == 3)) or ((get_timeout_seconds(player) > 1) and (participant.tr_group == 5)) or ((get_timeout_seconds(player) > 1) and (participant.tr_group == 6)): 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 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.tr_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 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 = [Instructions, key, Task_veasy, Task_easy, Task_medium, Task_diff, feedback_veasy, feedback_easy, feedback_medium, feedback_diff, feedback_final]