from otree.api import ( Page, WaitPage, models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random doc = """ Measuring flexibility """ class Constants(BaseConstants): name_in_url = 'flex_example' players_per_group = None num_rounds = 1 cost = 20 # cost2 = 30 # penalty_q = 5 quantity_a = 40 price_a = 18 num_rows = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): # nature_abnormal = models.IntegerField() # a random draw here will determine the state choose_b = models.BooleanField() price_b = models.IntegerField() cost = models.IntegerField() random_nature = models.IntegerField() quantity_b = models.IntegerField( label=' ', min=0, max=40) payoff_flex = models.IntegerField() mainjob = models.IntegerField(choices=[[1, 'Yes'], [0, 'No']], widget=widgets.RadioSelect, label='A. Do you consider your work in Fiverr or other similar platforms as your main job?') venmo = models.StringField( label="B. Please type your Venmo below (we will not share or use this information for any purpose other than sending you your compensation).", ) # FUNCTIONS def creating_session(subsession): print('in creating session') # Defining price B across rounds: for player in subsession.get_players(): if player.round_number == 1: player.price_b = 18 def set_payoffs(player): # Logic # A (40*20)-(5*cost) # B (quantity_b*price)-((quantity_b-35)*cost) if not player.choose_b: player.payoff = float((Constants.quantity_a*Constants.price_a)-(5*player.cost)) else: player.payoff = float((player.quantity_b*player.price_b)-((player.quantity_b-35)*player.cost)) # PAGES class AIntro(Page): def is_displayed(player): return player.round_number == 1 class BInstructions(Page): def is_displayed(player): return player.round_number == 1 def before_next_page(player, timeout_happened): player.random_nature = random.choice(range(1, 10)) if player.random_nature <= 8: # normal state, no cost player.cost = 0 else: # atypical state, cost vary player.cost = Constants.cost class CChoice(Page): form_model = 'player' form_fields = ['choose_b'] def vars_for_template(player): return dict( num_rows=1, L="Sell 40 units for 18 points each", R="Choose how many units to sell (0 to 40) for 18 points each.
You may adjust the quantity after you know the future.", C="No costs until quantity 35, and a tax of 20 points for each additional unit" ) class DStateOfTheWorld(Page): form_model = 'player' def before_next_page(player, timeout_happened): if player.choose_b == False: set_payoffs(player) class D1QuantityB(Page): form_model = 'player' form_fields = ['quantity_b'] def is_displayed(player): return player.choose_b == True def before_next_page(player, timeout_happened): if player.choose_b == True: set_payoffs(player) class ERoundResults(Page): pass class ResultsWaitPage(WaitPage): pass page_sequence = [AIntro, BInstructions, CChoice, DStateOfTheWorld, D1QuantityB, ERoundResults]