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 from django.utils.encoding import force_text from django.utils.safestring import mark_safe from django.core.validators import MaxValueValidator author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'kohaerenz' players_per_group = None num_rounds = 1 with open('bedarfsgerechtigkeit3/mono.csv') as f: questions_mono = list(csv.DictReader(f)) with open('bedarfsgerechtigkeit3/sen.csv') as f: questions_sen = list(csv.DictReader(f)) total_questions_mono = range(len(questions_mono)) total_questions_sen = range(len(questions_sen)) num_total_questions_mono = max(total_questions_mono) + 1 num_total_questions_sen = max(total_questions_sen) + 1 class Subsession(BaseSubsession): def creating_session(self): 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 = math.ceil(num_players / num_treatments) num_version = math.ceil(num_players / (num_treatments*2)) #i = self.session.config['treatments'] i = [] j = [] if self.session.config['treatment0'] == True: i += [0,] j += [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, ] if self.session.config['treatment10'] == True: i += [10, ] j += [1, ] if self.session.config['treatment0'] == True: j += [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, ] if self.session.config['treatment10'] == True: j += [2, ] #i = [0,1,2,3,] #j = [1,1,1,1,2,2,2,2,] version_numbers = [] random_treatment_numbers = [] counter_version = 0 random_counter_treatment = 0 for x in range(0,num_randomization_treatment): random.shuffle(i) random_treatment_numbers.extend(i) for x in range(0,num_version): version_numbers.extend(j) for p in self.get_players(): p.version_number = version_numbers[counter_version] counter_version += 1 p.participant.vars['num_question_mono'] = 1 p.participant.vars['num_question_sen'] = 1 p.participant.vars['number_mono'] = 0 #p.participant.vars['questions_mono'] = random.sample(Constants.questions_mono, len(Constants.questions_mono)) if p.version_number == 1: p.participant.vars['questions_mono'] = Constants.questions_mono else: p.participant.vars['questions_mono'] = list(reversed(Constants.questions_mono)) #p.participant.vars['questions_sen'] = random.sample(Constants.questions_sen, len(Constants.questions_sen)) if p.version_number == 1: p.participant.vars['questions_sen'] = Constants.questions_sen else: p.participant.vars['questions_sen'] = list(reversed(Constants.questions_sen)) p.participant.vars['num_monofragen'] = [] p.participant.vars['num_monosicherfragen'] = [] p.participant.vars['num_senfragen'] = 0 p.participant.vars['num_senvaluefragen'] = 0 p.participant.vars['num_sensicherfragen'] = 0 question_data_sen = p.current_question_sen() p.participant.vars['situation_id_sen'] = question_data_sen['situation_id'] p.treatment_number = random_treatment_numbers[random_counter_treatment] random_counter_treatment += 1 x = [1, 2, 3, ] y = [1, 2, 3, ] z = [1, 2, 3, ] p.participant.vars['fragen_x'] = random.sample(x,3) if p.treatment_number == 10: p.participant.vars['fragen_x'].extend(random.sample(x,3)) p.participant.vars['fragen_x'].extend(random.sample(x, 3)) p.participant.vars['fragen_y'] = random.sample(y,3) p.participant.vars['fragen_z'] = random.sample(z,3) p.participant.vars['num_fragen_x'] = 0 p.participant.vars['num_fragen_y'] = 0 p.participant.vars['num_fragen_z'] = 0 p.participant.vars['num_aufgabe'] = 1 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) verant = ['Familien', 'Arbeitslos', 'Krank', 'Alter', 'Pflege', ] p.participant.vars['verant'] = random.sample(verant, 5) partei = ['CDU','SPD', 'GRÜNE', 'DIELINKE', 'CSU', 'FDP', 'PIRATEN', 'AfD', 'NPD' ] p.participant.vars['partei'] = random.sample(partei, 9) class Group(BaseGroup): pass class Player(BasePlayer): # time_started = dj_models.DateTimeField() # time_ended = dj_models.DateTimeField() treatment_number = models.PositiveIntegerField() version_number = models.PositiveIntegerField() reihenfolge_sen = models.LongStringField(initial='') reihenfolge_mono = models.LongStringField(initial='') reihenfolge_x = models.LongStringField(initial='') reihenfolge_y = models.LongStringField(initial='') reihenfolge_z = models.LongStringField(initial='') justice_x1_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x1_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x2_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x2_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x3_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x3_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x4_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x4_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x5_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x5_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x6_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x6_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x7_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x7_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x8_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x8_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x9_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_x9_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y1_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y1_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y2_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y2_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y3_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_y3_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z1_1_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z1_1_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z1_2_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z1_2_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z2_1_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z2_1_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z2_2_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z2_2_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z3_1_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z3_1_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z3_2_1 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) justice_z3_2_2 = models.PositiveIntegerField(choices=range(0, 101, 1), initial=None, verbose_name='', widget=widgets.Slider()) # Demographic questions alter = models.PositiveIntegerField(verbose_name='In welchem Jahr wurden Sie geboren?', choices=range(1900, 2001), initial=None) geschlecht = models.StringField(choices=[('1', 'männlich'), ('2', 'weiblich'), ('-oth-', 'anderes')], verbose_name='Welches Geschlecht haben Sie?', widget=widgets.RadioSelectHorizontal) 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) 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) 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) studienfach = models.LongStringField(blank=True, verbose_name='Wenn Sie studieren/studiert haben: Welches ist Ihr Studienfach?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) wohnsituation = models.StringField(initial=None, choices=[('1', 'alleine lebend'), ('2', 'in einer Wohngemeinschaft lebend'), ('3', 'bei den Eltern oder bei anderen Familienmitgliedern lebend'), ('4', 'in einer Partnerschaft oder mit der eigenen Familie lebend'),], verbose_name='Wie ist Ihre Wohnsituation?', widget=widgets.RadioSelect) hausflaeche = models.LongStringField(verbose_name='Wie viele Quadratmeter Wohnraum stehen Ihrem Haushalt insgesamt zur Verfügung?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) hausgroesse = models.LongStringField(verbose_name='Wie viele Personen leben insgesamt – Sie eingeschlossen – in Ihrem Haushalt?', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) 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),) 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) bedarfe0 = models.PositiveIntegerField(verbose_name='', initial=None, widget=forms.NumberInput) bedarfe1 = models.LongStringField(verbose_name='', initial=None, widget=forms.TextInput) bedarfe2 = 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;'})) code = models.LongStringField(max_length=5,verbose_name='', widget=forms.TextInput(attrs={ 'style': 'width: 30em;'})) if Constants.num_total_questions_mono - 1 >= 0: #blah = [0, 50, 100] #value = random.choice(blah) for i in range(0, (Constants.num_total_questions_mono)*200,200): locals()["MonoSen" + str(i)] = models.PositiveIntegerField(choices=range(0, 101, 1), #initial=, verbose_name='', widget=widgets.Slider()) locals()["MonoSenSicher" + str(i)] = models.StringField(initial=None, choices=[('1', 'Sicher'), ('2', 'Unsicher')], verbose_name='Waren Sie sicher oder unsicher?', widget=widgets.RadioSelectHorizontal) del i monofrei = models.LongStringField(max_length=1000, verbose_name = 'Wie sind Sie zu Ihren Entscheidungen gekommen?', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) if Constants.num_total_questions_sen - 1 >= 0: for i in range(1, Constants.num_total_questions_sen+1,1): locals()["Sen" + str(i)] = models.StringField(initial=None, choices=[('1', 'Szenario 1'), ('2', 'Szenario 2'), ('3', 'Beide Szenarien sind gleich gut beziehungsweise gleich schlecht')], verbose_name='Welches Szenario ist besser?', widget=widgets.RadioSelect) # locals()["Sen" + str(i) + "value"] = models.PositiveIntegerField(initial=None, # choices=range(1, 12, 1), # verbose_name='', # widget=forms.RadioSelect(renderer=MyCustomRenderer)) locals()["Sen" + str(i) + "value"] = models.PositiveIntegerField(initial=None,choices=range(1, 12, 1), ) locals()["Sen" + str(i) + "sicher"] = models.PositiveIntegerField(initial=None, choices=[(1, 'sicher'), (2, 'unsicher'),], verbose_name='Bei meiner Wohnsituationsbewertung war ich mir...',) # locals()["Sen" + str(i) +"sicher"] = models.StringField(initial=None, # choices=[('1', 'sicher'), # ('2', 'unsicher'),], # verbose_name='Bei meiner Wohnsituationsbewertung war ich mir...', # widget=widgets.RadioSelectHorizontal()) del i senfrei = models.LongStringField(max_length=1000, verbose_name = 'Wie sind Sie zu Ihren Wohnsituationsbewertungen gekommen?', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) def current_question_mono(self): return self.participant.vars['questions_mono'][self.participant.vars['num_question_mono'] - 1] def current_question_sen(self): return self.participant.vars['questions_sen'][self.participant.vars['num_question_sen'] - 1] def display_if_treatment_1_or_4(self): return self.treatment_number == 1 or self.treatment_number == 4 def display_if_treatment_2_or_3(self): return self.treatment_number == 2 or self.treatment_number == 3 def get_question_data_mono_as_list(self): list_of_situation_ids = [] for x in self.participant.vars['questions_mono']: list_of_situation_ids.append(x['situation_id']) list_of_need = [] for x in self.participant.vars['questions_mono']: list_of_need.append(x['need']) list_of_endowment = [] for x in self.participant.vars['questions_mono']: list_of_endowment.append(x['endowment']) return list(zip(list_of_situation_ids, list_of_need, list_of_endowment)) def get_tuple_of_mono_form_fields(self, infix): list = [] for x in self.participant.vars['questions_mono']: list.append('MonoSen' + infix + '{}'.format(x['endowment'])) return tuple(list)