from otree.api import * import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'part1' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 ENDOWMENT = 1000 DONATION = 500 SELF_GAIN = 400 PUNISHMENT = 300 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): orgs = [ 'Ärzte ohne Grenzen', 'Brot für die Welt', 'Deutsche Kinderkrebsstiftung', 'SOS Kinderdorf' ] players = subsession.get_players() for player in players: player.Detect_1 = random.randint(0, 1) player.participant.vars['Detect_1'] = player.Detect_1 # Organisationen zuweisen (zwei verschiedene) chosen_orgs = random.sample(orgs, 2) player.participant.vars['donation_org_1'] = chosen_orgs[0] player.participant.vars['donation_org_3'] = chosen_orgs[1] class Group(BaseGroup): pass class Player(BasePlayer): Detect_1 = models.IntegerField() punished_1 = models.BooleanField() possibility_to_vote = models.BooleanField() donation_part1 = models.IntegerField(initial=0) Info = models.IntegerField( choices=[ [1, 'Ja, ich möchte die Informationen für 200 Punkte kaufen.'], [0, 'Nein, ich warte bis zum Beginn von Teil 2 und erhalte die Informationen dann kostenlos.'] ], label='Möchten Sie die Informationen über Teil 2 jetzt kaufen?', widget=widgets.RadioSelect ) # Frage 1 q1 = models.CharField( choices=[ ('1000', '1000'), ('700', '700'), ('1400', '1400'), ], widget=widgets.RadioSelect, label='Angenommen eine Person hat das Spendengeld an sich genommen und wird überprüft. ' 'Wie viele Punkte hat diese Person am Ende von Teil 1 auf dem Punktekonto?' ) # Frage 2 q2 = models.CharField( choices=[ ('1000', '1000'), ('700', '700'), ('1400', '1400'), ], widget=widgets.RadioSelect, label='Angenommen eine Person hat das Spendengeld an sich genommen und wird nicht überprüft. ' 'Wie viele Punkte hat diese Person am Ende von Teil 1 auf dem Punktekonto?' ) # Frage 3 q3 = models.CharField( choices=[ ('0', '0'), ('100', '100'), ('400', '400'), ('500', '500'), ], widget=widgets.RadioSelect, label='Angenommen eine Person hat in Teil 1 das Spendengeld an sich genommen und wird überprüft. ' 'Welcher Betrag wird letztlich in Teil 1 an die Wohltätigkeitsorganisation gespendet?' ) # Frage 4 (nur INFO) q4 = models.CharField( choices=[ ('alle', 'Alle Personen einer Gruppe'), ('bestimmte', 'Nur bestimmte Personen in einer Gruppe'), ], blank=True, widget=widgets.RadioSelect, label= 'Die Abstimmung in Teil 2 beeinflusst, mit welcher Wahrscheinlichkeit verschiedene Personen eine Aufgabe in Teil 4 bearbeiten dürfen. ' 'Welche Personen sind stimmberechtigt?' ) # Frage 5 (nur INFO) q5 = models.CharField( choices=[ ('ja', 'Ja'), ('nein','Nein'), ], blank=True, widget=widgets.RadioSelect, label='Die Abstimmung in Teil 2 beeinflusst, mit welcher Wahrscheinlichkeit verschiedene Personen eine Aufgabe in Teil 4 bearbeiten dürfen. ' 'Ist das Abstimmungsergebnis relevant für Ihre Auszahlungen?' ) Taking_1 = models.IntegerField( choices=[ (1, 'Ja, ich möchte das Spendengeld an mich nehmen.'), (0, 'Nein, ich möchte das Spendengeld nicht an mich nehmen.'), ], widget=widgets.RadioSelect, label="Möchten Sie die als Spende vorgesehenen Punkte an sich nehmen?" ) def set_payoff_part1(player): if player.Taking_1: if player.Detect_1: player.payoff = C.ENDOWMENT - C.PUNISHMENT # 700 player.participant.vars['payoff_part_1'] = C.ENDOWMENT - C.PUNISHMENT player.punished_1 = True player.participant.vars['punished_1'] = True player.donation_part1 = 400 else: player.payoff = C.ENDOWMENT + C.SELF_GAIN # 1400 player.participant.vars['payoff_part_1'] = C.ENDOWMENT + C.SELF_GAIN player.punished_1 = False player.participant.vars['punished_1'] = False player.donation_part1 = 0 else: player.payoff = C.ENDOWMENT # 1000 player.participant.vars['payoff_part_1'] = C.ENDOWMENT player.punished_1 = False player.participant.vars['punished_1'] = False player.donation_part1 = 500 if player.session.config['treatment'] == "INFO" and player.Info == 1: player.payoff -= 200 player.participant.vars['payoff_part_1'] -= 200 def set_possibility_to_vote(player): treatment = player.session.config.get('treatment') punished = player.punished_1 if not punished or treatment == "NO_DIS": player.possibility_to_vote = True player.participant.vars['possibility_to_vote'] = True else: player.possibility_to_vote = False player.participant.vars['possibility_to_vote'] = False # PAGES class InfoDecision(Page): form_model = 'player' form_fields = ['Info'] def before_next_page(player: Player, timeout_happened): player.participant.vars['Info'] = player.Info def is_displayed(player: Player): if player.session.config['treatment'] == 'INFO': return True class DetectionResult(Page): @staticmethod def is_displayed(player: Player): return True @staticmethod def vars_for_template(player: Player): return dict( detected=player.Detect_1, taking=player.Taking_1, punished=player.punished_1, payoff=player.payoff ) class Welcome(Page): pass class GeneralInformation(Page): pass class Instructions_1(Page): pass class Instructions_2(Page): def is_displayed(player: Player): return player.session.config['treatment'] != 'INFO' or player.Info == 1 class Instructions_3(Page): pass class Instructions_4(Page): pass class ControlQuestions(Page): form_model = 'player' def get_form_fields(player): fields = ['q1', 'q2', 'q3'] treatment = player.session.config.get('treatment') info = player.participant.vars.get('Info', 0) if not (treatment == 'INFO' and info == 0): fields += ['q4', 'q5'] return fields def error_message(player: Player, values): errors = {} treatment = player.session.config.get('treatment') if values.get('q1') != '700': errors['q1'] = 'Diese Antwort ist falsch.' if values.get('q2') != '1400': errors['q2'] = 'Diese Antwort ist falsch.' if values.get('q3') != '400': errors['q3'] = 'Diese Antwort ist falsch.' if 'q4' in values: if treatment == 'NO_DIS': if values['q4'] != 'alle': errors['q4'] = 'Diese Antwort ist falsch.' else: if values['q4'] != 'bestimmte': errors['q4'] = 'Diese Antwort ist falsch.' if 'q5' in values: if values['q5'] != 'ja': errors['q5'] = 'Diese Antwort ist falsch.' return errors def vars_for_template(player): return { 'bought': player.session.config['treatment'] != 'INFO' or player.Info == 1, } class TakingDecision(Page): form_model = 'player' form_fields = ['Taking_1'] def before_next_page(player: Player, timeout_happened): player.participant.vars['Taking_1'] = player.Taking_1 player.set_payoff_part1() player.set_possibility_to_vote() class TakingResults(Page): pass class DetectionResults(Page): pass page_sequence = [Welcome, GeneralInformation, Instructions_1, InfoDecision, Instructions_2, Instructions_3, Instructions_4, ControlQuestions, TakingDecision, TakingResults, DetectionResult]