from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'dynamic_short' PLAYERS_PER_GROUP = None NUM_ROUNDS = 5 EXPERIMENTER_BENEFIT = cu(1.5) INITIAL_WAGE = cu(0.2) BENEFIT_THRESHOLD = cu(1) NUM_TASKS = 5 RAISE = cu(0.1) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): wage_decision = models.StringField(choices=[['Increase wage by $0.10', 'Increase wage by $0.10'], ['Stay at current wage', 'Stay at current wage'], ['Revert to initial wage of $0.20', 'Revert to initial wage of $0.20']], widget=widgets.RadioSelect) ID_Number = models.IntegerField(blank=True, label='ID Number') wage_decision_limited = models.StringField(choices=[['A', 'Increase wage by $0.10'], ['B', 'Stay at current wage']], label='Wage Decision', widget=widgets.RadioSelect) def current_wage2(player: Player): if player.in_round(2).wage_decision == "Increase wage by $0.10": return C.INITIAL_WAGE + C.RAISE else: return C.INITIAL_WAGE def current_wage3(player: Player): if player.in_round(3).wage_decision == "Increase wage by $0.10": return current_wage2(player) + C.RAISE elif player.in_round(3).wage_decision == "Stay at current wage": return current_wage2(player) else: return C.INITIAL_WAGE def current_wage4(player: Player): if player.in_round(4).wage_decision == "Increase wage by $0.10": return current_wage3(player) + C.RAISE elif player.in_round(4).wage_decision == "Stay at current wage": return current_wage3(player) else: return C.INITIAL_WAGE def current_wage5(player: Player): if player.in_round(5).wage_decision == "Increase wage by $0.10": return current_wage4(player) + C.RAISE elif player.in_round(5).wage_decision == "Stay at current wage": return current_wage4(player) else: return C.INITIAL_WAGE def task_earnings2(player: Player): return C.NUM_TASKS * current_wage2(player) def task_earnings3(player: Player): return C.NUM_TASKS * current_wage3(player) def task_earnings4(player: Player): return C.NUM_TASKS * current_wage4(player) def task_earnings5(player: Player): return C.NUM_TASKS * current_wage5(player) def benefit_earnings2(player: Player): if task_earnings2(player) <=C.BENEFIT_THRESHOLD: return C.EXPERIMENTER_BENEFIT else: return 0 def benefit_earnings3(player: Player): if task_earnings3(player) <=C.BENEFIT_THRESHOLD: return C.EXPERIMENTER_BENEFIT else: return 0 def benefit_earnings4(player: Player): if task_earnings4(player) <=C.BENEFIT_THRESHOLD: return C.EXPERIMENTER_BENEFIT else: return 0 def benefit_earnings5(player: Player): if task_earnings5(player) <=C.BENEFIT_THRESHOLD: return C.EXPERIMENTER_BENEFIT else: return 0 class ID_Number(Page): form_model = 'player' form_fields = ['ID_Number'] @staticmethod def is_displayed(player: Player): return player.round_number ==1 class Instructions(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==1 class Initial_wage(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): player.payoff = C.NUM_TASKS * C.INITIAL_WAGE + C.EXPERIMENTER_BENEFIT class Tasks(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==1 class Initial_Result(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def vars_for_template(player: Player): return dict(initial_earnings = C.NUM_TASKS * C.INITIAL_WAGE) class Decision2(Page): form_model = 'player' form_fields = ['wage_decision'] @staticmethod def is_displayed(player: Player): return player.round_number ==2 @staticmethod def before_next_page(player: Player, timeout_happened): if task_earnings2(player) <= C.BENEFIT_THRESHOLD: player.payoff = task_earnings2(player) + benefit_earnings2(player) else: player.payoff = task_earnings2(player) class Tasks2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==2 class Results2(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 2 @staticmethod def vars_for_template(player: Player): return dict( current_wage2 = current_wage2(player), task_earnings2 = task_earnings2(player), benefit_earnings2 = benefit_earnings2(player) ) class Decision3(Page): form_model = 'player' form_fields = ['wage_decision'] @staticmethod def is_displayed(player: Player): return player.round_number ==3 @staticmethod def vars_for_template(player: Player): return dict(current_wage2 = current_wage2(player)) @staticmethod def before_next_page(player: Player, timeout_happened): if task_earnings3(player) <= C.BENEFIT_THRESHOLD: player.payoff = task_earnings3(player) + benefit_earnings3(player) else: player.payoff = task_earnings3(player) class Tasks3(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==3 class Results3(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==3 @staticmethod def vars_for_template(player: Player): return dict( current_wage3 = current_wage3(player), task_earnings3 = task_earnings3(player), benefit_earnings3 = benefit_earnings3(player) ) class Decision4(Page): form_model = 'player' form_fields = ['wage_decision'] @staticmethod def is_displayed(player: Player): return player.round_number == 4 @staticmethod def vars_for_template(player: Player): return dict(current_wage3 = current_wage3(player)) @staticmethod def before_next_page(player: Player, timeout_happened): if task_earnings4(player) <= C.BENEFIT_THRESHOLD: player.payoff = task_earnings4(player) + benefit_earnings4(player) else: player.payoff = task_earnings4(player) class Tasks4(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==4 class Results4(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==4 @staticmethod def vars_for_template(player: Player): return dict( current_wage4 = current_wage4(player), task_earnings4 = task_earnings4(player), benefit_earnings4 = benefit_earnings4(player) ) class Decision5(Page): form_model = 'player' form_fields = ['wage_decision'] @staticmethod def is_displayed(player: Player): return player.round_number ==5 @staticmethod def vars_for_template(player: Player): return dict(current_wage4 = current_wage4(player)) @staticmethod def before_next_page(player: Player, timeout_happened): if task_earnings5(player) <= C.BENEFIT_THRESHOLD: player.payoff = task_earnings5(player) + benefit_earnings5(player) else: player.payoff = task_earnings5(player) class Tasks5(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==5 class Results5(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==5 @staticmethod def vars_for_template(player: Player): return dict( current_wage5 = current_wage5(player), task_earnings5 = task_earnings5(player), benefit_earnings5 = benefit_earnings5(player) ) class Final_results(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [ID_Number, Instructions, Initial_wage, Tasks, Initial_Result, Decision2, Tasks2, Results2, Decision3, Tasks3, Results3, Decision4, Tasks4, Results4, Decision5, Tasks5, Results5, Final_results]