import os import pycountry from otree.api import * doc = """ Social Proximity Intro Part 1 incl Fragebogen """ ##helper def read_txt(stadt): filename = 'laender.txt' if stadt: filename = 'staedte.txt' with open(os.path.join(os.path.dirname(__file__), filename), 'r', encoding='utf-8') as file: rows = [line.strip() for line in file] return [(entry, entry) for entry in rows] ## Base Classes class C(BaseConstants): NAME_IN_URL = 'social_proximity_intro' PLAYERS_PER_GROUP = 2 NUM_ROUNDS = 3 ROUNDS_PART1 = 3 DEBUG_INITIAL = True #### DatenF CITIES = read_txt(True) COUNTRIES = read_txt(False) Header = [] Hobbies = [ dict(name='Politik', label="Politik und Wirtschaft"), dict(name='Kultur', label="Kultur und Kunst (Musik, Literatur, Sprachen, Film, Fotografie)"), dict(name='Technik', label="Technik"), dict(name='Sport', label="Sport"), dict(name='Familie', label="Familie und Heim (Heimwerken, Handarbeit, Kochen, Gartenarbeit) "), dict(name='Wellness', label="Wellness und Gesundheit"), dict(name='Philosophie', label="Philosophie, Religion und Spiritualität"), dict(name='Tiere', label="Tiere und Natur"), ] Sports = [ dict(name='Ballsport', label="Ballsport (Fuß-, Hand-, Basketball, Tennis, Hockey, ...)"), dict(name='Wintersport', label="Wintersport (Skifahren, Snowboarden, ...)"), dict(name='Wassersport', label="Wassersport (Schwimmen, Tauchen, Bootsport, ...)"), dict(name='Kraftsport', label="Kraftsport (Gewichtheben, CrossFit, Zirkeltraining, ...)"), dict(name='Yoga', label="Yoga/ Pilates/ Qi Gong/ Gymnastik"), dict(name='Reiten', label="Reiten "), dict(name='Klettern', label="Klettern"), dict(name='Leichtathletik', label="Leichtathletik"), dict(name='Kampfsport', label="Kampfsport"), dict(name='Motorsport', label="Rad-/ Motorsport (Rennrad, Mountain Biking)"), dict(name='Tanzsport', label="Tanzsport"), dict(name='NoSport', label="Kein Sport"), ] Music = [ dict(name='Klassik', label="Klassik, Sinfonien"), dict(name='Deutsche', label="Deutsche Schlager, Volksmusik"), dict(name='Pop', label="Pop"), dict(name='Rap', label="HipHop, Rap, RnB "), dict(name='Rock', label="Rock, Hard, Heavy "), dict(name='Reggae', label="Reggae"), dict(name='Jazz', label="Jazz, Blues, Spirituals, Gospel"), dict(name='Electronic', label="Dance & Electronic"), ] Film = [ dict(name='Krimi', label="Krimi"), dict(name='Horror', label="Thriller/Horror"), dict(name='Liebesfilme', label="Liebesfilme "), dict(name='Action', label="Action"), dict(name='Komoedie', label="Komödie"), dict(name='Fiction', label="Science-Fiction"), dict(name='Dokus', label="Dokus"), dict(name='Animation', label="Animation "), ] Urlaub = [ dict(name='Meer', label="Am Meer "), dict(name='Bergen', label="In den Bergen "), dict(name='Stadte', label="Städte, Kultur und Kunst"), dict(name='Party', label="Party-Hotspots ziehen mich an "), dict(name='Hauptsache', label="Hauptsache abenteuerlich"), dict(name='AllInclusive', label="All-inclusive und einfach mal abschalten "), dict(name='Fernweh', label="Umso weiter weg, umso besser"), dict(name='Hause', label="Zu Hause"), ] Eigenschaften = [ dict(name='Karrierebewusst', label="karrierebewusst und zielorientiert "), dict(name='Kinderlieb', label="kinderlieb und familienbezogen "), dict(name='Sportlich', label="sportlich und aktiv"), dict(name='Ruhig', label="zurückhaltend und ruhig "), dict(name='Sparsam', label="sparsam und genügsam"), dict(name='Warmherzig', label="warmherzig und hilfsbereit"), dict(name='Zuverlaessig', label="zuverlässig"), dict(name='Humorvoll', label="humorvoll und heiter "), ] Denken = [ dict(name='SpassAufgelegt', label="Ist zu jedem Spaß aufgelegt."), dict(name='GuteLaune', label="Hat immer gute Laune und ist fröhlich."), dict(name='Reflektiert', label="Denkt viel und ernsthaft über das Leben nach. "), dict(name='Traeumer', label="Ist etwas verträumt."), dict(name='Sachlich', label="Geht sachlich und überlegt an Schwierigkeiten heran."), dict(name='LoesungsOrientiert', label="Findet auch in unangenehmen Situationen eine für sich gute Lösung."), dict(name='Gelassen', label="Lässt sich durch nichts aus der Ruhe bringen."), dict(name='ImGeschehen', label="Nimmt an allem lebhaft teil. "), ] Wichtigsten = [ dict(name='Freundschaft', label="Freundschaft"), dict(name='Liebe', label="Glück in der Liebe"), dict(name='Ruhe', label="Ruhe und Zufriedenheit"), dict(name='Erfolg', label="Beruflicher Erfolg"), dict(name='Menschen', label="Von den Menschen in meiner Umgebung geachtet und respektiert zu sein"), dict(name='Soziale', label="Soziale Sicherheit"), dict(name='Selbstverwirklichung', label="Selbstverwirklichung"), dict(name='Partner', label="Ein familiäres Zuhause mit einem Partner "), ] class Subsession(BaseSubsession): TREATMENT = models.StringField(initial='Similar') MODE = models.StringField(initial='Test') ## wofür? AVERAGE_SIMILARITY_PLAYER_X_PLAYER = models.IntegerField(initial=-1) class Group(BaseGroup): pass class Player(BasePlayer): ## Todo: pcds/behnud, zum testen brauch man nicht eingeben ## generelles rating = models.FloatField(initial=0) avg_rating = models.FloatField(initial=0) match = models.IntegerField(initial=-1) top = models.BooleanField(initial=False) type = models.IntegerField(initial=0) ## customer or seller (low,mid,high) = [0,1,2,3] ### Similarity similarity = models.IntegerField(label="Wie ähnlich sind Sie und Ihr aktueller Transaktionspartner sich?", widget=widgets.RadioSelectHorizontal, choices=[ [1, "überhaupt nicht ähnlich"], [2, "kaum ähnlich"], [3, "teils/teils"], [4, "eher ähnlich"], [5, "sehr ähnlich"], ]) like_opposite = models.IntegerField(label="Was denken Sie, wie sehr würden Sie die Person mögen?", widget=widgets.RadioSelectHorizontal, choices=[ [1, "überhaupt nicht"], [2, "eher nicht"], [3, "neutral"], [4, "eher gern"], [5, "sehr gern"], ]) closeness_opposite = models.IntegerField(label="Wie nah fühlen Sie sich der anderen Person?", widget=widgets.RadioSelectHorizontal, choices=[ [1, "überhaupt nicht nah"], [2, "eher nicht nah"], [3, "neutral"], [4, "eher nah"], [5, "sehr nah"], ]) estimated_similarity_points = models.IntegerField(label="Ihre Einschätzung zwischen 0 und 24 Punkten:", initial=0, min=0, max=24) # Todo Behnud frage hier im initial performance_info_group = models.StringField(initial='Hier stand was mit Termin 1 @ behnud') ## #### FRAGEBOGEN # Frage 1 Politik = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Kultur = models.BooleanField(blank=True, initial=False) Technik = models.BooleanField(blank=True, initial=False) Sport = models.BooleanField(blank=True, initial=False) Familie = models.BooleanField(blank=True, initial=False) Wellness = models.BooleanField(blank=True, initial=False) Philosophie = models.BooleanField(blank=True, initial=False) Tiere = models.BooleanField(blank=True, initial=False) # Frage2 Ballsport = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Wintersport = models.BooleanField(blank=True, initial=False) Wassersport = models.BooleanField(blank=True, initial=False) Kraftsport = models.BooleanField(blank=True, initial=False) Yoga = models.BooleanField(blank=True, initial=False) Reiten = models.BooleanField(blank=True, initial=False) Klettern = models.BooleanField(blank=True, initial=False) Leichtathletik = models.BooleanField(blank=True, initial=False) Kampfsport = models.BooleanField(blank=True, initial=False) Motorsport = models.BooleanField(blank=True, initial=False) Tanzsport = models.BooleanField(blank=True, initial=False) NoSport = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) # Frage 3 Klassik = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Deutsche = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Pop = models.BooleanField(blank=True, initial=False) Rap = models.BooleanField(blank=True, initial=False) Rock = models.BooleanField(blank=True, initial=False) Reggae = models.BooleanField(blank=True, initial=False) Jazz = models.BooleanField(blank=True, initial=False) Electronic = models.BooleanField(blank=True, initial=False) # Frage 4 Krimi = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Horror = models.BooleanField(blank=True, initial=False) Liebesfilme = models.BooleanField(blank=True, initial=False) Action = models.BooleanField(blank=True, initial=False) Komoedie = models.BooleanField(blank=True, initial=False) Fiction = models.BooleanField(blank=True, initial=False) Dokus = models.BooleanField(blank=True, initial=False) Animation = models.BooleanField(blank=True, initial=False) # Frage 5 Meer = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Bergen = models.BooleanField(blank=True, initial=False) Stadte = models.BooleanField(blank=True, initial=False) Party = models.BooleanField(blank=True, initial=False) Hauptsache = models.BooleanField(blank=True, initial=False) AllInclusive = models.BooleanField(blank=True, initial=False) Fernweh = models.BooleanField(blank=True, initial=False) Hause = models.BooleanField(blank=True, initial=False) # Frage 6 Karrierebewusst = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Kinderlieb = models.BooleanField(blank=True, initial=False) Sportlich = models.BooleanField(blank=True, initial=False) Ruhig = models.BooleanField(blank=True, initial=False) Sparsam = models.BooleanField(blank=True, initial=False) Warmherzig = models.BooleanField(blank=True, initial=False) Zuverlaessig = models.BooleanField(blank=True, initial=False) Humorvoll = models.BooleanField(blank=True, initial=False) # Frage 7 SpassAufgelegt = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) GuteLaune = models.BooleanField(blank=True, initial=False) Reflektiert = models.BooleanField(blank=True, initial=False) Traeumer = models.BooleanField(blank=True, initial=False) Sachlich = models.BooleanField(blank=True, initial=False) LoesungsOrientiert = models.BooleanField(blank=True, initial=False) Gelassen = models.BooleanField(blank=True, initial=False) ImGeschehen = models.BooleanField(blank=True, initial=False) # Frage 8 Freundschaft = models.BooleanField(blank=True, initial=C.DEBUG_INITIAL) Liebe = models.BooleanField(blank=True, initial=False) Ruhe = models.BooleanField(blank=True, initial=False) Erfolg = models.BooleanField(blank=True, initial=False) Menschen = models.BooleanField(blank=True, initial=False) Soziale = models.BooleanField(blank=True, initial=False) Selbstverwirklichung = models.BooleanField(blank=True, initial=False) Partner = models.BooleanField(blank=True, initial=False) # Frage 9 Religion = models.IntegerField(widget=widgets.RadioSelect, label="9. Welcher Religion fühlen Sie sich zugehörig? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Katholisch'], [2, 'Evangelisch '], [3, 'Muslimisch '], [4, 'Jüdisch '], [5, 'Buddhistisch '], [6, 'Hinduistisch'], [7, 'Andere Religionsgemeinschaft'], [8, 'Konfessionslos'], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 10 Diskussion = models.IntegerField(widget=widgets.RadioSelect, label="10. Es wird viel diskutiert über Klimawandel, Umweltschutz, Energiequellen usw. Welche Aussage steht Ihrer Meinung am nächsten? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Angesichts unserer fortgeschrittenen Technologie sollte uns doch was Vernünftiges einfallen.'], [2, 'Wir sollten einfach akzeptieren, dass wir mit der Natur pfleglicher umgehen müssen. '], [3, 'Am liebsten würde ich gar nicht daran denken, was da noch alles auf uns zukommt. '], [4, 'Ich sehe das Problem nicht. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 11 GuteMenschen = models.IntegerField(widget=widgets.RadioSelect, label="11. Glauben Sie an das Gute im Menschen? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ja, immer.'], [2, 'Ich versuche es, aber es fällt mir manchmal schwer. '], [3, 'Kommt darauf an, in welchem Zusammenhang. '], [4, 'Nein. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 12 Herangehensweise = models.IntegerField(widget=widgets.RadioSelect, label="12. Wie gehen Sie vor, wenn Sie sich privat etwas vorgenommen haben? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich gehe ziemlich systematisch vor.'], [2, 'Ich denke, das wird sich schon irgendwie ergeben. '], [3, 'Ich warte, bis ich dafür in der richtigen Stimmung bin. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 13 RechtHaben = models.IntegerField(widget=widgets.RadioSelect, label="13. Wenn Ihnen jemand widerspricht, obwohl Sie genau wissen, dass Sie Recht haben, wie reagieren Sie dann üblicherweise? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich ärgere mich über die Rechthaberei des anderen, belasse es aber dabei. '], [2, 'Es ist mir gar nicht so wichtig, Recht zu bekommen. '], [3, 'Ich versuche, den anderen zu überzeugen. '], [4, 'Ich werde klarstellen, wer Recht hat. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 14 ImpulsVerhalten = models.IntegerField(widget=widgets.RadioSelect, label="14. Was ist Ihr erster Impuls, wenn Sie sich über das Verhalten eines Menschen, der Ihnen nahesteht, sehr ärgern? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich sage deutlich, dass ich verärgert bin.'], [2, 'Ich bleibe ruhig und versuche, die Situation zu klären. '], [3, 'Ich denke mir: Das kommt ja nicht so oft vor. '], [4, 'Ich schlucke den Ärger runter und beiße die Zähne zusammen. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 15 Kraenkung = models.IntegerField(widget=widgets.RadioSelect, label="15. Manchmal geschieht es, dass man von einem Menschen gekränkt wird. Wie reagieren Sie dann darauf? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich denke, vielleicht war es gar nicht so gemeint.'], [2, 'Ich bin mir sicher, dass ich schon einen Weg finden werde damit umzugehen. '], [3, 'Da habe ich schon eine Weile dran zu nagen. '], [4, 'Am liebsten würde ich so etwas sofort heimzahlen. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 16 UeberVerhaeltnisse = models.IntegerField(widget=widgets.RadioSelect, label="16. Stellen Sie sich vor: Ein Freund/eine Freundin kauft sich ein viel zu teures neues Auto, weit über seine/ihre Verhältnisse. Es ist genau das Auto, von dem Sie selbst immer geträumt haben. Was könnten Sie Ihrem Freund/Ihrer Freundin sagen? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Man sollte nicht über seine Verhältnisse leben. Wann wirst du endlich erwachsen?'], [2, 'Der ist so schön, da hätte ich Angst, den öffentlich zu parken und direkt eine Beule oder einen Kratzer zu bekommen. '], [3, 'Denk doch mal nach, sobald du einen Meter damit gefahren bist, ist der Wagen nur noch die Hälfte wert. '], [4, 'Oh, toll! Lass uns eine Spritztour machen! '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 17 ImpulsFreund = models.IntegerField(widget=widgets.RadioSelect, label="17. Stellen Sie sich vor: Sie und ein Freund/eine Freundin haben sich über eine andere Person sehr geärgert. Da macht Ihr Freund/Ihre Freundin den Vorschlag, der anderen Person eins auszuwischen. Was könnte Ihre erste Reaktion sein? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich weiß nicht. Das würde ich mir zweimal überlegen. Wer anderen eine Grube gräbt, fällt selbst hinein.'], [2, 'Vergiss es, in einem Jahr lachen wir darüber. '], [3, 'Das ist gemein, da mache ich nicht mit. '], [4, 'Ich denke, das könnte ganz lustig sein. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 18 Bananenschale = models.IntegerField(widget=widgets.RadioSelect, label="18. Stellen Sie sich vor: Sie rutschen auf dem Bürgersteig auf einer Bananenschale aus. Sie haben sich nicht verletzt, aber die Leute drehen sich um und bleiben stehen. Man will Ihnen helfen. Was könnte Ihre erste Reaktion sein? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich ärgere mich darüber, dass es Menschen gibt, die ohne darüber nachzudenken, eine Bananenschale auf den Bürgersteig werfen.'], [2, 'Ich stehe auf und trage die Bananenschale zum nächsten Abfallkorb, damit anderen nicht dasselbe passiert. '], [3, 'Während ich noch sitze, schaue ich mir von unten die Leute an und sage: „Was für eine Show, damit könnte ich auftreten, oder?" '], [4, 'Ich stehe auf, sage "Nichts passiert!" und gehe weiter. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 19 Nachbar = models.IntegerField(widget=widgets.RadioSelect, label="19. Stellen Sie sich vor: Sie wohnen in einem größeren Wohnhaus. Um halb drei morgens läutet es bei Ihnen. An der Gegensprechanlage meldet sich jemand und fragt, ob im Haus ein Herr Müller wohne. Das trifft tatsächlich zu - und natürlich hat Ihr Nachbar auch eine eigene Klingel. Was könnten Sie sagen? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, '„Dafür haben Sie mich aus dem tiefsten Schlaf gerissen!“ Und ich beende das Gespräch.'], [2, 'Ich denke, es könnte ja was passiert sein. Wenn dann nach Müller gefragt wird, schimpfe ich in den Apparat: „Sind Sie wahnsinnig! Was fällt Ihnen ein, mitten in der Nacht fremde Leute zu stören?“ '], [3, '„Wenn Sie den Müller mögen, dann lassen Sie ihn schlafen.“ '], [4, 'Ich denke, es könnte ja was passiert sein. Wenn dann nach Müller gefragt wird, lasse ich mir erklären, was er/sie nachts von Herrn Müller will. '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 20 Geschlecht = models.IntegerField(widget=widgets.RadioSelect, label="20. Was ist Ihr Geschlecht?", choices=[ [1, 'Weiblich '], [2, 'Männlich '], [3, 'Divers '], ], initial=3 if C.DEBUG_INITIAL else None ) # Frage 21 Geburtsjahr = models.IntegerField(label="Geburtsjahr", choices=[ [1970, '1970'], [1971, '1971'], [1972, '1972'], [1973, '1973'], [1974, '1974'], [1975, '1975'], [1976, '1976'], [1977, '1977'], [1978, '1978'], [1979, '1979'], [1980, '1980'], [1981, '1981'], [1982, '1982'], [1983, '1983'], [1984, '1984'], [1985, '1985'], [1986, '1986'], [1987, '1987'], [1988, '1988'], [1989, '1989'], [1990, '1990'], [1991, '1991'], [1992, '1992'], [1993, '1993'], [1994, '1994'], [1995, '1995'], [1996, '1996'], [1997, '1997'], [1998, '1998'], [1999, '1999'], [2000, '2000'], [2001, '2001'], [2002, '2002'], [2003, '2003'], [2004, '2004'], [2005, '2005'], ], initial=1990 if C.DEBUG_INITIAL else None ) # Frage 22 Studienfeld = models.StringField(blank=False) Studiengang = models.StringField(blank=False) # Frage 23 Land = models.CharField( choices=C.COUNTRIES, verbose_name='Country' ) # Frage 24 Stadt = models.CharField( choices=C.CITIES, verbose_name='City' ) ### FRAGEBOGEN ENDE def custom_export(players): yield ['session', 'participantA', 'participantB', 'round_number'] similarity = Fragebogensimilarity.filter() for fs in similarity: playerA = fs.playerA playerB = fs.playerB partA = playerA.participant partB = playerB.participant session = playerA.session yield [session.code, partA.code, partB.code, playerA.round_number] class Fragebogensimilarity(ExtraModel): playerA = models.Link(Player) playerB = models.Link(Player) score = models.IntegerField() score_single = models.IntegerField() score_tv = models.IntegerField() score_wichtig = models.IntegerField() score_denken = models.IntegerField() score_eigenschaften = models.IntegerField() score_hobbies = models.IntegerField() score_sport = models.IntegerField() score_urlaub = models.IntegerField() ### Fragen uebereinstimmung Politik = models.BooleanField() Kultur = models.BooleanField() Technik = models.BooleanField() Sport = models.BooleanField() Familie = models.BooleanField() Wellness = models.BooleanField() Philosophie = models.BooleanField() Tiere = models.BooleanField() # Frage2 Ballsport = models.BooleanField() Wintersport = models.BooleanField() Wassersport = models.BooleanField() Kraftsport = models.BooleanField() Yoga = models.BooleanField() Reiten = models.BooleanField() Klettern = models.BooleanField() Leichtathletik = models.BooleanField() Kampfsport = models.BooleanField() Motorsport = models.BooleanField() Tanzsport = models.BooleanField() NoSport = models.BooleanField() # Frage 3 Klassik = models.BooleanField() Deutsche = models.BooleanField() Pop = models.BooleanField() Rap = models.BooleanField() Rock = models.BooleanField() Reggae = models.BooleanField() Jazz = models.BooleanField() Electronic = models.BooleanField() # Frage 4 Krimi = models.BooleanField() Horror = models.BooleanField() Liebesfilme = models.BooleanField() Action = models.BooleanField() Komoedie = models.BooleanField() Fiction = models.BooleanField() Dokus = models.BooleanField() Animation = models.BooleanField() # Frage 5 Meer = models.BooleanField() Bergen = models.BooleanField() Stadte = models.BooleanField() Party = models.BooleanField() Hauptsache = models.BooleanField() AllInclusive = models.BooleanField() Fernweh = models.BooleanField() Hause = models.BooleanField() # Frage 6 Karrierebewusst = models.BooleanField() Kinderlieb = models.BooleanField() Sportlich = models.BooleanField() Ruhig = models.BooleanField() Sparsam = models.BooleanField() Warmherzig = models.BooleanField() Zuverlaessig = models.BooleanField() Humorvoll = models.BooleanField() # Frage 7 SpassAufgelegt = models.BooleanField() GuteLaune = models.BooleanField() Reflektiert = models.BooleanField() Traeumer = models.BooleanField() Sachlich = models.BooleanField() LoesungsOrientiert = models.BooleanField() Gelassen = models.BooleanField() ImGeschehen = models.BooleanField() # Frage 8 Freundschaft = models.BooleanField() Liebe = models.BooleanField() Ruhe = models.BooleanField() Erfolg = models.BooleanField() Menschen = models.BooleanField() Soziale = models.BooleanField() Selbstverwirklichung = models.BooleanField() Partner = models.BooleanField() # Frage 9 Religion = models.BooleanField() # Frage 10 Diskussion = models.BooleanField() # Frage 11 GuteMenschen = models.BooleanField() # Frage 12 Herangehensweise = models.BooleanField() # Frage 13 RechtHaben = models.BooleanField() # Frage 14 ImpulsVerhalten = models.BooleanField() # Frage 15 Kraenkung = models.BooleanField() # Frage 16 UeberVerhaeltnisse = models.BooleanField() # Frage 17 ImpulsFreund = models.BooleanField() # Frage 18 Bananenschale = models.BooleanField() # Frage 19 Nachbar = models.BooleanField() # Frage 20 Geschlecht = models.BooleanField() # Frage 21 Geburtsjahr = models.BooleanField() # Frage 22 Studienfeld = models.BooleanField() Studiengang = models.BooleanField() # Frage 23 Land = models.BooleanField() # Frage 24 Stadt = models.BooleanField() def creating_session(subsession: Subsession): subsession.TREATMENT == 'Similar' if 'sp_treament' in subsession.session.config: subsession.TREATMENT = subsession.session.config['sp_treament'] ### Helper def check_field(sim, dict_entry,entry,selected_fields, player): field_name = entry.replace(' ','') if getattr(sim, field_name): selected_fields[dict_entry][entry] = getattr(player, entry) def generate_empty_dic(dict_entry, selected_fields): selected_fields[dict_entry] = dict() def get_matching_values(sim: Fragebogensimilarity, player: Player): hobbies = ['Politik', 'Kultur', 'Technik', 'Sport', 'Familie', 'Wellness', 'Philosophie', 'Tiere'] sport = ['Ballsport', 'Wintersport', 'Wassersport', 'Kraftsport', 'Yoga', 'Reiten', 'Klettern', 'Leichtathletik', 'Kampfsport', 'Motorsport', 'Tanzsport', 'NoSport'] music = ['Klassik', 'Deutsche', 'Pop', 'Rap', 'Rock', 'Reggae', 'Jazz', 'Electronic', ] tv = ['Krimi', 'Horror', 'Liebesfilme', 'Action', 'Komoedie', 'Fiction', 'Dokus', 'Animation', ] urlaub = ['Meer', 'Bergen', 'Stadte', 'Party', 'Hauptsache', 'AllInclusive', 'Fernweh', 'Hause', ] eigenschaften = ['Karrierebewusst', 'Kinderlieb', 'Sportlich', 'Ruhig', 'Sparsam', 'Warmherzig', 'Zuverlaessig', 'Humorvoll', ] denken = ['SpassAufgelegt', 'GuteLaune', 'Reflektiert', 'Traeumer', 'Sachlich', 'LoesungsOrientiert', 'Gelassen', 'ImGeschehen', ] wichtig = ['Freundschaft', 'Liebe', 'Ruhe', 'Erfolg', 'Menschen', 'Soziale', 'Selbstverwirklichung', 'Partner', ] single_values = [ 'Religion', 'Diskussion', 'GuteMenschen', 'Herangehensweise', 'RechtHaben', 'ImpulsVerhalten', 'Kraenkung', 'UeberVerhaeltnisse', 'ImpulsFreund', 'Bananenschale', 'Nachbar', 'Geschlecht', 'Geburtsjahr', 'Studienfeld', 'Studiengang', 'Land','Stadt',] matched_values = dict() ## generate empty dic generate_empty_dic("hobby", matched_values) generate_empty_dic("sport", matched_values) generate_empty_dic("music", matched_values) generate_empty_dic("Film", matched_values) generate_empty_dic("Urlaub",matched_values) generate_empty_dic("Eigenschaften", matched_values) generate_empty_dic("Wichtigsten", matched_values) generate_empty_dic("Denken", matched_values) ## Unschöne benamung gelassen weil die Seite ja schon fertig ist for entry in hobbies: check_field(sim, 'hobby', entry, matched_values, player) for entry in sport: check_field(sim, 'sport', entry, matched_values, player) for entry in music: check_field(sim, 'music', entry, matched_values, player) for entry in tv: check_field(sim, 'Film', entry, matched_values, player) for entry in urlaub: check_field(sim, 'Urlaub', entry, matched_values, player) for entry in eigenschaften: check_field(sim, 'Eigenschaften', entry, matched_values, player) for entry in wichtig: check_field(sim, 'Wichtigsten', entry, matched_values, player) for entry in denken: check_field(sim, 'Denken', entry, matched_values, player) for entry in single_values: generate_empty_dic(entry, matched_values) check_field(sim, entry, entry, matched_values, player) return matched_values def get_similarity(playerA: Player, playerB: Player): a_b = Fragebogensimilarity.filter(playerA=playerA, playerB=playerB) b_a = Fragebogensimilarity.filter(playerA=playerB, playerB=playerA) if len(a_b) > 0: return a_b[0] elif len(b_a) > 0: return b_a[0] else: return create_similarity(playerA, playerB) def create_similarity(playerA: Player, playerB: Player): ## Unschön weil viel zu lang multiple_choice_points = 1 single_choice_points = 2 score = 0 Politik = playerA.Politik and playerB.Politik Kultur = playerA.Kultur and playerB.Kultur Technik = playerA.Technik and playerB.Technik Sport = playerA.Sport and playerB.Sport Familie = playerA.Familie and playerB.Familie Wellness = playerA.Wellness and playerB.Wellness Philosophie = playerA.Philosophie and playerB.Philosophie Tiere = playerA.Tiere and playerB.Tiere hobbies = [Politik, Kultur, Technik, Sport, Familie, Wellness, Philosophie, Tiere] score_hobbies = sum([val for val in hobbies]) * multiple_choice_points Ballsport = playerA.Ballsport and playerB.Ballsport Wintersport = playerA.Wintersport and playerB.Wintersport Wassersport = playerA.Wassersport and playerB.Wassersport Kraftsport = playerA.Kraftsport and playerB.Kraftsport Yoga = playerA.Yoga and playerB.Yoga Reiten = playerA.Reiten and playerB.Reiten Klettern = playerA.Klettern and playerB.Klettern Leichtathletik = playerA.Leichtathletik and playerB.Leichtathletik Kampfsport = playerA.Kampfsport and playerB.Kampfsport Motorsport = playerA.Motorsport and playerB.Motorsport Tanzsport = playerA.Tanzsport and playerB.Tanzsport NoSport = playerA.NoSport and playerB.NoSport sport = [Ballsport, Wintersport, Wassersport, Kraftsport, Yoga, Reiten, Klettern, Leichtathletik, Kampfsport, Motorsport, Tanzsport, NoSport] score_sport = sum([val for val in sport]) * multiple_choice_points Klassik = playerA.Klassik and playerB.Klassik Deutsche = playerA.Deutsche and playerB.Deutsche Pop = playerA.Pop and playerB.Pop Rap = playerA.Rap and playerB.Rap Rock = playerA.Rock and playerB.Rock Reggae = playerA.Reggae and playerB.Reggae Jazz = playerA.Jazz and playerB.Jazz Electronic = playerA.Electronic and playerB.Electronic music = [Klassik, Deutsche, Pop, Rap, Rock, Reggae, Jazz, Electronic] score_music = sum([val for val in music]) * multiple_choice_points Krimi = playerA.Krimi and playerB.Krimi Horror = playerA.Horror and playerB.Horror Liebesfilme = playerA.Liebesfilme and playerB.Liebesfilme Action = playerA.Action and playerB.Action Komoedie = playerA.Komoedie and playerB.Komoedie Fiction = playerA.Fiction and playerB.Fiction Dokus = playerA.Dokus and playerB.Dokus Animation = playerA.Animation and playerB.Animation tv = [Krimi, Horror, Liebesfilme, Action, Komoedie, Fiction, Dokus, Animation] score_tv = sum([val for val in tv]) * multiple_choice_points Meer = playerA.Meer and playerB.Meer Bergen = playerA.Bergen and playerB.Bergen Stadte = playerA.Stadte and playerB.Stadte Party = playerA.Party and playerB.Party Hauptsache = playerA.Hauptsache and playerB.Hauptsache AllInclusive = playerA.AllInclusive and playerB.AllInclusive Fernweh = playerA.Fernweh and playerB.Fernweh Hause = playerA.Hause and playerB.Hause urlaub = [Meer, Bergen, Stadte, Party, Hauptsache, AllInclusive, Fernweh, Hause] score_urlaub = sum([val for val in urlaub]) * multiple_choice_points Karrierebewusst = playerA.Karrierebewusst and playerB.Karrierebewusst Kinderlieb = playerA.Kinderlieb and playerB.Kinderlieb Sportlich = playerA.Sportlich and playerB.Sportlich Ruhig = playerA.Ruhig and playerB.Ruhig Sparsam = playerA.Sparsam and playerB.Sparsam Warmherzig = playerA.Warmherzig and playerB.Warmherzig Zuverlaessig = playerA.Zuverlaessig and playerB.Zuverlaessig Humorvoll = playerA.Humorvoll and playerB.Humorvoll eigenschaften = [Karrierebewusst, Kinderlieb, Sportlich, Ruhig, Sparsam, Warmherzig, Zuverlaessig, Humorvoll] score_eigenschaften = sum([val for val in eigenschaften]) * multiple_choice_points SpassAufgelegt = playerA.SpassAufgelegt and playerB.SpassAufgelegt GuteLaune = playerA.GuteLaune and playerB.GuteLaune Reflektiert = playerA.Reflektiert and playerB.Reflektiert Traeumer = playerA.Traeumer and playerB.Traeumer Sachlich = playerA.Sachlich and playerB.Sachlich LoesungsOrientiert = playerA.LoesungsOrientiert and playerB.LoesungsOrientiert Gelassen = playerA.Gelassen and playerB.Gelassen ImGeschehen = playerA.ImGeschehen and playerB.ImGeschehen denken = [SpassAufgelegt, GuteLaune, Reflektiert, Traeumer, LoesungsOrientiert, Gelassen, ImGeschehen] score_denken = sum([val for val in denken]) * multiple_choice_points Freundschaft = playerA.Freundschaft and playerB.Freundschaft Liebe = playerA.Liebe and playerB.Liebe Ruhe = playerA.Ruhe and playerB.Ruhe Erfolg = playerA.Erfolg and playerB.Erfolg Menschen = playerA.Menschen and playerB.Menschen Soziale = playerA.Soziale and playerB.Soziale Selbstverwirklichung = playerA.Selbstverwirklichung and playerB.Selbstverwirklichung Partner = playerA.Partner and playerB.Partner wichtig = [Freundschaft, Liebe, Ruhe, Erfolg, Menschen, Soziale, Selbstverwirklichung, Partner] score_wichtig = sum([val for val in wichtig]) * multiple_choice_points ## einfach antworten Religion = playerA.Religion and playerB.Religion Diskussion = playerA.Diskussion and playerB.Diskussion GuteMenschen = playerA.GuteMenschen and playerB.GuteMenschen Herangehensweise = playerA.Herangehensweise and playerB.Herangehensweise RechtHaben = playerA.RechtHaben and playerB.RechtHaben ImpulsVerhalten = playerA.ImpulsVerhalten and playerB.ImpulsVerhalten Kraenkung = playerA.Kraenkung and playerB.Kraenkung UeberVerhaeltnisse = playerA.UeberVerhaeltnisse and playerB.UeberVerhaeltnisse ImpulsFreund = playerA.ImpulsFreund and playerB.ImpulsFreund Bananenschale = playerA.Bananenschale and playerB.Bananenschale Nachbar = playerA.Nachbar and playerB.Nachbar Geschlecht = playerA.Geschlecht and playerB.Geschlecht Geburtsjahr = playerA.Geburtsjahr and playerB.Geburtsjahr Studienfeld = playerA.Studienfeld.__eq__(playerB.Studienfeld) Studiengang = playerA.Studiengang.__eq__(playerB.Studiengang) Land = playerA.Land.__eq__(playerB.Land) Stadt = playerA.Stadt.__eq__(playerB.Stadt) single_answers = [Religion, Diskussion, GuteMenschen, Herangehensweise, RechtHaben, ImpulsVerhalten, Kraenkung, UeberVerhaeltnisse, ImpulsFreund, Bananenschale, Nachbar, Geschlecht, Geburtsjahr, Studiengang, Studienfeld, Land, Stadt] score_single = sum([val for val in single_answers]) * single_choice_points score = score_single + score_tv + score_wichtig + score_denken + score_eigenschaften + score_music + score_hobbies + score_sport + score_urlaub extra_model = Fragebogensimilarity.create( playerA=playerA, playerB=playerB, score=score, score_single=score_single, score_tv=score_tv, score_wichtig=score_wichtig, score_denken=score_denken, score_eigenschaften=score_eigenschaften, score_hobbies=score_hobbies, score_sport=score_sport, score_urlaub=score_urlaub, Politik=Politik, Kultur=Kultur, Technik=Technik, Sport=Sport, Familie=Familie, Wellness=Wellness, Philosophie=Philosophie, Tiere=Tiere, Ballsport=Ballsport, Wintersport=Wintersport, Wassersport=Wassersport, Kraftsport=Kraftsport, Yoga=Yoga, Reiten=Reiten, Klettern=Klettern, Leichtathletik=Leichtathletik, Kampfsport=Kampfsport, Motorsport=Motorsport, Tanzsport=Tanzsport, NoSport=NoSport, Klassik=Klassik, Deutsche=Deutsche, Pop=Pop, Rap=Rap, Rock=Rock, Reggae=Reggae, Jazz=Jazz, Electronic=Electronic, Krimi=Krimi, Horror=Horror, Liebesfilme=Liebesfilme, Action=Action, Komoedie=Komoedie, Fiction=Fiction, Dokus=Dokus, Animation=Animation, Meer=Meer, Bergen=Bergen, Stadte=Stadte, Party=Party, Hauptsache=Hauptsache, AllInclusive=AllInclusive, Fernweh=Fernweh, Hause=Hause, Karrierebewusst=Karrierebewusst, Kinderlieb=Kinderlieb, Sportlich=Sportlich, Ruhig=Ruhig, Sparsam=Sparsam, Warmherzig=Warmherzig, Zuverlaessig=Zuverlaessig, Humorvoll=Humorvoll, SpassAufgelegt=SpassAufgelegt, GuteLaune=GuteLaune, Reflektiert=Reflektiert, Traeumer=Traeumer, Sachlich=Sachlich, LoesungsOrientiert=LoesungsOrientiert, Gelassen=Gelassen, ImGeschehen=ImGeschehen, Freundschaft=Freundschaft, Liebe=Liebe, Ruhe=Ruhe, Erfolg=Erfolg, Menschen=Menschen, Soziale=Soziale, Selbstverwirklichung=Selbstverwirklichung, Partner=Partner, Religion=Religion, Diskussion=Diskussion, GuteMenschen=GuteMenschen, Herangehensweise=Herangehensweise, RechtHaben=RechtHaben, ImpulsVerhalten=ImpulsVerhalten, Kraenkung=Kraenkung, UeberVerhaeltnisse=UeberVerhaeltnisse, ImpulsFreund=ImpulsFreund, Bananenschale=Bananenschale, Nachbar=Nachbar, Geschlecht=Geschlecht, Geburtsjahr=Geburtsjahr, Studiengang=Studiengang, Studienfeld=Studienfeld, Land=Land, Stadt=Stadt) return extra_model def error_message_multiple_fields(constant_field, values, min=1, max=3): num_selected = 0 for constant in constant_field: if values[constant['name']]: num_selected += 1 if num_selected < min: return "Bitte wählen Sie mindestens eine Antwort aus" if num_selected > max: return "Bitte wählen Sie höchstens drei Antworten aus" # PAGES class Instruktionen(Page): pass class Frage1_Hobby(Page): form_model = 'player' form_fields = ['Hobbies'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [hob['name'] for hob in C.Hobbies] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Hobbies, values) class Frage2_Sport(Page): form_model = 'player' form_fields = ['Sports'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [sport['name'] for sport in C.Sports] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Sports, values) class Frage3_Musik(Page): form_model = 'player' form_fields = ['Music'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [musi['name'] for musi in C.Music] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Music, values) class Frage4_TV(Page): form_model = 'player' form_fields = ['Film'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [fil['name'] for fil in C.Film] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Film, values) class Frage5_Urlaub(Page): form_model = 'player' form_fields = ['Urlaub'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [ur['name'] for ur in C.Urlaub] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Urlaub, values) class Frage6_Eigenschaften(Page): form_model = 'player' form_fields = ['Eigenschaften'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [ein['name'] for ein in C.Eigenschaften] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Eigenschaften, values) class Frage7_Denken(Page): form_model = 'player' form_fields = ['Denken'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [den['name'] for den in C.Denken] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Denken, values) class Frage8_Wichtigste(Page): form_model = 'player' form_fields = ['Wichtigsten'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_form_fields(player: Player): return [win['name'] for win in C.Wichtigsten] @staticmethod def error_message(player: Player, values): return error_message_multiple_fields(C.Wichtigsten, values) class Frage9_Religion(Page): form_model = 'player' form_fields = ['Religion'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage10_Diskussion(Page): form_model = 'player' form_fields = ['Diskussion'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage11_GuteMenschen(Page): form_model = 'player' form_fields = ['GuteMenschen'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage12_Herangehensweise(Page): form_model = 'player' form_fields = ['Herangehensweise'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage13_RechtHaben(Page): form_model = 'player' form_fields = ['RechtHaben'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage14_ImpulsVerhalten(Page): form_model = 'player' form_fields = ['ImpulsVerhalten'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage15_Kraenkung(Page): form_model = 'player' form_fields = ['Kraenkung'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage16_UeberVerhaeltnisse(Page): form_model = 'player' form_fields = ['UeberVerhaeltnisse'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage17_ImpulsFreund(Page): form_model = 'player' form_fields = ['ImpulsFreund'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage18_Bananenschale(Page): form_model = 'player' form_fields = ['Bananenschale'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage19_Nachbar(Page): form_model = 'player' form_fields = ['Nachbar'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage20_Geschlecht(Page): form_model = 'player' form_fields = ['Geschlecht'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage21_Geburtsjahr(Page): form_model = 'player' form_fields = ['Geburtsjahr'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage22_Studium(Page): form_model = 'player' form_fields = ['Studienfeld', 'Studiengang'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Frage23_Land(Page): form_model = 'player' form_fields = ['Land'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 def vars_for_template(self): return dict( countries=[c.name for c in pycountry.countries] ) class Frage24_Stadt(Page): form_model = 'player' form_fields = ['Stadt'] @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Fragebogen_Ende(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def before_next_page(player: Player, timeout_happened): ### baue das Extra model pass class Similar_Group_Matching(WaitPage): ## todo: Rausschmeissen ist nur zum Zwischen Matching, das passiert nachher ja im OnetoOneMatching wait_for_all_groups = True @staticmethod def after_all_players_arrive(group: Group): playerA = group.get_players()[0] ## erster spieler playerB = playerA.get_others_in_group()[0] ## 2ter ## Wird normalerweise zurückggeben, aber können wir uns ja auch sparen get_similarity(playerA, playerB) class Estimate_Similarity(Page): form_model = 'player' form_fields = ['similarity', 'like_opposite', 'closeness_opposite', 'estimated_similarity_points' ] def is_displayed(player: Player): return True ## Todo : Behnud drüber schauen & ok geben # Customer_Condition = player.type == 0 and player.round_number >= C.ROUNDS_PART1 # Seller_Condition = player.type != 0 and player.subsession.TREATMENT == 'Similar' and player.round_number >= C.ROUNDS_PART1 # and not player.period_over # return Customer_Condition or Seller_Condition def vars_for_template(player: Player): player.performance_info_group = 'blub' return dict( playerKunde=not player.type, similarity=player.subsession.TREATMENT == 'Similar', firstpart=player.round_number < C.ROUNDS_PART1 ) class Similarity(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 or True @staticmethod def vars_for_template(player: Player): sim = get_similarity(player.in_round(1), player.get_others_in_group()[0].in_round(1)) matched = get_matching_values(sim, player.in_round(1)) return dict( Matched = matched, Social_score = sim.score, above_average = 0, ) page_sequence = [ Instruktionen , Frage1_Hobby , Frage2_Sport , Frage3_Musik , Frage4_TV , Frage5_Urlaub , Frage6_Eigenschaften , Frage7_Denken , Frage8_Wichtigste , Frage9_Religion , Frage10_Diskussion , Frage11_GuteMenschen , Frage12_Herangehensweise , Frage13_RechtHaben , Frage14_ImpulsVerhalten , Frage15_Kraenkung , Frage16_UeberVerhaeltnisse , Frage17_ImpulsFreund , Frage18_Bananenschale , Frage19_Nachbar , Frage20_Geschlecht , Frage21_Geburtsjahr , Frage22_Studium , Frage23_Land , Frage24_Stadt , Fragebogen_Ende , Estimate_Similarity , Similarity ]