from otree.api import * import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'message_pretest' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 Message_1= 'You have transcribed X letters correctly in this round. Congratulations! ' Message_2 = 'You have transcribed X letters correctly in this round.' Message_3 = 'You have transcribed X letters correctly in this round. You could do better.' Message_4 = 'You have transcribed X letters correctly in this round. Congratulations! ' \ 'If you slow down a little, your accuracy may improve.' Message_5 = 'You have transcribed X letters correctly in this round. ' \ 'If you slow down a little, your accuracy may improve.' Message_6 = 'You have transcribed X letters correctly in this round. You could do better. ' \ 'If you slow down a little, your accuracy may improve.' Message_7 = 'You have transcribed X letters correctly in this round. Congratulations! ' \ 'If you speed up, you can still maintain your accuracy.' Message_8 = 'You have transcribed X letters correctly in this round. ' \ 'If you speed up, you can still maintain your accuracy.' Message_9 = 'You have transcribed X letters correctly in this round. You could do better. ' \ 'If you speed up, you can still maintain your accuracy.' Message_list1 = [Message_2, Message_6, Message_7, Message_5, Message_4, Message_1, Message_3, Message_9, Message_8] Message_list2 = [Message_7, Message_3, Message_6,Message_8, Message_9, Message_1, Message_4, Message_5, Message_2] Message_list3 = [Message_1, Message_7, Message_9, Message_8, Message_4, Message_6, Message_2, Message_5, Message_3] Message_list4 = [Message_8, Message_3, Message_7, Message_2, Message_6, Message_1, Message_4, Message_9, Message_5] Message_list5 = [Message_2, Message_4, Message_3, Message_6, Message_8, Message_5, Message_9, Message_1, Message_7] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): attention = models.IntegerField(min=0, max=1, initial=0) Num_Attempts = models.IntegerField(initial=1) Attention_content = models.IntegerField() List_number = models.IntegerField(initial=0) ProlificID = models.StringField() ProlificID_2 = models.StringField() Gender = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'Male'], [2, 'Female'], [3, 'Non-binary / gender diverse'], [4, 'Prefer not to say']]) # Referring to US CPS survey Race = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'White '], [2, 'Black or African American'], [3, 'American Indian or Alaska Native'], [4, 'Asian'], [5, 'Native Hawaiian or Other Pacific Islander'], [6, 'Other']]) YOB = models.IntegerField(min=1923, max=2023) Nationality = models.StringField() # Referring to US CPS survey Education = models.StringField(widget=widgets.RadioSelect, choices=['Less than High School', 'High school completion', "Some colleges or associate's degree", "Bachelor's degree", 'Advanced degree']) enroll = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'Yes'], [0, 'No']]) Comprehension_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '2 rounds'], [2, '3 rounds'], [3, '10 rounds'], [4, '6 rounds']]) Comprehension_2 = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '24 ECUs'], [2, '16 ECUs'], [3, '32 ECUs'], [4, '10 ECUs']]) Comprehension_3 = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '$ 4.00'], [2, '$ 2.00'], [3, '$ 5.00'], [4, '$ 3.00']]) Belief_1 = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, 'Males'], [2, 'Females'], [3, 'No difference']]) Belief_2a = models.IntegerField(min=0, max=75) Belief_2b = models.IntegerField(min=0, max=75) Belief_2c = models.IntegerField(min=0, max=75) Guess_1a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_1b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_2a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_2b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_3a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_3b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_4a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_4b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_5a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_5b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_6a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_6b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_7a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_7b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_8a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_8b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) Guess_9a = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely negative'], [2, '2 = Somewhat negative'], [3, '3 = Neutral, neither negative nor positive'], [4, '4 = Somewhat positive'], [5, '5 = Extremely positive']]) Guess_9b = models.IntegerField(widget=widgets.RadioSelect, choices=[[1, '1 = Extremely unconstructive'], [2, '2 = Somewhat unconstructive'], [3, '3 = Neutral, neither constructive nor unconstructive'], [4, '4 = Somewhat constructive'], [5, '5 = Extremely constructive']]) # PAGES class Consent(Page): form_model = 'player' form_fields = ['ProlificID', 'enroll'] class Consent_Completion(Page): @staticmethod def is_displayed(player): return player.enroll == 0 class General_Instruction(Page): @staticmethod def is_displayed(player): return player.enroll == 1 class Comprehension_test(Page): form_model = 'player' form_fields = ['Comprehension_1', 'Comprehension_2', 'Comprehension_3'] @staticmethod def is_displayed(player): return player.enroll == 1 @staticmethod def error_message(player: Player, values): solutions = dict(Comprehension_1=2, Comprehension_2=1, Comprehension_3=4) if values != solutions: player.Num_Attempts += 1 return "One or more answers were incorrect." class Attention_check(Page): form_model = 'player' form_fields = ['Attention_content'] @staticmethod def is_displayed(player): return player.enroll == 1 @staticmethod def before_next_page(player, timeout_happened): if player.Attention_content == 3: player.attention += 1 class Attention_Completion(Page): @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 0 class Task1(Page): form_model = 'player' form_fields = ['Belief_1', 'Belief_2a', 'Belief_2b', 'Belief_2c'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def error_message(player, values): if values['Belief_2a'] + values['Belief_2b'] + values['Belief_2c'] != 75: return 'The total must sum up to 75 for question 2' class Task2(Page): @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def before_next_page(player, timeout_happened): player.List_number=random.randint(1,5) class Message_1(Page): form_model = 'player' form_fields = ['Guess_1a', 'Guess_1b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[0]) elif player.List_number == 2: return dict(Message=C.Message_list2[0]) elif player.List_number == 3: return dict(Message=C.Message_list3[0]) elif player.List_number == 4: return dict(Message=C.Message_list4[0]) else: return dict(Message=C.Message_list5[0]) class Message_2(Page): form_model = 'player' form_fields = ['Guess_2a', 'Guess_2b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[1]) elif player.List_number == 2: return dict(Message=C.Message_list2[1]) elif player.List_number == 3: return dict(Message=C.Message_list3[1]) elif player.List_number == 4: return dict(Message=C.Message_list4[1]) else: return dict(Message=C.Message_list5[1]) class Message_3(Page): form_model = 'player' form_fields = ['Guess_3a', 'Guess_3b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[2]) elif player.List_number == 2: return dict(Message=C.Message_list2[2]) elif player.List_number == 3: return dict(Message=C.Message_list3[2]) elif player.List_number == 4: return dict(Message=C.Message_list4[2]) else: return dict(Message=C.Message_list5[2]) class Message_4(Page): form_model = 'player' form_fields = ['Guess_4a', 'Guess_4b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[3]) elif player.List_number == 2: return dict(Message=C.Message_list2[3]) elif player.List_number == 3: return dict(Message=C.Message_list3[3]) elif player.List_number == 4: return dict(Message=C.Message_list4[3]) else: return dict(Message=C.Message_list5[3]) class Message_5(Page): form_model = 'player' form_fields = ['Guess_5a', 'Guess_5b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[4]) elif player.List_number == 2: return dict(Message=C.Message_list2[4]) elif player.List_number == 3: return dict(Message=C.Message_list3[4]) elif player.List_number == 4: return dict(Message=C.Message_list4[4]) else: return dict(Message=C.Message_list5[4]) class Message_6(Page): form_model = 'player' form_fields = ['Guess_6a', 'Guess_6b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[5]) elif player.List_number == 2: return dict(Message=C.Message_list2[5]) elif player.List_number == 3: return dict(Message=C.Message_list3[5]) elif player.List_number == 4: return dict(Message=C.Message_list4[5]) else: return dict(Message=C.Message_list5[5]) class Message_7(Page): form_model = 'player' form_fields = ['Guess_7a', 'Guess_7b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message = C.Message_list1[6]) elif player.List_number == 2: return dict(Message=C.Message_list2[6]) elif player.List_number == 3: return dict(Message=C.Message_list3[6]) elif player.List_number == 4: return dict(Message=C.Message_list4[6]) else: return dict(Message=C.Message_list5[6]) class Message_8(Page): form_model = 'player' form_fields = ['Guess_8a', 'Guess_8b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message=C.Message_list1[7]) elif player.List_number == 2: return dict(Message=C.Message_list2[7]) elif player.List_number == 3: return dict(Message=C.Message_list3[7]) elif player.List_number == 4: return dict(Message=C.Message_list4[7]) else: return dict(Message=C.Message_list5[7]) class Message_9(Page): form_model = 'player' form_fields = ['Guess_9a', 'Guess_9b'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 @staticmethod def vars_for_template(player): if player.List_number == 1: return dict(Message=C.Message_list1[8]) elif player.List_number == 2: return dict(Message=C.Message_list2[8]) elif player.List_number == 3: return dict(Message=C.Message_list3[8]) elif player.List_number == 4: return dict(Message=C.Message_list4[8]) else: return dict(Message=C.Message_list5[8]) class Survey(Page): form_model = 'player' form_fields = ['Gender', 'Race', 'YOB', 'Nationality', 'Education', 'ProlificID_2'] @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 class End_Page(Page): @staticmethod def is_displayed(player): return player.enroll == 1 and player.attention == 1 page_sequence = [Consent, Consent_Completion, General_Instruction, Comprehension_test, Attention_check, Attention_Completion, Task1, Task2, Message_1, Message_2, Message_3, Message_4, Message_5, Message_6, Message_7, Message_8, Message_9, Survey, End_Page]