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 = 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 = 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*Constants.cost)) else: player.payoff = float((player.quantity_b*player.price_b)-((player.quantity_b-35)*Constants.cost)) # PAGES class Intro(Page): def is_displayed(player): return player.round_number == 1 class Instructions(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: # abnormal state, cost vary player.cost = Constants.cost 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$ 18 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" ) 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 = [Intro, Instructions, Choice, StateOfTheWorld, QuantityB, RoundResults, ResultsWaitPage]