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]