from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'nonlinear_public' players_per_group = 2 num_rounds = 15 parameter= 0.5 endowment_low = 12 endowment_high = 18 INSTRUCTIONS_TEMPLATE = 'nonlinear_public/Instructions.html' class Subsession(BaseSubsession): pass class Player(BasePlayer): contribution = models.IntegerField() private = models.IntegerField() utility = models.IntegerField() class Group(BaseGroup): contribution1 = models.IntegerField( choices=range(0, Constants.endowment_low+1, 1), label="いくら投資しますか?", ) contribution2 = models.IntegerField( choices=range(0, Constants.endowment_high+1, 1), label="いくら投資しますか?", ) public_share = models.IntegerField() def compute(self): p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p1.contribution = self.contribution1 p2.contribution = self.contribution2 p1.private = Constants.endowment_low - p1.contribution p2.private = Constants.endowment_high - p2.contribution self.public_share = p1.contribution + p2.contribution p1.utility = round(100 * p1.private ** Constants.parameter * self.public_share ** (1 - Constants.parameter) + 100) p2.utility = round(100 * p2.private ** Constants.parameter * self.public_share ** (1 - Constants.parameter) + 100) # PAGES class Instructions(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Roles(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Page1(Page): timeout_seconds = 90 form_model = 'group' form_fields = ['contribution1'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 @staticmethod def vars_for_template(player: Player): if not player.round_number == 1: prev_player = player.in_round(player.round_number - 1) prev_group = player.group.in_round(player.round_number - 1) return dict( prev_player=prev_player, prev_group=prev_group, ) class Page2(Page): timeout_seconds = 90 form_model = 'group' form_fields = ['contribution2'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 @staticmethod def vars_for_template(player: Player): if not player.round_number == 1: prev_player = player.in_round(player.round_number - 1) prev_group = player.group.in_round(player.round_number - 1) return dict( prev_player=prev_player, prev_group=prev_group, ) class Results(Page): timeout_seconds = 30 class FinalResults(Page): @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds @staticmethod def vars_for_template(player: Player): player_in_all_rounds = player.in_all_rounds() group_in_all_rounds = player.group.in_all_rounds() return dict( player_in_all_rounds=player_in_all_rounds, group_in_all_rounds =group_in_all_rounds, ) class ResultsWaitPage(WaitPage): def after_all_players_arrive(self): self.group.compute() page_sequence = [Instructions, Roles, Page1, Page2, ResultsWaitPage, Results, FinalResults]