from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'd_so_lg_ed_rounds' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): session = subsession.session import random for p in subsession.get_players(): p.page_PEQ4A = random.choice([True, False]) Subsession.creating_session = creating_session class Group(BaseGroup): pass class Player(BasePlayer): invest1 = models.IntegerField(label='', max=100, min=0) invest2 = models.IntegerField(label='', max=100, min=0) invest3 = models.IntegerField(label='', max=100, min=0) invest4 = models.IntegerField(label='', max=100, min=0) player_level1 = models.IntegerField(initial=50, label='') player_level2 = models.IntegerField(initial=50, label='') player_level3 = models.IntegerField(initial=50, label='') player_level4 = models.IntegerField(initial=50, label='') bonus1 = models.FloatField(label='') compensation = models.StringField(label='') PEQ1 = models.StringField(choices=[['T', 'True'], ['F', 'False']], label='Each year, Oval sets aside 3,000 Lira (30% of its total assets) for investing in financial assets.', widget=widgets.RadioSelect) PEQ2 = models.StringField(choices=[['1', '1 (Relatively Small)'], ['2', '2'], ['3', '3'], ['4', '4 (Neutral)'], ['5', '5'], ['6', '6'], ['7', '7 (Relatively Large)']], label='Oval sets aside 3,000 Lira to invest in financial assets, which is 30% of Oval’s total assets (10,000 Lira). How would you rate the relative magnitude or size of the amount Oval sets aside to invest in financial assets?', widget=widgets.RadioSelect) PEQ3 = models.StringField(choices=[['1', '1 (Small)'], ['2', '2'], ['3', '3'], ['4', '4 (Neutral)'], ['5', '5'], ['6', '6'], ['7', '7 (Large)']], label='Each financial asset generates an expected return of 3 Lira. How would you rate the magnitude or size of the expected return amount?', widget=widgets.RadioSelect) PEQ4 = models.StringField(choices=[['1', '1 (Not at all)'], ['2', '2'], ['3', '3'], ['4', '4 (A moderate amount)'], ['5', '5'], ['6', '6'], ['7', '7 (A great deal)']], label='How much did you focus on MINIMIZING losses when making your investment decision?', widget=widgets.RadioSelect) PEQ5 = models.StringField(choices=[['1', '1 (Not at all)'], ['2', '2'], ['3', '3'], ['4', '4 (A moderate amount)'], ['5', '5'], ['6', '6'], ['7', '7 (A great deal)']], label='How much did you focus on MAXIMIZING gains when making your investment decision?', widget=widgets.RadioSelect) PEQ6 = models.StringField(choices=[['1', '1 (Try to avoid taking risks)'], ['2', '2'], ['3', '3'], ['4', '4 (Neutral)'], ['5', '5'], ['6', '6'], ['7', '7 (Fully prepared to take risks)']], label='Are you generally a person who tries to avoid taking risks or is fully prepared to take risks? ', widget=widgets.RadioSelect) PEQ7 = models.StringField(choices=[['a', '4%'], ['b', '6%'], ['c', '8%'], ['d', '10%']], label='In percentage terms, what level of expected return does each financial asset generate?', widget=widgets.RadioSelect) PEQ8 = models.StringField(choices=[['a', '0 Lira'], ['b', '5 Lira'], ['c', '10 Lira'], ['d', '30 Lira']], label='Suppose you invested in 10 financial assets and none of them are the “bad” investment. What is the total amount of EXPECTED RETURNS?', widget=widgets.RadioSelect) PEQ9 = models.StringField(choices=[['a', '0 Lira'], ['b', '5 Lira'], ['c', '10 Lira'], ['d', '30 Lira']], label='Suppose you invest in 10 financial assets and one of them is the “bad” investment. What is the total amount of EXPECTED RETURNS?', widget=widgets.RadioSelect) PEQ10 = models.StringField(choices=[['a', '0'], ['b', 'Less than 1 year'], ['c', '1 - 2 years'], ['d', '3 - 4 years'], ['e', '5 - 6 years'], ['f', '7 - 8 years'], ['g', '9 - 10 years'], ['h', 'More than 11 years']], label='How much investment experience do you have, either personally or professionally?', widget=widgets.RadioSelect) PEQ11 = models.StringField(choices=[['a', 'Yes'], ['b', 'No']], label='Have you experienced any losses from your investment experience?', widget=widgets.RadioSelect) PEQ12 = models.StringField(choices=[['1', '1 (Once or only a few times)'], ['2', '2'], ['3', '3'], ['4', '4 (Several times)'], ['5', '5'], ['6', '6'], ['7', '7 (Many times)']], label='How often have you experienced relatively small losses from your investment experience?', widget=widgets.RadioSelect) PEQ13 = models.StringField(choices=[['1', '1 (Once or only a few times)'], ['2', '2'], ['3', '3'], ['4', '4 (Several times)'], ['5', '5'], ['6', '6'], ['7', '7 (Many times)']], label='How often have you experienced relatively large losses from your investment experience?', widget=widgets.RadioSelect) PEQ14 = models.StringField(choices=[['a', 'Female'], ['b', 'Male'], ['c', 'Other'], ['d', 'Prefer not to say']], label='What is your gender identity?', widget=widgets.RadioSelect) PEQ15 = models.IntegerField(label='What is your age (in years)?') PEQ16 = models.StringField(choices=[['a', 'Unemployed'], ['b', 'Public sector (e.g., government)'], ['c', 'Private sector (e.g., most corporations, financial institutions and individual businesses)'], ['d', 'Non-profit sector (e.g., charity or shelter)'], ['e', 'Have not been employeed'], ['f', 'Other']], label='Which industry best describes that in which you primarily work (or worked)?', widget=widgets.RadioSelect) PEQ17 = models.StringField(choices=[['a', '0 (if you indicated “Have not been employed”)'], ['b', 'Less than 1 year'], ['c', '1 – 2 years'], ['d', '3 – 4 years'], ['e', '5 – 6 years'], ['f', '7 – 8 years'], ['g', '9 – 10 years'], ['h', 'More than 11 years']], label='How much work experience do you have in the industry you selected in the previous question?', widget=widgets.RadioSelect) PEQ18 = models.StringField(choices=[['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd']], label='For this question, please choose ‘c’ for your response.', widget=widgets.RadioSelect) bonus2 = models.FloatField(label='') bonus3 = models.FloatField(label='') bonus4 = models.FloatField(label='') round = models.IntegerField(initial=1, label='') page_PEQ4A = models.BooleanField() def assetnumber1(player: Player): return int(player.invest1) def assetnumber2(player: Player): return player.invest2 def assetnumber3(player: Player): return player.invest3 def assetnumber4(player: Player): return player.invest4 def earning1(player: Player): return format(round(player.invest1 * 30 * 0.1, 2), '7.2f') def earning2(player: Player): return format(round(player.invest2 * 30 * 0.1, 2), '7.2f') def earning3(player: Player): return format(round(player.invest3 * 30 * 0.1, 2), '7.2f') def earning4(player: Player): return format(round(player.invest4 * 30 * 0.1, 2), '7.2f') def get_score(player: Player): list = [] decision = [player.invest1, player.invest2, player.invest3, player.invest4] bonuses = [player.bonus1, player.bonus2, player.bonus3, player.bonus4] playerLevels = [player.player_level1, player.player_level2, player.player_level3, player.player_level4] for i in range(4): list.append({ 'round': 'Year ' + str(i + 1), 'decision': decision[i], 'isBad': 'Yes' if decision[i] > playerLevels[i] else 'No', 'bonus': bonuses[i] }) return list def rand_decision(player: Player): bonuses = [player.bonus1, player.bonus2, player.bonus3, player.bonus4] price = bonuses[player.round - 1] * 0.025 info = {'round': player.round, 'price': format(round(price+10**(-len(str(price))-1), 2), '7.2f'), 'total': format(round((price+10**(-len(str(price))-1)+1),2),'7.2f')} return info Player.assetnumber1 = assetnumber1 Player.assetnumber2 = assetnumber2 Player.assetnumber3 = assetnumber3 Player.assetnumber4 = assetnumber4 Player.earning1 = earning1 Player.earning2 = earning2 Player.earning3 = earning3 Player.earning4 = earning4 Player.get_score = get_score Player.rand_decision = rand_decision def custom_export(players): yield ['participant_code', 'id_in_group'] for p in players: pp = p.participant yield [pp.code, p.id_in_group] class Round1(Page): form_model = 'player' form_fields = ['invest1', 'round', 'player_level1', 'player_level2', 'player_level3', 'player_level4'] class Round1_Result(Page): form_model = 'player' form_fields = ['bonus1'] class Round2(Page): form_model = 'player' form_fields = ['invest2', 'round', 'player_level1', 'player_level2', 'player_level3', 'player_level4'] class Round2_Result(Page): form_model = 'player' form_fields = ['bonus2'] class Round3(Page): form_model = 'player' form_fields = ['invest3', 'round', 'player_level1', 'player_level2', 'player_level3', 'player_level4'] class Round3_Result(Page): form_model = 'player' form_fields = ['bonus3'] class Round4(Page): form_model = 'player' form_fields = ['invest4', 'round', 'player_level1', 'player_level2', 'player_level3', 'player_level4'] class Round4_Result(Page): form_model = 'player' form_fields = ['bonus4'] class LandingPage(Page): form_model = 'player' class PEQP1(Page): form_model = 'player' form_fields = ['PEQ1'] class PEQ23(Page): form_model = 'player' form_fields = ['PEQ2', 'PEQ3'] class PEQ4A(Page): form_model = 'player' form_fields = ['PEQ4'] @staticmethod def is_displayed(player: Player): return player.page_PEQ4A class PEQ5(Page): form_model = 'player' form_fields = ['PEQ5'] class PEQ4B(Page): form_model = 'player' form_fields = ['PEQ4'] @staticmethod def is_displayed(player: Player): return not player.page_PEQ4A class PEQ6(Page): form_model = 'player' form_fields = ['PEQ6'] class PEQ7_9(Page): form_model = 'player' form_fields = ['PEQ7', 'PEQ8', 'PEQ9'] class PEQ10_11(Page): form_model = 'player' form_fields = ['PEQ10', 'PEQ11'] @staticmethod def error_message(player: Player, values): if values['PEQ10'] == 'a' and values['PEQ11'] == 'a': return "Your responses to the below two questions are inconsistent. Please update your responses." class PEQ12_13(Page): form_model = 'player' form_fields = ['PEQ12', 'PEQ13'] @staticmethod def is_displayed(player: Player): return player.PEQ11 == 'a' class PEQ14_18(Page): form_model = 'player' form_fields = ['PEQ14', 'PEQ15', 'PEQ16', 'PEQ17', 'PEQ18'] @staticmethod def is_displayed(player: Player): return player.PEQ11 == 'a' class PEQ14_18B(Page): form_model = 'player' form_fields = ['PEQ14', 'PEQ15', 'PEQ16', 'PEQ17', 'PEQ18'] @staticmethod def is_displayed(player: Player): return player.PEQ11 == 'b' class Compensation_Page(Page): form_model = 'player' form_fields = ['compensation'] @staticmethod def vars_for_template(player: Player): return dict(rand_decision=rand_decision(player)) @staticmethod def app_after_this_page(player: Player, upcoming_apps): return "finalpage" page_sequence = [Round1, Round1_Result, Round2, Round2_Result, Round3, Round3_Result, Round4, Round4_Result, LandingPage, PEQP1, PEQ23, PEQ4A, PEQ5, PEQ4B, PEQ6, PEQ7_9, PEQ10_11, PEQ12_13, PEQ14_18, PEQ14_18B, Compensation_Page]