from otree.api import * class C(BaseConstants): NAME_IN_URL = 'demographics' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): trust = models.StringField( choices=[ ['trust', 'Man kann den meisten Menschen vertrauen.'], ['caution', 'Man kann im Umgang mit anderen Menschen nicht vorsichtig genug sein.'], ], label='', widget=widgets.RadioSelect, ) age = models.IntegerField(label='', min=13, max=125) gender = models.StringField( choices=[['Male', 'Männlich'], ['Female', 'Weiblich'], ['Diverse', 'Divers'], ['NA', 'Keine Angabe']], label='', widget=widgets.RadioSelect, ) education = models.StringField( choices=[ ['Hauptschulabschluss', 'Hauptschulabschluss'], ['Mittlere Reife', 'Mittlere Reife'], ['Fachhochschulreife', 'Fachhochschulreife'], ['IB', 'Allgemeine Hochschulreife'], ['Ausbildung', 'Ausbildung'], ['Meister', 'Meister'], ['Bachelor', 'Bachelor'], ['Master', 'Master'], ['PhD', 'Doktor'], ], label='', widget=widgets.RadioSelect, ) student = models.BooleanField(label='') course_of_study = models.IntegerField( label='', choices=[ [1, 'Wirtschaftswissenschaften'], [2, 'Sozialwissenschaften'], [3, 'Rechtswissenschaften'], [4, 'Geisteswissenschaften'], [5, 'Kulturwissenschaften'], [6, 'Sprachen'], [7, 'Lehramt'], [8, 'Agrarwissenschaften'], [9, 'Forstwissenschaften'], [10, 'Geowissenschaften'], [11, 'Medizin'], [12, 'Naturwissenschaften'], [13, 'Mathematik'], [14, 'Informatik'], [15, 'Theologie'], ], widget=widgets.RadioSelect, ) semester = models.IntegerField(label='', min=0, blank=True) # Payment fields iban = models.StringField(label='') bic = models.StringField(label='') name = models.StringField(label='') street = models.StringField(label='') house_nr = models.StringField(label='') zip_code = models.StringField(label='') city = models.StringField(label='') availability = models.LongStringField(label='') language_preference = models.StringField( choices=[ ['both_ok', 'Beide Sprachen sind mir gleich recht.'], ['prefer_en', 'Ich bevorzuge Englisch, Deutsch ist aber auch in Ordnung.'], ['prefer_de', 'Ich bevorzuge Deutsch, Englisch ist aber auch in Ordnung.'], ['only_en', 'Ich möchte ausschließlich an einer englischsprachigen Sitzung teilnehmen.'], ['only_de', 'Ich möchte ausschließlich an einer deutschsprachigen Sitzung teilnehmen.'], ], label='', widget=widgets.RadioSelect, ) # ── PAGES ────────────────────────────────────────────────────────────────────── class TrustQuestion(Page): form_model = 'player' form_fields = ['trust'] class Demographics(Page): form_model = 'player' form_fields = ['age', 'gender', 'education', 'student'] class StudentQuestions(Page): form_model = 'player' form_fields = ['course_of_study', 'semester'] @staticmethod def is_displayed(player: Player): return player.student == True class Availability(Page): form_model = 'player' form_fields = ['availability', 'language_preference'] @staticmethod def error_message(player, values): if not values.get('availability'): if player.participant.language == 'de': return 'Bitte wählen Sie mindestens einen Termin aus.' else: return 'Please select at least one available time slot.' class PaymentInformation(Page): form_model = 'player' form_fields = ['name', 'iban', 'bic', 'street', 'house_nr', 'zip_code', 'city'] @staticmethod def error_message(player: Player, values): if len(values['iban']) > 22: return 'Deine IBAN hat mehr als 22 Stellen. Bitte überprüfe, ob du die Richtigkeit deiner IBAN.' elif len(values['iban']) < 22: return 'Deine IBAN hat weniger als 22 Stellen. Bitte überprüfe, ob du die Richtigkeit deiner IBAN.' class LastPage(Page): @staticmethod def vars_for_template(player: Player): dictator_points = player.participant.vars.get('dictator_payoff', 0) dictator_payoff = dictator_points/100 return dict( dictator_payoff=dictator_payoff, showup_fee=1.00, ) page_sequence = [TrustQuestion, Demographics, StudentQuestions, Availability, PaymentInformation, LastPage]