from otree.api import * doc = """ One player decides how to divide a certain amount between himself and the other player. See: Kahneman, Daniel, Jack L. Knetsch, and Richard H. Thaler. "Fairness and the assumptions of economics." Journal of business (1986): S285-S300. """ class C(BaseConstants): NAME_IN_URL = 'Diktator_Spiel_KG' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 2 ENDOWMENT = 100 class ShuffleWaitPage(WaitPage): wait_for_all_groups = True @staticmethod def after_all_players_arrive(subsession): # Überprüfen, ob es sich um Runde 1 handelt if subsession.round_number == 1: for player in subsession.get_players(): player.participant.vars['Tätigkeit'] = player.Tätigkeit player.participant.vars['Alter'] = player.Alter player.participant.vars['Geschlecht'] = player.Geschlecht player.participant.vars['Einkommen'] = player.Einkommen else: # Werte aus Runde 1 den Spielern in den folgenden Runden zuweisen for player in subsession.get_players(): if 'Tätigkeit' in player.participant.vars: player.Tätigkeit = player.participant.vars['Tätigkeit'] if 'Alter' in player.participant.vars: player.Alter = player.participant.vars['Alter'] if 'Geschlecht' in player.participant.vars: player.Geschlecht = player.participant.vars['Geschlecht'] if 'Einkommen' in player.participant.vars: player.Einkommen = player.participant.vars['Einkommen'] # Zufällige Zuordnung der Spieler zu Gruppen subsession.group_randomly() # In der Subsession die Gruppenbildung auf die WaitPage verweisen class Subsession(BaseSubsession): pass class Group(BaseGroup): kept = models.IntegerField( doc="""Amount dictator decided to keep for himself""", min=0, max=C.ENDOWMENT, label="Ich behalte", ) kept_2 = models.IntegerField( doc="""Amount dictator decided to keep for himself""", min=0, max=C.ENDOWMENT, label="Ich behalte", ) class Player(BasePlayer): type = models.StringField() Tätigkeit = models.StringField(label="Welcher Tätigkeit gehen Sie nach?:") Alter = models.IntegerField(label="Wie alt sind Sie?:", min=1, max=99) Geschlecht = models.IntegerField(label="Welchem Geschlecht sind Sie angehörg?:", choices=[ [1, 'weiblich'], [2, 'männlich'], [3, 'divers'], ] ) Einkommen = models.IntegerField(label="Was ist Ihr Netto-Einkommen pro Monat (in Euro)?", choices=[ [1, 'sehr niedriges Einkommen (...)'], [2, 'niedriges Einkommen (...)'], [3, 'durchschnittliches Einkommen (...)'], [4, 'hohes Einkommen (...)'], [5, 'sehr hohes Einkommen (...)'], ] ) Fair = models.IntegerField(label="Wie fair ist die Entscheidung von Spieler 1 (1=Sehr Fair, 2=Fair, 3=Indifferent, 4=Unfair, 5=Sehr Unfair?", choices=[1, 2, 3, 4, 5], widget=widgets.RadioSelect ) def set_payoffs(group:Group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = group.kept p2.payoff = C.ENDOWMENT - group.kept class Einführung(Page): @staticmethod def is_displayed(player): return player.round_number == 1 form_model = 'player' form_fields = ['Geschlecht', 'Alter','Tätigkeit','Einkommen'] # this means player.name, player.age class Gebot(Page): form_model = 'group' form_fields = ['kept'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 1 class Gebot_2(Page): form_model = 'group' form_fields = ['kept_2'] @staticmethod def is_displayed(player: Player): return player.id_in_group == 2 class WarteSeite(WaitPage): after_all_players_arrive = set_payoffs class Wechsel(Page): @staticmethod def vars_for_template(player: Player): group = player.group return class Ergebnis(Page): @staticmethod def vars_for_template(player: Player): group = player.group return dict(offer=C.ENDOWMENT - group.kept, offer_2=C.ENDOWMENT - group.kept_2) page_sequence = [ Einführung, ShuffleWaitPage, Gebot, WarteSeite, Wechsel, Gebot_2, WarteSeite, Ergebnis, ]