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' players_per_group = None num_rounds = 3 cost1 = 20 cost2 = 30 penalty_q = 5 quantity_a = 40 price_a = 20 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() # 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 = 20 if player.round_number == 2: player.price_b = 19 else: player.price_b = 18 # def state_of_nature(player): # #for player in subsession.get_players(): # if player.random_nature <= 8: # normal state, no cost # player.cost = 0 # else: # abnormal state, cost vary # if player.round_number <= 2: # player.cost = Constants.cost1 # else: # player.cost = Constants.cost2 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 Instructions(Page): pass # 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: # abnormal state, cost vary # if player.round_number <= 2: # player.cost = Constants.cost1 # else: # player.cost = Constants.cost2 class Next(Page): form_model = 'player' # 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: # abnormal state, cost vary if player.round_number <= 2: player.cost = Constants.cost1 else: player.cost = Constants.cost2 class Choice(Page): form_model = 'player' form_fields = ['choose_b'] def vars_for_template(player): return dict( num_rows=1, L="Sell 40 units for E$ 20 each", R="Choose how many units to sell (0 to 40) for E$ " + str(player.price_b) + " each. You choose quantity after knowing the future.", C="You must pay a E$ " + str(player.cost) + " fee for every unit sold above 35" ) # 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: # abnormal state, cost vary # if player.round_number <= 2: # player.cost = Constants.cost1 # else: # player.cost = Constants.cost2 class StateOfTheWorld(Page): form_model = 'player' def before_next_page(player, timeout_happened): if player.choose_b == False: set_payoffs(player) class QuantityB(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 RoundResults(Page): pass class ResultsWaitPage(WaitPage): pass class Results(Page): pass # def is_displayed(player): # return player.round_number == 3 page_sequence = [Next, Choice, StateOfTheWorld, QuantityB, RoundResults]