from otree.api import * import numpy as np doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'masterarbeit' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 BUDGET = 1000 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.IntegerField() trust_game_1 = models.CurrencyField(min=0) trust_game_2 = models.CurrencyField(min=0) trust_game_3 = models.CurrencyField(min=0) trust_game_4 = models.CurrencyField(min=0) trust_game_5 = models.CurrencyField(min=0) trust_game_6 = models.CurrencyField(min=0) trust_game_7 = models.CurrencyField(min=0) trust_game_8 = models.CurrencyField(min=0) trust_game_9 = models.CurrencyField(min=0) trust_game_10 = models.CurrencyField(min=0) kontrollfrage_1 = models.IntegerField(label="Der DIFG-Investmentfonds unterscheidet sich nicht vom DIFG-Nachhaltigkeitsfonds bezüglich der Kosten.", choices=[[1, 'Richtig'], [2, 'Falsch']], widget=widgets.RadioSelectHorizontal) kontrollfrage_2 = models.IntegerField(label="Der DIFG-Investmentfonds berücksichtigt bei der Anlagepolitik Ziele der Nachhaltigkeit.", choices=[[1, 'Richtig'], [2, 'Falsch']], widget=widgets.RadioSelectHorizontal) kontrollfrage_3 = models.IntegerField(label="Es laufen staatsanwaltschaftliche Ermittlungen gegen den DIFG-Nachhaltigkeitsfonds aufgrund von Greenwashing Vorwürfen.", choices=[[1, 'Richtig'], [2, 'Falsch']], widget=widgets.RadioSelectHorizontal) investment_konventionell = models.CurrencyField(label="Wieviel Geld wollen Sie in den DIFG-Investmentfonds investieren?", min=0) investment_nachhaltig = models.CurrencyField(label="Wieviel Geld wollen Sie in den DIFG-Nachhaltigkeitsfonds investieren?", min=0) kein_investment = models.CurrencyField(label="Wieviel Geld wollen Sie gar nicht investieren?", min=0) erwartete_rendite = models.IntegerField(label="Wie schätzen Sie die Rendite von nachhaltigen Investmentfonds im Vergleich zu konventionellen Investmentfonds ein?", choices=[[1, 'deutlich niedriger'], [2, 'ein bisschen geringer'], [3, 'gleich'], [4, 'ein bisschen höher'], [5, 'deutlich höher']], widget=widgets.RadioSelect,) erwartetes_risiko = models.IntegerField(label="Wie schätzen Sie das Risiko von nachhaltigen Investmentfonds im Vergleich zu konventionellen Investmentfonds ein?", choices=[[1, 'deutlich niedriger'], [2, 'ein bisschen geringer'], [3, 'gleich'], [4, 'ein bisschen höher'], [5, 'deutlich höher']], widget=widgets.RadioSelect,) erwartetes_rr_ratio = models.IntegerField(label="Wie schätzen Sie das Rendite-Risiko Verhältnis von nachhaltigen Investmentfonds im Vergleich zu konventionellen Investmentfonds ein?", choices=[[1, 'deutlich niedriger'], [2, 'ein bisschen geringer'], [3, 'gleich'], [4, 'ein bisschen höher'], [5, 'deutlich höher']], widget=widgets.RadioSelect,) vertrauen_1 = models.IntegerField(label="Ich vertraue dem DIFG-Nachhaltigkeitsfonds sich an die Nachhaltigkeits-Richtlinien, mit denen er wirbt, zu halten.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) vertrauen_2 = models.IntegerField(label="Der Nachhaltigkeitsfonds, angeboten von der DIFG, ist ein ehrlicher Versuch soziale Themen, wie die Problematik der Umweltverschmutzung, zu verbessern.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) vertrauen_3 = models.IntegerField(label="Ich vertraue dem DIFG-Nachhaltigkeitsfonds alles in seiner Macht Stehende zu tun, Unternehmen dazu zubringen soziale Probleme zu reduzieren.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) vertrauen_4 = models.IntegerField(label="Ich vertraue dem DIFG-Nachhaltigkeitsfonds nicht in Unternehmen zu investieren, die Tabak oder Waffen herstellen.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) vertrauen_5 = models.IntegerField(label="Anbieter von Nachhaltigkeitsfonds haben kein eigenständiges Interesse in der Verbesserung der Umwelt, da sie wie jedes Unternehmen zuallererst Gewinn machen wollen.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) marketing_trick = models.IntegerField(label='Glauben Sie, dass nachhaltige Investmentfonds ein Marketing Trick sind?', choices=[[1, 'Ja'], [2, 'Nein']], widget=widgets.RadioSelectHorizontal, ) nachhaltiger_impact_1 = models.IntegerField(label="Nachhaltige Investmentfonds haben einen positiven Einfluss auf die Gesellschaft.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) nachhaltiger_impact_2 = models.IntegerField(label="Durch das Investieren in nachhaltige Investmentfonds kann jeder Investor einen positiven Einfluss auf die Umwelt ausüben.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) nachhaltiger_impact_3 = models.IntegerField(label="Jede Person hat die Macht soziale Probleme zu beeinflussen, indem sie nachhaltig investiert.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) nachhaltiger_impact_4 = models.IntegerField(label="Es macht keinen Unterschied nachhaltig zu investieren, da eine Person allein keine Veränderungen bewirken kann.", choices=[[1, 'Stimme überhaupt nicht zu'], [2, 'Stimme nicht zu'], [3, 'Stimme weder zu noch nicht zu'], [4, 'Stimme zu'], [5, 'Stimme voll und ganz zu']], widget=widgets.RadioSelect) alter = models.IntegerField(label='Wie alt sind Sie?', max=120, min=1) geschlecht = models.StringField(label='Welches Geschlecht haben Sie?', choices=[['männlich', 'männlich'], ['weiblich', 'weiblich'], ['divers', 'divers']], widget=widgets.RadioSelect,) bildung = models.IntegerField(label='Was ist Ihr höchster Bildungsabschluss?', choices=[[1, 'Hauptschulabschluss'], [2, 'Realschule (Mittlere Reife)'], [3, 'Gymnasium (Abitur)'], [4, 'Abgeschlossene Berufsausbildung'], [5, 'Hochschulabschluss (Bachelor, Master)']], widget=widgets.RadioSelectHorizontal,) feedback = models.LongStringField(label='Feedback:', blank=True,) # FUNCTIONS def creating_session(subsession: Subsession): # balanced randomisation of subjects into treatment 1 and 2 if subsession.round_number == 1: number_players = len(subsession.get_players()) treatment_list = [] for i in range(number_players): # % gives the remainder of a division # ensures that both treatments are balanced if i % 2 == 0: treatment_list.append(1) else: treatment_list.append(2) for player in subsession.get_players(): # get a random treatment index = np.random.randint(0, len(treatment_list)) # pop removes the value from the list so it wont be assigned again player.treatment = treatment_list.pop(index) else: for player in subsession.get_players(): player.treatment = player.in_round(1).treatment # PAGES class Einleitung(Page): pass class TrustGame1(Page): pass class TrustGame2(Page): form_model = 'player' form_fields = ['trust_game_1', 'trust_game_2', 'trust_game_3', 'trust_game_4', 'trust_game_5', 'trust_game_6', 'trust_game_7', 'trust_game_8', 'trust_game_9', 'trust_game_10'] def error_message(player: Player, values): if values['trust_game_1'] > 15: return "Du kannst bei Entscheidung 1 maximal 15 Euro zurückschicken" if values['trust_game_2'] > 30: return "Du kannst bei Entscheidung 2 maximal 30 Euro zurückschicken" if values['trust_game_3'] > 45: return "Du kannst bei Entscheidung 3 maximal 45 Euro zurückschicken" if values['trust_game_4'] > 60: return "Du kannst bei Entscheidung 4 maximal 60 Euro zurückschicken" if values['trust_game_5'] > 75: return "Du kannst bei Entscheidung 5 maximal 75 Euro zurückschicken" if values['trust_game_6'] > 90: return "Du kannst bei Entscheidung 6 maximal 90 Euro zurückschicken" if values['trust_game_7'] > 105: return "Du kannst bei Entscheidung 7 maximal 105 Euro zurückschicken" if values['trust_game_8'] > 120: return "Du kannst bei Entscheidung 8 maximal 120 Euro zurückschicken" if values['trust_game_9'] > 135: return "Du kannst bei Entscheidung 9 maximal 135 Euro zurückschicken" if values['trust_game_10'] > 150: return "Du kannst bei Entscheidung 10 maximal 150 Euro zurückschicken" class Erklaerung1(Page): @staticmethod def is_displayed(player: Player): return player.treatment == 1 class Erklaerung2(Page): @staticmethod def is_displayed(player: Player): return player.treatment == 2 class Investmentfonds(Page): pass class Nachhaltigkeitsfonds(Page): pass class Greenwashing(Page): @staticmethod def is_displayed(player: Player): return player.treatment == 2 class Kontrollfragen1(Page): form_model = 'player' form_fields = ['kontrollfrage_1', 'kontrollfrage_2'] @staticmethod def is_displayed(player: Player): return player.treatment == 1 def error_message(player: Player, values): if values["kontrollfrage_1"] == 2 and values["kontrollfrage_2"] == 1: return "Frage 1 und 2 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_1"] == 2: return "Frage 1 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_2"] == 1: return "Frage 2 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut" class Kontrollfragen2(Page): form_model = 'player' form_fields = ['kontrollfrage_1', 'kontrollfrage_2', 'kontrollfrage_3'] @staticmethod def is_displayed(player: Player): return player.treatment == 2 def error_message(player: Player, values): if values["kontrollfrage_1"] == 2 and values["kontrollfrage_2"] == 1 and values["kontrollfrage_3"] == 1: return "Frage 1,2 und 3 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_1"] == 2 and values["kontrollfrage_2"] ==1: return "Frage 1 und 2 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_1"] == 2 and values["kontrollfrage_3"] ==1: return "Frage 1 und 3 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_2"] == 1 and values["kontrollfrage_3"] ==1: return "Frage 2 und 3 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_1"] == 2: return "Frage 1 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_2"] == 1: return "Frage 2 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" elif values["kontrollfrage_3"] == 1: return "Frage 3 ist leider nicht korrekt beantwortet. Versuchen Sie es erneut!" class Investmententscheidung(Page): form_model = 'player' form_fields = ['investment_konventionell', 'investment_nachhaltig', 'kein_investment'] @staticmethod def error_message(player: Player, values): investment = int(values["investment_konventionell"]) + int(values["investment_nachhaltig"]) + int(values["kein_investment"]) if investment > C.BUDGET: return "Fehler: Du hast zu viel von deinem Budget verbraucht. Dein Budget wurde um " + str(abs(C.BUDGET-investment)) + " Euro überschritten!" elif investment < C.BUDGET: return "Fehler: Du hast nicht dein ganzes Budget verbraucht. Dein Budget beträgt noch " + str(C.BUDGET - investment) + " Euro!" class FinanzielleMotive(Page): form_model = 'player' form_fields = ['erwartete_rendite', 'erwartetes_risiko', 'erwartetes_rr_ratio'] class Vertrauen(Page): form_model = 'player' form_fields = ['vertrauen_1', 'vertrauen_2', 'vertrauen_3', 'vertrauen_4', 'vertrauen_5', 'marketing_trick'] class NachhaltigerImpact(Page): form_model = 'player' form_fields = ['nachhaltiger_impact_1', 'nachhaltiger_impact_2', 'nachhaltiger_impact_3', 'nachhaltiger_impact_4'] class Demografie(Page): form_model = 'player' form_fields = ['alter', 'geschlecht', 'bildung'] class Schluss(Page): form_model = 'player' form_fields = ['feedback'] page_sequence = [Einleitung, TrustGame1, TrustGame2, Erklaerung1, Erklaerung2, Investmentfonds, Nachhaltigkeitsfonds, Greenwashing, Kontrollfragen1, Kontrollfragen2, Investmententscheidung, FinanzielleMotive, Vertrauen, NachhaltigerImpact, Demografie, Schluss]