from otree.api import * # Import information about treatments from static_data.treatments import treatments import time doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'risk' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # Comprehension Questions compQ_1 = models.StringField() compQ_2 = models.StringField() compQ_3 = models.StringField() compQ_4 = models.StringField() compQ_5 = models.StringField() compQ_6 = models.StringField() compQ_7 = models.StringField() compQ_8 = models.StringField() # Attention Check attention_check_done = models.BooleanField(initial=False) attention_check = models.StringField(initial="-9999") # Risk outcomes singleRiskOutcomes = models.LongStringField() repeatedRiskOutcomes = models.LongStringField() # PAGES class singleRisk(Page): form_model = "player" form_fields = ["compQ_1", "compQ_2"] @staticmethod def is_displayed(player): return not player.participant.timeoutHappened @staticmethod def live_method(player, data): player.singleRiskOutcomes = str(data) @staticmethod def js_vars(player): return dict( winProb = player.session.config["winProb"], upTick = player.session.config["upTick_Intro"], min_time_on_page = player.session.config["min_time_on_page_instructions"], wait_time = player.session.config["time_after_wrong_comp"], testing = player.session.config["testing"], user_chosen_decision = player.participant.bf, ) @staticmethod def vars_for_template(player): return dict( winProb = player.session.config["winProb"], upTick = '£%.2f' % player.session.config["upTick_Intro"], downTick = '£%.2f' % player.session.config["upTick_Intro"], testing = player.session.config["testing"], ) @staticmethod def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() @staticmethod def before_next_page(player, timeout_happened): if timeout_happened: player.participant.timeoutHappened = True player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 class repeatedRisk(Page): form_model = "player" form_fields = ["compQ_3", "compQ_4"] @staticmethod def is_displayed(player): return not player.participant.timeoutHappened @staticmethod def live_method(player, data): player.repeatedRiskOutcomes = str(data) @staticmethod def js_vars(player): return dict( winProb = player.session.config["winProb"], upTick = player.session.config["upTick_Intro"], min_time_on_page = player.session.config["min_time_on_page_instructions"], wait_time = player.session.config["time_after_wrong_comp"], testing = player.session.config["testing"], user_chosen_decision = player.participant.bf, ) @staticmethod def vars_for_template(player): return dict( winProb = player.session.config["winProb"], upTick = '£%.2f' % player.session.config["upTick_Intro"], downTick = '£%.2f' % player.session.config["upTick_Intro"], testing = player.session.config["testing"], ) @staticmethod def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() @staticmethod def before_next_page(player, timeout_happened): if timeout_happened: player.participant.timeoutHappened = True player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 class riskComp(Page): form_model = "player" form_fields = [ "compQ_5", "compQ_6", "compQ_7", "compQ_8", ] @staticmethod def is_displayed(player): return not player.participant.timeoutHappened @staticmethod def js_vars(player): return dict( winProb = player.session.config["winProb"], upTick = player.session.config["upTick_Intro"], min_time_on_page = player.session.config["min_time_on_page_instructions"], wait_time = player.session.config["time_after_wrong_comp"], testing = player.session.config["testing"], ) @staticmethod def vars_for_template(player): return dict( testing = player.session.config["testing"], ) @staticmethod def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() @staticmethod def before_next_page(player, timeout_happened): if timeout_happened: player.participant.timeoutHappened = True player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 class atnQuest(Page): @staticmethod def is_displayed(player): return not player.participant.timeoutHappened @staticmethod def live_method(player, data): player.attention_check_done = True player.attention_check = str(data) return {player.id_in_group: data} # Send data back @staticmethod def vars_for_template(player: Player): return dict( testing = player.session.config["testing"], ) @staticmethod def js_vars(player: Player): return dict( stopEntry = player.attention_check_done, submittedAnswer = player.attention_check, ) @staticmethod def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() @staticmethod def before_next_page(player, timeout_happened): if player.attention_check == str(False): player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 if timeout_happened: player.participant.timeoutHappened = True player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 @staticmethod def app_after_this_page(player, upcoming_apps): if player.attention_check == str(True): return treatments[player.participant.treatment][1] # Gives name of study class exitPage(Page): @staticmethod def is_displayed(player): return player.attention_check == str(False) and not player.participant.timeoutHappened# Need to keep string here @staticmethod def vars_for_template(player: Player): return dict( testing = player.session.config["testing"], ) @staticmethod def get_timeout_seconds(player): participant = player.participant return participant.expiry - time.time() @staticmethod def before_next_page(player, timeout_happened): if timeout_happened: player.participant.timeoutHappened = True player.session.dropouts.append(player.participant.treatment) player.session.actives[player.participant.treatment] = player.session.actives[player.participant.treatment] - 1 page_sequence = [ singleRisk, repeatedRisk, riskComp, atnQuest, exitPage ]