from otree.api import * DEBUG = False ### todo: Set to False for real experiment & controlstages working / True doc = """ Read quiz questions from a CSV (simple version). See also the 'complex' version of this app. """ def read_csv(): import csv f = open('btae/data/test_hard.csv', encoding='utf-8-sig') #adjust csv File for easy treatment rows = list(csv.DictReader(f)) return rows class C(BaseConstants): NAME_IN_URL = 'btae' PLAYERS_PER_GROUP = None QUESTIONS = read_csv() NUM_ROUNDS = len(QUESTIONS) TREATMENT = 2 ###Set 1 for Replication, 2 for Adaptation INSTRUCTION_REPLIC = "btae/InstructionReplication.html" INSTRUCTION_ADAPT = "btae/InstructionAdaptation.html" LOTTERY_REPLIC = "btae/LotteryReplication.html" LOTTERY_ADAPT = "btae/LotteryAdaptation.html" COLORS = ['Weiß', 'Schwarz', 'Rot', 'Pink', 'Grün', 'Blau'] class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): current_question = C.QUESTIONS[subsession.round_number - 1] for p in subsession.get_players(): p.question = current_question['Frage'] p.optionA = current_question['Antwort A'] p.optionB = current_question['Antwort B'] p.optionC = current_question['Antwort C'] p.optionD = current_question['Antwort D'] p.optionE = current_question['Antwort E'] p.solution = current_question['Lösung'] p.participant.quiz_num_correct = 0 class Group(BaseGroup): pass class Player(BasePlayer): introduction_control1 = models.IntegerField( label="1) Welche der folgenden Aussagen zum Ablauf des Experiments ist korrekt?", choices=[ [1, "Sie werden sowohl die Aufgabe als auch die Lotterie spielen, unabhängig davon wofür Sie sich in der Abstimmung entscheiden."], [2, "Sie werden entweder nur die Aufgabe oder nur die Lotterie spielen und entscheiden in der Abstimmung darüber."], ], widget=widgets.RadioSelect, #initial=1 # TODO: herausnehmen wenn keine vorauswahl gewünscht ist, nur damit schneller geklickt werden kann ) introduction_control2 = models.IntegerField( label="2) Welche der folgenden Aussagen zum Auszahlungsmechanismus ist korrekt?", choices=[ [1, "Sie selbst bestimmen allein, welcher Auszahlungsmechanismus für Sie angewandt wird."], [2, "Ein Mehrheitsentscheid unter allen Teilnehmenden bestimmmt, welcher Auszahlungsmechanismus für alle Teilnehmenden angewandt wird."], ], widget=widgets.RadioSelect, ) introduction_control3 = models.IntegerField( label="3) Welche der folgenden Aussagen zur Bonuszahlung ist korrekt?", choices=[ [1, "Alle Teilnehmenden erhalten eine Bonuszahlung."], [2, "Die Leistung bei der Aufgabe bzw. das Lotterieergebnis (je nach Abstimmungsergebnis) entscheidet darüber, wer eine Bonuszahlung erhält."], ], widget=widgets.RadioSelect, ) introduction_control4 = models.IntegerField( label="4) Welche der folgenden Aussagen zur Leistungs-Variante ist korrekt?", choices=[ [1, "Wenn 'Leistung' als Auszahlungsmechanismus gewählt wird, erhalten 50 zufällig ausgewählte Teilnehmende eine Bonuszahlung."], [2, "Wenn 'Leistung' als Auszahlungsmechanismus gewählt wird, erhält die Hälfte der Teilnehmenden (die 50 mit den besten Leistungen bei der Aufgabe) eine Bonuszahlung."], ], widget=widgets.RadioSelect, ) introduction_control5_rep = models.IntegerField( label="5) Welche der folgenden Aussagen zur Lotterie-Variante ist korrekt?", choices=[ [1, "Wenn 'Lotterie' als Auszahlungsmechanismus gewählt wird, erhalten Sie mit einer Wahrscheinlichkeit von 50% eine Bonuszahlung (nämlich wenn Sie eine ungerade Glückszahl gewählt haben und eine ungerade Zahl gewürfelt wird bzw. wenn Sie eine gerade Glückszahl gewählt haben und eine gerade Zahl gewürfelt wird)."], [2, "Wenn 'Lotterie' als Auszahlungsmechanismus gewählt wird, ist die Wahrscheinlichkeit dafür keine Bonuszahlung zu erhalten höher als die Wahrscheinlichkeit dafür eine Bonuszahlung zu erhalten."], ], widget=widgets.RadioSelect, ) introduction_control5_adapt = models.IntegerField( label="5) Welche der folgenden Aussagen zur Lotterie-Variante ist korrekt?", choices=[ [1, "Wenn 'Lotterie' als Auszahlungsmechanismus gewählt wird, erhält exakt die Hälfte der Teilnehmenden (50 von 100) eine Bonuszahlung (nämlich wenn Ihr Gewinncode gezogen wird)."], [2, "Wenn 'Lotterie' als Auszahlungsmechanismus gewählt wird, erhalten mehr Teilnehmende eine Bonuszahlung als beim Leistungstest."], ], widget=widgets.RadioSelect, ) introduction_control6 = models.IntegerField( label="6) Wann erhalten Sie die Rückmeldung über Ihr individuelles Ergebnis bei der Aufgabe?", choices=[ [1, "Sofort nach Beendigung der Aufgabe"], [2, "Nachdem alle 100 Personen an der Studie teilgenommen haben (per Rundmail)"], ], widget=widgets.RadioSelect, ) introduction_control7 = models.IntegerField( label="7) Wann erhalten Sie die Rückmeldung darüber, ob Sie eine Bonuszahlung erhalten?", choices=[ [1, "Sofort nach Beendigung der Aufgabe"], [2, "Nachdem alle 100 Personen an der Studie teilgenommen haben (per Rundmail)"], ], widget=widgets.RadioSelect, ) vote = models.IntegerField( label="", choices=[ [1, "Leistung"], [2, "Lotterie"], ], widget=widgets.RadioSelect, ) prediction_own = models.IntegerField( label="", min=0, max=20, ) prediction_group = models.IntegerField( label="", min=0, max=20, ) sure_pre = models.IntegerField( label="How sure are you to have made the right decision in the vote?", choices=[ [1, "Very unsure"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very sure"] ], widget=widgets.RadioSelect, ) difficult_change_pre = models.IntegerField( label="How difficult would you find it to change your decision?", choices=[ [1, "Very easy"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very difficult"] ], widget=widgets.RadioSelect, ) important = models.IntegerField( label="How important is doing well in the test to you?", choices=[ [1, "Very unimportant"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very important"] ], widget=widgets.RadioSelect, ) difficulty_pre = models.IntegerField( label="How difficult do you think the test will be?", choices=[ [1, "Very easy"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very difficult"] ], widget=widgets.RadioSelect, ) expected_performance = models.IntegerField( label="How good do you think you will be in the test?", choices=[ [1, "Not very good"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very good"] ], widget=widgets.RadioSelect, ) rationale = models.LongStringField( label="Bitte begründen Sie Ihre Wahl bei der Abstimmung in 1-2 Sätzen:", ) estimated_group = models.IntegerField( label=" ", min=0, max=20, ) satisfied = models.IntegerField( label="How satisfied are you with your result in the test?", choices=[ [1, "Very unsatisfied"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very satisfied"] ], widget=widgets.RadioSelect, ) sure_post = models.IntegerField( label="How sure are you now to have made the right decision in the vote?", choices=[ [1, "Very unsure"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very sure"] ], widget=widgets.RadioSelect, ) difficult_change_post = models.IntegerField( label="How difficult would you find it now to change your decision in the vote?", choices=[ [1, "Very easy"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very difficult"] ], widget=widgets.RadioSelect, ) difficulty_post = models.IntegerField( label="How difficult do you think the test was?", choices=[ [1, "Very easy"], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, "Very difficult"] ], widget=widgets.RadioSelect, ) lottery_number = models.IntegerField( label="Bitte geben Sie hier Ihre Zahl zwischen 1 und 6 ein:", min=1, max=6, ) age = models.IntegerField( label="Wie alt sind Sie?", ) gender = models.IntegerField( label="Welchem Geschlecht fühlen Sie sich zugehörig?", choices=[ [1, "weiblich"], [2, "männlich"], [3, "nicht-binär"] ], ) educ = models.IntegerField( label="Bitte geben Sie den höchsten Bildungsabschluss an, den Sie bisher erlangt haben.", choices=[ [1, "Haupt-/Realschule"], [2, "(Fach-)Abitur"], [3, "Berufsausbildung"], [4, "Bachelor"], [5, "Master"], [6, "Promotion"], ], widget=widgets.RadioSelect, ) student = models.IntegerField( label="Studieren Sie aktuell?", choices=[ [1, "Ja"], [2, "Nein"], ], widget=widgets.RadioSelect, ) major = models.StringField( label="Bitte geben Sie Ihren aktuellen Studiengang / Beruf an.", ) german = models.IntegerField( label="Ist Deutsch Ihre Erstsprache?", choices=[ [1, "Ja"], [2, "Nein"], ], widget=widgets.RadioSelect, ) incom1 = models.IntegerField( label="Ich achte immer sehr darauf, wie ich Dinge tue, im Vergleich dazu wie andere Dinge tun.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) incom2 = models.IntegerField( label="Ich vergleiche häufig meine soziale Stellung (z.B. soziale Fähgikeiten, Beliebtheit) mit anderen Person.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) incom3 = models.IntegerField( label="Ich bin nicht der Typ Mensch, der sich oft mit anderen vergleicht.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) incom4 = models.IntegerField( label="Ich versuche häufig herauszufinden, was andere Personen denken, die mit ähnlichen Problemen konfrontiert sind wie ich.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) incom5 = models.IntegerField( label="Ich möchte immer wissen, wie sich andere in einer ähnlichen Situation verhalten würden.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) incom6 = models.IntegerField( label="Wenn ich mehr über etwas wissen möchte, versuche ich herauszufinden was andere darüber denken oder wissen.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne eher ab"], [3, "Weder noch"], [4, "Ich stimme eher zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) Weiß = models.BooleanField(blank=True) Schwarz = models.BooleanField(blank=True) Rot = models.BooleanField(blank=True) Pink = models.BooleanField(blank=True) Grün = models.BooleanField(blank=True) Blau = models.BooleanField(blank=True) attention = models.IntegerField( label="Ich lese die Fragen aufmerksam und wähle deshalb 'Ich lehne stark ab' aus.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelect, ) prefinal_attention = models.IntegerField( label="Haben Sie das Experiment aufmerksam und ehrlich bearbeitet?", choices=[ [1, "Ja, ich habe das Experiment aufmerksam und ehrlich bearbeitet"], [2, "Nein, ích habe das Experiment NICHT aufmerksam und ehrlich bearbeitet"], ], widget=widgets.RadioSelect, ) debrief_continuity = models.IntegerField( label="Haben Sie das Experiment an einem Stück, d.h. ohne Unterbrechungen, bearbeitet?", choices=[ [1, "Ja, ich habe das Experiment an einem Stück bearbeitet"], [2, "Nein, ích habe das Experiment NICHT an einem Stück bearbeitet"], ], widget=widgets.RadioSelect, ) risk = models.IntegerField( label="Wie bereits sind Sie, im Allgemeinen, Risiken einzugehen?", choices=[ [0, "Überhaupt nicht bereit Risiken einzugehehn"], [1, ""], [2, ""], [3, ""], [4, ""], [5, ""], [6, ""], [7, ""], [8, ""], [9, ""], [10, "Sehr bereit Risiken einzugehen"], ], widget=widgets.RadioSelectHorizontal, ) alt1 = models.IntegerField( label="Ich habe Mitgefühl mit Menschen, die weniger Glück haben als ich.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) alt2 = models.IntegerField( label="Ich versuche, Notleidende großzügig zu unterstützen.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) alt3 = models.IntegerField( label="Es würde nicht mich nicht stören, jemandem zu schaden, den ich nicht mag.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) alt4 = models.IntegerField( label="Man hält mich für einen hartherzigen Menschen.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) ext1 = models.IntegerField( label="tba.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) ext2 = models.IntegerField( label="tba.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) ext3 = models.IntegerField( label="tba.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) ext4 = models.IntegerField( label="tba.", choices=[ [1, "Ich lehne stark ab"], [2, "Ich lehne ab"], [3, "Weder noch"], [4, "Ich stimme zu"], [5, "Ich stimme stark zu"], ], widget=widgets.RadioSelectHorizontal, ) asku1 = models.IntegerField( label="In schwierigen Situationen kann ich mich auf meine Fähigkeiten verlassen.", choices=[ [1, "Trifft gar nicht zu"], [2, "Trifft wenig zu"], [3, "Trifft etwas zu"], [4, "Trifft ziemlich zu"], [5, "Trifft voll und ganz zu"], ], widget=widgets.RadioSelect, ) asku2 = models.IntegerField( label="Die meisten Probleme kann ich aus eigener Kraft gut meistern.", choices=[ [1, "Trifft gar nicht zu"], [2, "Trifft wenig zu"], [3, "Trifft etwas zu"], [4, "Trifft ziemlich zu"], [5, "Trifft voll und ganz zu"], ], widget=widgets.RadioSelect, ) asku3 = models.IntegerField( label="Auch anstrengende und komplizierte Aufgaben kann ich in der Regel gut lösen.", choices=[ [1, "Trifft gar nicht zu"], [2, "Trifft wenig zu"], [3, "Trifft etwas zu"], [4, "Trifft ziemlich zu"], [5, "Trifft voll und ganz zu"], ], widget=widgets.RadioSelect, ) color = models.IntegerField( label="Bitte wählen Sie Ihre Gewinnfarbe:", choices=[ [1, "Rot"], [2, "Schwarz"], ], ) switch_mpl = models.IntegerField( label="", min=1, max=29 ) switch_aa = models.IntegerField( label="", min = 1, max = 20, ) mpl1 = models.IntegerField( label="1)", choices=[ [1, "0 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl2 = models.IntegerField( label="2)", choices=[ [1, "1 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl3 = models.IntegerField( label="3)", choices=[ [1, "2 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl4 = models.IntegerField( label="4)", choices=[ [1, "3 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl5 = models.IntegerField( label="5)", choices=[ [1, "4 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl6 = models.IntegerField( label="6)", choices=[ [1, "5 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl7 = models.IntegerField( label="7)", choices=[ [1, "6 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl8 = models.IntegerField( label="8)", choices=[ [1, "7 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl9 = models.IntegerField( label="9)", choices=[ [1, "8 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl10 = models.IntegerField( label="10)", choices=[ [1, "9 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl11 = models.IntegerField( label="11)", choices=[ [1, "10 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl12 = models.IntegerField( label="12)", choices=[ [1, "11 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl13 = models.IntegerField( label="13)", choices=[ [1, "12 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl14 = models.IntegerField( label="14)", choices=[ [1, "13 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl15 = models.IntegerField( label="15)", choices=[ [1, "14 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl16 = models.IntegerField( label="16)", choices=[ [1, "15 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl17 = models.IntegerField( label="17)", choices=[ [1, "16 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl18 = models.IntegerField( label="18)", choices=[ [1, "17 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl19 = models.IntegerField( label="19)", choices=[ [1, "18 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl20 = models.IntegerField( label="20)", choices=[ [1, "19 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl21 = models.IntegerField( label="21)", choices=[ [1, "20 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl22 = models.IntegerField( label="22)", choices=[ [1, "21 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl23 = models.IntegerField( label="23)", choices=[ [1, "22 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl24 = models.IntegerField( label="24)", choices=[ [1, "23 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl25 = models.IntegerField( label="25)", choices=[ [1, "24 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl26 = models.IntegerField( label="26)", choices=[ [1, "25 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl27 = models.IntegerField( label="27)", choices=[ [1, "26 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl28 = models.IntegerField( label="28)", choices=[ [1, "27 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl29 = models.IntegerField( label="29)", choices=[ [1, "28 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) mpl30 = models.IntegerField( label="30)", choices=[ [1, "29 € sicher"], [2, "30 € mit einer Wahrscheinlichkeit von 50%, 0 € mit einer Wahrscheinlichkeit von 50%"], ], widget=widgets.RadioSelect, ) prolificID = models.StringField( label="Bitte tragen Sie hier Ihre Prolific ID ein:", ) example1 = models.IntegerField( label="1) Welches Wortpaar verhält sich wie 'Samen' zu 'Pflanze'?", choices=[ [1, "Beutel - Känguru"], [2, "Wurzel - Boden"], [3, "Tropfen - Wasser"], [4, "Rinde - Baum "], [5, "Ei - Vogel"], ], widget=widgets.RadioSelect, ) example2 = models.IntegerField( label="2) Welches Wortpaar verhält sich wie 'befreien' zu 'gefesselt'?", choices=[ [1, "abrufen - geübt"], [2, "beschmutzen - unsauber"], [3, "aufklären - unwissend"], [4, "verehren - unerkannt"], [5, "bewundern - herzlich"], ], widget=widgets.RadioSelect, ) example3 = models.IntegerField( label="3) Welches Wortpaar verhält sich wie 'schwanken' zu 'Unentschlossenheit'?", choices=[ [1, "beklagen - Leid"], [2, "überwintern - Winter"], [3, "befreien - Verstrickung"], [4, "abschweifen - Angst"], [5, "nachahmen - Egoisimus"], ], widget=widgets.RadioSelect, ) comment = models.LongStringField( blank=True, label="Möchten Sie uns noch etwas mitteilen? (optional)", ) question = models.StringField() optionA = models.StringField() optionB = models.StringField() optionC = models.StringField() optionD = models.StringField() optionE = models.StringField() solution = models.StringField() choice = models.StringField( label="Ihre Antwort:", widget=widgets.RadioSelect) is_correct = models.BooleanField() def choice_choices(player: Player): return [ ['A', player.optionA], ['B', player.optionB], ['C', player.optionC], ['D', player.optionD], ['E', player.optionE], ] def rationale_error_message(player, value): if len(value) < 25: return "Ihre Begründung muss mind. 25 Zeichen lang sein." def prolificID_error_message(player, value): if len(value) != 24: return "Ihre Prolific ID muss 24 Zeichen (Buchstaben & Zahlen) lang sein." class Welcome(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Check(Page): form_model = 'player' form_fields = ['Weiß', 'Schwarz', 'Rot', 'Pink', 'Grün', 'Blau'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instructions(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class ProlificID(Page): form_model = 'player' form_fields = ['prolificID'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class ComprehensionChecksReplication(Page): form_model = 'player' form_fields = ['introduction_control1', 'introduction_control2', 'introduction_control3', 'introduction_control4', 'introduction_control5_rep', 'introduction_control6', 'introduction_control7'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def error_message(player, values): solutions = dict( introduction_control1=1, introduction_control2=2, introduction_control3=2, introduction_control4=2, introduction_control5_rep=1, introduction_control6=1, introduction_control7=2 ) error_messages = dict() for field_name in solutions: if values[field_name] != solutions[field_name]: error_messages[field_name] = 'Sie haben diese Frage falsch beantwortet. Bitte überprüfen Sie noch einmal Ihre Antwort.' return error_messages # @staticmethod # def error_message(player, values): # if not DEBUG: # if values['introduction_control1'] != 1 or values['introduction_control2'] != 2 or values[ # 'introduction_control3'] != 2 or values['introduction_control4'] != 2 or values['introduction_control5_rep'] != 1 or values['introduction_control6'] != 1 or values['introduction_control7'] != 2: # return 'Sie haben mindestens eine Frage falsch beantwortet. Bitte überprüfen Sie noch einmal Ihre Antworten.' class ComprehensionChecksAdaptation(Page): form_model = 'player' form_fields = ['introduction_control1', 'introduction_control2', 'introduction_control3', 'introduction_control4', 'introduction_control5_adapt', 'introduction_control6', 'introduction_control7'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def error_message(player, values): solutions = dict( introduction_control1=1, introduction_control2=2, introduction_control3=2, introduction_control4=2, introduction_control5_adapt=1, introduction_control6=1, introduction_control7=2 ) error_messages = dict() for field_name in solutions: if values[field_name] != solutions[field_name]: error_messages[ field_name] = 'Sie haben diese Frage falsch beantwortet. Bitte überprüfen Sie noch einmal Ihre Antwort.' return error_messages class Examples(Page): form_model = 'player' form_fields = ['example1', 'example2', 'example3'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class ExamplesSolution(Page): form_model = 'player' @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Vote(Page): form_model = 'player' form_fields = ['vote'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player, timeout_happened): player.payoff = player.vote class Rationale(Page): form_model = 'player' form_fields = ['rationale'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Expectations1(Page): form_model = 'player' form_fields = ['prediction_own', 'prediction_group'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Expectations2(Page): form_model = 'player' form_fields = ['sure_pre', 'difficult_change_pre', 'important', 'difficulty_pre', 'expected_performance'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class TestIntro(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Test(Page): timeout_seconds = 30 timer_text = 'Verbleibende Zeit für die Bearbeitung dieser Aufgabe:' form_model = 'player' form_fields = ['choice'] @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant player.is_correct = player.choice == player.solution participant.quiz_num_correct += int(player.is_correct) class Reflection1(Page): form_model = 'player' form_fields = ['estimated_group'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Reflection2(Page): form_model = 'player' form_fields = ['satisfied', 'sure_post', 'difficult_change_post', 'difficulty_post'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class LotteryIntro(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Lottery(Page): form_model = 'player' form_fields = ['lottery_number'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Questionnaire(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class QuestionnaireINCOM(Page): form_model = 'player' form_fields = ['incom1', 'incom2', 'incom3', 'attention', 'incom4', 'incom5', 'incom6'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class QuestionnaireGSE(Page): form_model = 'player' form_fields = ['asku1', 'asku2', 'asku3'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class QuestionnairePersonality(Page): form_model = 'player' form_fields = ['alt1', 'alt2', 'alt3', 'alt4'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Ambiguity(Page): form_model = 'player' form_fields = ['color', 'switch_aa'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class MPL(Page): form_model = 'player' form_fields = ['switch_mpl'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class QuestionnaireDemographics(Page): form_model = 'player' form_fields = ['age', 'gender', 'educ', 'student', 'major', 'german', 'risk', 'comment'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class PrefinalPage(Page): form_model = 'player' form_fields = ['prefinal_attention'] @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class FinalPage(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS class Results(Page): @staticmethod def is_displayed(player: Player): return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player: Player): return dict(round_players=player.in_all_rounds()) page_sequence = [Welcome, ProlificID, Check, Instructions, #ComprehensionChecksReplication, ComprehensionChecksAdaptation, Examples, ExamplesSolution, Vote, Rationale, Expectations1, Expectations2, TestIntro, Test, Results, Reflection1, Reflection2, LotteryIntro, Lottery, Questionnaire, QuestionnaireINCOM, QuestionnaireGSE, QuestionnairePersonality, MPL, Ambiguity, QuestionnaireDemographics, PrefinalPage, FinalPage, ] ##### Important: Set "PARTICIPANT_FIELDS = ['quiz_num_correct']" in settings.py !! ##### Vor Experiment: Set Treatment, DEBUG == False 'ComprehensionChecksReplication' oder 'ComprehensionChecksAdaptation' ausgrauen