from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random #to render html to pdf using weasyprint from django.core.files.storage import FileSystemStorage from django.http import HttpResponse from django.template.loader import render_to_string #from weasyprint import HTML author = 'Kevin Trutmann' doc = """ An oTree implementation of the Big Five Inventory (BFI) """ class Constants(BaseConstants): name_in_url = 'Big5' players_per_group = None num_rounds = 1 RANDOMIZE_QUESTIONS = True class Subsession(BaseSubsession): def creating_session(self): self.session.vars['q_labs'] = ['Ich gehe aus mir heraus, bin gesellig.', 'Ich bin einfühlsam, warmherzig.', 'Ich bin eher unordentlich.', 'Ich bleibe auch in stressigen Situationen gelassen.', 'Ich bin nicht sonderlich kunstinteressiert.', 'Ich bin durchsetzungsfähig, energisch.', 'Ich begegne anderen mit Respekt.', 'Ich bin bequem, neige zu Faulheit.', 'Ich bleibe auch bei Rückschlägen zuversichtlich.', 'Ich bin vielseitig interessiert.', 'Ich schäume selten vor Begeisterung über.', 'Ich neige dazu, andere zu kritisieren.', 'Ich bin stetig, beständig.', 'Ich kann launisch sein, habe schwankende Stimmungen.', 'Ich bin erfinderisch, mir fallen raffinierte Lösungen ein.', 'Ich bin eher ruhig.', 'Ich habe mit anderen wenig Mitgefühl.', 'Ich bin systematisch, halte meine Sachen in Ordnung.', 'Ich reagiere leicht angespannt.', 'Ich kann mich für Kunst, Musik und Literatur begeistern.', 'Ich neige dazu, die Führung zu übernehmen.', 'Ich habe oft Streit mit anderen.', 'Ich neige dazu, Aufgaben vor mir herzuschieben.', 'Ich bin selbstsicher, mit mir zufrieden.', 'Ich meide philosophische Diskussionen.', 'Ich bin weniger aktiv und unternehmungslustig als andere.', 'Ich bin nachsichtig, vergebe anderen leicht.', 'Ich bin manchmal ziemlich nachlässig.', 'Ich bin ausgeglichen, nicht leicht aus der Ruhe zu bringen.', 'Ich bin nicht besonders einfallsreich.', 'Ich bin eher schüchtern.', 'Ich bin hilfsbereit und selbstlos.', 'Ich mag es sauber und aufgeräumt.', 'Ich mache mir oft Sorgen.', 'Ich weiß Kunst und Schönheit zu schätzen.', 'Mir fällt es schwer, andere zu beeinflussen.', 'Ich bin manchmal unhöflich und schroff.', 'Ich bin effizient, erledige Dinge schnell.', 'Ich fühle mich oft bedrückt, freudlos.', 'Es macht mir Spaß, gründlich über komplexe Dinge nachzudenken und sie zu verstehen.', 'Ich bin voller Energie und Tatendrang.', 'Ich bin anderen gegenüber misstrauisch.', 'Ich bin verlässlich, auf mich kann man zählen.', 'Ich habe meine Gefühle unter Kontrolle, werde selten wütend.', 'Ich bin nicht sonderlich fantasievoll.', 'Ich bin gesprächig.', 'Andere sind mir eher gleichgültig, egal.', 'Ich bin eher der chaotische Typ, mache selten sauber.', 'Ich werde selten nervös und unsicher.', 'Ich finde Gedichte und Theaterstücke langweilig.', 'In einer Gruppe überlasse ich lieber anderen die Entscheidung.', 'Ich bin höflich und zuvorkommend.', 'Ich bleibe an einer Aufgabe dran, bis sie erledigt ist.', 'Ich bin oft deprimiert, niedergeschlagen.', 'Mich interessieren abstrakte Überlegungen wenig.', 'Ich bin begeisterungsfähig und kann andere leicht mitreißen.', 'Ich schenke anderen leicht Vertrauen, glaube an das Gute im Menschen.', 'Manchmal verhalte ich mich verantwortungslos, leichtsinnig.', 'Ich reagiere schnell gereizt oder genervt.', 'Ich bin originell, entwickle neue Ideen.'] if Constants.RANDOMIZE_QUESTIONS: self.randomize_questions() def randomize_questions(self): rand_key = list(range(len(self.session.vars['q_labs']))) random.shuffle(rand_key) self.session.vars['rand_key'] = rand_key self.session.vars['q_labs'] = [self.session.vars['q_labs'][i] for i in rand_key] class Group(BaseGroup): pass class Player(BasePlayer): pers_big5_Q1 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q2 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q3 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q4 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q5 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q6 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q7 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q8 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q9 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q10 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q11 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q12 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q13 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q14 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q15 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q16 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q17 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q18 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q19 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q20 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q21 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q22 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q23 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q24 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q25 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q26 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q27 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q28 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q29 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q30 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q31 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q32 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q33 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q34 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q35 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q36 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q37 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q38 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q39 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q40 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q41 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q42 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q43 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q44 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q45 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q46 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q47 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q48 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q49 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q50 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q51 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q52 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q53 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q54 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q55 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q56 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q57 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q58 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q59 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_Q60 = models.IntegerField(choices=range(1, 6), label='', widget=widgets.RadioSelectHorizontal) pers_big5_O = models.FloatField() pers_big5_C = models.FloatField() pers_big5_E = models.FloatField() pers_big5_A = models.FloatField() pers_big5_N = models.FloatField() # if questions have been randomized, this puts them back in the right order, such that the scores # can be calculated. I know exec() is evil, but oTree doesn't allow for easy handling of fields with lists. def reorder_questions(self): exec('self.session.vars["temp_ans"] = [' + ', '.join(['self.pers_big5_Q{}'.format(i) for i in range(1, 61)]) + ']') for i in range(0, 60): exec("self.pers_big5_Q{} = self.session.vars['temp_ans'][{}]".format( (self.session.vars['rand_key'][i] + 1), i)) def calculate_scores(self): self.pers_big5_O = ((6 - self.pers_big5_Q5) + self.pers_big5_Q10 + self.pers_big5_Q15 + self.pers_big5_Q20 + (6 - self.pers_big5_Q25) + (6 - self.pers_big5_Q30) + self.pers_big5_Q35 + self.pers_big5_Q40 + (6 - self.pers_big5_Q45) + (6 - self.pers_big5_Q50) + (6 - self.pers_big5_Q55) + self.pers_big5_Q60) / 12 self.pers_big5_C = ((6 - self.pers_big5_Q3) + (6 - self.pers_big5_Q8) + self.pers_big5_Q13 + self.pers_big5_Q18 + (6 - self.pers_big5_Q23) + (6 - self.pers_big5_Q28) + self.pers_big5_Q33 + self.pers_big5_Q38 + self.pers_big5_Q43 + (6 - self.pers_big5_Q48) + self.pers_big5_Q53 + (6 - self.pers_big5_Q58)) / 12 self.pers_big5_E = (self.pers_big5_Q1 + self.pers_big5_Q6 + (6 - self.pers_big5_Q11) + (6 - self.pers_big5_Q16) + self.pers_big5_Q21 + (6 - self.pers_big5_Q26) + (6 - self.pers_big5_Q31) + (6 - self.pers_big5_Q36) + self.pers_big5_Q41 + self.pers_big5_Q46 + (6 - self.pers_big5_Q51) + self.pers_big5_Q56) / 12 self.pers_big5_A = (self.pers_big5_Q2 + self.pers_big5_Q7 + (6 - self.pers_big5_Q12) + (6 - self.pers_big5_Q17) + (6 - self.pers_big5_Q22) + self.pers_big5_Q27 + self.pers_big5_Q32 + (6 - self.pers_big5_Q37) + (6 - self.pers_big5_Q42) + (6 - self.pers_big5_Q47) + self.pers_big5_Q52 + self.pers_big5_Q57) / 12 self.pers_big5_N = ((6 - self.pers_big5_Q4) + (6 - self.pers_big5_Q9) + self.pers_big5_Q14 + self.pers_big5_Q19 + (6 - self.pers_big5_Q24) + (6 - self.pers_big5_Q29) + self.pers_big5_Q34 + self.pers_big5_Q39 + (6 - self.pers_big5_Q44) + (6 - self.pers_big5_Q49) + self.pers_big5_Q54 + self.pers_big5_Q59) / 12