from otree.api import * c = cu doc = '' class C(BaseConstants): NAME_IN_URL = 'dynamic_short1' 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.RadioSelectHorizontal) 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 current_wage(player: Player): if player.round_number ==1: return C.INITIAL_WAGE elif player.round_number ==2: return current_wage2(player) elif player.round_number ==3: return current_wage3(player) elif player.round_number ==4: return current_wage4(player) else: return current_wage5(player) def task_earnings(player: Player): return C.NUM_TASKS * current_wage(player) def benefit_earnings(player: Player): if task_earnings(player) <=C.BENEFIT_THRESHOLD: return C.EXPERIMENTER_BENEFIT else: return 0 def prev_wage(player: Player): if player.round_number ==1: return C.INITIAL_WAGE elif player.round_number ==2: return C.INITIAL_WAGE elif player.round_number ==3: return current_wage2(player) elif player.round_number ==4: return current_wage3(player) else: return current_wage4(player) def wage_decision_choices(player: Player): if prev_wage(player) == C.INITIAL_WAGE: return ["Increase wage by $0.10","Stay at current wage"] else: return ["Increase wage by $0.10","Stay at current wage","Revert to initial wage of $0.20"] 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 Initial_tasks(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number ==1 class Initial_results(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 Decision(Page): form_model = 'player' form_fields = ['wage_decision'] @staticmethod def is_displayed(player: Player): return player.round_number !=1 @staticmethod def vars_for_template(player: Player): return dict(prev_wage = prev_wage(player)) @staticmethod def before_next_page(player: Player, timeout_happened): if task_earnings(player) <= C.BENEFIT_THRESHOLD: player.payoff = task_earnings(player) + benefit_earnings(player) else: player.payoff = task_earnings(player) class Tasks(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number !=1 class Results(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number !=1 @staticmethod def vars_for_template(player: Player): return dict( current_wage = current_wage(player), task_earnings = task_earnings(player), benefit_earnings = benefit_earnings(player) ) class Final_results(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [Instructions, Initial_wage, Initial_tasks, Initial_results, Decision, Tasks, Results, Final_results]