from otree.api import ( Page, WaitPage, models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) from random import choice import random from random import randint doc = """ 2 firms complete in a market by setting prices for homogenous goods. See "Kruse, J. B., Rassenti, S., Reynolds, S. S., & Smith, V. L. (1994). Bertrand-Edgeworth competition in experimental markets. Econometrica: Journal of the Econometric Society, 343-371." """ class Constants(BaseConstants): players_per_group = 6 name_in_url = 'school_choice' num_rounds = 2 instructions_template = 'school_choice/instructions.html' chosen_round = 2 class Subsession(BaseSubsession): def after_all_players_arrive(self, players): if self.round_number == 1: random.shuffle(players) return players pass class Group(BaseGroup): pass class Player(BasePlayer): number = models.IntegerField() chosen_bet = models.CharField( choices=[['A', 'Bet A'], ['B', 'Bet B']], widget=widgets.RadioSelect ) # FUNCTIONS def creating_session(subsession:Subsession): subsession.group_randomly(fixed_id_in_group=True) def set_payoffs(group: Group): all_players = group.get_players() for player in all_players: if player.id_in_group in [1, 2]: player.number_JP = choice([5, 10]) elif player.id_in_group in [3, 4]: player.number_JP = choice([7, 12]) else: player.number_JP = choice([10, 15]) chosen_a = [p for p in all_players if p.chosen_betJP == 'A'] chosen_b = [p for p in all_players if p.chosen_betJP == 'B'] top_a = sorted(chosen_a, key=lambda x: x.number_JP, reverse=True)[:2] top_b = sorted(chosen_b, key=lambda x: x.number_JP, reverse=True)[:2] for player in top_a: if player.subsession.round_number == Constants.chosen_round: player.payoff = 10 for player in top_b: if player.subsession.round_number == Constants.chosen_round: player.payoff = 7 # PAGES class Introduction(Page): pass class ChoosingBet(Page): form_model = 'player' form_fields = ['chosen_bet'] class ResultsWaitPage(WaitPage): after_all_players_arrive = 'set_payoffs' class Results(Page): @staticmethod def vars_for_template(player: Player): group = player.group all_players = group.get_players() top_a = sorted( [p for p in all_players if p.chosen_betJP == 'A'], key=lambda x: x.number_JP, reverse=True)[:2] top_b = sorted( [p for p in all_players if p.chosen_betJP == 'B'], key=lambda x: x.number_JP, reverse=True)[:2] return { 'top_a': top_a, 'top_b': top_b, } pass class Payout(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 2 class Pose(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player: Player): if player.round_number == 1: return page_sequence = [Introduction, ChoosingBet, ResultsWaitPage, Results, Pose]