from otree.api import * import random DEBUG = False ### todo: Set to False for real experiment & controlstages working / True doc = """ "Environmental Experiment". """ class C(BaseConstants): NAME_IN_URL = 'Environmental_Employee' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 TREATMENT = 1 ###Set 1 == Known x Fix, 2 == Known x Incentive, 3 == Unknown x Fix, 4 == Unknown x Incentive MANAGER_K = "Environmental_Employee/ManagerKnown.html" MANAGER_K_T = "Environmental_Employee/ManagerKnownType.html" MANAGER_U = "Environmental_Employee/ManagerUnknown.html" INCENTIVE = "Environmental_Employee/Incentive.html" NO_INCENTIVE = "Environmental_Employee/NoIncentive.html" DSGVO_PAGE = __name__ + '/Datenschutz.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): player_Type = models.IntegerField() user_Role = models.StringField() correct_answer = models.IntegerField(initial=0) User_input = models.IntegerField(blank=True) total_correct = models.IntegerField() amount = models.IntegerField() numberInput = models.IntegerField() counter = models.IntegerField(initial=0) solution = models.IntegerField() einwilligung1 = models.BooleanField( label="Ich willige in die Teilnahme an der oben beschriebenen Studie ein.", choices=[ [1, "Ja"], [0, "Nein"], ], widget=widgets.RadioSelect, ) einwilligung2 = models.BooleanField( label = "Ich willige hiermit ein (Art. 6 Abs. 1 lit. a DSGVO), dass meine übermittelten persönlichen Daten gespeichert und verarbeitet werden dürfen. Ich versichere, dass ich über 16 Jahre alt bin bzw. die Zustimmung der / des Sorgeberechtigten zur Nutzung des Kontaktes und Weitergabe der Daten vorliegt. Die Datenschutzerklärung zum Formular habe ich gelesen. Das Recht des Widerrufs ist mir bekannt.", choices=[ [1, "Ja"], [0, "Nein"], ], widget=widgets.RadioSelect, ) type = models.IntegerField( label="", ) control_emp1 = models.IntegerField( label="", choices=[ [1, "Arbeitnehmer"], [2, "Manager"], ], widget=widgets.RadioSelect, ) control_emp2 = models.IntegerField( label="", choices=[ [1, "Sie"], [2, "Ihr Manager"], ], widget=widgets.RadioSelect, ) control_emp3 = models.IntegerField( label="", ) control_emp4 = models.IntegerField( label="Meine Auszahlung beträgt _____ Taler", ) control_emp4_incentive = models.IntegerField( label="Meine Auszahlung beträgt _____ Taler", ) example = models.IntegerField( label='Gesamtzahl der 7er im angezeigten Zahlenblock:', min=0, max=300, ) ios = models.IntegerField( label="", min=1, max=7, ) prolificID = models.StringField( label="Bitte tragen Sie hier Ihre Prolific ID ein:", ) def prolificID_error_message(player, value): if len(value) != 24: return "Ihre Prolific ID muss 24 Zeichen (Buchstaben & Zahlen) lang sein." class Type(Page): form_model = 'player' form_fields = ['player_Type'] def before_next_page(player: Player, timeout_happened): if player.player_Type <= 4: player.user_Role = "Employee" else: player.user_Role = "Employer" print('UserRole', player.user_Role) class Welcome(Page): form_model = 'player' form_fields = ['einwilligung1', 'einwilligung2'] class Instructions(Page): form_model = 'player' class Instruction2(Page): pass class ProlificID(Page): form_model = 'player' form_fields = ['prolificID'] class Example(Page): timeout_seconds = 30 timer_text = 'Verbleibende Zeit für die Bearbeitung dieser Aufgabe:' form_model = 'player' form_fields = ['example'] class ExampleSolution(Page): pass class ComprehensionChecksNoIncentive(Page): form_model = 'player' form_fields = ['control_emp1', 'control_emp2', 'control_emp3', 'control_emp4'] @staticmethod def error_message(player, values): if not DEBUG: if values['control_emp1'] != 1 or values['control_emp2'] != 2: return 'Mindestens eine Ihrer Antworten war nicht korrekt.' if values['control_emp3'] != 150: return 'Bitte beachten Sie: ' \ 'Pro korrekt gelöste Aufgabe generieren Sie 15 Taler an Unternehmensressourcen.' if values['control_emp4'] != 200: return 'Bitte beachten Sie: ' \ 'Sie erhalten ein festes Gehalt in Höhe von 200 Taler, d.h. Ihre Auszahlung hängt nicht von der Anzahl der von Ihnen korrekt gezählten Blöcken ab.' class ComprehensionChecksIncentive(Page): form_model = 'player' form_fields = ['control_emp1', 'control_emp2', 'control_emp3', 'control_emp4_incentive'] @staticmethod def error_message(player, values): if not DEBUG: if values['control_emp1'] != 1 or values['control_emp2'] != 2: return 'Mindestens eine Ihrer Antworten war nicht korrekt.' if values['control_emp3'] != 150: return 'Bitte beachten Sie: ' \ 'Pro korrekt gelöste Aufgabe generieren Sie 15 Taler an Unternehmensressourcen.' if values['control_emp4_incentive'] != 200: #check again for new treatment return 'Bitte beachten Sie:' \ 'Sie erhalten ein Festgehalt in Höhe von 150 Taler. Für jede richtig gelöste Aufgabe erhalten Sie zusätzlich 5 Taler.' class Moor(Page): form_model = 'player' class TaskIntro(Page): form_model = 'player' class Task(Page): form_model = 'player' form_fields = ['User_input'] timeout_seconds = 120 timer_text = "Verbleibende Zeit:" def vars_for_template(player: Player): solution = 0 counts_7 = [0] * 8 LINE_LENGTH = 15 numbers = [] for _ in range(8): counts_7_i = 0 innerlist = [] for _ in range(LINE_LENGTH): val = random.randint(0, 9) innerlist.append(str(val)) if val == 7: counts_7_i += 1 numbers.append(''.join(innerlist)) counts_7.append(counts_7_i) solution += counts_7_i # Remove the first element of counts_7 since it was initialized with zeros counts_7.pop(0) return { 'Numbers': numbers, 'solution': solution, 'counter': 0 } def before_next_page(player: Player, timeout_happened): user_input = player.field_maybe_none('User_input') correct_solution = player.field_maybe_none('solution') if user_input == correct_solution: player.counter += 1 print("counter", Player.counter) class Closeness(Page): form_model = 'player' form_fields = ['ios'] class Result(Page): form_model = 'player' page_sequence = [Welcome, ProlificID, Instructions, ComprehensionChecksNoIncentive, #ComprehensionChecksIncentive, Example, ExampleSolution, Moor, Closeness, TaskIntro, ]