from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, safe_json ) from django.db import models as dj_models import csv import random import math from django.utils import timezone 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 = 'Alexander Max Bauer und Jan K. Romann' doc = """ Umfrage zum Thema Bedarfsgerechtigkeit, die auf Basis von csv-Dateien erstellt wird. """ class Constants(BaseConstants): name_in_url = 'Bedarfsgerechtigkeit_Folgestudie' players_per_group = None with open('bedarfsgerechtigkeit3/ueberunter.csv') as f: questions_ueberunter = list(csv.DictReader(f)) with open('bedarfsgerechtigkeit3/verteil.csv') as f: questions_verteil = list(csv.DictReader(f)) total_questions_ueberunter = range(len(questions_ueberunter)) total_questions_verteil = range(len(questions_verteil)) num_total_questions_ueberunter = max(total_questions_ueberunter) + 1 num_total_questions_verteil = max(total_questions_verteil) + 1 num_rounds = 1 class Subsession(BaseSubsession): def creating_session(self): players = self.get_players() num_players = len(players) num_randomization = math.ceil(num_players / 3) #num_randomization = num_players random_numbers = [] i = [1,2,3,] random_counter = 0 random_version1numbers = [] num_version1 = math.ceil(num_players / 6) j = [1,1,1,2,2,2] treatment1_versioncounter = 0 for x in range(0,num_randomization): random.shuffle(i) random_numbers.extend(i) for x in range(0,num_version1): random_version1numbers.extend(j) if self.round_number == 1: for p in self.get_players(): p.participant.vars['questions_ueberunter'] = random.sample(Constants.questions_ueberunter, len(Constants.questions_ueberunter)) p.participant.vars['questions_verteil'] = random.sample(Constants.questions_verteil, len(Constants.questions_verteil)) # max_num_verteil = len(Constants.questions_verteil)+1 p.participant.vars['questions_verteil'] = Constants.questions_verteil p.treatment_number = random_numbers[random_counter] random_counter += 1 p.participant.vars['version_number'] = random_version1numbers[treatment1_versioncounter] treatment1_versioncounter += 1 # if p.treatment_number == 1: # # p.version_number = random_version1numbers[treatment1_versioncounter] # treatment1_versioncounter += 1 p.participant.vars['num_uebersicht'] = 0 for p in self.get_players(): p.payoff = 0 p.participant.vars['num_question_ueberunter'] = 1 p.participant.vars['num_question_verteil'] = 1 question_data_ueberunter = p.current_question_ueberunter() p.participant.vars['situation_id_ueberunter'] = question_data_ueberunter['situation_id'] question_data_verteil = p.current_question_verteil() p.participant.vars['situation_id_verteil'] = question_data_verteil['situation_id'] self.session.config['participation_fee'] = c(10) 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_verteil = models.LongStringField(initial='') reihenfolge_ueberunter = models.LongStringField(initial='') # Treatment 1 if Constants.num_total_questions_ueberunter - 1 >= 0: for i in range(1, Constants.num_total_questions_ueberunter+1): for s in range(1, 3): choices = [0,50,100] value = random.choice(choices) locals()[str(i) + "ueberunter" + str(s)] = models.PositiveIntegerField(choices=range(0, 101, 1), #initial=slider_startvalue, label='', widget=widgets.Slider()) locals()[str(i) + "ueberuntersicher" + str(s)] = models.StringField(initial=None, choices=[('1', 'Sicher'), ('2', 'Unsicher')], label='Waren Sie sicher oder unsicher?', widget=widgets.RadioSelectHorizontal) del choices del value del s del i ueberunterfrei = models.LongStringField(max_length=500, label='Wie sind Sie zu Ihren Entscheidungen gekommen?', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) if Constants.num_total_questions_verteil - 1 >= 0: for i in range(1, Constants.num_total_questions_verteil+1): locals()[str(i) + "verteil1"] = models.PositiveIntegerField( initial=None, label='Haushalt A soll bekommen:', widget=forms.TextInput()) locals()[str(i) + "verteil2"] = models.PositiveIntegerField( initial=None, label='Haushalt B soll bekommen:', widget=forms.TextInput()) del i verteilauswahl = models.StringField(initial=None, choices=[('1', 'Person A'), ('2', 'Person B')], label='', widget=widgets.RadioSelectHorizontal) verteilfrei = models.LongStringField(max_length=500, label='Mit welcher Überlegung haben Sie Wohnraum verteilt?', widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) # Treatment 2+3 einfrei = models.LongStringField(max_length=500, widget=forms.Textarea(attrs={ 'style': 'width: 30em;'})) # General questions and Demographics assoquadrat = models.PositiveIntegerField(validators=[MaxValueValidator(300)],label='Wievielen Quadratmetern entsprechen 1.000 regionale Größeneinheiten in Ihrer Vorstellung?', widget=forms.TextInput) assopersonen = models.PositiveIntegerField(validators=[MaxValueValidator(50)],label='Wieviele Personen leben in Ihrer Vorstellung in einem Haushalt, der 1.000 regionale Größeneinheiten Wohnraum braucht, um in Würde leben zu können?', widget=forms.TextInput) kabinennummer = models.PositiveIntegerField(min=1,max=30,label='Wie lautet Ihre Kabinennummer?', widget=forms.TextInput) def current_question_ueberunter(self): return self.participant.vars['questions_ueberunter'][self.participant.vars['num_question_ueberunter'] - 1] def current_question_verteil(self): return self.participant.vars['questions_verteil'][self.participant.vars['num_question_verteil'] - 1] def randomise_questions_to_participant_vars(self, items, dictionary_key): self.participant.vars[dictionary_key] = random.sample(items, len(items))