import random import time from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'online_V1' PLAYERS_PER_GROUP = None tasks = ['2', '3', '4'] NUM_ROUNDS = 1 point_increase = 1000 point_same = 1000 point_decrease = 1000 max_lottery_value = 1 conversion = 2000 fee = 1 def creating_session(subsession): import itertools pressures = itertools.cycle([True, False]) for player in subsession.get_players(): player.time_pressure = next(pressures) player.sequence = random.choice([1, 2, 3, 4, 5, 6]) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): time_pressure = models.BooleanField() sequence = models.IntegerField() # Time record t_welcome = models.FloatField() t_instructionurn = models.FloatField() t_compre = models.FloatField() t_instructionurn_2 = models.FloatField() t_compre_2 = models.FloatField() t_instructionurn_3 = models.FloatField() t_compre_3 = models.FloatField() t_instructiontask = models.FloatField() t_feedback0 = models.FloatField() t_feedback5 = models.FloatField() t_cemain = models.FloatField() t_instructionbelief = models.FloatField() t_attention = models.FloatField() t_instructionbelief_2 = models.FloatField() t_attention_2 = models.FloatField() t_increase = models.FloatField() t_same = models.FloatField() t_decrease = models.FloatField() t_ce50 = models.FloatField() # Comprehension questions num_fail = models.IntegerField(initial=0) num_fail_2 = models.IntegerField(initial=0) num_fail_3 = models.BooleanField(initial=False) fail_too_many = models.BooleanField(initial=False) fail_too_many_2 = models.BooleanField(initial=False) fail_too_many_3 = models.BooleanField(initial=False) ans1 = models.IntegerField( choices=[[0, 'Yes'], [1, 'No']], label='You know the probability that you have a good asset.', widget=widgets.RadioSelect, ) ans2 = models.IntegerField( choices=[[0, 'Yes'], [1, 'No']], label='The Good Urn contains only blue balls.', widget=widgets.RadioSelect, ) ans3 = models.IntegerField( choices=[[1, 'Yes'], [0, 'No']], label='A blue ball can be drawn from the Bad Urn.', widget=widgets.RadioSelect, ) ans4 = models.IntegerField( choices=[[1, 'Yes'], [0, 'No']], label='A red ball is more likely to be drawn from the Bad Urn than from the Good Urn.', widget=widgets.RadioSelect, ) # L1 = models.IntegerField() # L2 = models.IntegerField() # L3 = models.IntegerField() # L4 = models.IntegerField() # L5 = models.IntegerField() task = models.IntegerField() attention = models.IntegerField(label='What is 2 + 2?') attention_2 = models.IntegerField(label='What is 2 + 2?') # Feedback urn = models.StringField() d_qrt1 = models.IntegerField() d_qrt2 = models.IntegerField() d_qrt3 = models.IntegerField() d_qrt4 = models.IntegerField() d_qrt5 = models.IntegerField() d_qrt6 = models.IntegerField() d_qrt7 = models.IntegerField() d_qrt8 = models.IntegerField() qrt1 = models.IntegerField() qrt2 = models.IntegerField() qrt3 = models.IntegerField() qrt4 = models.IntegerField() qrt5 = models.IntegerField() qrt6 = models.IntegerField() qrt7 = models.IntegerField() qrt8 = models.IntegerField() CE_max = models.IntegerField() CE_min = models.IntegerField() # Elicitation(CE) choice_CE1 = models.StringField() choice_CE2 = models.StringField() choice_CE3 = models.StringField() choice_CE4 = models.StringField() choice_CE5 = models.StringField() choice_CE6 = models.StringField() choice_CE7 = models.StringField() choice_CE8 = models.StringField() choice_CE9 = models.StringField() choice_CE10 = models.StringField() choice_CE11 = models.StringField() choice_CE12 = models.StringField() choice_CE13 = models.StringField() choice_CE14 = models.StringField() choice_CE15 = models.StringField() choice_CE16 = models.StringField() choice_CE17 = models.StringField() choice_CE18 = models.StringField() choice_CE19 = models.StringField() choice_CE20 = models.StringField() choice_CE21 = models.StringField() CE1 = models.IntegerField() CE2 = models.IntegerField() CE3 = models.IntegerField() CE4 = models.IntegerField() CE5 = models.IntegerField() CE6 = models.IntegerField() CE7 = models.IntegerField() CE8 = models.IntegerField() CE9 = models.IntegerField() CE10 = models.IntegerField() CE11 = models.IntegerField() CE12 = models.IntegerField() CE13 = models.IntegerField() CE14 = models.IntegerField() CE15 = models.IntegerField() CE16 = models.IntegerField() CE17 = models.IntegerField() CE18 = models.IntegerField() CE19 = models.IntegerField() CE20 = models.IntegerField() CE21 = models.IntegerField() switching_point_CE = models.IntegerField() picked_CE = models.IntegerField() picked_choice_CE = models.StringField() point_CE = models.IntegerField() # Elicitation(Increase, Same, Decrease) choice_increase1 = models.StringField() choice_increase2 = models.StringField() choice_increase3 = models.StringField() choice_increase4 = models.StringField() choice_increase5 = models.StringField() choice_increase6 = models.StringField() choice_increase7 = models.StringField() choice_increase8 = models.StringField() choice_increase9 = models.StringField() choice_increase10 = models.StringField() choice_increase11 = models.StringField() choice_increase12 = models.StringField() choice_increase13 = models.StringField() choice_increase14 = models.StringField() choice_increase15 = models.StringField() choice_increase16 = models.StringField() choice_increase17 = models.StringField() choice_increase18 = models.StringField() choice_increase19 = models.StringField() choice_increase20 = models.StringField() switching_point_increase = models.IntegerField() picked_increase = models.IntegerField() picked_choice_increase = models.StringField() point_increase = models.IntegerField() choice_same1 = models.StringField() choice_same2 = models.StringField() choice_same3 = models.StringField() choice_same4 = models.StringField() choice_same5 = models.StringField() choice_same6 = models.StringField() choice_same7 = models.StringField() choice_same8 = models.StringField() choice_same9 = models.StringField() choice_same10 = models.StringField() choice_same11 = models.StringField() choice_same12 = models.StringField() choice_same13 = models.StringField() choice_same14 = models.StringField() choice_same15 = models.StringField() choice_same16 = models.StringField() choice_same17 = models.StringField() choice_same18 = models.StringField() choice_same19 = models.StringField() choice_same20 = models.StringField() switching_point_same = models.IntegerField() picked_same = models.IntegerField() picked_choice_same = models.StringField() point_same = models.IntegerField() choice_decrease1 = models.StringField() choice_decrease2 = models.StringField() choice_decrease3 = models.StringField() choice_decrease4 = models.StringField() choice_decrease5 = models.StringField() choice_decrease6 = models.StringField() choice_decrease7 = models.StringField() choice_decrease8 = models.StringField() choice_decrease9 = models.StringField() choice_decrease10 = models.StringField() choice_decrease11 = models.StringField() choice_decrease12 = models.StringField() choice_decrease13 = models.StringField() choice_decrease14 = models.StringField() choice_decrease15 = models.StringField() choice_decrease16 = models.StringField() choice_decrease17 = models.StringField() choice_decrease18 = models.StringField() choice_decrease19 = models.StringField() choice_decrease20 = models.StringField() switching_point_decrease = models.IntegerField() picked_decrease = models.IntegerField() picked_choice_decrease = models.StringField() point_decrease = models.IntegerField() point = models.FloatField() bonus = models.FloatField() Y = models.FloatField() # post-experiment survey CE_50 = models.FloatField(min=0, max=100, label='1. Suppose you have a lottery with a 50% chance of paying £0 and a 50% chance of paying £1. ' 'Please enter the amount you would be willing to sell the lottery for, by typing in a number between 0 and 100 pence.') fn1 = models.IntegerField( choices=[[0, 'More'], [1, 'Less'], [0, 'Same']], label='2. Imagine that a year ago you deposited money in a bank account with 8% interest rate, while the annual inflation rate was 10%. ' 'Do you think the money from your account can now buy more, less, or the same amount of goods and services on average compared to a year ago?', widget=widgets.RadioSelect, ) fn2 = models.FloatField( label='3. You lend £100 to a friend one evening and he repays you £100 the next day. How much interest does he pay on this loan? Please type a number.', ) fn3 = models.IntegerField( choices=[[1, 'Yes'], [0, 'No']], label='4. An investment with a high return is likely to be high risk.', widget=widgets.RadioSelect, ) fn4 = models.IntegerField( choices=[[1, 'Yes'], [0, 'No']], label='5. It is usually possible to reduce the risk of investing in the stock market by buying a wide range of stocks and shares.', widget=widgets.RadioSelect, ) fn5 = models.FloatField( label=' Please type a number (£).' ) fn6 = models.IntegerField( choices=[[1, 'More than £110'], [0, 'Exactly £110'], [0, 'Less than £110']], label=' And how much would be in the account at the end of five years?', widget=widgets.RadioSelect, ) risk1 = models.IntegerField( choices=[[0, 'Strongly agree'], [1, 'Agree'], [2, 'Neutral'], [3, 'Disagree'], [4, 'Strongly disagree']], label='1. People who know me would describe me as a cautious person.', widget=widgets.RadioSelect, ) risk2 = models.IntegerField( choices=[[0, 'Strongly agree'], [1, 'Agree'], [2, 'Neutral'], [3, 'Disagree'], [4, 'Strongly disagree']], label='2. I generally look for safer investments, even if that means lower returns.', widget=widgets.RadioSelect, ) risk3 = models.IntegerField( choices=[[0, 'Strongly agree'], [1, 'Agree'], [2, 'Neutral'], [3, 'Disagree'], [4, 'Strongly disagree']], label='3. I have little experience of investing in stocks and shares.', widget=widgets.RadioSelect, ) risk4 = models.IntegerField( choices=[[0, 'Strongly agree'], [1, 'Agree'], [2, 'Neutral'], [3, 'Disagree'], [4, 'Strongly disagree']], label='4. I am not comfortable with the ups and downs of stock market investments.', widget=widgets.RadioSelect, ) # PAGES class Welcome(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_welcome = time.time() class InstructionUrns(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_instructionurn = time.time() class ComprehensionQ(Page): form_model = 'player' form_fields = ['ans1', 'ans2', 'ans3', 'ans4'] @staticmethod def before_next_page(player, timeout_happened): player.t_compre = time.time() def error_message(player, values): if values['ans1'] != 1 or values['ans2'] != 1 or values['ans3'] != 1 or values['ans4'] != 1: player.num_fail += 1 if player.num_fail >= 5: player.fail_too_many = True else: return 'One or more of your answers are wrong. Please answer again.' class InstructionUrns_2(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_instructionurn_2 = time.time() def is_displayed(player: Player): return player.fail_too_many class ComprehensionQ_2(Page): form_model = 'player' form_fields = ['ans1', 'ans2', 'ans3', 'ans4'] @staticmethod def is_displayed(player: Player): return player.fail_too_many def before_next_page(player, timeout_happened): player.t_compre_2 = time.time() def error_message(player, values): if values['ans1'] != 1 or values['ans2'] != 1 or values['ans3'] != 1 or values['ans4'] != 1: player.num_fail_2 += 1 if player.num_fail_2 >= 5: player.fail_too_many_2 = True else: return 'One or more of your answers are wrong. Please answer again.' class InstructionUrns_3(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_instructionurn_3 = time.time() def is_displayed(player: Player): return player.fail_too_many_2 class ComprehensionQ_3(Page): form_model = 'player' form_fields = ['ans1', 'ans2', 'ans3', 'ans4'] @staticmethod def is_displayed(player: Player): return player.fail_too_many_2 def before_next_page(player, timeout_happened): player.t_compre_3 = time.time() def error_message(player, values): solutions = dict( ans1=1, ans2=1, ans3=1, ans4=1 ) custom_error_messages = dict( ans1="Your answer is wrong. The instructions do not specify the probability that the computer will select a good or bad asset.", ans2="Your answer is wrong. The Good Urn contains 3 blue balls and 1 red ball.", ans3="Your answer is wrong. A blue ball can be drawn from the Bad Urn which contains 3 red balls and 1 blue ball.", ans4="Your answer is wrong. A red ball is more likely to be drawn from the Bad Urn because the Bad Urn contains 3 red balls while the Good Urn contains only 1 red ball." ) error_messages = dict() for field_name in solutions: if values[field_name] != solutions[field_name]: error_messages[field_name] = custom_error_messages[field_name] return error_messages class InstructionTask(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_instructiontask = time.time() class Feedback0(Page): timeout_seconds = 1 @staticmethod def before_next_page(player, timeout_happened): player.t_feedback0 = time.time() player.urn = random.choice(['g', 'b']) if player.urn == 'g': player.d_qrt1 = random.choice([100, 100, 100, -100]) player.d_qrt2 = random.choice([100, 100, 100, -100]) player.d_qrt3 = random.choice([100, 100, 100, -100]) player.d_qrt4 = random.choice([100, 100, 100, -100]) player.d_qrt5 = random.choice([100, 100, 100, -100]) player.d_qrt6 = random.choice([100, 100, 100, -100]) player.d_qrt7 = random.choice([100, 100, 100, -100]) player.d_qrt8 = random.choice([100, 100, 100, -100]) else: player.d_qrt1 = random.choice([100, -100, -100, -100]) player.d_qrt2 = random.choice([100, -100, -100, -100]) player.d_qrt3 = random.choice([100, -100, -100, -100]) player.d_qrt4 = random.choice([100, -100, -100, -100]) player.d_qrt5 = random.choice([100, -100, -100, -100]) player.d_qrt6 = random.choice([100, -100, -100, -100]) player.d_qrt7 = random.choice([100, -100, -100, -100]) player.d_qrt8 = random.choice([100, -100, -100, -100]) player.qrt1 = 1000 + player.d_qrt1 player.qrt2 = player.qrt1 + player.d_qrt2 player.qrt3 = player.qrt2 + player.d_qrt3 player.qrt4 = player.qrt3 + player.d_qrt4 player.qrt5 = player.qrt4 + player.d_qrt5 player.qrt6 = player.qrt5 + player.d_qrt6 player.qrt7 = player.qrt6 + player.d_qrt7 player.qrt8 = player.qrt7 + player.d_qrt8 player.CE_max = player.qrt4 + 400 player.CE_min = player.qrt4 - 400 player.CE1 = player.qrt4 + 400 player.CE2 = player.CE1 - 40 player.CE3 = player.CE2 - 40 player.CE4 = player.CE3 - 40 player.CE5 = player.CE4 - 40 player.CE6 = player.CE5 - 40 player.CE7 = player.CE6 - 40 player.CE8 = player.CE7 - 40 player.CE9 = player.CE8 - 40 player.CE10 = player.CE9 - 40 player.CE11 = player.CE10 - 40 player.CE12 = player.CE11 - 40 player.CE13 = player.CE12 - 40 player.CE14 = player.CE13 - 40 player.CE15 = player.CE14 - 40 player.CE16 = player.CE15 - 40 player.CE17 = player.CE16 - 40 player.CE18 = player.CE17 - 40 player.CE19 = player.CE18 - 40 player.CE20 = player.CE19 - 40 player.CE21 = player.CE20 - 40 class Feedback1(Page): timeout_seconds = 4 @staticmethod def before_next_page(player, timeout_happened): player.urn = random.choice(['g', 'b']) # player.L1 = random.randint(player.CE_min, player.CE_max) # player.L2 = random.randint(0, 100) # player.L3 = random.randint(0, 100) # player.L4 = random.randint(0, 100) player.task = random.choice([1, 2, 3, 4]) class Feedback1_5(Page): timeout_seconds = 1 class Feedback2(Page): timeout_seconds = 4 class Feedback2_5(Page): timeout_seconds = 1 class Feedback3(Page): timeout_seconds = 4 class Feedback3_5(Page): timeout_seconds = 1 class Feedback4(Page): timeout_seconds = 4 class Feedback4_5(Page): timeout_seconds = 1 class Feedback5(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_feedback5 = time.time() class CEmain(Page): form_model = 'player' form_fields = ['switching_point_CE', 'choice_CE1', 'choice_CE2', 'choice_CE3', 'choice_CE4', 'choice_CE5', 'choice_CE6', 'choice_CE7', 'choice_CE8', 'choice_CE9', 'choice_CE10', 'choice_CE11', 'choice_CE12', 'choice_CE13', 'choice_CE14', 'choice_CE15', 'choice_CE16', 'choice_CE17', 'choice_CE18', 'choice_CE19', 'choice_CE20', 'choice_CE21'] @staticmethod def before_next_page(player, timeout_happened): player.t_cemain = time.time() CE_choice = [(player.CE1, player.choice_CE1), (player.CE2, player.choice_CE2), (player.CE3, player.choice_CE3), (player.CE4, player.choice_CE4), (player.CE5, player.choice_CE5), (player.CE6, player.choice_CE6), (player.CE7, player.choice_CE7), (player.CE8, player.choice_CE8), (player.CE9, player.choice_CE9), (player.CE10, player.choice_CE10), (player.CE11, player.choice_CE11), (player.CE12, player.choice_CE12), (player.CE13, player.choice_CE13), (player.CE14, player.choice_CE14), (player.CE15, player.choice_CE15), (player.CE16, player.choice_CE16), (player.CE17, player.choice_CE17), (player.CE18, player.choice_CE18), (player.CE19, player.choice_CE19), (player.CE20, player.choice_CE20), (player.CE21, player.choice_CE21)] player.picked_CE, player.picked_choice_CE = random.choice(CE_choice) if player.picked_choice_CE == 'left': player.point_CE = player.picked_CE else: player.point_CE = player.qrt8 # @staticmethod # def error_message(player, values): # solutions = dict( # range(player.CE_min, player.CE_max) # ) # error_messages = dict() # for field_name in solutions: # if values[field_name] != solutions[field_name]: # error_messages[field_name] = 'Please report the amount within the specified range' # return error_messages class InstructionBelief(Page): @staticmethod def before_next_page(player, timeout_happened): player.t_instructionbelief = time.time() class AttentionCheck(Page): form_model = 'player' form_fields = ['attention'] @staticmethod def before_next_page(player, timeout_happened): player.t_attention = time.time() def error_message(player, values): if values['attention'] != 10: player.num_fail_3 = True class AttentionCorrect(Page): pass class InstructionBelief_2(Page): @staticmethod def is_displayed(player: Player): return player.num_fail_3 def before_next_page(player, timeout_happened): player.t_instructionbelief_2 = time.time() class AttentionWrong(Page): @staticmethod def is_displayed(player: Player): return player.num_fail_3 def before_next_page(player, timeout_happened): player.t_attention_2 = time.time() class AttentionCheck_2(Page): form_model = 'player' form_fields = ['attention_2'] @staticmethod def is_displayed(player: Player): return player.num_fail_3 def before_next_page(player, timeout_happened): player.t_increase = time.time() class Increase1(Page): form_model = 'player' form_fields = ['switching_point_increase', 'choice_increase1', 'choice_increase2', 'choice_increase3', 'choice_increase4', 'choice_increase5', 'choice_increase6', 'choice_increase7', 'choice_increase8', 'choice_increase9', 'choice_increase10', 'choice_increase11', 'choice_increase12', 'choice_increase13', 'choice_increase14', 'choice_increase15', 'choice_increase16', 'choice_increase17', 'choice_increase18', 'choice_increase19', 'choice_increase20'] @staticmethod def is_displayed(player: Player): return player.sequence in [1, 2] def before_next_page(player, timeout_happened): player.t_increase = time.time() increase_choice = [(100, player.choice_increase1), (85, player.choice_increase2), (75, player.choice_increase3), (70, player.choice_increase4), (65, player.choice_increase5), (60, player.choice_increase6), (55, player.choice_increase7), (50, player.choice_increase8), (45, player.choice_increase9), (40, player.choice_increase10), (35, player.choice_increase11), (30, player.choice_increase12), (25, player.choice_increase13), (20, player.choice_increase14), (15, player.choice_increase15), (10, player.choice_increase16), (5, player.choice_increase17), (2, player.choice_increase18), (1, player.choice_increase19), (0, player.choice_increase20)] player.picked_increase, player.picked_choice_increase = random.choice(increase_choice) if player.picked_choice_increase == 'left': Y = random.choices([C.point_increase, 0], weights=[player.picked_increase, 100 - player.picked_increase], k=1) player.point_increase = random.choice(Y) else: if player.qrt8 > player.qrt4: player.point_increase = C.point_increase else: player.point_increase = 0 class Same1(Page): form_model = 'player' form_fields = ['switching_point_same', 'choice_same1', 'choice_same2', 'choice_same3', 'choice_same4', 'choice_same5', 'choice_same6', 'choice_same7', 'choice_same8', 'choice_same9', 'choice_same10', 'choice_same11', 'choice_same12', 'choice_same13', 'choice_same14', 'choice_same15', 'choice_same16', 'choice_same17', 'choice_same18', 'choice_same19', 'choice_same20'] @staticmethod def is_displayed(player: Player): return player.sequence in [1, 3, 4] def before_next_page(player, timeout_happened): player.t_same = time.time() same_choice = [(100, player.choice_same1), (85, player.choice_same2), (75, player.choice_same3), (70, player.choice_same4), (65, player.choice_same5), (60, player.choice_same6), (55, player.choice_same7), (50, player.choice_same8), (45, player.choice_same9), (40, player.choice_same10), (35, player.choice_same11), (30, player.choice_same12), (25, player.choice_same13), (20, player.choice_same14), (15, player.choice_same15), (10, player.choice_same16), (5, player.choice_same17), (2, player.choice_same18), (1, player.choice_same19), (0, player.choice_same20)] player.picked_same, player.picked_choice_same = random.choice(same_choice) if player.picked_choice_same == 'left': Y = random.choices([C.point_same, 0], weights=[player.picked_same, 100 - player.picked_same], k=1) player.point_same = random.choice(Y) else: if player.qrt8 == player.qrt4: player.point_same = C.point_same else: player.point_same = 0 class Decrease1(Page): form_model = 'player' form_fields = ['switching_point_decrease', 'choice_decrease1', 'choice_decrease2', 'choice_decrease3', 'choice_decrease4', 'choice_decrease5', 'choice_decrease6', 'choice_decrease7', 'choice_decrease8', 'choice_decrease9', 'choice_decrease10', 'choice_decrease11', 'choice_decrease12', 'choice_decrease13', 'choice_decrease14', 'choice_decrease15', 'choice_decrease16', 'choice_decrease17', 'choice_decrease18', 'choice_decrease19', 'choice_decrease20'] @staticmethod def is_displayed(player: Player): return player.sequence in [1, 2, 4, 5, 6] def before_next_page(player, timeout_happened): player.t_decrease = time.time() decrease_choice = [(100, player.choice_decrease1), (85, player.choice_decrease2), (75, player.choice_decrease3), (70, player.choice_decrease4), (65, player.choice_decrease5), (60, player.choice_decrease6), (55, player.choice_decrease7), (50, player.choice_decrease8), (45, player.choice_decrease9), (40, player.choice_decrease10), (35, player.choice_decrease11), (30, player.choice_decrease12), (25, player.choice_decrease13), (20, player.choice_decrease14), (15, player.choice_decrease15), (10, player.choice_decrease16), (5, player.choice_decrease17), (2, player.choice_decrease18), (1, player.choice_decrease19), (0, player.choice_decrease20)] player.picked_decrease, player.picked_choice_decrease = random.choice(decrease_choice) if player.picked_choice_decrease == 'left': Y = random.choices([C.point_decrease, 0], weights=[player.picked_decrease, 100 - player.picked_decrease], k=1) player.point_decrease = random.choice(Y) else: if player.qrt8 < player.qrt4: player.point_decrease = C.point_decrease else: player.point_decrease = 0 class Increase2(Page): form_model = 'player' form_fields = ['switching_point_increase', 'choice_increase1', 'choice_increase2', 'choice_increase3', 'choice_increase4', 'choice_increase5', 'choice_increase6', 'choice_increase7', 'choice_increase8', 'choice_increase9', 'choice_increase10', 'choice_increase11', 'choice_increase12', 'choice_increase13', 'choice_increase14', 'choice_increase15', 'choice_increase16', 'choice_increase17', 'choice_increase18', 'choice_increase19', 'choice_increase20'] @staticmethod def is_displayed(player: Player): return player.sequence in [3, 4, 5] def before_next_page(player, timeout_happened): player.t_increase = time.time() increase_choice = [(100, player.choice_increase1), (85, player.choice_increase2), (75, player.choice_increase3), (70, player.choice_increase4), (65, player.choice_increase5), (60, player.choice_increase6), (55, player.choice_increase7), (50, player.choice_increase8), (45, player.choice_increase9), (40, player.choice_increase10), (35, player.choice_increase11), (30, player.choice_increase12), (25, player.choice_increase13), (20, player.choice_increase14), (15, player.choice_increase15), (10, player.choice_increase16), (5, player.choice_increase17), (2, player.choice_increase18), (1, player.choice_increase19), (0, player.choice_increase20)] player.picked_increase, player.picked_choice_increase = random.choice(increase_choice) if player.picked_choice_increase == 'left': Y = random.choices([C.point_increase, 0], weights=[player.picked_increase, 100 - player.picked_increase], k=1) player.point_increase = random.choice(Y) else: if player.qrt8 > player.qrt4: player.point_increase = C.point_increase else: player.point_increase = 0 class Same2(Page): form_model = 'player' form_fields = ['switching_point_same', 'choice_same1', 'choice_same2', 'choice_same3', 'choice_same4', 'choice_same5', 'choice_same6', 'choice_same7', 'choice_same8', 'choice_same9', 'choice_same10', 'choice_same11', 'choice_same12', 'choice_same13', 'choice_same14', 'choice_same15', 'choice_same16', 'choice_same17', 'choice_same18', 'choice_same19', 'choice_same20'] @staticmethod def is_displayed(player: Player): return player.sequence in [2, 5, 6] def before_next_page(player, timeout_happened): player.t_same = time.time() same_choice = [(100, player.choice_same1), (85, player.choice_same2), (75, player.choice_same3), (70, player.choice_same4), (65, player.choice_same5), (60, player.choice_same6), (55, player.choice_same7), (50, player.choice_same8), (45, player.choice_same9), (40, player.choice_same10), (35, player.choice_same11), (30, player.choice_same12), (25, player.choice_same13), (20, player.choice_same14), (15, player.choice_same15), (10, player.choice_same16), (5, player.choice_same17), (2, player.choice_same18), (1, player.choice_same19), (0, player.choice_same20)] player.picked_same, player.picked_choice_same = random.choice(same_choice) if player.picked_choice_same == 'left': Y = random.choices([C.point_same, 0], weights=[player.picked_same, 100 - player.picked_same], k=1) player.point_same = random.choice(Y) else: if player.qrt8 == player.qrt4: player.point_same = C.point_same else: player.point_same = 0 class Decrease2(Page): form_model = 'player' form_fields = ['switching_point_decrease', 'choice_decrease1', 'choice_decrease2', 'choice_decrease3', 'choice_decrease4', 'choice_decrease5', 'choice_decrease6', 'choice_decrease7', 'choice_decrease8', 'choice_decrease9', 'choice_decrease10', 'choice_decrease11', 'choice_decrease12', 'choice_decrease13', 'choice_decrease14', 'choice_decrease15', 'choice_decrease16', 'choice_decrease17', 'choice_decrease18', 'choice_decrease19', 'choice_decrease20'] @staticmethod def is_displayed(player: Player): return player.sequence in [3] def before_next_page(player, timeout_happened): player.t_decrease = time.time() decrease_choice = [(100, player.choice_decrease1), (85, player.choice_decrease2), (75, player.choice_decrease3), (70, player.choice_decrease4), (65, player.choice_decrease5), (60, player.choice_decrease6), (55, player.choice_decrease7), (50, player.choice_decrease8), (45, player.choice_decrease9), (40, player.choice_decrease10), (35, player.choice_decrease11), (30, player.choice_decrease12), (25, player.choice_decrease13), (20, player.choice_decrease14), (15, player.choice_decrease15), (10, player.choice_decrease16), (5, player.choice_decrease17), (2, player.choice_decrease18), (1, player.choice_decrease19), (0, player.choice_decrease20)] player.picked_decrease, player.picked_choice_decrease = random.choice(decrease_choice) if player.picked_choice_decrease == 'left': Y = random.choices([C.point_decrease, 0], weights=[player.picked_decrease, 100 - player.picked_decrease], k=1) player.point_decrease = random.choice(Y) else: if player.qrt8 < player.qrt4: player.point_decrease = C.point_decrease else: player.point_decrease = 0 class Increase3(Page): form_model = 'player' form_fields = ['switching_point_increase', 'choice_increase1', 'choice_increase2', 'choice_increase3', 'choice_increase4', 'choice_increase5', 'choice_increase6', 'choice_increase7', 'choice_increase8', 'choice_increase9', 'choice_increase10', 'choice_increase11', 'choice_increase12', 'choice_increase13', 'choice_increase14', 'choice_increase15', 'choice_increase16', 'choice_increase17', 'choice_increase18', 'choice_increase19', 'choice_increase20'] @staticmethod def is_displayed(player: Player): return player.sequence in [6] def before_next_page(player, timeout_happened): player.t_increase = time.time() increase_choice = [(100, player.choice_increase1), (85, player.choice_increase2), (75, player.choice_increase3), (70, player.choice_increase4), (65, player.choice_increase5), (60, player.choice_increase6), (55, player.choice_increase7), (50, player.choice_increase8), (45, player.choice_increase9), (40, player.choice_increase10), (35, player.choice_increase11), (30, player.choice_increase12), (25, player.choice_increase13), (20, player.choice_increase14), (15, player.choice_increase15), (10, player.choice_increase16), (5, player.choice_increase17), (2, player.choice_increase18), (1, player.choice_increase19), (0, player.choice_increase20)] player.picked_increase, player.picked_choice_increase = random.choice(increase_choice) if player.picked_choice_increase == 'left': Y = random.choices([C.point_increase, 0], weights=[player.picked_increase, 100 - player.picked_increase], k=1) player.point_increase = random.choice(Y) else: if player.qrt8 > player.qrt4: player.point_increase = C.point_increase else: player.point_increase = 0 class BeforeCE50(Page): def before_next_page(player, timeout_happened): player.t_ce50 = time.time() if player.task == 2: player.point = player.point_increase elif player.task == 3: player.point = player.point_same elif player.task == 4: player.point = player.point_decrease else: player.point = player.point_CE player.bonus = player.point / C.conversion player.Y = player.bonus + C.fee player.payoff = player.bonus class CE50(Page): form_model = 'player' form_fields = ['CE_50', 'fn1', 'fn2', 'fn3', 'fn4', 'fn5', 'fn6', 'risk1', 'risk2', 'risk3', 'risk4'] def vars_for_template(player: Player): player.participant.finished = True # @staticmethod # # def error_message(player, values): # # if values['CE_50'] < 0 or values['CE_50'] > 100: # # return 'Please report the amount within the specified range' # # def before_next_page(player, timeout_happened): # player.t_ce50 = time.time() # # # # if player.CE_50 <= player.L5: # # player.point_CE_50 = player.L5 # # else: # # player.point_CE_50 = random.choice([0, 100]) # # if player.task == 2: # player.point = player.point_increase # elif player.task == 3: # player.point = player.point_same # elif player.task == 4: # player.point = player.point_decrease # else: # player.point = player.point_CE_main # # player.point = random.choice([player.point_CE_main, player.point_increase, player.point_same, player.point_decrease]) # player.bonus = player.point / C.conversion # player.Y = player.bonus + C.fee # player.payoff = player.bonus class Results(Page): pass page_sequence = [Welcome, InstructionUrns, ComprehensionQ, InstructionUrns_2, ComprehensionQ_2, InstructionUrns_3, ComprehensionQ_3, InstructionTask, Feedback0, Feedback1, Feedback1_5, Feedback2, Feedback2_5, Feedback3, Feedback3_5, Feedback4, Feedback4_5, Feedback5, CEmain, InstructionBelief, AttentionCheck, AttentionCorrect, InstructionBelief_2, AttentionCheck_2, AttentionWrong, Increase1, Same1, Decrease1, Increase2, Same2, Decrease2, Increase3, BeforeCE50, CE50, Results ]