from otree.api import * import random doc = """ Asymmetric game Part II """ class C(BaseConstants): NAME_IN_URL = 'Asym2' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 8 MULTIPLIER = 1.5 Pool = 20 Account = 20 class Subsession(BaseSubsession): pass class Group(BaseGroup): contribution = models.IntegerField() extraction = models.IntegerField() size_pool = models.IntegerField() payoff_per_group = models.FloatField() additional_payoff1 = models.IntegerField() additional_payoff2 = models.IntegerField() pool = models.FloatField() class Player(BasePlayer): possible_payoff = models.FloatField() extraction = models.IntegerField( min=0, max=20, label="So viele Taler (zwischen 0 und 20) nehme ich aus dem Gemeinschaftsprojekt:" ) contribution = models.IntegerField( min=0, max=20, label="So viele Taler (zwischen 0 und 20) gebe ich in das Gemeinschaftsprojekt:" ) thoughts1 = models.LongStringField( blank=False, label="Bitte notieren Sie Ihre Gedanken und Überlegungen in folgendem Textfeld:" ) thoughts2 = models.LongStringField( blank=True, label="Bitte notieren Sie Ihre Gedanken und Überlegungen in folgendem Textfeld:" ) def creating_session(subsession): if subsession.round_number == 1: subsession.group_randomly() else: subsession.group_like_round(1) def set_possible_payoffs(group: Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) contribution = p1.contribution extraction = p2.extraction group.size_pool = C.Pool - extraction + contribution group.additional_payoff1 = C.Account - contribution group.additional_payoff2 = extraction group.pool = group.size_pool * C.MULTIPLIER group.payoff_per_group = group.pool / 2 p1.possible_payoff = group.payoff_per_group + group.additional_payoff1 p2.possible_payoff = group.payoff_per_group + group.additional_payoff2 class MyWaitPage(WaitPage): wait_for_all_groups = True after_all_players_arrive = 'creating_session' class Introduction(Page): @staticmethod def is_displayed(player): return player.round_number == 1 class Intro2(Page): timeout_seconds = 10 @staticmethod def is_displayed(player): return player.round_number >= 2 class Thoughts(Page): timeout_seconds = 100 form_model = 'player' form_fields = ['thoughts1'] @staticmethod def is_displayed(player): return player.round_number == 1 class Thoughts2(Page): timeout_seconds = 100 form_model = 'player' form_fields = ['thoughts2'] @staticmethod def is_displayed(player): return player.round_number >= 2 class Contribution(Page): form_model = 'player' form_fields = ['contribution'] @staticmethod def is_displayed(player): return player.id_in_group <= 1 class Extraction(Page): form_model = 'player' form_fields = ['extraction'] @staticmethod def is_displayed(player): return player.id_in_group > 1 class ResultsWaitPage(WaitPage): after_all_players_arrive = set_possible_payoffs class Results(Page): timeout_seconds = 30 @staticmethod def vars_for_template(player): group = player.group p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) return dict( g=player.group.get_players(), p1=p1, p2=p2, earning=format(float(player.possible_payoff), '.2f').replace(".", ","), ) @staticmethod def before_next_page(player: Player, timeout_happened): import random participant = player.participant # if it's the last round if player.round_number == C.NUM_ROUNDS: random_round = random.randint(1, C.NUM_ROUNDS) participant.selected_round = random_round player_in_selected_round = player.in_round(random_round) player.payoff = player_in_selected_round.possible_payoff participant.vars['app2_payoff'] = player.payoff participant.vars['app2_round'] = random_round class Ende(Page): @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS class BlankWaitPage(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS class Blank(Page): @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS page_sequence = [MyWaitPage, Introduction, Intro2, Thoughts, Thoughts2, Contribution, Extraction, ResultsWaitPage, Results, Ende, BlankWaitPage, Blank]