from otree.api import * import random doc = """ Indi Give T3 Part 2 """ class C(BaseConstants): NAME_IN_URL = 'Indi_Give_T3_P2' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 8 MULTIPLIER = 1.5 Pool = 0 Account = 20 class Subsession(BaseSubsession): pass class Group(BaseGroup): contribution = 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() contribution1 = models.IntegerField( min=0, max=20, label="So viele Taler (zwischen 0 und 20) gebe ich in das Gemeinschaftsprojekt:" ) contribution2 = models.IntegerField( min=0, max=20, label="So viele Taler (zwischen 0 und 20) gebe ich in das Gemeinschaftsprojekt:" ) Strategy_Q1 = models.StringField( label='Was denken Sie: Welche der folgenden Strategien beschreibt das Verhalten eines typischen Teilnehmers im nächsten Teil am besten? Das heißt, welche der folgenden Strategien ist die häufigste? ', choices=['(1) Immer wenige/keine Taler (d.h. zwischen 0-6 Taler) geben.', '(2) Immer viele/alle Taler (d.h. zwischen 14-20 Taler) geben.', '(3) In der ersten Runde viele/alle Taler geben. In den folgenden Runden das Verhalten des anderen Teilnehmers aus der vorherigen Runde spiegeln: Hat er viele/alle Taler gegeben, gibt man ebenfalls viele/alle; hat er wenige/keine gegeben, gibt man ebenfalls wenige/keine.', '(4) In der ersten Runde viele/alle Taler geben. In den folgenden Runden weiterhin viele/alle Taler geben, solange der andere Teilnehmer zuvor ebenfalls viele/alle Taler gegeben hat. Gibt der andere Teilnehmer jedoch einmal wenige/keine Taler, ab diesem Zeitpunkt dauerhaft wenig/keine Taler geben.', '(5) Wie Strategie (3), nur in der ersten Runde wenig/keine Taler geben.', '(6) Wie Strategie (3), nur in Runde 8 auf jeden Fall wenig/keine Taler geben.', '(7) Wie Strategie (3), nur in Runden 7 und 8 auf jeden Fall wenig/keine Taler geben.', 'Keine der oben genannten Strategien' ], widget=widgets.RadioSelect, ) Strategy_Q2 = models.StringField( label='Was denken Sie: Welche der folgenden Strategien beschreibt das Verhalten eines typischen Teilnehmern im gerade gespielten Teil am besten? Das heißt, welche der folgenden Strategien war die häufigste? ', choices=['(1) Immer wenige/keine Taler (d.h. zwischen 0-6 Taler) geben.', '(2) Immer viele/alle Taler (d.h. zwischen 14-20 Taler) geben.', '(3) In der ersten Runde viele/alle Taler geben. In den folgenden Runden das Verhalten des anderen Teilnehmers aus der vorherigen Runde spiegeln: Hat er viele/alle Taler gegeben, gibt man ebenfalls viele/alle; hat er wenige/keine gegeben, gibt man ebenfalls wenige/keine.', '(4) In der ersten Runde viele/alle Taler geben. In den folgenden Runden weiterhin viele/alle Taler geben, solange der andere Teilnehmer zuvor ebenfalls viele/alle Taler gegeben hat. Gibt der andere Teilnehmer jedoch einmal wenige/keine Taler, ab diesem Zeitpunkt dauerhaft wenig/keine Taler geben.', '(5) Wie Strategie (3), nur in der ersten Runde wenig/keine Taler geben.', '(6) Wie Strategie (3), nur in Runde 8 auf jeden Fall wenig/keine Taler geben.', '(7) Wie Strategie (3), nur in Runden 7 und 8 auf jeden Fall wenig/keine Taler geben.', 'Keine der oben genannten Strategien' ], widget=widgets.RadioSelect, ) 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) contribution1 = p1.contribution1 contribution2 = p2.contribution2 group.size_pool = C.Pool + contribution1 + contribution2 group.additional_payoff1 = C.Account - contribution1 group.additional_payoff2 = C.Account - contribution2 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 Strategy1(Page): form_model = 'player' form_fields = ['Strategy_Q1'] @staticmethod def is_displayed(player): return player.round_number == 1 class Contribution1(Page): form_model = 'player' form_fields = ['contribution1'] @staticmethod def is_displayed(player): return player.id_in_group == 1 class Contribution2(Page): form_model = 'player' form_fields = ['contribution2'] @staticmethod def is_displayed(player): return player.id_in_group == 2 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 Strategy2(Page): form_model = 'player' form_fields = ['Strategy_Q2'] @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS 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, Strategy1, Contribution1, Contribution2, ResultsWaitPage, Results, Strategy2, Ende, BlankWaitPage, Blank]