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 = 'Jan Romann' doc = """ Umsetzung der dritten Version einer Kohärenzstudie im Rahmen des Projektes "Maße der Bedarfsgerechtigkeit, Expertise und Kohärenz". """ class Constants(BaseConstants): name_in_url = 'kohaerenz3' players_per_group = None num_rounds = 1 with open('kohaerenz3/block1.csv') as f: questions_block1 = list(csv.DictReader(f)) with open('kohaerenz3/block2.csv') as f: questions_block2 = list(csv.DictReader(f)) with open('kohaerenz3/block1.csv') as f: questions_block3 = list(csv.DictReader(f)) with open('kohaerenz3/block2.csv') as f: questions_block4 = list(csv.DictReader(f)) with open('kohaerenz3/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 if self.session.config['treatment2'] == True: num_treatments += 1 if self.session.config['treatment3'] == True: 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] j += [1] if self.session.config['treatment2'] == True: i += [2] j += [1] if self.session.config['treatment3'] == True: i += [3] j += [1] # Version 2 if self.session.config['treatment1'] == True: j += [2] if self.session.config['treatment2'] == True: j += [2] if self.session.config['treatment3'] == True: j += [2] # Version 3 if self.session.config['treatment1'] == True: j += [3] if self.session.config['treatment2'] == True: j += [3] if self.session.config['treatment3'] == True: j += [3] # Version 4 if self.session.config['treatment1'] == True: j += [4] if self.session.config['treatment2'] == True: j += [4] if self.session.config['treatment3'] == True: j += [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) Checker = ['Winter', 'Haus', 'Trinken', 'Muehle', 'Weizen', 'Roggen', 'Sonnenblumen'] checker_random = random.sample(Checker, 7) Scheite = [6720, 44, 770, 70777, 55, 55505, 9999] scheite_random = random.sample(Scheite, len(Scheite)) for p in self.get_players(): p.version_equality = random.randint(0, 1) 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 if self.session.is_demo == 0: p.participant.vars['questions_block1'] = random.sample(Constants.questions_block1, len(Constants.questions_block1)) p.participant.vars['questions_block2'] = random.sample(Constants.questions_block2, len(Constants.questions_block2)) p.participant.vars['questions_block3'] = random.sample(Constants.questions_block3, len(Constants.questions_block3)) p.participant.vars['questions_block4'] = random.sample(Constants.questions_block4, len(Constants.questions_block4)) else: p.participant.vars['questions_block1'] = random.sample(Constants.questions_block1, Constants.num_demo_questions) p.participant.vars['questions_block2'] = random.sample(Constants.questions_block2, Constants.num_demo_questions) p.participant.vars['questions_block3'] = random.sample(Constants.questions_block3, Constants.num_demo_questions) p.participant.vars['questions_block4'] = random.sample(Constants.questions_block4, Constants.num_demo_questions) p.participant.vars['num_block1'] = () p.participant.vars['num_block2'] = () p.participant.vars['num_block3'] = () p.participant.vars['num_block4'] = () 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 # Choose the right question data according to treatment treatment_prefix = '' if p.treatment_number == 1: treatment_prefix = 'N_' elif p.treatment_number == 2: treatment_prefix = 'E_' elif p.treatment_number == 3: treatment_prefix = 'NE_' p.participant.vars['question_aliases'] = [treatment_prefix + 'person_E_need', treatment_prefix + 'person_N_need', treatment_prefix + 'person_E_effort', treatment_prefix + 'person_N_effort', treatment_prefix + 'effort_relation', treatment_prefix + 'need_relation'] # for i in range(1, 5, 1): # j = str(i) # # p.participant.vars['questions_block' + str(i)]['person_E_need'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'person_E_need') # p.participant.vars['questions_block' + str(i)]['person_N_need'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'person_N_need') # p.participant.vars['questions_block' + str(i)]['person_E_effort'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'person_E_effort') # p.participant.vars['questions_block' + str(i)]['person_N_effort'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'person_N_effort') # p.participant.vars['questions_block' + str(i)]['person_E_need'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'person_E_need') # p.participant.vars['questions_block' + str(i)]['effort_relation'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'effort_relation') # p.participant.vars['questions_block' + str(i)]['need_relation'] = p.participant.vars['questions_block' + str(i)].pop(treatment_prefix + 'need_relation') # Randomisierung von Variablen staat = ['Frei', 'Wuerde', 'Gleich', 'Viel', 'Verdienst', 'Bedarf'] p.participant.vars['staat'] = random.sample(staat,6) verant = ['Familien', 'Arbeitslos', 'Krank', 'Alter', 'Pflege',] p.participant.vars['verant'] = random.sample(verant, 5) partei = ['CDU', 'SPD', 'AfD', 'FDP', 'DIELINKE', 'GRÜNE', 'CSU'] p.participant.vars['partei'] = partei #random.sample(partei, 7) # BSJO = ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L'] # p.participant.vars['BSJO'] = random.sample(BSJO, 12) BSJO = ['B', 'C', 'D', 'E', 'I', 'J', 'K', 'L'] p.participant.vars['BSJO'] = random.sample(BSJO, 8) p.participant.vars['Checker'] = checker_random p.participant.vars['Scheite'] = scheite_random strategien = ['priority_need', 'equity', 'need_equity_average', 'needs_first'] if p.treatment_number != 2: strategien.append('equal_needs') strategien.append('lower_need_first') strategien.append('equality_N') if p.treatment_number != 1: strategien.append('priority_need_E') strategien.append('equity_relation') strategien.append('equality_E') p.participant.vars['Strategien'] = random.sample(strategien,len(strategien)) 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_equality = 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;'})) level_german = models.StringField(choices=[('0', 'Muttersprachler*in'), ('1', 'A1 – Anfänger*in'), ('2', 'A2 – Grundlegende Kenntnisse'), ('3', 'B1 – Fortgeschrittene Sprachverwendung'), ('4', 'B2 – Selbständige Sprachverwendung'), ('5', 'C1 – Fachkundige Sprachkenntnisse'), ('6', 'C2 – Annähernd muttersprachliche Kenntnisse'),], verbose_name='Auf welchem Niveau beherrschen die deutsche Sprache?', blank=True) 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 (in Euro) haben Sie monatlich ungefähr zur Verfügung?') einkommen_eltern = models.PositiveIntegerField(blank=True, verbose_name='Über wie viel Geld (in Euro) 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), ) # Verteilungsstrategie-Fragen priority_need = models.PositiveIntegerField(choices=range(1, 8, 1),) priority_need_E = models.PositiveIntegerField(choices=range(1, 8, 1),) equal_needs = models.PositiveIntegerField(choices=range(1, 8, 1),) equality_N = models.PositiveIntegerField(choices=range(1, 8, 1),) equality_E = models.PositiveIntegerField(choices=range(1, 8, 1),) equity_relation = models.PositiveIntegerField(choices=range(1, 8, 1),) equity = models.PositiveIntegerField(choices=range(1, 8, 1),) need_equity_average = models.PositiveIntegerField(choices=range(1, 8, 1),) needs_first = models.PositiveIntegerField(choices=range(1, 8, 1),) lower_need_first = models.PositiveIntegerField(choices=range(1, 8, 1),) own_Strategy = models.LongStringField(max_length=1000,blank=True,verbose_name='', widget=forms.Textarea(attrs={'style': 'width: 30em;'})) # Checker questions CheckerGerechtigkeit = models.LongStringField(verbose_name='Haben Sie sich schon einmal mit Gerechtigkeitsfragen beschäftigt?',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()) Scheite6720 = 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()) # Question, if people could participate in the study without interuptions restart = models.PositiveIntegerField(choices=[(0, 'Nein, ich musste nicht noch einmal von vorne beginnen '), (1, 'Ja, ich musste noch einmal von vorne beginnen')], widget=widgets.RadioSelect, verbose_name='Mussten Sie die Studie zwischendurch erneut starten und noch einmal von vorne beginnen?') # 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]