from otree.api import * import time author = 'Thomas' class C(BaseConstants): NAME_IN_URL = 'Questionaire_Post' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 MIA_CHOICES = [ (1, 'Wetter'), (2, 'Entfernung'), (3, 'Art des Fahrradweges'), (4, 'Zugang zum Fahrrad'), (5, 'Leihgebühren (E-Bike)'), (6, 'Möglichkeit einer alternativen Strecke'), (7, 'Parkgebühren und Parkplatzsituation'), (8, 'Gepäck'), ] DAY_CHOICES = [ (1, '1 Tag pro Woche'), (2, '2 Tage pro Woche'), (3, '3 Tage pro Woche'), (4, '4 Tage pro Woche'), (5, '5 Tage pro Woche'), (6, '6 Tage pro Woche'), (7, 'Jeden Tag'), (8, 'Nie') ] PerHoliday_CHOICES = [(i, str(i)) for i in range(0, 21)] + [(22, "mehr als 20")] PerWeek_CHOICES = [(i, str(i)) for i in range(0, 21)] + [(22, "mehr als 20")] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): car_licence = models.IntegerField(label="Besitzen Sie einen Autoführerschein?", blank=False, choices=[ [1, 'Ja'], [0, 'Nein'] ]) car_use = models.IntegerField(label="An wie vielen Tagen einer typischen Woche benutzen Sie eine privaten PKW als Fahrer oder Mitfahrer?", blank=False, choices=C.DAY_CHOICES) bike_use = models.IntegerField( label="An wie vielen Tagen einer typischen Woche benutzen Sie eine Fahrrad als Fortbewegungsmittel?", blank=False, choices=C.DAY_CHOICES) dem_sport_heavy = models.IntegerField( label="Anstrengende Bewegungen
" "(z.B. Laufen, Joggen, Hockey, Fußball, Squash, Basketball, Skilanglauf, Judo, Rollschuhlaufen, kräftiges Schwimmen, kräftiges Radfahren über längere Strecken)" , blank=False, choices=C.PerWeek_CHOICES) dem_sport_moderate = models.IntegerField( label="Moderate Bewegungen
" "(z.B. schnelles Gehen, Baseball, Tennis, leichtes Radfahren, Volleyball, Badminton, leichtes Schwimmen, alpiner Skilauf, Volkstanz)" , blank=False, choices=C.PerWeek_CHOICES) dem_sport_easy = models.IntegerField( label="Leichte Bewegungen
" "(z.B. Yoga, Bogenschießen, Angeln, Bowling, Golf, leichtes Gehen)" , blank=False, choices=C.PerWeek_CHOICES) dem_sport_heavy_h = models.IntegerField( label="Anstrengende Bewegungen
" "(z.B. Laufen, Joggen, Hockey, Fußball, Squash, Basketball, Skilanglauf, Judo, Rollschuhlaufen, kräftiges Schwimmen, kräftiges Radfahren über längere Strecken)" , blank=True, choices=C.PerHoliday_CHOICES) dem_sport_moderate_h = models.IntegerField( label="Moderate Bewegungen
" "(z.B. schnelles Gehen, Baseball, Tennis, leichtes Radfahren, Volleyball, Badminton, leichtes Schwimmen, alpiner Skilauf, Volkstanz)" , blank=True, choices=C.PerHoliday_CHOICES) dem_sport_easy_h = models.IntegerField( label="Leichte Bewegungen
" "(z.B. Yoga, Bogenschießen, Angeln, Bowling, Golf, leichtes Gehen)" , blank=True, choices=C.PerHoliday_CHOICES) dem_health = models.IntegerField( label="Wie ist Ihr Gesundheitszustand im Allgemeinen?", blank=False, choices=[ [1, 'Sehr gut'], [2, 'Gut'], [3, 'Mittelmäßig'], [4, 'Schlecht'], [5, 'Sehr schlecht'], [0, 'Möchte ich nicht sagen'] ]) dem_satisfaction=models.IntegerField(blank=True,label="", min=0, max=11) dem_risk = models.IntegerField(blank=True,label="", min=0, max=11) dem_time = models.IntegerField(blank=True,label="", min=0, max=11) dem_altruism = models.IntegerField(blank=True,label="", min=0, max=11) dem_holiday_days = models.IntegerField( label="Wie viele Tage waren Sie im letzten Jahr insgesamt im Urlaub?", blank=False, choices=[(i, str(i)) for i in range(0, 41)] + [(41, "mehr als 40")] ) dem_holiday_type = models.IntegerField(label="Welche Art von Urlaub haben Sie überwiegend gemacht?", blank=True, choices=[ [1, 'Erholungsurlaub/Gesundheitsurlaub/Wellnessurlaub '], [2, 'Städtereisen/Kulturreise'], [3, 'Fernreisen'], [4, 'Aktivurlaub (z. B. Wandern, Radfahren, ...)'], [5, 'Strandurlaub'], [6, 'Besuch von Verwandten oder Freunden'], [7, 'Anderer Urlaub'] ]) dem_HH_adults = models.IntegerField( label="", blank=False, choices=[ [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, 'Mehr als 5'] ]) dem_HH_kids = models.IntegerField( label="", blank=False, choices=[ [0, '0'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5'], [6, 'Mehr als 5'] ]) dem_income = models.IntegerField( label="""Wie hoch ist das monatliche Netto-Einkommen Ihres Haushaltes insgesamt? """, blank=False, choices=[ [1, 'bis unter 400 Euro'], [2, '400 bis unter 500 Euro'], [3, '500 bis unter 750 Euro'], [4, '750 bis unter 1.000 Euro'], [5, '1.000 bis unter 1.250 Euro'], [6, '1.250 bis unter 1.500 Euro'], [7, '1.500 bis unter 1.750 Euro'], [8, '1.750 bis unter 2.000 Euro'], [9, '2.000 bis unter 2.250 Euro'], [10, '2.250 bis unter 2.500 Euro'], [11, '2.500 bis unter 2.750 Euro'], [12, '2.750 bis unter 3.000 Euro'], [13, '3.000 bis unter 3.250 Euro'], [14, '3.250 bis unter 3.500 Euro'], [15, '3.500 bis unter 3.750 Euro'], [16, '3.750 bis unter 4.000 Euro'], [17, '4.000 bis unter 5.000 Euro'], [18, '5.000 Euro und mehr '], [99, 'Möchte ich nicht sagen'] ]) bot_check = models.StringField(blank=True) FinalComment = models.LongStringField( label="Wenn Sie uns noch Anmerkungen, Kritik, oder Verbesserungsvorschläge zur Umfrage angeben möchten, können Sie das hier tun:", blank=True, max_length=2000, # Adjusting for an approximate word-to-character ratio. ) WhyNoPart = models.LongStringField( label="Möchten Sie uns noch kurz mitteilen warum Sie nicht an der Befragung teilnehmen möchten?", blank=True, max_length=2000, # Adjusting for an approximate word-to-character ratio. ) nutri1 = models.IntegerField(blank=True,label="Ich esse mindestens drei Mahlzeiten am Tag und habe einen regelmäßigen Essensrythmus.", min=1, max=4) nutri2 = models.IntegerField(blank=True,label="Ich frühstücke jeden Morgen zuhause (mehr als eine Tasse Tee oder Cafe.", min=1, max=4) nutri3 = models.IntegerField(blank=True,label="Ich esse mindestens einmal täglich Obst.", min=1, max=4) nutri4 = models.IntegerField(blank=True,label="Ich esse mindestens einmal täglich Gemüse.", min=1, max=4) nutri5 = models.IntegerField(blank=True,label="Ich nehme täglich zwei Portionen Milch oder Milchprodukte zu mir (z.B. Joghurt).", min=1, max=4) nutri6 = models.IntegerField(blank=True,label="Ich begrenze die Aufname von tierischen Fetten.", min=1, max=4) nutri7 = models.IntegerField(blank=True,label="Ich begrenze die Aufnahme von Salz.", min=1, max=4) nutri8 = models.IntegerField(blank=True,label="Ich begrenze die Aufnahme von Süßigkeiten.", min=1, max=4) nutri9 = models.IntegerField(blank=True,label="Ich vermeide das Naschen zwischen den Mahlzeiten.", min=1, max=4) mental1 = models.IntegerField(blank=True,label="Ich schlafe jede Nacht mindestens 6-7 Stunden.", min=1, max=4) mental2 = models.IntegerField(blank=True,label="Ich gehe zu regelmäßigen Zeiten ins Bett.", min=1, max=4) mental3 = models.IntegerField(blank=True,label="Ich entspanne mich täglich mindestens 20-30 Minuten (z.B. Ausruhen, Entspannungsübungen).", min=1, max=4) mental4 = models.IntegerField(blank=True,label="Ich kann gut mit Stress umgehen.", min=1, max=4) mental5 = models.IntegerField(blank=True,label="Ich bin mir selbst und der Welt gegenüber positiv eingestellt.", min=1, max=4) mental6 = models.IntegerField(blank=True,label="In schwierigen Situationen bitte ich andere Menschen um Hilfe (z.B. Familie oder Freunde).", min=1, max=4) mental7 = models.IntegerField(blank=True,label="Ich verbringen mindestens einmal pro Monat Zeit mit meinen Freunden.", min=1, max=4) sport1 = models.IntegerField(blank=True,label="""Ich bewege mich täglich mindestens 30 Minuten mit moderater oder hoher Intensität (z.B. Joggen, schnelles Gehen, Gartenarbeit, Sportaktivitäten).""", min=1, max=4) sport2 = models.IntegerField(blank=True,label="Ich mache mindestens 2-3 mal pro Woche Kräftigungsübungen für de großen Muskelgruppen.", min=1, max=4) sport3 = models.IntegerField(blank=True,label="Ich steigere meine körperliche Aktivität in meinem Alltag (z.B. zu Fuss gehen statt mit dem Auto fahren; die Treppe statt den Aufzug nehmen.", min=1, max=4) sport4 = models.IntegerField(blank=True,label="Ich begrenze die Zeit, die ich vor dem Fernseher verbringe.", min=1, max=4) survey_end = models.FloatField() survey_duration = models.FloatField() #FUNCTIONS def get_age_quota_key(age): if 18 <= age <= 29: return 'age_18_29' elif 30 <= age <= 39: return 'age_30_39' elif 40 <= age <= 49: return 'age_40_49' elif 50 <= age <= 59: return 'age_50_59' elif 60 <= age <= 69: return 'age_60_69' return None def get_gender_quota_key(gender): if gender == 1: return 'male' elif gender == 2: return 'female' return None def get_school_quota_key(school): if school == 0: return 'school_0' elif school == 1: return 'school_1' elif school == 2: return 'school_2' elif school == 3: return 'school_3' elif school == 4: return 'school_4' elif school == 5: return 'school_student' return None def get_land_quota_key(land): if land in range(1, 17): return f'land_{land}' return None def get_all_quota_keys(participant): age = participant.vars.get('dem_age') gender = participant.vars.get('dem_gender') school = participant.vars.get('dem_school') land = participant.vars.get('dem_land') age_key = get_age_quota_key(age) gender_key = get_gender_quota_key(gender) school_key = get_school_quota_key(school) land_key = get_land_quota_key(land) if None in [age_key, gender_key, school_key, land_key]: return None return [land_key, school_key, age_key, gender_key] #PAGES class Q_post_DEM_sports(Page): form_model = 'player' form_fields = ['dem_sport_heavy', 'dem_sport_moderate', 'dem_sport_easy'] def is_displayed(player): return player.participant.vars.get('survey_participate') == 1 class Q_post_DEM_car(Page): form_model = 'player' form_fields = ['car_licence', 'car_use', 'bike_use', 'bot_check'] def is_displayed(player): return player.participant.vars.get('survey_participate') == 1 class Q_post_DEM_2(Page): form_model = 'player' form_fields = ['dem_risk', 'dem_time', 'dem_altruism', 'dem_HH_adults', 'dem_HH_kids', 'dem_income', 'dem_health', 'dem_satisfaction'] def is_displayed(player): return player.participant.vars.get('survey_participate') == 1 class Q_post_DEM_holiday(Page): form_model = 'player' form_fields = ['dem_holiday_days', 'dem_holiday_type','dem_sport_heavy_h', 'dem_sport_moderate_h', 'dem_sport_easy_h'] def is_displayed(player): return player.participant.vars.get('survey_participate') == 1 class Q_positivehealth_nutri(Page): form_model = 'player' form_fields = ['nutri1', 'nutri2', 'nutri3', 'nutri4', 'nutri5', 'nutri6', 'nutri7', 'nutri8', 'nutri9'] @staticmethod def is_displayed(player: Player): return player.participant.vars.get('survey_participate') == 1 class Q_positivehealth_mental(Page): form_model = 'player' form_fields = ['mental1', 'mental2', 'mental3', 'mental4', 'mental5', 'mental6', 'mental7'] @staticmethod def is_displayed(player: Player): return player.participant.vars.get('survey_participate') == 1 class Q_positivehealth_sport(Page): form_model = 'player' form_fields = ['sport1', 'sport2', 'sport3', 'sport4'] @staticmethod def is_displayed(player: Player): return player.participant.vars.get('survey_participate') == 1 # Final Page: Je nachdem ob die Personen an der Umfrage teilnehmen. class End_Participate_Yes(Page): form_model = 'player' form_fields = ['FinalComment'] @staticmethod def is_displayed(player: Player): return player.participant.vars.get('survey_participate') == 1 @staticmethod def before_next_page(player, timeout_happened): start = player.participant.vars.get('survey_start') if start is not None: player.survey_end = time.time() player.survey_duration = player.survey_end - start participant = player.participant # do not count people who were screened out if participant.vars.get('quota_screened_out', False): return # avoid double counting if participant.vars.get('quota_counted', False): return keys = get_all_quota_keys(participant) if keys is None: return counts = player.session.vars['quota_counts'] for key in keys: counts[key] += 1 participant.vars['quota_counted'] = True class NoParticipation(Page): form_model = 'player' form_fields = ['WhyNoPart'] @staticmethod def is_displayed(player): return player.participant.vars.get('survey_participate') == 0 @staticmethod def before_next_page(player, timeout_happened): start = player.participant.vars.get('survey_start') if start is not None: player.survey_end = time.time() player.survey_duration = player.survey_end - start class RedirectToProvider_Yes(Page): @staticmethod def is_displayed(player): return player.participant.vars.get('survey_participate') == 1 @staticmethod def js_vars(player): return dict( redirect_url="https://soundcloud.com/discover" ) class RedirectToProvider_No(Page): @staticmethod def is_displayed(player): return player.participant.vars.get('survey_participate') == 0 @staticmethod def js_vars(player): return dict( redirect_url="https://www.google.com/" ) page_sequence = [ Q_post_DEM_car, Q_positivehealth_nutri, Q_positivehealth_mental, Q_positivehealth_sport, Q_post_DEM_sports, Q_post_DEM_holiday, Q_post_DEM_2, End_Participate_Yes, NoParticipation, RedirectToProvider_Yes, RedirectToProvider_No ]