from otree.api import * doc = """ Behavioural Economics classroom experiments (LUT 2023) """ """ Experiments: 2. Strategic interaction: c) Weak link game (SI3) """ class C(BaseConstants): NAME_IN_URL = 'behavioural_econ_weak_link' PLAYERS_PER_GROUP = None NUM_ROUNDS = 10 class Subsession(BaseSubsession): pass class Group(BaseGroup): lowest_bid = models.IntegerField() class Player(BasePlayer): SI3_answer = models.IntegerField(label="", choices=[1, 2, 3, 4, 5, 6, 7], widget=widgets.RadioSelect) age = models.IntegerField(min=1920, max=2006) sex = models.StringField(widget=widgets.RadioSelect, choices=["Male", "Female", "I prefer not to say"]) # PAGES class Start(Page): def is_displayed(player: Player): return player.round_number == 1 class SI3_instructions(Page): def is_displayed(player: Player): return player.round_number == 1 class SI3_task(Page): form_model = 'player' form_fields = ['SI3_answer'] class WaitingPage(WaitPage): @staticmethod def after_all_players_arrive(group: Group): choices = [] for p in group.get_players(): choices.append(p.SI3_answer) choices.sort() group.lowest_bid = choices[0] for p in group.get_players(): p.payoff = 0.20*group.lowest_bid-0.10*p.SI3_answer+0.60 class SI3_result(Page): def vars_for_template(player: Player): chosen = 1 choice = 1 earnings = 1 return dict(chosen=chosen, choice=choice, earnings=earnings) class Demographics(Page): def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS form_model = 'player' form_fields = ['age', 'sex'] class Final(Page): def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS page_sequence = [ Start, SI3_instructions, SI3_task, WaitingPage, SI3_result, # Demographics, Final]