from otree.api import * doc = """ Fragebogen für das WB Social Norms Experiment 3 Treatments: control, T1 und T2 """ def creating_session(subsession): subsession.TREATMENT = 'T1' #für Testzwecke manuell T1 und T2 eingeben für weitere Treatments if 'wb_treatment' in subsession.session.config: #nur relevant wenn man questionnaire als Teil des WB Experiments nimmt subsession.TREATMENT = subsession.session.config['wb_treatment'] subsession.STANDALONE = False class C(BaseConstants): NAME_IN_URL = 'postex_questionnaire' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 #TREATMENT_NAMES = ['Control', 'T1','T2'] Personen = [ dict(name='Kinder', label="Kinder"), dict(name='K_M', label="Mädchen"), dict(name='K_J', label="Jungen"), dict(name='Fr', label="Frauen"), dict(name='Mn', label="Männer"), dict(name='PersonSonstige', label="Sonstige Empfängergruppe"), ] Region = [ dict(name='Afrika_ns', label="Afrika nördlich der Sahara"), dict(name='Afrika_s', label="Afrika südlich der Sahara"), dict(name='Asien', label="Süd- und Südostasien"), dict(name='LateinA', label="Latein- und Mittelamerika"), dict(name='NordA', label="Nordamerika"), dict(name='Osteuropa', label="Osteuropa"), dict(name='Westeuropa', label="Westeuropa"), dict(name='RegionSonstige', label="Sonstige Region"), ] Projekte = [ dict(name='H_Kinder', label="Hilfsprojekte für Kinder und Bildung (z.B UNICEF, SOS Kinderdörfer, Save the Children)"), dict(name='H_Hunger', label="Hilfsprojekte gegen Hunger und Armut (z.B. SOS Kinderdörfer, Gemeinsam für Afrika, Welthungerhilfe)"), dict(name='H_Frieden', label="Hilfsprojekte für Frieden und Schlichtung"), dict(name='H_Tiere', label="Hilfsprojekte für Tiere / Umwelt (z.B. Greenpeace, WWF)"), dict(name='HSonstige', label="Sonstige Hilfsprojekte"), ] class Subsession(BaseSubsession): TREATMENT = models.StringField(initial='Control') STANDALONE = models.BooleanField(initial=True) class Group(BaseGroup): pass class Player(BasePlayer): #hier alle Variablen aufführen #zur Steuerung roletypeA = models.BooleanField(initial=True) spieler1 = models.BooleanField(initial=True) #Seite 1 Feedback zum Experiment und Instruktionen ExpTeilnahme = models.IntegerField( label="Haben Sie schon einmal zuvor an einem Experiment teilgenommen", choices=[ [1, "Ja"], [0, "Nein"] ], widget=widgets.RadioSelect, ) #Instruktionen = models.BooleanField( # label="Empfanden Sie die Instruktionen als gut verständlich?", #choices=[ # [True, "Ja"], # [False, "Nein"] #], #widget=widgets.RadioSelect, #) InstruktionenJa = models.BooleanField(blank=False) InstruktionenNein = models.BooleanField(blank=True) InstruktionenText = models.StringField(blank=True) InstruktionenJ = models.BooleanField( choices=[ [True, "Ja"], [False, "Nein"], ], widgets=widgets.RadioSelect, ) #Seite 2 A-Spieler SpielerAQ1 = models.IntegerField( label="Inwieweit haben Sie sich mit Ihrem Teammitglied im ersten Teil des Experiments (Spieler*in B) durch die gemeinsame Zählaufgabe verbunden gefühlt? (1=gar nicht verbunden; 7=sehr verbunden)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ2Ja = models.BooleanField(blank=False) SpielerAQ2Nein = models.BooleanField(blank=True) SpielerAQ2Text = models.StringField(blank=True) SpielerAQ3Ja = models.BooleanField(blank=False) SpielerAQ3Nein = models.BooleanField(blank=True) SpielerAQ3Text = models.StringField(blank=True) SpielerAQ6 = models.StringField( label="Was hat Sie zu Ihrer Entscheidung über das Spendenbudget bewegt?" ) SpielerAQ7 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Entscheidung über das Spendenbudget berücksichtigt, wie Ihr Teammitglied (Spieler*in B) über Ihre Entscheidung denken würde? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ8 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Entscheidung über das Spendenbudget berücksichtigt, wie sich Ihr Teammitglied (Spieler*in B) verhalten wird? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ9 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Entscheidung über das Spendenbudget berücksichtigt, wie sich andere Teilnehmende des Experiments in der Rolle von Spieler*in A entscheiden könnten? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ10 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Entscheidung über das Spendenbudget berücksichtigt, ob Ihre getroffene Entscheidung die für Sie moralisch richtige Entscheidung darstellt? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ11 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Entscheidung über das Spendenbudget berücksichtigt, ob die Mehrheit der anderen Teilnehmenden in der Rolle von Spieler*in A Ihre getroffene Entscheidung als die moralisch richtige Entscheidung ansieht? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerAQ12 = models.IntegerField( label="Wie hätten Sie sich in der Rolle von Spieler*in B entschieden?", choices=[ [0, "Stillschweigend über das Verhalten von Spieler*in A hinwegsehen"], [1, "Das Verhalten von Spieler*in A melden"] ], widget=widgets.RadioSelect, ) # Seite 2 B-Spieler SpielerBQ1 = models.IntegerField( label="Inwieweit haben Sie sich mit Ihrem Teammitglied im ersten Teil des Experiments (Spieler*in A) durch die gemeinsame Zählaufgabe verbunden gefühlt? (1=gar nicht verbunden; 7=sehr verbunden)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ2Ja = models.BooleanField(blank=False) SpielerBQ2Nein = models.BooleanField(blank=True) SpielerBQ2Text = models.StringField(blank=True) SpielerBQ3Ja = models.BooleanField(blank=False) SpielerBQ3Nein = models.BooleanField(blank=True) SpielerBQ3Text = models.StringField(blank=True) SpielerBQ6 = models.StringField( label="Was hat Sie zu Ihrer Reaktion auf das Verhalten von Spieler*in A bewegt?" ) SpielerBQ7 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Reaktion auf das Verhalten von Spieler*in A berücksichtigt, wie Ihr Teammitglied (Spieler*in A) über Ihre Entscheidung denken würde? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ8 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Reaktion auf das Verhalten von Spieler*in A berücksichtigt, wie sich Ihr Teammitglied (Spieler*in A) verhalten wird? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ9 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Reaktion auf das Verhalten von Spieler*in A berücksichtigt, wie sich andere Teilnehmende des Experiments in der Rolle von Spieler*in B entscheiden könnten? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ10 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Reaktion auf das Verhalten von Spieler*in A berücksichtigt, ob Ihre getroffene Entscheidung die für Sie moralisch richtige Entscheidung darstellt? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ11 = models.IntegerField( label="Wie stark haben Sie bei Ihrer Reaktion auf das Verhalten von Spieler*in A berücksichtigt, ob die Mehrheit der anderen Teilnehmenden in der Rolle von Spieler*in B Ihre getroffene Entscheidung als die moralisch richtige Entscheidung ansieht? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) SpielerBQ12 = models.IntegerField( label="Wie hätten Sie sich in der Rolle von Spieler*in A entschieden?", choices=[ [0, "Einen Teil des Spendenbudgets einbehalten"], [1, "Die Spende weiterleiten"] ], widget=widgets.RadioSelect, ) #Seite 3: Fragen zum zweiten Teil des Experiments Spieler1Q1 = models.IntegerField( label="Wie stark haben Sie in Ihrer Entscheidung, die Aufgabe in Teil 2 des Experiments allein oder als Team zu lösen, die Information über das Verhalten von Spieler*in 2 im ersten Teil des Experiments berücksichtigt? (1=gar nicht berücksichtigt; 7=stark berücksichtigt)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) Spieler2Q1 = models.IntegerField( label="Wie hoch haben Sie das Risiko empfunden, dass Spieler*in 1 sich in Teil 2 des Experiments entscheidet, die Aufgabe alleine zu lösen? (1=sehr niedrig; 7=sehr hoch)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) Spieler2Q2 = models.IntegerField( label="Inwiefern hatten Sie das Gefühl, dass die Entscheidung von Spieler*in 1, die Aufgabe in Teil 2 des Experiments alleine oder als Team zu lösen, von der Information über Ihr Verhalten in Teil 1 des Experiments beeinflusst wurde? (1=gar nicht; 7=sehr stark)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) Spieler2Q3 = models.IntegerField( label="Inwiefern wurde Ihre Entscheidung in Teil 1 des Experiments dadurch beeinflusst, dass Spieler*in 1 in Teil 2 des Experiments entscheiden konnte, ob die Aufgabe allein oder als Team gelöst wird? (1=gar nicht; 7=sehr stark)", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], [6, "6"], [7, "7"], ], widget=widgets.RadioSelectHorizontal, ) #Seite 4 Social Comparison Fragen SCO1 = models.IntegerField( label="Ich vergleiche oft, wie es mir nahestehenden Personen (Partner*in, Familienmitgliedern) und wie es anderen geht.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO2 = models.IntegerField( label="Ich achte immer sehr darauf, wie ich Dinge im Vergleich zu anderen tue.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO3 = models.IntegerField( label="Wenn ich herausfinden will, wie gut ich etwas gemacht habe, vergleiche ich meine Leistungen mit denen anderer.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO4 = models.IntegerField( label="Ich vergleiche mein soziales Verhalten (z. B. soziale Fähigkeiten, Beliebtheit) oft mit dem anderer Menschen.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO5 = models.IntegerField( label="Ich bin nicht der Typ Mensch, der sich oft mit anderen vergleicht.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO6 = models.IntegerField( label="Ich vergleiche mich oft mit anderen in Bezug auf das, was ich im Leben erreicht habe.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO7 = models.IntegerField( label="Ich unterhalte mich oft und gerne mit anderen über gemeinsame Meinungen und Erfahrungen.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO8 = models.IntegerField( label="Ich versuche oft herauszufinden, was andere denken, die ähnliche Probleme haben wie ich.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO9 = models.IntegerField( label="Ich möchte immer wissen, was andere in einer ähnlichen Situation tun würden.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO10 = models.IntegerField( label="Wenn ich mehr über etwas erfahren möchte, versuche ich herauszufinden, was andere darüber denken.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) SCO11 = models.IntegerField( label="Ich betrachte meine Lebenssituation nie im Vergleich zu der anderer Menschen.", choices=[ [1, "1"], [2, "2"], [3, "3"], [4, "4"], [5, "5"], ], widget=widgets.RadioSelect, ) #Seite 5 Fragen zum Spendenverhalten SpendeQ1 = models.IntegerField( label="Haben Sie schon einmal für ein Wohltätigkeitsprojekt gespendet?", choices=[ [0, "Nie"], [1, "Einmal"], [2, "1-3 Mal"], [3, "Regelmäßig"], ], widget=widgets.RadioSelect, ) #wegen Checkboxes andere Struktur #Frage 2 Person Kinder = models.BooleanField(blank=True, initial=False) K_M = models.BooleanField(blank=True, initial=False) K_J = models.BooleanField(blank=True, initial=False) Fr = models.BooleanField(blank=True, initial=False) Mn = models.BooleanField(blank=True, initial=False) PersonSonstige = models.BooleanField(blank=True, initial=False) #Frage 3 Region Afrika_ns = models.BooleanField(blank=True, initial=False) Afrika_s = models.BooleanField(blank=True, initial=False) Asien = models.BooleanField(blank=True, initial=False) LateinA = models.BooleanField(blank=True, initial=False) NordA = models.BooleanField(blank=True, initial=False) Osteuropa = models.BooleanField(blank=True, initial=False) Westeuropa = models.BooleanField(blank=True, initial=False) RegionSonstige = models.BooleanField(blank=True, initial=False) #Frage 4: Wohltätigkeitsprojekte H_Kinder = models.BooleanField(blank=True, initial=False) H_Hunger = models.BooleanField(blank=True, initial=False) H_Frieden = models.BooleanField(blank=True, initial=False) H_Tiere = models.BooleanField(blank=True, initial=False) HSonstige = models.BooleanField(blank=True, initial=False) #Seite 6 Demographische Angaben age = models.IntegerField( label="Wie alt sind Sie?", max=100, min=16 ) gender = models.IntegerField( label="Welchem Geschlecht fühlen Sie sich zugehörig?", choices=[ [1, "weiblich"], [2, "männlich"], [3, "nicht-binär"] ], widget=widgets.RadioSelect, ) major = models.StringField( label="Bitte geben Sie Ihren aktuellen Studiengang an.", ) year = models.IntegerField( label="Aktuelles Fachsemester", max=100, min=1 ) # PAGES class WelcomeWaitPage(WaitPage): wait_for_all_groups = True def after_all_players_arrive(subsession: Subsession): # Spielerdaten bekommen aus wb treatment session for p in subsession.get_players(): if p.participant.vars['spieler'] == 'Spieler1': p.spieler1 = True else: p.spieler1 = False; if p.participant.vars['playertype'] == 'A': p.roletypeA = True else: p.roletypeA = False def is_displayed(player: Player): # nur anzeigen wenn Fragebogen Teil des WB Treatments ist return player.subsession.STANDALONE==False def vars_for_template(player: Player): return dict( body_text="Bitte warten Sie, bis der Fragebogen für alle Teilnehmenden gestartet wird." ) class MyWelcomePage(Page): #erste Seite pass class FeedExp(Page): form_model = 'player' form_fields = [ 'ExpTeilnahme', 'InstruktionenJa', 'InstruktionenNein', 'InstruktionenText' ] class FeedExp2(Page): form_model = 'player' form_fields = [ 'ExpTeilnahme', 'InstruktionenJ', 'InstruktionenText' ] class SpielerAPage(Page): form_model = 'player' form_fields = [ 'SpielerAQ1', 'SpielerAQ2Ja', 'SpielerAQ2Nein', 'SpielerAQ2Text', 'SpielerAQ3Ja', 'SpielerAQ3Nein', 'SpielerAQ3Text', 'SpielerAQ6', 'SpielerAQ7', 'SpielerAQ8', 'SpielerAQ9', 'SpielerAQ10', 'SpielerAQ11', 'SpielerAQ12' ] def is_displayed(player: Player): #nur spieler vom typ A anzeigen return player.roletypeA == True class SpielerBPage(Page): form_model = 'player' form_fields = [ 'SpielerBQ1', 'SpielerBQ2Ja', 'SpielerBQ2Nein', 'SpielerBQ2Text', 'SpielerBQ3Ja', 'SpielerBQ3Nein', 'SpielerBQ3Text', 'SpielerBQ6', 'SpielerBQ7', 'SpielerBQ8', 'SpielerBQ9', 'SpielerBQ10', 'SpielerBQ11', 'SpielerBQ12' ] def is_displayed(player: Player): # nur spieler vom typ B anzeigen return player.roletypeA == False class ZweiterTeilSP1(Page): form_model = 'player' form_fields = ['Spieler1Q1'] @staticmethod def is_displayed(player: Player): return player.spieler1 and (player.subsession.TREATMENT=='T1' or player.subsession.TREATMENT=='T2') class ZweiterTeilSP2_T12(Page): form_model = 'player' form_fields = ['Spieler2Q1', 'Spieler2Q2', 'Spieler2Q3' ] @staticmethod def is_displayed(player: Player): return not player.spieler1 and (player.subsession.TREATMENT=='T1' or player.subsession.TREATMENT=='T2') class ZweiterTeilSP2(Page): form_model = 'player' form_fields = ['Spieler2Q1', 'Spieler2Q3' ] @staticmethod def is_displayed(player: Player): return not player.spieler1 and player.subsession.TREATMENT=='Control' class FragenSCO(Page): form_model = 'player' form_fields = ['SCO1', 'SCO2', 'SCO3', 'SCO4', 'SCO5', 'SCO6', 'SCO7', 'SCO8', 'SCO9', 'SCO10', 'SCO11' ] class SpendenF(Page): form_model = 'player' form_fields = ['SpendeQ1', 'Kinder', 'K_M', 'K_J', 'Fr', 'Mn', 'PersonSonstige', 'Afrika_ns', 'Afrika_s', 'Asien', 'LateinA', 'NordA', 'Osteuropa', 'Westeuropa', 'RegionSonstige', 'H_Kinder', 'H_Hunger', 'H_Frieden', 'H_Tiere', 'HSonstige' ] @staticmethod def error_message(player: Player, values): num_selected1 = 0 num_selected2=0 num_selected3=0 seterror = False string1="" string2="" string3="" for pers in C.Personen: if values[pers['name']]: num_selected1 += 1 if num_selected1 < 1: seterror=True string1 = "Bitte wählen Sie mindestens eine Hilfeempfängeroption aus." for regs in C.Region: if values[regs['name']]: num_selected2 += 1 if num_selected2 < 1: seterror = True string2 = "Bitte wählen Sie mindestens eine der Regionoptionen aus." for proj in C.Projekte: if values[proj['name']]: num_selected3 += 1 if num_selected3 < 1: seterror = True string3 = "Bitte wählen Sie mindestens eine der Pojektoptionen aus." if seterror: return " "+string1+"\n "+string2+"\n "+string3 class Demographie(Page): form_model = 'player' form_fields = [ 'age', 'gender', 'major', 'year', ] class Final(Page): pass #page_sequence = [MyWaitPage,MyWelcomePage, FeedExp, test ,MyPage, MyPage1, MyPage3,MyPage4,MyPage5,MyPage6,MyPage7,Final] page_sequence = [WelcomeWaitPage, MyWelcomePage, FeedExp, SpielerAPage, SpielerBPage, ZweiterTeilSP1,ZweiterTeilSP2, ZweiterTeilSP2_T12,FragenSCO, SpendenF, Demographie,Final]