from otree.api import * import random doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'part2' PLAYERS_PER_GROUP = 4 NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): decision_rule = models.IntegerField(choices=[1, 2]) def set_rule(group): votes = [p.field_maybe_none('Own_Vote') for p in group.get_players() if p.field_maybe_none('Own_Vote') is not None] num_opt1 = votes.count('option_1') num_opt2 = votes.count('option_2') if num_opt1 > num_opt2: group.decision_rule = 1 elif num_opt2 > num_opt1: group.decision_rule = 2 else: tiebreak = random.SystemRandom().choice([1, 2]) group.decision_rule = tiebreak for player in group.get_players(): player.participant.vars['decision_rule'] = group.decision_rule class Player(BasePlayer): Own_Vote = models.StringField( choices=[ ('option_1', 'Ich wähle Option 1, die bestrafte Personen benachteiligt und nicht bestrafte Personen begünstigt. (90 % | 10 %)'), ('option_2', 'Ich wähle Option 2, die alle Personen unabhängig von einer Bestrafung am Ende von Teil 1 behandelt. (50 % | 50 %)'), ], widget=widgets.RadioSelect, label='Welche Option möchten Sie wählen?') # Frage 4 (nur INFO spät) 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 spät) 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?' ) # PAGES class InfoQuestionsLate(Page): form_model = 'player' form_fields = ['q4', 'q5'] def is_displayed(player: Player): if player.session.config['treatment'] == 'INFO' and player.participant.vars.get('Info', 0) == 0: return True def error_message(player: Player, values): errors = {} if 'q4' in values: 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 class Voting(Page): form_model = 'player' form_fields = ['Own_Vote'] def get_form_fields(player): if player.participant.vars.get('possibility_to_vote'): return ['Own_Vote'] else: return [] def vars_for_template(player): return { 'Info': player.participant.vars.get('Info'), 'Detect_1': player.participant.vars.get('Detect_1'), 'Taking_1': player.participant.vars.get('Taking_1'), 'possibility_to_vote': player.participant.vars.get('possibility_to_vote'), } class GroupWaitPage(WaitPage): wait_for_all_groups = False # Only synchronize within group title_text = "Bitte warten..." body_text = "Bitte warten Sie, bis alle Gruppenmitglieder abgestimmt haben." @staticmethod def after_all_players_arrive(group: Group): group.set_rule() class Part2Goodbye(Page): pass page_sequence = [InfoQuestionsLate, Voting, GroupWaitPage, Part2Goodbye]