import random from otree.api import * doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'study' players_per_group = None num_rounds = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass # FUNCTIONS def make_field(label): return models.IntegerField( choices=[1,2,3,4,5,6,7], label=label, widget= widgets.RadioSelectHorizontal ) def shuffle_form_fields(fields, blocksize=3, subblocks=True): form_fields = fields blocksize = blocksize blocks = [form_fields[i:i+blocksize] for i in range(0, len(form_fields), blocksize)] random.shuffle(blocks) if subblocks: for subblock in blocks: random.shuffle(subblock) form_fields = [formfield for subblock in blocks for formfield in subblock] return form_fields # random treatment groups # def creating_session(subsession): # import random # x = 1 # print("-----") # for player in subsession.get_players(): # player.treatment_peer = random.choice([True, False]) # player.treatment_advice = random.choice([True, False]) # print("player", x) # x += 1 # print("set peer to", player.treatment_peer) # print("set advice to", player.treatment_advice) # random treatment groups def creating_session(subsession): import random import string # x = 1 # print("-----") for player in subsession.get_players(): bool = [True, False] # final randomization player.treatment_peer = random.choice(bool) player.treatment_advice = random.choice(bool) player.case = random.choice(bool) player.unique_ID = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(6)]) participant = player.participant # participant.my_field_order = [0] pers_inno = ["pers_inno1", "pers_inno2", "pers_inno3", "pers_inno4"] args_sentencing = [ "sentencing_advice", "sentencing_motives", "sentencing_mindset", "sentencing_noncompliance", "sentencing_execution", "sentencing_past", "sentencing_attitude"] args_parole = [ "parole_advice", "parole_personality", "parole_past", "parole_circumstances", "parole_attitude", "parole_life", "parole_effects"] confid_satis = ["confidence_sentencing", "confidence_parole", "satisfaction_sentencing", "satisfaction_parole"] post_questions = [ "cog_trust1", "cog_trust2", "cog_trust3", "integ_trust1", "integ_trust2", "integ_trust3", "emo_trust1", "emo_trust2", "emo_trust3", "useful1", "useful2", "useful3", "subj_norm1", "subj_norm2", "subj_norm3", "neg_eval1", "neg_eval2", "neg_eval3"] ideology = [[0, '...versäumt unser Rechtssystem zu oft, die Rechte der Beschuldigten zu schützen."'], [1,'...hat unser Rechtssystem das richtige Gleichgewicht gefunden, um die Rechte der Beschuldigten zu schützen."'], [2,'...übertreibt unser Rechtssystem zu oft, wenn es um den Schutz der Rechte der Beschuldigten geht."']] manipulation_check = [[0,"Es gibt keinen zweiten Teil."], [1,"Ich bewerte als Revisionsinstanz im zweiten Teil."], [2,"Richter*innen werden sich mit mir im zweiten Teil austauschen."], [3,"Die Revisionsinstanz wird meine Urteilsbegründung im zweiten Teil auf Rechtsfehler überprüfen."]] random.shuffle(pers_inno) random.shuffle(args_sentencing) random.shuffle(args_parole) random.shuffle(ideology) random.shuffle(manipulation_check) confid_satis = shuffle_form_fields(confid_satis, blocksize=2, subblocks=False) post_questions = shuffle_form_fields(post_questions, blocksize=3) # print(post_questions) # print(confid_satis) # print(pers_inno) # print(args_sentencing) # print(args_parole) participant.ideology_order = ideology participant.manipulation_check_order = manipulation_check participant.pers_inno_order = pers_inno participant.args_sentencing_order = args_sentencing participant.args_parole_order = args_parole participant.confid_satis_order = confid_satis participant.post_questions_order = post_questions # treatment = next(treatments) # player.case = treatment[0] # player.treatment_peer = treatment[1] # player.treatment_advice = treatment[2] # print("player", x) # x += 1 # print("set peer to", player.treatment_peer) # print("set advice to", player.treatment_advice) # print("set case to", player.case) def ideol_choices(player): choices = player.participant.ideology_order return choices def manipulation_check_choices(player): choices = player.participant.manipulation_check_order return choices def custom_export(players): yield ["participant_code"] for p in players: participant = p.participant yield ["participant.code"] class Player(BasePlayer): # Treatments treatment_peer = models.BooleanField() treatment_advice = models.BooleanField() # CASES # 0 = without priors # 1 = with priors case = models.BooleanField() is_mobile = models.BooleanField() consent = models.BooleanField(choices=["Ich möchte an der Studie teilnehmen."], label="Durch das Ankreuzen des Kästchens erkläre ich mich mit der Teilnahme an der Studie einverstanden.") manipulation_check = models.IntegerField( widget=widgets.RadioSelect, label='Bitte geben Sie an, was in Teil 2 passiert.') # Preliminary Questions age = models.IntegerField(label="Bitte geben Sie Ihr Alter an.", min=18, max=99) sex = models.IntegerField(choices=[[0, "Divers"], [1, "Weiblich"], [2, "Männlich"]], widget=widgets.RadioSelectHorizontal, label="Bitte geben Sie Ihr Geschlecht an.") job = models.IntegerField(choices=[[0, "Student*in"], [1, "Jurist*in mit abgeschlossenem 1. Staatsexamen"], [2, "Volljurist*in mit abgeschlossenem 2. Staatsexamen"], [3, "Rechtsanwältin/Rechtsanwalt"], [4, "Staatsanwältin/Staatsanwalt"], [5, "Richter*in"], [6, "Sonstiges"]], widget=widgets.RadioSelect, label="Bitte geben Sie Ihren Beruf bzw. Studienstatus an.") stud_exp = models.IntegerField(label="Im wievielten Semester des Jurastudiums befinden Sie sich? (Sofern Sie kein*e Student*in sind, bitte die Zahl 0 angeben)", min=0, max=99) trainee_exp = models.IntegerField(label="In welchem Monat des Rechtsreferendariats sind Sie? (Sofern Sie kein*e Rechtsreferendar*in sind, bitte die Zahl 0 angeben)", min=0, max=99) exp = models.IntegerField(choices=[[0, "Keine"],[1,"Weniger als 1 Jahr"],[2,"1-2 Jahre"],[3,"2-3 Jahre"],[4,"3-4 Jahre"], [5,"5-6 Jahre"],[6,"7-8 Jahre"],[7,"9-10 Jahre"],[8,"Über 10 Jahre"]], label="Bitte geben Sie an, wie viele Jahre Arbeitserfahrung Sie im Strafrecht besitzen " "(darunter fallen auch Praktika, Werkstudententätigkeiten oder (hilfs-)wissenschaftliche Erfahrungen).") # Region of the participant since there are regional differences in decision making region = models.IntegerField(choices=[[0,"Baden-Württemberg"],[1,"Bayern"],[2,"Berlin"],[3,"Brandenburg"], [4,"Bremen"],[5,"Hamburg"],[6,"Hessen"],[7,"Mecklenburg-Vorpommern"], [8,"Niedersachsen"],[9,"Nordrhein-Westfalen"],[10,"Rheinland-Pfalz"],[11,"Saarland"], [12,"Sachsen-Anhalt"],[13,"Sachsen"],[14,"Schleswig-Holstein"],[15,"Thüringen"]], label="Bitte geben Sie an, in welchem Bundesland Sie arbeiten bzw. studieren.") ideol = models.IntegerField( widget=widgets.RadioSelect, label='Folgendes Zitat wurde in Studien zur Beurteilung der Einstellung von Personen zum Rechtssystem verwendet. ' 'Wie würden Sie den folgenden Satz ergänzen:
' '"Bei dem Versuch, das richtige Gleichgewicht zu finden zwischen ' '(i) dem Schutz der Gesellschaft vor Verbrechen und ' '(ii) dem Schutz der Rechte von Bürger*innen, die einer Straftat beschuldigt werden, ...') pers_inno1 = make_field("Wenn ich von einer neuen Technologie hören würde, würde ich nach Möglichkeiten suchen, damit zu experimentieren.") pers_inno2 = make_field("Unter meinen Kolleg*innen bzw. Kommiliton*innen bin ich in der Regel die/der Erste, die/der neue Technologie ausprobiert.") # attention check 3 pers_inno3 = make_field("Im Allgemeinen zögere ich davor, neue Technologie auszuprobieren.") pers_inno4 = make_field("Ich experimentiere gerne mit neuer Technologie.") sentencing = models.IntegerField() parole = models.BooleanField(choices=[[True, "Ja, ich setze die Vollstreckung der Freiheitsstrafe zur Bewährung aus."], [False, "Nein, ich setze die Vollstreckung der Freiheitsstrafe zur Bewährung nicht aus."]], label="Aufgabe: Bitte treffen Sie eine Entscheidung über die Strafaussetzung zur Bewährung.") click_open = models.IntegerField() click_close = models.IntegerField() # recid_init = models.BooleanField(choices=[[True, "Ja"], [False, "Nein"]], label="Denken Sie, dass die beschuldigte Person rückfällig wird, sollte man ihr keine Freiheitsstrafe geben?") # argumentation sentencing_advice = models.IntegerField(label="Die Einschätzung des KI-Systems") sentencing_motives = models.IntegerField(label="Die Beweggründe und die Ziele des Täters, besonders auch rassistische, fremdenfeindliche, antisemitische oder sonstige menschenverachtende") sentencing_mindset = models.IntegerField(label="Die Gesinnung, die aus der Tat spricht, und der bei der Tat aufgewendete Wille") sentencing_noncompliance = models.IntegerField(label="Das Maß der Pflichtwidrigkeit") sentencing_execution = models.IntegerField(label="Die Art der Ausführung und die verschuldeten Auswirkungen der Tat") sentencing_past = models.IntegerField(label="Das Vorleben des Täters, seine persönlichen und wirtschaftlichen Verhältnisse") sentencing_attitude = models.IntegerField(label="Sein Verhalten nach der Tat, besonders sein Bemühen, den Schaden wiedergutzumachen, sowie das Bemühen des Täters, einen Ausgleich mit dem Verletzten zu erreichen") parole_advice = models.IntegerField(label="Die Einschätzung des KI-Systems") parole_personality = models.IntegerField(label="Die Persönlichkeit des Verurteilten") parole_past = models.IntegerField(label="Sein Vorleben") parole_circumstances = models.IntegerField(label="Die Umstände seiner Tat") parole_attitude = models.IntegerField(label="Sein Verhalten nach der Tat") parole_life = models.IntegerField(label="Seine Lebensverhältnisse") parole_effects = models.IntegerField(label="Die Wirkungen, die von der Aussetzung für ihn zu erwarten sind") # post-task 1 confidence_sentencing = make_field("Ich bin von der Entscheidung in der Strafhöhe überzeugt, die ich während der Strafzumessung getroffen habe.") confidence_parole = make_field("Ich bin von der Entscheidung überzeugt, die ich während der Strafaussetzung zur Bewährung getroffen habe.") # confid2 = make_field("Ich bin sicher, dass meine Entscheidung akkurat ist.") # confid3 = make_field("Ich halte es für wahrscheinlich, dass meine Entscheidung zu einem Höchstmaß an Gerechtigkeit führen wird.") satisfaction_sentencing = make_field("Ich bin mit der Entscheidung in der Strafhöhe zufrieden, die ich während der Strafzumessung getroffen habe.") satisfaction_parole = make_field("Ich bin mit der Entscheidung zufrieden, die ich während der Strafaussetzung zur Bewährung getroffen habe.") # satis2 = make_field("Ich bin mit dem Entscheidungsprozess bei der Strafzumessung zufrieden.") # satis3 = make_field("Insgesamt bin ich mit meiner Leistung bei dieser Strafzumessung zufrieden.") # Advice related fields # ml_knowledge = models.IntegerField(choices=[[0,"Keine Kenntnisse"], [1,"Wenige Kenntnisse - Ich kenne grundlegende Konzepte des maschinellen Lernens"], # [2,"Einige Kenntnisse - Ich habe schon einmal maschinelles Lernen eingesetzt"], # [3,"Viel Wissen - Ich wende maschinelles Lernen häufig bei meiner Arbeit an oder ich erstelle Anwendungen des maschinellen Lernens"]], # label="Welches Wissen über maschinelles Lernen besitzen Sie?") responsibility = models.IntegerField() responsibility_advisor = models.IntegerField() # recid_rev = models.BooleanField(choices=[[True, "Ja"], [False, "Nein"]], label="Denken Sie, dass die beschuldigte Person rückfällig wird, sollte man ihr keine Freiheitsstrafe geben?") cog_trust1 = make_field("Das System ist kompetent und effektiv bei der Vorhersage der Rückfallwahrscheinlichkeit.") cog_trust2 = make_field("Das System erfüllt seine Aufgabe, die Rückfallwahrscheinlichkeit vorherzusagen, sehr gut.") cog_trust3 = make_field("Insgesamt ist das System ein fähiges und qualifiziertes Werkzeug für die Vorhersage der Rückfallwahrscheinlichkeit.") integ_trust1 = make_field("Dieses System gibt unvoreingenommene Empfehlungen.") # attention check 1 integ_trust2 = make_field("Dieses System ist unehrlich.") integ_trust3 = make_field("Ich halte dieses System für integer.") # attention check 2 emo_trust1 = make_field("Ich fühle mich unsicher, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf dieses System verlasse.") emo_trust2 = make_field("Ich fühle mich wohl, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf dieses System verlasse.") emo_trust3 = make_field("Ich fühle mich zufrieden, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf dieses System verlasse.") useful1 = make_field("Die Verwendung des Systems erhöht meine Produktivität.") useful2 = make_field("Die Verwendung des Systems erhöht meine Effektivität.") useful3 = make_field("Ich finde das System nützlich.") subj_norm1 = make_field("Kolleg*innen bzw. Kommiliton*innen, die mein Verhalten beeinflussen, sind der Meinung, dass ich das System nutzen sollte.") subj_norm2 = make_field("Kolleg*innen bzw. Kommiliton*innen, die mir wichtig sind, sind der Meinung, dass ich das System nutzen sollte.") subj_norm3 = make_field("Kolleg*innen bzw. Kommiliton*innen, deren Meinung ich schätze, sind der Meinung, dass ich das System nutzen sollte.") neg_eval1 = make_field("Ich mache mir Gedanken darüber, was andere über mich sagen.") neg_eval2 = make_field("Ich mache mir Gedanken darüber, was andere über mich denken.") neg_eval3 = make_field("Ich habe das Gefühl, dass andere hinter meinem Rücken über mich reden.") anticipated_regret = make_field("Wenn die Entscheidung, die ich während der Strafaussetzung getroffen habe, von Kolleg*innen bzw. Kommiliton*innen für unangemessen empfunden wird, würde ich mir wahrscheinlich wünschen, dass ich mich anders entschieden hätte.") regret = make_field("Könnte ich die Zeit zurückdrehen und noch einmal entscheiden, würde ich mich anders entscheiden.") regret_reason = models.BooleanField(choices=[[True, "Ja"], [False, "Nein"]]) responsibility_end = models.IntegerField() responsibility_advisor_end = models.IntegerField() unique_ID = models.StringField() # def creating_session(subsession): # for player in subsession.get_players(): # player.treatment = random.choice([True, False]) # print("Set treatment to ", player.treatment) # PAGES class Intro(Page): form_model = "player" @staticmethod def get_form_fields(player: Player): form_fields = ["is_mobile", "consent"] if player.treatment_peer: form_fields += ["manipulation_check"] return form_fields class PrelimQuestions(Page): form_model = "player" @staticmethod def get_form_fields(player: Player): form_fields = ["age", "sex", "job", "stud_exp", "trainee_exp", "exp", "region", "ideol"] form_fields += player.participant.pers_inno_order # form_fields += shuffle_form_fields(["pers_inno1", "pers_inno2", "pers_inno3", "pers_inno4"], 4) return form_fields @staticmethod def vars_for_template(player: Player): other = ["age", "sex", "job", "stud_exp", "trainee_exp", "exp", "region", "ideol"] return dict(other=other) @staticmethod def error_message(player: Player, values): if (values["stud_exp"] > 0) & (values["trainee_exp"] > 0): return "Bitte überprüfen Sie Ihre Angaben zur Semesteranzahl und Anzahl der Monate im Rechtsreferendariat." class Case(Page): pass class Task(Page): form_model = "player" form_fields = ["click_open", "click_close", "sentencing", "parole"] class Argumentation(Page): form_model = "player" @staticmethod def get_form_fields(player: Player): form_fields = player.participant.args_sentencing_order + player.participant.args_parole_order return form_fields @staticmethod def js_vars(player: Player): return dict( sentencing=player.sentencing, ) @staticmethod def error_message(player: Player, values): if values["sentencing_advice"] + values["sentencing_motives"] + values["sentencing_mindset"] + values[ "sentencing_noncompliance"] + values["sentencing_execution"] + values["sentencing_past"] + values[ "sentencing_attitude"] == 0: return "Bitte nutzen Sie die Schieberegler." if values["parole_advice"] + values["parole_personality"] + values["parole_circumstances"] + values[ "parole_life"] + values["parole_effects"] + values["parole_past"] + values[ "parole_attitude"] == 0: return "Bitte nutzen Sie die Schieberegler." class PostQuestions(Page): form_model = "player" @staticmethod def get_form_fields(player: Player): form_fields = player.participant.confid_satis_order + player.participant.post_questions_order form_fields += ["responsibility", "responsibility_advisor", "anticipated_regret"] # print("post-questions:", form_fields) # player.participant.my_field_order = form_fields[4:-3] return form_fields @staticmethod def js_vars(player: Player): treatment = player.treatment_advice cog_trust1_label = { 0: "Der Psychologe ist kompetent und effektiv bei der Vorhersage der Rückfallwahrscheinlichkeit.", 1: "Das KI-System ist kompetent und effektiv bei der Vorhersage der Rückfallwahrscheinlichkeit." } cog_trust2_label = { 0: "Der Psychologe erfüllt seine Aufgabe, die Rückfallwahrscheinlichkeit vorherzusagen, sehr gut.", 1: "Das KI-System erfüllt seine Aufgabe, die Rückfallwahrscheinlichkeit vorherzusagen, sehr gut." } cog_trust3_label = { 0: "Insgesamt ist der Psychologe ein fähiger und qualifizierter Berater für die Vorhersage der Rückfallwahrscheinlichkeit.", 1: "Insgesamt ist das KI-System ein fähiger und qualifizierter Berater für die Vorhersage der Rückfallwahrscheinlichkeit." } integ_trust1_label = { 0: "Der Psychologe gibt unvoreingenommene Empfehlungen.", 1: "Das KI-System gibt unvoreingenommene Empfehlungen." } integ_trust2_label = { 0: "Der Psychologe ist unehrlich.", 1: "Das KI-System ist unehrlich." } integ_trust3_label = { 0: "Ich halte den Psychologen für integer.", 1: "Ich halte das KI-System für integer." } emo_trust1_label = { 0: "Ich fühle mich unsicher, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf den Psychologen verlasse.", 1: "Ich fühle mich unsicher, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf das KI-System verlasse." } emo_trust2_label = { 0: "Ich fühle mich wohl, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf den Psychologen verlasse.", 1: "Ich fühle mich wohl, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf das KI-System verlasse." } emo_trust3_label = { 0: "Ich fühle mich zufrieden, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf den Psychologen verlasse.", 1: "Ich fühle mich zufrieden, wenn ich mich bei meiner Entscheidung während der Strafaussetzung auf das KI-System verlasse." } useful1_label = { 0: "Die Verwendung der Einschätzung des Psychologen erhöht meine Produktivität.", 1: "Die Verwendung der Einschätzung durch das KI-System erhöht meine Produktivität." } useful2_label = { 0: "Die Verwendung der Einschätzung des Psychologen erhöht meine Effektivität.", 1: "Die Verwendung der Einschätzung durch das KI-System erhöht meine Effektivität." } useful3_label = { 0: "Ich finde die Einschätzung des Psychologen nützlich.", 1: "Ich finde die Einschätzung durch das KI-System nützlich." } subj_norm1_label = { 0: "Kolleg*innen bzw. Kommiliton*innen, die mein Verhalten beeinflussen, sind der Meinung, dass ich die Einschätzung des Psychologen nutzen sollte.", 1: "Kolleg*innen bzw. Kommiliton*innen, die mein Verhalten beeinflussen, sind der Meinung, dass ich die Einschätzung durch das KI-System nutzen sollte." } subj_norm2_label = { 0: "Kolleg*innen bzw. Kommiliton*innen, die mir wichtig sind, sind der Meinung, dass ich die Einschätzung des Psychologen nutzen sollte.", 1: "Kolleg*innen bzw. Kommiliton*innen, die mir wichtig sind, sind der Meinung, dass ich die Einschätzung durch das KI-System nutzen sollte." } subj_norm3_label = { 0: "Kolleg*innen bzw. Kommiliton*innen, deren Meinung ich schätze, sind der Meinung, dass ich die Einschätzung des Psychologen nutzen sollte.", 1: "Kolleg*innen bzw. Kommiliton*innen, deren Meinung ich schätze, sind der Meinung, dass ich die Einschätzung durch das KI-System nutzen sollte." } neg_eval1_label = { 0: "Ich mache mir Gedanken darüber, was andere über mich sagen.", 1: "Ich mache mir Gedanken darüber, was andere über mich sagen." } neg_eval2_label = { 0: "Ich mache mir Gedanken darüber, was andere über mich denken.", 1: "Ich mache mir Gedanken darüber, was andere über mich denken." } neg_eval3_label = { 0: "Ich habe das Gefühl, dass andere hinter meinem Rücken über mich reden.", 1: "Ich habe das Gefühl, dass andere hinter meinem Rücken über mich reden." } label_dict = { "cog_trust1": cog_trust1_label[treatment], "cog_trust2": cog_trust2_label[treatment], "cog_trust3": cog_trust3_label[treatment], "integ_trust1": integ_trust1_label[treatment], "integ_trust2": integ_trust2_label[treatment], "integ_trust3": integ_trust3_label[treatment], "emo_trust1": emo_trust1_label[treatment], "emo_trust2": emo_trust2_label[treatment], "emo_trust3": emo_trust3_label[treatment], "useful1": useful1_label[treatment], "useful2": useful2_label[treatment], "useful3": useful3_label[treatment], "subj_norm1": subj_norm1_label[treatment], "subj_norm2": subj_norm2_label[treatment], "subj_norm3": subj_norm3_label[treatment], "neg_eval1": neg_eval1_label[treatment], "neg_eval2": neg_eval2_label[treatment], "neg_eval3": neg_eval3_label[treatment] } return dict( sentencing=player.sentencing, constructs=label_dict ) # class WaitingPage(Page): # pass class Evaluation(Page): form_model = "player" form_fields = ["regret", "regret_reason", "responsibility_end", "responsibility_advisor_end"] @staticmethod def vars_for_template(player: Player): if player.treatment_advice: advisor = "durch das KI-System" else: advisor = "durch den Psychologen" return dict( regret_reason_label='Würden Sie sich beim nächsten Mal auf die Einschätzung {} verlassen?'.format(advisor) ) @staticmethod def js_vars(player: Player): if player.treatment_advice: advisor = "durch das KI-System" else: advisor = "durch den Psychologen" return dict( advisor=advisor ) class End(Page): form_model = "player" @staticmethod def js_vars(player: Player): return dict( unique_ID=player.unique_ID, ) page_sequence = [ Intro, PrelimQuestions, Case, Task, Argumentation, PostQuestions, Evaluation, End ]