from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from django.db import models as dj_models import csv import random import math from django import forms author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'kohaerenz2' players_per_group = None num_rounds = 1 with open('kohaerenz2/block1.csv') as f: questions_block1 = list(csv.DictReader(f)) with open('kohaerenz2/block2.csv') as f: questions_block2 = list(csv.DictReader(f)) with open('kohaerenz2/block1.csv') as f: questions_block3 = list(csv.DictReader(f)) with open('kohaerenz2/block2.csv') as f: questions_block4 = list(csv.DictReader(f)) with open('kohaerenz2/BSJO.csv') as f: BSJO = list(csv.DictReader(f)) total_questions_block1 = range(len(questions_block1)) total_questions_block2 = range(len(questions_block2)) total_questions_block3 = range(len(questions_block3)) total_questions_block4 = range(len(questions_block4)) num_total_questions_block1 = max(total_questions_block1) + 1 num_total_questions_block2 = max(total_questions_block2) + 1 num_total_questions_block3 = max(total_questions_block3) + 1 num_total_questions_block4 = max(total_questions_block4) + 1 num_demo_questions = 3 class Subsession(BaseSubsession): def creating_session(self): self.session.vars['data_participants'] = [] self.session.vars['data_participants_num'] = 0 players = self.get_players() num_players = len(players) num_treatments = 0 # if self.session.config['treatment0'] == True: # num_treatments += 1 if self.session.config['treatment1'] == True: num_treatments += 1 num_treatments += 1 num_treatments += 1 if self.session.config['treatment2'] == True: num_treatments += 1 num_treatments += 1 if self.session.config['treatment3'] == True: num_treatments += 1 num_treatments += 1 num_randomization_treatment = int(math.ceil(num_players / num_treatments)) num_randomization_scale = int(math.ceil(num_players / 2)) num_version = int(math.ceil(num_players / (num_treatments * 2))) i = [] j = [] # Treatments + Version 1 if self.session.config['treatment1'] == True: i += [1, 1, 1] j += [1, 1, 1] if self.session.config['treatment2'] == True: i += [2, 2] j += [1, 1] if self.session.config['treatment3'] == True: i += [3, 3] j += [1, 1] # Version 2 if self.session.config['treatment1'] == True: j += [2, 2, 2] if self.session.config['treatment2'] == True: j += [2, 2, ] if self.session.config['treatment3'] == True: j += [2, 2, ] # Version 3 if self.session.config['treatment1'] == True: j += [3, 3, 3, ] if self.session.config['treatment2'] == True: j += [3, 3, ] if self.session.config['treatment3'] == True: j += [3, 3, ] # Version 4 if self.session.config['treatment1'] == True: j += [4, 4, 4, ] if self.session.config['treatment2'] == True: j += [4, 4, ] if self.session.config['treatment3'] == True: j += [4, 4, ] random_treatment_numbers = [] for x in range(0, num_randomization_treatment): random.shuffle(i) random_treatment_numbers.extend(i) version_numbers = [] for x in range(0, num_version): version_numbers.extend(j) scale_numbers = [1, 2] random_scale_numbers = [] for x in range(0, num_randomization_scale): random.shuffle(scale_numbers) random_scale_numbers.extend(scale_numbers) counter_version = 0 random_counter_treatment = 0 counter_scale = 0 for x in range(0, num_version): version_numbers.extend(j) for p in self.get_players(): person_names = ['Müller', 'Schmidt', 'Schneider', 'Fischer', 'Weber', 'Meyer'] p.participant.vars['persons'] = random.sample(person_names, 6) p.version_number = version_numbers[counter_version] counter_version += 1 p.version_number_skala = random_scale_numbers[counter_scale] counter_scale += 1 p.participant.vars['num_question_block1'] = 1 p.participant.vars['num_question_block2'] = 1 p.participant.vars['num_question_block3'] = 1 p.participant.vars['num_question_block4'] = 1 p.participant.vars['number_block1'] = 0 p.participant.vars['number_block2'] = 0 p.participant.vars['number_block3'] = 0 p.participant.vars['number_block4'] = 0 p.determine_questions() question_data_block1 = p.current_question_block1() p.participant.vars['situation_id_block1'] = question_data_block1['situation_id'] question_data_block2 = p.current_question_block2() p.participant.vars['situation_id_block2'] = question_data_block2['situation_id'] question_data_block3 = p.current_question_block3() p.participant.vars['situation_id_block3'] = question_data_block3['situation_id'] question_data_block4 = p.current_question_block4() p.participant.vars['situation_id_block4'] = question_data_block4['situation_id'] p.treatment_number = random_treatment_numbers[random_counter_treatment] random_counter_treatment += 1 # Randomisierung von Variablen p.randomise_questions_to_participant_vars(['Frei', 'Wuerde', 'Gleich', 'Viel', 'Verdienst', 'Bedarf'], 'staat') p.randomise_questions_to_participant_vars(['Familien', 'Arbeitslos', 'Krank', 'Alter', 'Pflege'], 'verant') p.randomise_questions_to_participant_vars(['CDU', 'SPD', 'GRÜNE', 'DIELINKE','CSU','FDP','PIRATEN','AfD','NPD'], 'partei') p.randomise_questions_to_participant_vars(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'], 'BSJO') p.randomise_questions_to_participant_vars(['Winter', 'Haus', 'Trinken', 'Muehle', 'Weizen', 'Roggen', 'Sonnenblumen'], 'Checker') p.randomise_questions_to_participant_vars([4440, 44, 770, 70777, 55, 55505, 9999], 'Scheite') class Group(BaseGroup): pass class Player(BasePlayer): data_participants = models.LongStringField(initial='') time_started = dj_models.DateTimeField() time_ended = dj_models.DateTimeField() treatment_number = models.PositiveIntegerField() version_number = models.PositiveIntegerField() version_number_skala = models.PositiveIntegerField() part = models.PositiveIntegerField(initial=1) Name = models.LongStringField(widget=forms.TextInput, verbose_name='Vor- und Nachname') Email = models.LongStringField(widget=forms.TextInput, verbose_name='Email-Adresse') Uni = models.LongStringField(widget=forms.TextInput, verbose_name='Ihre Universität') Matrikelnummer = models.LongStringField(widget=forms.TextInput) # Auxiliary variables to record the order of questions in block 1 to 4 reihenfolge_block1 = models.LongStringField(initial='') reihenfolge_block2 = models.LongStringField(initial='') reihenfolge_block3 = models.LongStringField(initial='') reihenfolge_block4 = models.LongStringField(initial='') # Demographic questions verteilfrage = models.LongStringField(verbose_name='Was verstehen Sie unter einer gerechten Güterverteilung?', max_length=500, widget=forms.Textarea(attrs={'style': 'width: 30em;'})) alter = models.PositiveIntegerField(verbose_name='In welchem Jahr wurden Sie geboren?', min=1905, max=2005, blank=True) geschlecht = models.PositiveIntegerField(choices=[(1, 'männlich'), (2, 'weiblich'), (99, 'anderes')], verbose_name='Welches Geschlecht haben Sie?', blank=True) geschlechtother = models.LongStringField(blank=True, verbose_name='Wenn Sie "anderes" angegeben haben: Welche Selbstbezeichnung würden Sie stattdessen wählen?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) staatsbuergerschaft = models.StringField( choices=[('1', 'deutsch'), ('-oth-', 'andere')], verbose_name='Welche Staatsbürgerschaft besitzen Sie?', widget=widgets.RadioSelectHorizontal, blank=True) staatsbuergerschaftother = models.LongStringField(blank=True, verbose_name='Wenn Sie "andere" angegeben haben: Welche Staatsbürgerschaft besitzen Sie?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) abschluss = models.StringField(choices=[('1', 'kein Schulabschluss'), ('2', 'Hauptschul- oder Realschulabschluss'), ('3', 'Abitur beziehungsweise allgemeine Hochschulreife oder Fachhochschulreife'), ('4', 'abgeschlossene betriebliche oder schulische Berufsausbildung'), ('5', 'Bachelor'), ('6', 'Master, Promotion oder Vergleichbares'), ('7', 'anderer allgemeiner Schulabschluss oder beruflicher Abschluss')], verbose_name='Was ist der höchste Bildungsabschluss, den Sie erreicht haben?', widget=widgets.RadioSelect, blank=True) beschaeftigung = models.StringField(choices=[('1', 'Schüler oder Student'), ('2', 'Angestellter oder Beamter'), ('3', 'selbstständig Erwerbstätiger'), ('4', 'geringfügig Beschäftigter'), ('5', 'arbeitslos oder arbeitssuchend'), ], verbose_name='Welcher Beschäftigung gehen Sie aktuell hauptsächlich nach?', widget=widgets.RadioSelect, blank=True) studienfach = models.LongStringField(blank=True, verbose_name='Wenn Sie studieren/studiert haben: Welches ist Ihr Studienfach?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) einkommen = models.PositiveIntegerField(blank=True, verbose_name='Wie viel Geld haben Sie monatlich ungefähr zur Verfügung?') einkommen_eltern = models.PositiveIntegerField(blank=True, verbose_name='Über wie viel Geld pro Monat verfügen die Personen (oder die Person) ungefähr durchschnittlich, bei denen (oder der) Sie aufgewachsen sind?') soziodemozustaendVerantFamilien = models.PositiveIntegerField(choices=range(1, 6, 1), ) soziodemozustaendVerantArbeitslos = models.PositiveIntegerField(choices=range(1, 6, 1), ) soziodemozustaendVerantKrank = models.PositiveIntegerField(choices=range(1, 6, 1), ) soziodemozustaendVerantAlter = models.PositiveIntegerField(choices=range(1, 6, 1), ) soziodemozustaendVerantPflege = models.PositiveIntegerField(choices=range(1, 6, 1), ) # Links-Rechts-Selbsteinschätzung linksrechtsselbst = models.PositiveIntegerField(choices=range(1, 10, 1), ) # Links-Rechts-Einschätzung Parteien linksrechtsparteiCDU = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiSPD = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiGRÜNE = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiDIELINKE = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiCSU = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiFDP = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiPIRATEN = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiAfD = models.PositiveIntegerField(choices=range(1, 10, 1), ) linksrechtsparteiNPD = models.PositiveIntegerField(choices=range(1, 10, 1), ) # alte Gerechtigkeitsskala zustimmungStaatFrei = models.PositiveIntegerField(choices=range(1, 8, 1), ) zustimmungStaatWuerde = models.PositiveIntegerField(choices=range(1, 8, 1), ) zustimmungStaatGleich = models.PositiveIntegerField(choices=range(1, 8, 1), ) zustimmungStaatViel = models.PositiveIntegerField(choices=range(1, 8, 1), ) zustimmungStaatVerdienst = models.PositiveIntegerField(choices=range(1, 8, 1), ) zustimmungStaatBedarf = models.PositiveIntegerField(choices=range(1, 8, 1), ) # Even more demographic questions risiko = models.StringField(initial=None, choices=[('1', 'sehr risikofreudig'), ('2', 'eher risikofreudig'), ('3', 'risikoneutral'), ('4', 'eher risikoscheu'), ('5', 'sehr risikoscheu'), ], verbose_name='Bitte geben Sie an, ob Sie sich eher als risikofreudig oder risikoscheu beschreiben würden.', widget=widgets.RadioSelect) ErinnerungBedarfeE = models.PositiveIntegerField(verbose_name='', initial=None, max=9999, widget=forms.NumberInput) ErinnerungBedarfeN = models.PositiveIntegerField(verbose_name='', initial=None, max=9999, widget=forms.NumberInput) ErinnerungLeistung = models.LongStringField(verbose_name='', initial=None, widget=forms.TextInput) bedarfsgerecht = models.LongStringField(max_length=1000, verbose_name='Bitte beschreiben Sie kurz, was für Sie eine bedarfsgerechte Verteilung von Gütern kennzeichnet.', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) wuerde = models.LongStringField(max_length=1000, verbose_name='Bitte beschreiben Sie kurz, was es für Sie bedeutet, in Würde leben zu können.', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) kommentar = models.LongStringField(max_length=1000, verbose_name='', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) code = models.LongStringField(max_length=5, verbose_name='', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) # creation of model fields according to the number of questions in the csv-files if Constants.num_total_questions_block1 - 1 >= 0: for i in range(1, Constants.num_total_questions_block1 + 1, 1): locals()["Block1_" + str(i) + "_E"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) locals()["Block1_" + str(i) + "_N"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) del i if Constants.num_total_questions_block2 - 1 >= 0: for i in range(1, Constants.num_total_questions_block2 + 1, 1): locals()["Block2_" + str(i) + "_E"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) locals()["Block2_" + str(i) + "_N"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) del i if Constants.num_total_questions_block3 - 1 >= 0: for i in range(1, Constants.num_total_questions_block3 + 1, 1): locals()["Block3_" + str(i) + "_E"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) locals()["Block3_" + str(i) + "_N"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) del i if Constants.num_total_questions_block4 - 1 >= 0: for i in range(1, Constants.num_total_questions_block4 + 1, 1): locals()["Block4_" + str(i) + "_E"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) locals()["Block4_" + str(i) + "_N"] = models.PositiveIntegerField(initial=None, verbose_name='', widget=forms.NumberInput()) del i # Gerechtigkeitsskala-Fragen skala_A = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_B = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_C = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_D = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_E = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_F = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_G = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_H = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_I = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_J = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_K = models.PositiveIntegerField(choices=range(1, 8, 1), ) skala_L = models.PositiveIntegerField(choices=range(1, 8, 1), ) # Checker questions CheckerGerechtigkeit = models.LongStringField(verbose_name='Wie gerecht finden Sie die Verteilung der Holzscheite?', blank=True, widget=forms.Textarea) CheckerWinter = models.BooleanField(widget=forms.CheckboxInput()) CheckerHaus = models.BooleanField(widget=forms.CheckboxInput()) CheckerTrinken = models.BooleanField(widget=forms.CheckboxInput()) CheckerMuehle = models.BooleanField(widget=forms.CheckboxInput()) CheckerWeizen = models.BooleanField(widget=forms.CheckboxInput()) CheckerRoggen = models.BooleanField(widget=forms.CheckboxInput()) CheckerSonnenblumen = models.BooleanField(widget=forms.CheckboxInput()) Scheite4440 = models.BooleanField(widget=forms.CheckboxInput()) Scheite44 = models.BooleanField(widget=forms.CheckboxInput()) Scheite770 = models.BooleanField(widget=forms.CheckboxInput()) Scheite70777 = models.BooleanField(widget=forms.CheckboxInput()) Scheite55 = models.BooleanField(widget=forms.CheckboxInput()) Scheite55505 = models.BooleanField(widget=forms.CheckboxInput()) Scheite9999 = models.BooleanField(widget=forms.CheckboxInput()) # functions to get the current question number in each block def current_question_block1(self): return self.participant.vars['questions_block1'][self.participant.vars['num_question_block1'] - 1] def current_question_block2(self): return self.participant.vars['questions_block2'][self.participant.vars['num_question_block2'] - 1] def current_question_block3(self): return self.participant.vars['questions_block3'][self.participant.vars['num_question_block3'] - 1] def current_question_block4(self): return self.participant.vars['questions_block4'][self.participant.vars['num_question_block4'] - 1] def determine_questions(self): if self.session.is_demo == 0: self.participant.vars['questions_block1'] = random.sample(Constants.questions_block1, len(Constants.questions_block1)) self.participant.vars['questions_block2'] = random.sample(Constants.questions_block2, len(Constants.questions_block2)) self.participant.vars['questions_block3'] = random.sample(Constants.questions_block3, len(Constants.questions_block3)) self.participant.vars['questions_block4'] = random.sample(Constants.questions_block4, len(Constants.questions_block4)) else: self.participant.vars['questions_block1'] = random.sample(Constants.questions_block1, Constants.num_demo_questions) self.participant.vars['questions_block2'] = random.sample(Constants.questions_block2, Constants.num_demo_questions) self.participant.vars['questions_block3'] = random.sample(Constants.questions_block3, Constants.num_demo_questions) self.participant.vars['questions_block4'] = random.sample(Constants.questions_block4, Constants.num_demo_questions) def randomise_questions_to_participant_vars(self, items, dictionary_key): self.participant.vars[dictionary_key] = random.sample(items, len(items))