from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, Page, WaitPage, ) import random import json from otree.models import participant doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'MPL' players_per_group = None num_rounds = 1 risky_low = 200 risky_high = 800 safer_low = 400 safer_high = 600 num_rows = 10 to_USD = 40 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): response = models.StringField() random_draw = models.IntegerField() lottery_random = models.IntegerField() # Functions # def creating_session(subsession): # print('in creating session') # for p in subsession.get_players(): # if subsession.round_number == 1: # p.participant.vars['payoff_mpl'] = 0 #setting payoff to zero in every new round def set_payoffs(player): response_list = json.loads(player.response) if player.random_draw == 1: if response_list[0] == 0: # Safer option if player.lottery_random == 1: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random == 1: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 2: if response_list[1] == 0: # Safer option if player.lottery_random <= 2: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[1] == 1: # Risky option if player.lottery_random <=2: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 3: if response_list[0] == 0: # Safer option if player.lottery_random <= 3: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 3: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 4: if response_list[0] == 0: # Safer option if player.lottery_random <= 4: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 4: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 5: if response_list[0] == 0: # Safer option if player.lottery_random <= 5: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 5: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 6: if response_list[0] == 0: # Safer option if player.lottery_random <= 6: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 6: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 7: if response_list[0] == 0: # Safer option if player.lottery_random <= 7: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 7: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 8: if response_list[0] == 0: # Safer option if player.lottery_random <= 8: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 8: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 9: if response_list[0] == 0: # Safer option if player.lottery_random <= 9: player.payoff = Constants.safer_high else: player.payoff = Constants.safer_low if response_list[0] == 1: # Risky option if player.lottery_random <= 9: player.payoff = Constants.risky_high else: player.payoff = Constants.risky_low if player.random_draw == 10: if response_list[0] == 0: # Safer option player.payoff = Constants.safer_high if response_list[0] == 1: # Risky option player.payoff = Constants.risky_high # PAGES class Intro(Page): pass class Instructions(Page): pass class MyPage(Page): form_model = 'player' form_fields = ['response'] def vars_for_template(player): return dict( num_rows=10, L1=" 1 = E$" + str(Constants.safer_high) + " (10%), or 2-10 = E$" + str(Constants.safer_low) + " (90%)", R1=" 1 = E$" + str(Constants.risky_high) + " (10%), or 2-10 = E$" + str(Constants.risky_low) + " (90%)", L2=" 1-2 = E$" + str(Constants.safer_high) + " (20%), or 3-10 = E$" + str(Constants.safer_low) + " (80%)", R2=" 1-2 = E$" + str(Constants.risky_high) + " (20%), or 3-10 = E$" + str(Constants.risky_low) + " (80%)", L3=" 1-3 = E$" + str(Constants.safer_high) + " (30%), or 4-10 = E$" + str(Constants.safer_low) + " (70%)", R3=" 1-3 = E$" + str(Constants.risky_high) + " (30%), or 4-10 = E$" + str(Constants.risky_low) + " (70%)", L4=" 1-4 = E$" + str(Constants.safer_high) + " (40%), or 5-10 = E$" + str(Constants.safer_low) + " (60%)", R4=" 1-4 = E$" + str(Constants.risky_high) + " (40%), or 5-10 = E$" + str(Constants.risky_low) + " (60%)", L5=" 1-5 = E$" + str(Constants.safer_high) + " (50%), or 6-10 = E$" + str(Constants.safer_low) + " (50%)", R5=" 1-5 = E$" + str(Constants.risky_high) + " (50%), or 6-10 = E$" + str(Constants.risky_low) + " (50%)", L6=" 1-6 = E$" + str(Constants.safer_high) + " (60%), or 7-10 = E$" + str(Constants.safer_low) + " (40%)", R6=" 1-6 = E$" + str(Constants.risky_high) + " (60%), or 7-10 = E$" + str(Constants.risky_low) + " (40%)", L7=" 1-7 = E$" + str(Constants.safer_high) + " (70%), or 8-10 = E$" + str(Constants.safer_low) + " (30%)", R7=" 1-7 = E$" + str(Constants.risky_high) + " (70%), or 8-10 = E$" + str(Constants.risky_low) + " (30%)", L8=" 1-8 = E$" + str(Constants.safer_high) + " (80%), or 9-10 = E$" + str(Constants.safer_low) + " (20%)", R8=" 1-8 = E$" + str(Constants.risky_high) + " (80%), or 9-10 = E$" + str(Constants.risky_low) + " (20%)", L9=" 1-9 = E$" + str(Constants.safer_high) + " (90%), or 10 = E$" + str(Constants.safer_low) + " (10%)", R9=" 1-9 = E$" + str(Constants.risky_high) + " (90%), or 10 = E$" + str(Constants.risky_low) + " (10%)", L10=" 1-10 = E$" + str(Constants.safer_high) + " (100%)", R10=" 1-10 = E$" + str(Constants.risky_high) + " (100%)", ) def before_next_page(player, timeout_happened): player.random_draw = random.choice(range(1, 10)) # random draw selects which decision line counts in MPL player.lottery_random = random.choice(range(1, 10)) # lottery_random chooses a number for the lottery set_payoffs(player) class ResultsWaitPage(WaitPage): pass class Lottery(Page): form_model = 'player' def vars_for_template(player): return dict( num_rows=10, L1=" 1 = E$" + str(Constants.safer_high) + " or 2-10 = E$" + str(Constants.safer_low), R1=" 1 = E$" + str(Constants.risky_high) + " or 2-10 = E$" + str(Constants.risky_low), L2=" 1-2 = E$" + str(Constants.safer_high) + " or 3-10 = E$" + str(Constants.safer_low), R2=" 1-2 = E$" + str(Constants.risky_high) + " or 3-10 = E$" + str(Constants.risky_low), L3=" 1-3 = E$" + str(Constants.safer_high) + " or 4-10 = E$" + str(Constants.safer_low), R3=" 1-3 = E$" + str(Constants.risky_high) + " or 4-10 = E$" + str(Constants.risky_low), L4=" 1-4 = E$" + str(Constants.safer_high) + " or 5-10 = E$" + str(Constants.safer_low), R4=" 1-4 = E$" + str(Constants.risky_high) + " or 5-10 = E$" + str(Constants.risky_low), L5=" 1-5 = E$" + str(Constants.safer_high) + " or 6-10 = E$" + str(Constants.safer_low), R5=" 1-5 = E$" + str(Constants.risky_high) + " or 6-10 = E$" + str(Constants.risky_low), L6=" 1-6 = E$" + str(Constants.safer_high) + " or 7-10 = E$" + str(Constants.safer_low), R6=" 1-6 = E$" + str(Constants.risky_high) + " or 7-10 = E$" + str(Constants.risky_low), L7=" 1-7 = E$" + str(Constants.safer_high) + " or 8-10 = E$" + str(Constants.safer_low), R7=" 1-7 = E$" + str(Constants.risky_high) + " or 8-10 = E$" + str(Constants.risky_low), L8=" 1-8 = E$" + str(Constants.safer_high) + " or 9-10 = E$" + str(Constants.safer_low), R8=" 1-8 = E$" + str(Constants.risky_high) + " or 9-10 = E$" + str(Constants.risky_low), L9=" 1-9 = E$" + str(Constants.safer_high) + " or 10 = E$" + str(Constants.safer_low), R9=" 1-9 = E$" + str(Constants.risky_high) + " or 10 = E$" + str(Constants.risky_low), L10=" 1-10 = E$" + str(Constants.safer_high), R10=" 1-10 = E$" + str(Constants.risky_high), ) def js_vars(player): return dict ( response=json.loads(player.response), ) class Results(Page): form_model = 'player' def vars_for_template(player): return dict( num_rows=10, L1=" 1 = E$" + str(Constants.safer_high) + " or 2-10 = E$" + str(Constants.safer_low), R1=" 1 = E$" + str(Constants.risky_high) + " or 2-10 = E$" + str(Constants.risky_low), L2=" 1-2 = E$" + str(Constants.safer_high) + " or 3-10 = E$" + str(Constants.safer_low), R2=" 1-2 = E$" + str(Constants.risky_high) + " or 3-10 = E$" + str(Constants.risky_low), L3=" 1-3 = E$" + str(Constants.safer_high) + " or 4-10 = E$" + str(Constants.safer_low), R3=" 1-3 = E$" + str(Constants.risky_high) + " or 4-10 = E$" + str(Constants.risky_low), L4=" 1-4 = E$" + str(Constants.safer_high) + " or 5-10 = E$" + str(Constants.safer_low), R4=" 1-4 = E$" + str(Constants.risky_high) + " or 5-10 = E$" + str(Constants.risky_low), L5=" 1-5 = E$" + str(Constants.safer_high) + " or 6-10 = E$" + str(Constants.safer_low), R5=" 1-5 = E$" + str(Constants.risky_high) + " or 6-10 = E$" + str(Constants.risky_low), L6=" 1-6 = E$" + str(Constants.safer_high) + " or 7-10 = E$" + str(Constants.safer_low), R6=" 1-6 = E$" + str(Constants.risky_high) + " or 7-10 = E$" + str(Constants.risky_low), L7=" 1-7 = E$" + str(Constants.safer_high) + " or 8-10 = E$" + str(Constants.safer_low), R7=" 1-7 = E$" + str(Constants.risky_high) + " or 8-10 = E$" + str(Constants.risky_low), L8=" 1-8 = E$" + str(Constants.safer_high) + " or 9-10 = E$" + str(Constants.safer_low), R8=" 1-8 = E$" + str(Constants.risky_high) + " or 9-10 = E$" + str(Constants.risky_low), L9=" 1-9 = E$" + str(Constants.safer_high) + " or 10 = E$" + str(Constants.safer_low), R9=" 1-9 = E$" + str(Constants.risky_high) + " or 10 = E$" + str(Constants.risky_low), L10=" 1-10 = E$" + str(Constants.safer_high), R10=" 1-10 = E$" + str(Constants.risky_high), ) def js_vars(player): return dict( response=json.loads(player.response), ) page_sequence = [Intro, MyPage, Lottery, Results, ResultsWaitPage]