from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'Penalty_Other' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 TEMP_TEMPLATE = 'Penalty_Other/temp.html' OVERVIEW_TEMPLATE = 'Penalty_Other/overview.html' STAGE1_DEMOGRAPHIC_TEMPLATE = 'Penalty_Other/stage1_demographic.html' STAGE1_CHARACTERISTICS_1_TEMPLATE = 'Penalty_Other/stage1_characteristics_1.html' STAGE1_CHARACTERISTICS_2_TEMPLATE = 'Penalty_Other/stage1_characteristics_2.html' STAGE2_OVERVIEW_1_TEMPLATE = 'Penalty_Other/stage2_overview_1.html' CC_1_TEMPLATE = 'Penalty_Other/cc_1.html' STAGE2_CONTRACT_DETAIL_TEMPLATE = 'Penalty_Other/stage2_contract_detail.html' CC_2_TEMPLATE = 'Penalty_Other/cc_2.html' STAGE2_DECISION_TEMPLATE = 'Penalty_Other/stage2_decision.html' STAGE2_PM_TEMPLATE = 'Penalty_Other/stage2_pm.html' STAGE3_OVERVIEW_1_TEMPLATE = 'Penalty_Other/stage3_overview_1.html' CC_3_TEMPLATE = 'Penalty_Other/cc_3.html' STAGE3_INVEST_TEMPLATE = 'Penalty_Other/stage3_invest.html' BEFORE_WAIT_TEMPLATE = 'Penalty_Other/before_wait.html' FINAL_SCREEN_TEMPLATE = 'Penalty_Other/final_screen.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): P1_Alt_1 = models.IntegerField() P2_Alt_1 = models.IntegerField() P3_Alt_1 = models.IntegerField() P4_Alt_1 = models.IntegerField() P5_Alt_1 = models.IntegerField() P6_Alt_1 = models.IntegerField() P7_Alt_1 = models.IntegerField() P8_Alt_1 = models.IntegerField() P9_Alt_1 = models.IntegerField() P10_Alt_1 = models.IntegerField() P11_Alt_1 = models.IntegerField() P12_Alt_1 = models.IntegerField() P13_Alt_1 = models.IntegerField() P14_Alt_1 = models.IntegerField() P15_Alt_1 = models.IntegerField() P16_Alt_1 = models.IntegerField() P17_Alt_1 = models.IntegerField() P18_Alt_1 = models.IntegerField() P19_Alt_1 = models.IntegerField() P20_Alt_1 = models.IntegerField() P21_Alt_1 = models.IntegerField() P22_Alt_1 = models.IntegerField() P23_Alt_1 = models.IntegerField() P24_Alt_1 = models.IntegerField() P25_Alt_1 = models.IntegerField() P26_Alt_1 = models.IntegerField() P27_Alt_1 = models.IntegerField() P28_Alt_1 = models.IntegerField() P29_Alt_1 = models.IntegerField() P30_Alt_1 = models.IntegerField() P1_Alt_2 = models.IntegerField() P2_Alt_2 = models.IntegerField() P3_Alt_2 = models.IntegerField() P4_Alt_2 = models.IntegerField() P5_Alt_2 = models.IntegerField() P6_Alt_2 = models.IntegerField() P7_Alt_2 = models.IntegerField() P8_Alt_2 = models.IntegerField() P9_Alt_2 = models.IntegerField() P10_Alt_2 = models.IntegerField() P11_Alt_2 = models.IntegerField() P12_Alt_2 = models.IntegerField() P13_Alt_2 = models.IntegerField() P14_Alt_2 = models.IntegerField() P15_Alt_2 = models.IntegerField() P16_Alt_2 = models.IntegerField() P17_Alt_2 = models.IntegerField() P18_Alt_2 = models.IntegerField() P19_Alt_2 = models.IntegerField() P20_Alt_2 = models.IntegerField() P21_Alt_2 = models.IntegerField() P22_Alt_2 = models.IntegerField() P23_Alt_2 = models.IntegerField() P24_Alt_2 = models.IntegerField() P25_Alt_2 = models.IntegerField() P26_Alt_2 = models.IntegerField() P27_Alt_2 = models.IntegerField() P28_Alt_2 = models.IntegerField() P29_Alt_2 = models.IntegerField() P30_Alt_2 = models.IntegerField() Num_Participants = models.IntegerField(initial=0) class Player(BasePlayer): Gender = models.IntegerField(choices=[[1, 'Male'], [2, 'Female'], [3, 'Prefer Not to Answer']], label='What gender do you identify as? ', widget=widgets.RadioSelect) Age = models.IntegerField(label='What is your age? ', max=99, min=18) Fair = models.IntegerField(choices=[[1, '1 - Not fair at all'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10 '], [11, '11'], [12, '12'], [13, '13 - Extremely fair']], label='When dealing with others, how would you describe yourself?', widget=widgets.RadioSelectHorizontal) Risk = models.IntegerField(choices=[[1, '1 - Completely unwilling'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10 '], [11, '11'], [12, '12'], [13, '13 - Completely willing']], label='In general, how willing are you to take risks?', widget=widgets.RadioSelectHorizontal) Optimistic = models.IntegerField(choices=[[1, '1 - Very pessimistic'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10'], [11, '11'], [12, '12'], [13, '13 - Very optimistic']], label='When my friends describe me they would say that I am…', widget=widgets.RadioSelectHorizontal) Trusting = models.IntegerField(choices=[[1, '1 - Not trusting at all'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10'], [11, '11'], [12, '12'], [13, '13 - Very trusting']], label='When it comes to other people, I’m', widget=widgets.RadioSelectHorizontal) Q1 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Whether or not I get to be a leader depends mostly on my ability.', widget=widgets.RadioSelectHorizontal) Q2 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='To a great extent my life is controlled by accidental happenings.', widget=widgets.RadioSelectHorizontal) Q3 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='I feel like what happens in my life is mostly determined by powerful people. ', widget=widgets.RadioSelectHorizontal) Q4 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Whether or not I get into a car accident depends mostly on how good a driver I am. ', widget=widgets.RadioSelectHorizontal) Q5 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='When I make plans, I am almost certain to make them work. ', widget=widgets.RadioSelectHorizontal) Q6 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Often there is no chance of protecting my personal interests from bad luck happening. ', widget=widgets.RadioSelectHorizontal) Q7 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='When I get what I want, it is usually because I’m lucky. ', widget=widgets.RadioSelectHorizontal) Q8 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Although I might have good ability, I will not be given leadership responsibility without appealing to those in positions of power. ', widget=widgets.RadioSelectHorizontal) Q9 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='How many friends I have depends on how nice of a person I am. ', widget=widgets.RadioSelectHorizontal) Q10 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='I have often found that what is going to happen will happen. ', widget=widgets.RadioSelectHorizontal) Q11 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='My life is chiefly controlled by powerful others. ', widget=widgets.RadioSelectHorizontal) Q12 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Whether or not I get into a car accident is mostly a matter of luck. ', widget=widgets.RadioSelectHorizontal) Q13 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='People like myself have very little chance of protecting our personal interests when they conflict with those of strong pressure groups. ', widget=widgets.RadioSelectHorizontal) Q14 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='It’s not always wise for me to plan too far ahead because many things turn out to be a matter of good or bad fortune. ', widget=widgets.RadioSelectHorizontal) Q15 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Getting what I want requires pleasing those people above me. ', widget=widgets.RadioSelectHorizontal) Q16 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Whether or not I get to be a leader depends on whether I’m lucky enough to be in the right place at the right time. ', widget=widgets.RadioSelectHorizontal) Q17 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='If important people were to decide they didn’t like me, I probably wouldn’t make many friends. ', widget=widgets.RadioSelectHorizontal) Q18 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='I can pretty much determine what will happen in my life. ', widget=widgets.RadioSelectHorizontal) Q19 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='I am usually able to protect my personal interests. ', widget=widgets.RadioSelectHorizontal) Q20 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='Whether or not I get into a car accident depends mostly on the other driver. ', widget=widgets.RadioSelectHorizontal) Q21 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='When I get what I want, it’s usually because I worked hard for it. ', widget=widgets.RadioSelectHorizontal) Q22 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='In order to have my plans work, I make sure that they fit in with the desires of people who have power over me. ', widget=widgets.RadioSelectHorizontal) Q23 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='My life is determined by my own actions. ', widget=widgets.RadioSelectHorizontal) Q24 = models.IntegerField(choices=[[1, '1 - Definitely Disagree '], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Definitely Agree']], label='It’s chiefly a matter of fate whether or not I have a few friends or many friends.', widget=widgets.RadioSelectHorizontal) CC1 = models.IntegerField(choices=[[1, 'High'], [2, 'Low']], label='Drawing a red chip means your performance outcome will be:', widget=widgets.RadioSelect) CC2 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False] The bag will always contain 20 chips in total but the number of red and blue chips will change depending on your chosen effort level. ', widget=widgets.RadioSelect) CC3 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False] It does NOT cost you anything to raise the effort level. ', widget=widgets.RadioSelect) CC4 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False] The higher the chosen effort, the higher the likelihood of drawing a red chip and achieving a high performance outcome. ', widget=widgets.RadioSelect) CC5 = models.IntegerField(choices=[[1, 'Red Chip'], [2, 'Blue Chip']], label='In order to not pay the $10 penalty, which colored chip needs to be drawn: ', widget=widgets.RadioSelect) CC6 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False]: The higher the effort level you choose, the more you must pay in effort costs.', widget=widgets.RadioSelect) Effort = models.IntegerField(choices=[[1, 'Effort Level 1'], [2, 'Effort Level 2'], [3, 'Effort Level 3'], [4, 'Effort Level 4'], [5, 'Effort Level 5'], [6, 'Effort Level 6'], [7, 'Effort Level 7'], [8, 'Effort Level 8'], [9, 'Effort Level 9'], [10, 'Effort Level 10'], [11, 'Effort Level 11'], [12, 'Effort Level 12'], [13, 'Effort Level 13']], label='Please choose an effort level: ', widget=widgets.RadioSelect) Contract_Fair = models.IntegerField(choices=[[1, '1 - Not fair at all'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Moderately fair'], [8, '8'], [9, '9'], [10, '10'], [11, '11'], [12, '12'], [13, '13 - Extremely fair']], label='How fair is your performance contract?', widget=widgets.RadioSelectHorizontal) Disappointed = models.IntegerField(choices=[[1, '1 - Not at all disappointed'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, '6'], [7, '7 - Moderately disappointed'], [8, '8'], [9, '9'], [10, '10'], [11, '11'], [12, '12'], [13, '13 - Extremely disappointed']], label='How disappointed would you be if the performance outcome is low and you have to pay a penalty?', widget=widgets.RadioSelectHorizontal) CC7 = models.IntegerField(choices=[[1, 'Alternative 1'], [2, 'Alternative 2']], label='Which alternative guarantees full repayment of your investment: ', widget=widgets.RadioSelect) CC8 = models.IntegerField(choices=[[1, 'Alternative 1'], [2, 'Alternative 2']], label='Which alternative provides a higher return but also introduces a higher risk:', widget=widgets.RadioSelect) CC9 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False] Any return from the investment will be received by another participant.', widget=widgets.RadioSelect) CC10 = models.IntegerField(choices=[[1, 'True'], [0, 'False']], label='[True or False] The participant that you will make an investment decision for is not the same participant that will make an investment decision for you. ', widget=widgets.RadioSelect) Alternative1 = models.IntegerField(max=1000, min=0) Alternative2 = models.IntegerField(max=1000, min=0) Alternative1_Other = models.IntegerField() Alternative2_Other = models.IntegerField() def CC1_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC2_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC3_error_message(player: Player, value): if value != 0: return 'Incorrect! Please try again' def CC4_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC5_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC6_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC7_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC8_error_message(player: Player, value): if value != 2: return 'Incorrect! Please try again' def CC9_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def CC10_error_message(player: Player, value): if value != 1: return 'Incorrect! Please try again' def Alternative1_error_message(player: Player, value): if value % 25 != 0: return 'Investment amount must be made in increments of 25 cents. Please try again' def Alternative2_error_message(player: Player, value): if value % 25 != 0: return 'Investment amount must be made in increments of 25 cents. Please try again' def Count_Participant(player: Player): group = player.group if player.id_in_group >= 1: group.Num_Participants += 1 def Record_Investment(player: Player): group = player.group if 1 <= player.id_in_group <= 30: setattr(group, f'P{player.id_in_group}_Alt_1', player.Alternative1) setattr(group, f'P{player.id_in_group}_Alt_2', player.Alternative2) def Retrieve_Investment(player: Player): group = player.group if group.Num_Participants == 2: if player.id_in_group == 1: player.Alternative1_Other = group.P2_Alt_1 player.Alternative2_Other = group.P2_Alt_2 if player.id_in_group == 2: player.Alternative1_Other = group.P1_Alt_1 player.Alternative2_Other = group.P1_Alt_2 if group.Num_Participants == 3: if player.id_in_group == 1: player.Alternative1_Other = group.P2_Alt_1 player.Alternative2_Other = group.P2_Alt_2 if player.id_in_group == 2: player.Alternative1_Other = group.P3_Alt_1 player.Alternative2_Other = group.P3_Alt_2 if player.id_in_group == 3: player.Alternative1_Other = group.P1_Alt_1 player.Alternative2_Other = group.P1_Alt_2 if group.Num_Participants == 4: if player.id_in_group == 1: player.Alternative1_Other = group.P2_Alt_1 player.Alternative2_Other = group.P2_Alt_2 if player.id_in_group == 2: player.Alternative1_Other = group.P3_Alt_1 player.Alternative2_Other = group.P3_Alt_2 if player.id_in_group == 3: player.Alternative1_Other = group.P4_Alt_1 player.Alternative2_Other = group.P4_Alt_2 if player.id_in_group == 4: player.Alternative1_Other = group.P1_Alt_1 player.Alternative2_Other = group.P1_Alt_2 def Retrieve_Investment_Simple(player: Player): group = player.group if 2 <= group.Num_Participants <= 30: next_id = player.id_in_group % group.Num_Participants + 1 # wraps around player.Alternative1_Other = getattr(group, f'P{next_id}_Alt_1') player.Alternative2_Other = getattr(group, f'P{next_id}_Alt_2') class Study_Overview(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): Count_Participant(player) class Stage1_Demo(Page): form_model = 'player' form_fields = ['Gender', 'Age'] class Stage1_Character_Batch1(Page): form_model = 'player' form_fields = ['Fair', 'Risk', 'Optimistic', 'Trusting'] class Stage1_Character_Batch2(Page): form_model = 'player' form_fields = ['Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6', 'Q7', 'Q8', 'Q9', 'Q10', 'Q11', 'Q12'] class Stage1_Character_Batch3(Page): form_model = 'player' form_fields = ['Q13', 'Q14', 'Q15', 'Q16', 'Q17', 'Q18', 'Q19', 'Q20', 'Q21', 'Q22', 'Q23', 'Q24'] class Stage2_Overview(Page): form_model = 'player' class CC1(Page): form_model = 'player' form_fields = ['CC1', 'CC2', 'CC3', 'CC4'] class Stage2_Contract(Page): form_model = 'player' class CC2(Page): form_model = 'player' form_fields = ['CC5', 'CC6'] class Stage2_Effort(Page): form_model = 'player' form_fields = ['Effort'] class Stage2_Process(Page): form_model = 'player' form_fields = ['Contract_Fair', 'Disappointed'] class Stage3_Overview(Page): form_model = 'player' class CC3(Page): form_model = 'player' form_fields = ['CC7', 'CC8', 'CC9', 'CC10'] class Stage3_Investment(Page): form_model = 'player' form_fields = ['Alternative1', 'Alternative2'] @staticmethod def before_next_page(player: Player, timeout_happened): Record_Investment(player) @staticmethod def error_message(player: Player, values): print('values is', values) if values['Alternative1'] + values['Alternative2'] != 1000: return 'The total investment must equal exactly 1,000 cents' class Waiting_Room(WaitPage): title_text = 'Waiting Room ' body_text = 'Please wait. Other participants are still completing the study.' class Before_Results(Page): form_model = 'player' @staticmethod def before_next_page(player: Player, timeout_happened): Retrieve_Investment_Simple(player) class Payoff(Page): form_model = 'player' page_sequence = [Study_Overview, Stage1_Demo, Stage1_Character_Batch1, Stage1_Character_Batch2, Stage1_Character_Batch3, Stage2_Overview, CC1, Stage2_Contract, CC2, Stage2_Effort, Stage2_Process, Stage3_Overview, CC3, Stage3_Investment, Waiting_Room, Before_Results, Payoff]