import random import json from json import JSONDecodeError import time from otree import settings from otree.api import * import numpy as np # from experiments._static.addons import task_matrix, image_utils # from .._static.addons import task_matrix, image_utils from datetime import datetime # import helper from . import helper from . import tasks_image_generator doc = """ Notizen 25.09.2023 Vorschlag für neues Programm Instruktionen 1 (5 Minuten) -> Persönlichkeitsfragebogen (15 Min) -> 2 Runden Test von Aufgaben (5 min) -> (Seller/Customer decision) Instruktionen 2 (10 Minuten) -> (Group Matching) 2 Runden Aufgaben mit 1:1 Matching (8 min) -> 8 Runden Markt-Interaktion (40 Min) -> Ex-post Fragebogen (10 Min) Total: 93 Minuten + 15 Minuten auszahlung: ca. 120 Minuten über oder unterdurchschnittlich - gemeinsamkeiten pro def count_similarities(player,andereSeite): - kunde-anbieter oder anbieter-kunde können wir aber in gruppe speichern def avg_similarities(player,gruppe_andereSeite): RundenTest: 7er , logik wechsel, 7er, logik wechsel, 7er, .. bis zu 8 Ergebnis Runden: Sie haben so & soviel erreicht Part2: 7er oder Analogie & Zahlenreihe gar nix ToDo 05.01.2024 -Benötige binäre Steuervariable, ob baseline oder social proximity treatment gespielt wird -> baseline als default -Timer von 7 Minuten für Instruktionen.html und 10 Minuten für Instruktionen2.html -Bei Analogienaufgabe die Optionen nebeneinander statt untereinander -Wir müssten uns überlegen, wie wir die Runden anzeigen und durchnummerieren -> Runden für 2 Testrunden; 8 Runden für Interaktion, davon 2 Runden 1-1 Matching """ class C(BaseConstants): NAME_IN_URL = 'social_proximity_single_session' PLAYERS_PER_GROUP = None NUM_ROUNDS = 12 # 2 testrunde, 2 1-1 runden, 8 market interaction AMOUNT_QUESTIONS = 24 TIMER_TEXT = "Verbleibende Lesezeit" TIMER_TEXT_TASK = "Verbleibende Bearbeitungszeit" TIMEOUT_GAME = 30 ### LOAD MODELS: ## TODO BEHNUD : FILES ANPASSEN , habe meine genommen ANALOGY_LIST = helper.load_logic_tasks('analogy') NUM_SEQUENCE_LIST = helper.load_logic_tasks('nums') ANALOGY_POINTS = 2 TIMER_MINUTES = .5 # 5 ##TEST ZWECKE HOCH GESETZT TIMER_TASK = 160 TIMER_TASK_CUSTOMER_TASK_A = 25 TIMER_TASK_CUSTOMER_TASK_B = 50 LOGIC_POINTS = 2 INSTRUCTION_READ_TIME = 600 # todo auf 600 änern INSTRUCTION2_READ_TIME = 600 TEST_ROUNDS = 2 ONE_TO_ONE_ROUNDS = 2 MARKETINTERACTION_ROUNDS = 8 CHANGE_ORDER_ROUNDS = 4 START_ONE_TO_ONE = TEST_ROUNDS START_MARKET_INTERACTION = TEST_ROUNDS + ONE_TO_ONE_ROUNDS MAX_BIRTH_YEAR = time.localtime().tm_year - 16 # min age: 16 ## Gruppenzuordnung, vor und nach dem swap ## Idee zZ bottom 4 + 2 aus der Mitte & Top 4 + 2 aus der Mitte SELLER_ORDER = [0, 1, 4, 2, 3, 5, 8, 9, 6, 10, 11, 7] ## Wechsel die Mitte leute aus SELLER_ORDER_SWAP = [0, 1, 5, 2, 3, 4, 8, 9, 7, 10, 11, 6] PART2 = False ## nur fürs steuern # TODO: Variablen für Nutzen, Punkte, Bonus etc. für Kunden und Anbieter anlegen # Payoff Variablen für Anbieter und Kunde # Jeder Punkt wird für Kunde und Anbieter mit verschiedenem Faktor in Nutzen umgerechnet EXCHANGE_RATE_POINTS_UTILITY_KUNDE_ANBIETERTASKS = 2.4 # Umrechnungsfaktor in Nutzen für jeden Punkt, den Kunde durch Anbieter erarbeiten lässt EXCHANGE_RATE_POINTS_UTILITY_KUNDE_OWNTASKS = 1.5 # Umrechnungsfaktor in Nutzen für jeden Punkt, den Kunde durch eigene Aufgabenbearbeitung erreicht EXCHANGE_RATE_POINTS_TALER_ANBIETER = 1.25 # Umrechnungsfaktor in Taler für jeden Punkt, den Anbieter für die Aufgabenbearbeitung erzielt EXCHANGE_RATE_UTILITY_TALER = 1 # Umrechnungskurs von Nutzen zu Taler COSTS_UTILITY_FAIL_KUNDE_OWNTASKS = -0.5 # Kosten in Nutzeneinheiten, wenn Kunde eigene Aufgaben nicht korrekt bearbeitet NO_TRANSACTION_PAYMENT_TALER = 8 # Auszahlung an beide Partner wenn keine Transaktion zustande kommt BONUS_TALER_PREFERRED_ANBIETER = 3 # Bonus Taler für meistpräferierten Anbieter BONUS_UTILITY_CORRECT_ESTIMATION = 3 # Bonus in Nutzeneinheiten wenn Kunde mit Einschätzung korrekt liegt innerhalb der BOUNDARY_ESTIMATION BOUNDARY_ESTIMATION = 1 # Erlaubte Abweichung der Schätzung von wahrer Punktzahl des Anbieters MAX_POINTS_KUNDE_OWNTASKS = 4 # wie viele Punkte Kunde selbst maximal machen kann Hobbies = [ dict(name='hobbies_politik', label="Politik und Wirtschaft"), dict(name='hobbies_kultur', label="Kultur und Kunst (Musik, Literatur, Sprachen, Film, Fotografie)"), dict(name='hobbies_technik', label="Technik"), dict(name='hobbies_sport', label="Sport"), dict(name='hobbies_familie', label="Familie und Heim (Heimwerken, Handarbeit, Kochen, Gartenarbeit) "), dict(name='hobbies_wellness', label="Wellness und Gesundheit"), dict(name='hobbies_philosophie', label="Philosophie, Religion und Spiritualität"), dict(name='hobbies_tiere', label="Tiere und Natur"), ] Sports = [ dict(name='sport_ballsport', label="Ballsport (Fuß-, Hand-, Basketball, Tennis, Hockey, ...)"), dict(name='sport_wintersport', label="Wintersport (Skifahren, Snowboarden, ...)"), dict(name='sport_wassersport', label="Wassersport (Schwimmen, Tauchen, Bootsport, ...)"), dict(name='sport_kraftsport', label="Kraftsport (Gewichtheben, CrossFit, Zirkeltraining, ...)"), dict(name='sport_yoga', label="Yoga/ Pilates/ Qi Gong/ Gymnastik"), dict(name='sport_reiten', label="Reiten "), dict(name='sport_klettern', label="Klettern"), dict(name='sport_leichtathletik', label="Leichtathletik"), dict(name='sport_kampfsport', label="Kampfsport"), dict(name='sport_motorsport', label="Rad-/ Motorsport (Rennrad, Mountain Biking)"), dict(name='sport_tanzsport', label="Tanzsport"), dict(name='sport_nosport', label="Kein Sport"), ] Music = [ dict(name='music_klassik', label="Klassik, Sinfonien"), dict(name='music_deutsche', label="Deutsche Schlager, Volksmusik"), dict(name='music_pop', label="Pop"), dict(name='music_rap', label="HipHop, Rap, RnB "), dict(name='music_rock', label="Rock, Hard, Heavy "), dict(name='music_reggae', label="Reggae"), dict(name='music_jazz', label="Jazz, Blues, Spirituals, Gospel"), dict(name='music_electronic', label="Dance & Electronic"), ] Film = [ dict(name='film_krimi', label="Krimi"), dict(name='film_horror', label="Thriller/ Horror"), dict(name='film_romantik', label="Liebesfilme"), dict(name='film_action', label="Action"), dict(name='film_komoedie', label="Komödie"), dict(name='film_scifi', label="Science-Fiction"), dict(name='film_dokus', label="Dokus"), dict(name='film_animation', label="Animation"), ] Urlaub = [ dict(name='urlaub_meer', label="Am Meer "), dict(name='urlaub_bergen', label="In den Bergen "), dict(name='urlaub_stadt', label="Städte, Kultur und Kunst"), dict(name='urlaub_party', label="Party-Hotspots ziehen mich an "), dict(name='urlaub_abenteuerlich', label="Hauptsache abenteuerlich"), dict(name='urlaub_all_incl', label="All-inclusive und einfach mal abschalten "), dict(name='urlaub_fernweh', label="Umso weiter weg, umso besser"), dict(name='urlaub_haus', label="Zu Hause"), ] Eigenschaften = [ dict(name='eigenschaft_karrierebewusst', label="karrierebewusst und zielorientiert "), dict(name='eigenschaft_kinderlieb', label="kinderlieb und familienbezogen "), dict(name='eigenschaft_sportlich', label="sportlich und aktiv"), dict(name='eigenschaft_zuruckhaltend', label="zurückhaltend und ruhig "), dict(name='eigenschaft_sparsam', label="sparsam und genügsam"), dict(name='eigenschaft_warmherzig', label="warmherzig und hilfsbereit"), dict(name='eigenschaft_zuverlassig', label="zuverlässig"), dict(name='eigenschaft_humorvoll', label="humorvoll und heiter "), ] Denken = [ dict(name='denken_spass', label="Ist zu jedem Spaß aufgelegt."), dict(name='denken_gute_laune', label="Hat immer gute Laune und ist fröhlich."), dict(name='denken_ernsthaft', label="Denkt viel und ernsthaft über das Leben nach. "), dict(name='denken_vertraeumt', label="Ist etwas verträumt."), dict(name='denken_sachlich', label="Geht sachlich und überlegt an Schwierigkeiten heran."), dict(name='denken_loesungsorientiert', label="Findet auch in unangenehmen Situationen eine für sich gute Lösung."), dict(name='denken_ruhe', label="Lässt sich durch nichts aus der Ruhe bringen."), dict(name='denken_lebhaft', label="Nimmt an allem lebhaft teil. "), ] Wichtigsten = [ dict(name='wichtig_freundschaft', label="Freundschaft"), dict(name='wichtig_liebe', label="Glück in der Liebe"), dict(name='wichtig_ruhe', label="Ruhe und Zufriedenheit"), dict(name='wichtig_erfolg', label="Beruflicher Erfolg"), dict(name='wichtig_menschen', label="Von den Menschen in meiner Umgebung geachtet und respektiert zu sein"), dict(name='wichtig_soziale', label="Soziale Sicherheit"), dict(name='wichtig_selbstverwirklichung', label="Selbstverwirklichung"), dict(name='wichtig_partner', label="Ein familiäres Zuhause mit einem Partner "), ] ## HEADER-LABEL HOBBY_LABEL = "Welche Interessen bzw. Hobbies haben Sie?" SPORT_LABEL = "Welche der genannten Sportarten betreiben Sie aktiv?" MUSIC_LABEL = "Welche Musik hören Sie am liebsten?" FILM_LABEL = "Welche Film-/ Seriengenres gefallen Ihnen am besten?" URLAUB_LABEL = "Wo und wie machen Sie am liebsten Urlaub?" EIGENSCHAFT_LABEL = "Welche der nachfolgend genannten Eigenschaften beschreiben Sie?" DENKEN_LABEL = "Was, glauben Sie, könnten Menschen, die Sie gut kennen, am ehesten über Sie denken?" WICHTIG_LABEL = "Welche der folgenden Werte sind für Sie im Leben die wichtigsten?" RELIGION_LABEL = "Welcher Religion fühlen Sie sich zugehörig?" DISKUSSION_LABEL = "Es wird viel diskutiert über Klimawandel, Umweltschutz, Energiequellen usw. Welche Aussage steht Ihrer Meinung am nächsten?" VERTRAUEN_LABEL = "Glauben Sie an das Gute im Menschen?" PRIVAT_LABEL = "Wie gehen Sie vor, wenn Sie sich privat etwas vorgenommen haben?" WIDERSPRUCH_LABEL = "Wenn Ihnen jemand widerspricht, obwohl Sie genau wissen, dass Sie Recht haben, wie reagieren Sie dann üblicherweise?" IMPULS_LABEL = "Was ist Ihr erster Impuls, wenn Sie sich über das Verhalten eines Menschen, der Ihnen nahesteht, sehr ärgern?" KRAENKUNG_LABEL = "Manchmal geschieht es, dass man von einem Menschen gekränkt wird. Wie reagieren Sie dann darauf?" UEBERVERHAELTNISSE_LABEL = "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?" RACHE_LABEL = "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?" BANANE_LABEL = "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?" WOHNHAUS_LABEL = "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? " KEINE_UEBEREINSTIMMUNG = "Keine Übereinstimmung bei dieser Frage" ### mehr dicts für single questions - name des dicts sollte der gleiche sein wie das Feld/die auflistung unten in der similarity page RELIGION_CHOICES = dict( name="Religion", choices=[[1, 'Katholisch'], [2, 'Evangelisch '], [3, 'Muslimisch '], [4, 'Jüdisch '], [5, 'Buddhistisch '], [6, 'Hinduistisch'], [7, 'Andere Religionsgemeinschaft'], [8, 'Konfessionslos'], ], ) DISKUSSION_CHOICES = dict( name="Diskussion", 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. ']] ) VERTRAUEN_CHOICES = dict( name="Vertrauen", choices=[ [1, 'Ja, immer.'], [2, 'Ich versuche es, aber es fällt mir manchmal schwer. '], [3, 'Kommt darauf an, in welchem Zusammenhang. '], [4, 'Nein. '], ] ) PRIVAT_CHOICES = dict( name="Privat", 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. '], ] ) WIDERSPRUCH_CHOICES = dict( name="Widerspruch", 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. '], ] ) IMPULS_CHOICES = dict( name='Impuls', 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. '], ] ) KRAENKUNG_CHOICES = dict( name='Kraenkung', 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. '], ] ) UEBERVERHAELTNISSE_CHOICES = dict( name='UeberVerhaeltnisse', 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! '], ] ) RACHE_CHOICES = dict( name='Rache', 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. '], ] ) BANANE_CHOICES = dict( name='Banane', 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. '], ] ) WOHNHAUS_CHOICES = dict( name='Wohnhaus', 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. '], ]) GESCHLECHT_CHOICES = dict( name='Geschlecht', choices=[ ['weiblich', 'Weiblich '], ['männlich', 'Männlich '], ['divers', 'Divers '], ]) GEBURTSJAHR_CHOICES = dict( name='Geburtsjahr', choices=[[year, str(year)] for year in range(MAX_BIRTH_YEAR - 45, MAX_BIRTH_YEAR + 1)] ) STUDIENFELD_CHOICES_ALT = [ 'Naturwissenschaften', 'Sport und Gesundheit', 'Wirtschaftswissenschaften', 'Ingenieurwissenschaften', 'Mathematik und Informatik', 'Sprache und Literatur', 'Geistes- und Gesellschaftswissenschaften', 'Kunst, Medien und Musik' ] STUDIENFELD_CHOICES = [ 'Naturwissenschaften', 'Wirtschaftswissenschaften', 'Ingenieurwissenschaften, Mathematik und Informatik', 'Kulturwissenschaften' ] STUDIENGANG_CHOICES = dict( Naturwissenschaften=["Angewandte Sportwissenschaft", "Applied neurosciences in Sports & Exercise", "Betriebliches Gesundheitsmanagement", "Chemie", "Lehramt Chemie BK", "Lehramt Chemie GyGe", "Lehramt Chemie HRSGe", "Lehramt Ernährungs- und Hauswirtschaftswissenschaften BK", "Lehramt Ernährungs- und Hauswirtschaftswissenschaften in Kombination mit Lebensmitteltechnik", "Lehramt Ernährungslehre GyGe", "Lehramt Hauswirtschaft HRSGe", "Lehramt Lebensmitteltechnik BK", "Lehramt Natur- und Gesellschaftswissenschaften (Sachunterricht) G/SP", "Lehramt Physik BK", "Lehramt Physik GyGe", "Lehramt Physik HRSGe", "Lehramt Sport BK", "Lehramt Sport G", "Lehramt Sport GyGe", "Lehramt Sport HRSGe", "Lehramt Sport SP", "Materials Science", "Materialwissenschaften", "Optoelectronics and Photonics", "Physik", ], Wirtschaftswissenschaften=["Betriebswirtschaftslehre", "International Business Studies", "International Economics and Management", "Lehramt Wirtschaftspädagogik BK", "Lehramt Wirtschaftswissenschaften BK", "Management", "Management (Zwei-Fach-Bachelor/Master)", "Management Information Systems", "Sportökonomie", "Taxation, Accounting and Finance", "Wirtschaftsinformatik", "Wirtschaftspädagogik", "Wirtschaftswissenschaften"], Ingenieurswissenschaften_Mathematik_Informatik=[ "Berufsbildung Maschinenbau", "Chemieingenieurwesen", "Computer Engineering", "Electrical Systems Engineering", "Elektrotechnik", "Informatik", "Lehramt Elektrotechnik und Automatisierungs-/Informationstechnik an BK", "Lehramt Elektrotechnik BK", "Lehramt Informatik BK", "Lehramt Informatik GyGe", "Lehramt Informatik HRSGe", "Lehramt Maschinenbau BK", "Lehramt Mathematik BK", "Lehramt Mathematik G", "Lehramt Mathematik GyGe", "Lehramt Mathematik HRSGe", "Lehramt Mathematik SP", "Lehramt mathematische Grundbildung G", "Lehramt mathematische Grundbildung SP", "Maschinenbau", "Materialwissenschaften", "Mathematik", "Optoelectronics and Photonics", "Technomathematik", "Wirtschaftsingenieurwesen", ], Kulturwissenschaften=[ "Benelux-Studien", "Deutsch-Lateinamerikanische Kulturvermittlungen", "Deutschsprachige Literaturen (Zwei-Fach)", "Digital Humanities (Zwei-Fach)", "Englische Sprachwissenschaft (Zwei-Fach)", "Englischsprachige Literatur und Kultur (Zwei-Fach)", "English and american literary and cultural studies", "Erziehungswissenschaften (Zwei-Fach)", "Europäische Studien", "Europäische Studien (Zwei-Fach)", "Germanistische Literaturwissenschaft", "Germanistische Sprachwissenschaft (Zwei-Fach)", "Geschichte (Zwei-Fach)", "Geschlechterstudien/Gender Studies (Zwei-Fach)", "Komparatistik / Vergleichende Literatur- und Kulturwissenschaft", "Komparatistik / Vergleichende Literatur- und Kulturwissenschaft (Zwei-Fach)", "Komparative Theologie der Religionen (Zwei-Fach)", "Kulturen der Europäischen Vormoderne (Zwei-Fach)", "Kulturerbe", "Kunst und Kunstvermittlung (Zwei-Fach)", "Lehramt Deutsch BK", "Lehramt Deutsch GyGe", "Lehramt Deutsch HRSGe", "Lehramt Englisch BK", "Lehramt Englisch G", "Lehramt Englisch GyGe", "Lehramt Englisch HRSGe", "Lehramt Englisch SP", "Lehramt Evangelische Religionslehre BK", "Lehramt Evangelische Religionslehre G", "Lehramt Evangelische Religionslehre GyGe", "Lehramt Evangelische Religionslehre HRSGe", "Lehramt Evangelische Religionslehre SP", "Lehramt Förderschwerpunkt emotionale und soziale Entwicklung SP", "Lehramt Förderschwerpunkt Lernen SP", "Lehramt Förderschwerpunkt Sprache", "Lehramt Französisch BK", "Lehramt Französisch GyGe", "Lehramt Französisch HRSGe", "Lehramt Geschichte GyGe", "Lehramt Geschichte HRSGe", "Lehramt Islamische Religionslehre BK", "Lehramt Islamische Religionslehre G", "Lehramt Islamische Religionslehre GyGE", "Lehramt Islamische Religionslehre HRSGe", "Lehramt Katholische Religionslehre BK", "Lehramt Katholische Religionslehre G", "Lehramt Katholische Religionslehre GyGe", "Lehramt Katholische Religionslehre HRSGe", "Lehramt Katholische Religionslehre SP", "Lehramt Kunst Bk", "Lehramt Kunst G", "Lehramt Kunst GyGe", "Lehramt Kunst HRSGe", "Lehramt Kunst SP", "Lehramt Musik G", "Lehramt Musik GyGe", "Lehramt Musik HRSGe", "Lehramt Musik SP", "Lehramt Pädagogik BK", "Lehramt Pädagogik GyGe", "Lehramt Philosophie GyGe", "Lehramt Praktische Philosophie BK", "Lehramt Praktische Philosophie HRSGe", "Lehramt Psychologie BK", "Lehramt Psychologie GyGe", "Sozialpädagogik BK", "Lehramt Spanisch BK", "Lehramt Spanisch GyGe", "Lehramt Spanisch HRSGe", "Lehramt sprachliche Grundbildung G", "Lehramt sprachliche Grundbildung SP", "Lehramt Textilgestaltung HRSGe", "Lehramt Technik GyGe", "Lehramt Technik HRSGe", "Linguistik", "Linguistik: Sprachdynamik", "Medienwissenschaften", "Medienwissenschaften (Zwei-Fach)", "Mode-Textil-Design-Studien (Zwei-Fach)", "Musikwissenschaft", "Musikwissenschaft (Zwei-Fach)", "Philosophie (Zwei-Fach)", "Philosophie - Studienfach in Kultur und Gesellschaft", "PopMediaCulture", "Populäre Musik und Medien", "Romanistik/ Französisch (Zwei-Fach)", "Romanistik/ Spanisch (Zwei-Fach)", "Soziologie (Zwei-Fach)", "Theologien im Dialog (Zwei-Fach)", ], ) ### Count Sevens ## Old GROUP_CHOICE = [1, 2, 3] GROUP_CHOICE_LETTER = [[1, 'X'], [2, 'Y'], [3, 'Z']] class Subsession(BaseSubsession): TREATMENT = models.StringField(initial='social_interaction') TYPE_OF_SEVENS = models.StringField(initial='old') OLD_SEVENS = models.BooleanField(initial=False) SOCIAL_INTERACTION = models.BooleanField(initial=True) SKIP_QUESTIONAIRE = models.BooleanField(initial=False) ## Damit wir das nicht immer durchspielen müssen SKIP_TEST_ROUNDS = models.BooleanField(initial=False) # Skipping test rounds. Each participant gets 5-24 points. SHOW_PROVIDERS_PERFORMANCE_AVERAGE = models.BooleanField(initial=True) class Group(BaseGroup): seller_first = models.IntegerField(initial=-1) seller_second = models.IntegerField(initial=-1) seller_third = models.IntegerField(initial=-1) class Player(BasePlayer): ### Wird voll , gerne einklappen ''' Generelles ''' time_round = models.IntegerField(initial=-1) customer = models.BooleanField(initial=False) play_together = models.BooleanField(label="Bitte wählen Sie aus:", widget=widgets.RadioSelect, choices=[ [True, "Ich möchte eine Transaktion eingehen."], [False, "Ich möchte keine Transaktion eingehen."], ], doc='Kundenwahl ob zusammengespielt/Transaktion gemacht wird', initial=True ## todo Behnud ist das okay so? ) amount_rating_received = models.IntegerField(initial=0) match = models.IntegerField(initial=-1) matched_pref = models.IntegerField(initial=-1, doc="Präferiertes Match") match_letter = models.StringField(initial="A", doc="Präferiertes Match") matched_index = models.IntegerField(initial=-1, doc="bekommenes Matching (index), vermutlich nicht benutzt") top = models.BooleanField(initial=False) estimated_points = models.IntegerField(label="Ihre Einschätzung zwischen 0 und 24 Punkten:", initial=0, min=0, max=24, doc='Punkte Einschätzung') ### Punkte Pro Stage points_count_seven_1 = models.IntegerField(initial=0, doc="Punkte für 7er 1") points_count_seven_2 = models.IntegerField(initial=0, doc="Punkte für 7er 2") points_count_seven_3 = models.IntegerField(initial=0, doc="Punkte für 7er 3") points_count_seven_4 = models.IntegerField(initial=0, doc="Punkte für 7er 4") points_analogy_1 = models.IntegerField(initial=0, doc="Punkte für Analogy 1") points_analogy_2 = models.IntegerField(initial=0, doc="Punkte für Analogy 2") points_num_seq_1 = models.IntegerField(initial=0, doc="Punkte für Zahlenreihe 1") points_num_seq_2 = models.IntegerField(initial=0, doc="Punkte für Zahlenreihe 2") points_total = models.IntegerField(initial=0, doc="Gesamtpunkte nach Runde - benutze für Estimate vergleich") points_logic_task = models.IntegerField(initial=0) stage_reached = models.IntegerField(initial=0, doc="1-8 für wie weit man gekommen ist") group_before_one_to_one_matching = models.IntegerField(initial=-1, doc="Gruppenspeicher für Runde OneToOneMatching um nachzuvollziehen woher die Leute kamen") type_of_task = models.IntegerField( label="Bitte geben Sie jetzt an, ob und welchen Aufgabentyp Sie bearbeiten möchten", widget=widgets.RadioSelect, choices=[ [1, "Ich möchte in dieser Runde keine Aufgabe selbst bearbeiten."], [2, "Ich möchte in dieser Runde eine Aufgabe des Typs A (7er zählen) selbst bearbeiten."], [3, "Ich möchte in dieser Runde zwei Aufgaben des Typs B (1x Analogie und 1x Zahlenreihe) selbst bearbeiten. "] ], doc="Welche Art von Aufgabe möchte der Kunde bearbeiten", initial=-1) type = models.IntegerField(initial=-1, doc='Typ des Spielers: Kunde:0, Verkäufer: 1-Bottom , 2-Middle, 3-Top') response_games = models.StringField() tag = models.StringField(initial="INITIAL") points_analogy = models.IntegerField(initial=0) points_num_seq = models.IntegerField(initial=0) solution_7num = models.IntegerField(doc='just a helper') ### HARIS 7 Task - didnt touch count_7num = models.IntegerField(label="Ihre Antwort:") count_7num2 = models.IntegerField(label="Ihre Antwort:") count_7num3 = models.IntegerField(label="Ihre Antwort:") count_7num4 = models.IntegerField(label="Ihre Antwort:") ### Vielleich so? analogy_answer_1 = models.IntegerField(initial=-1, doc="Antwort der ersten Analogy in der Runde") analogy_answer_2 = models.IntegerField(initial=-1, doc="Antwort der zweiten Analogy in der Runde") sequence_answer_1 = models.IntegerField(initial=-1, doc="Antwort der ersten NumSeq in der Runde") sequence_answer_2 = models.IntegerField(initial=-1, doc="Antwort der zweiten NumSeq in der Runde") market_interaction_choice_1 = models.IntegerField(label="Präferenz 1:", initial=1 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) market_interaction_choice_3 = models.IntegerField(label="Präferenz 3:", initial=3 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) market_interaction_choice_2 = models.IntegerField(label="Präferenz 2:", initial=2 if settings.DEBUG else 0, choices=C.GROUP_CHOICE_LETTER) rating = models.FloatField(initial=0, choices=[1, 2, 3, 4, 5]) rating_received = models.FloatField(initial=0, choices=[1, 2, 3, 4, 5]) avg_rating = models.FloatField(initial=0) # save_one_to_one_avg = models.FloatField(initial=0) performance_info_group = models.FloatField(initial=-1) ### TaskselectionEstimationKunde similarity_avg = models.FloatField(initial=-1) ## AVG und SCORE score = models.FloatField(initial=None) above_avg = models.BooleanField(initial=None) ##### ### UTILS #### util_seller = models.FloatField(initial=0) util_customer = models.FloatField(initial=0) utility_customer_forseller = models.FloatField(initial=0) estimation_customer = models.FloatField(initial=0) payment_toseller = models.FloatField(initial=0) bonus_most_preferred = models.FloatField(initial=0) payoff_show_float = models.FloatField(initial=0) ''' Persönlichkeits Profil ''' # Hobbies hobbies_politik = helper.make_boolean() hobbies_kultur = helper.make_boolean() hobbies_technik = helper.make_boolean() hobbies_sport = helper.make_boolean() hobbies_familie = helper.make_boolean() hobbies_wellness = helper.make_boolean() hobbies_philosophie = helper.make_boolean() hobbies_tiere = helper.make_boolean() # Sport sport_ballsport = helper.make_boolean() sport_wintersport = helper.make_boolean() sport_wassersport = helper.make_boolean() sport_kraftsport = helper.make_boolean() sport_yoga = helper.make_boolean() sport_reiten = helper.make_boolean() sport_klettern = helper.make_boolean() sport_leichtathletik = helper.make_boolean() sport_kampfsport = helper.make_boolean() sport_motorsport = helper.make_boolean() sport_tanzsport = helper.make_boolean() sport_nosport = helper.make_boolean() # Music music_klassik = helper.make_boolean() music_deutsche = helper.make_boolean() music_pop = helper.make_boolean() music_rap = helper.make_boolean() music_rock = helper.make_boolean() music_reggae = helper.make_boolean() music_jazz = helper.make_boolean() music_electronic = helper.make_boolean() # Film film_krimi = helper.make_boolean() film_horror = helper.make_boolean() film_romantik = helper.make_boolean() film_action = helper.make_boolean() film_komoedie = helper.make_boolean() film_scifi = helper.make_boolean() film_dokus = helper.make_boolean() film_animation = helper.make_boolean() # Urlaub urlaub_meer = helper.make_boolean() urlaub_bergen = helper.make_boolean() urlaub_stadt = helper.make_boolean() urlaub_party = helper.make_boolean() urlaub_abenteuerlich = helper.make_boolean() urlaub_all_incl = helper.make_boolean() urlaub_fernweh = helper.make_boolean() urlaub_haus = helper.make_boolean() # Eigenschaften eigenschaft_karrierebewusst = helper.make_boolean() eigenschaft_kinderlieb = helper.make_boolean() eigenschaft_sportlich = helper.make_boolean() eigenschaft_zuruckhaltend = helper.make_boolean() eigenschaft_sparsam = helper.make_boolean() eigenschaft_warmherzig = helper.make_boolean() eigenschaft_zuverlassig = helper.make_boolean() eigenschaft_humorvoll = helper.make_boolean() # Denken denken_spass = helper.make_boolean() denken_gute_laune = helper.make_boolean() denken_ernsthaft = helper.make_boolean() denken_vertraeumt = helper.make_boolean() denken_sachlich = helper.make_boolean() denken_loesungsorientiert = helper.make_boolean() denken_ruhe = helper.make_boolean() denken_lebhaft = helper.make_boolean() # Wichtigsten wichtig_freundschaft = helper.make_boolean() wichtig_liebe = helper.make_boolean() wichtig_ruhe = helper.make_boolean() wichtig_erfolg = helper.make_boolean() wichtig_menschen = helper.make_boolean() wichtig_soziale = helper.make_boolean() wichtig_selbstverwirklichung = helper.make_boolean() wichtig_partner = helper.make_boolean() ### religion_kath, religion_evang ,. Religion = helper.make_int( label=f"{C.RELIGION_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.RELIGION_CHOICES['choices']) ## diskussion_vernufgt Diskussion = helper.make_int( label=f"{C.DISKUSSION_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.DISKUSSION_CHOICES['choices'] ) Vertrauen = helper.make_int(label=f"{C.VERTRAUEN_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.VERTRAUEN_CHOICES['choices']) Privat = helper.make_int( label=f"{C.PRIVAT_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.PRIVAT_CHOICES['choices']) Widerspruch = helper.make_int( label=f"{C.WIDERSPRUCH_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.WIDERSPRUCH_CHOICES['choices']) Impuls = helper.make_int( label=f"{C.IMPULS_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.IMPULS_CHOICES['choices']) Kraenkung = helper.make_int( label=f"{C.KRAENKUNG_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.KRAENKUNG_CHOICES['choices']) UeberVerhaeltnisse = helper.make_int( label=f"{C.UEBERVERHAELTNISSE_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.UEBERVERHAELTNISSE_CHOICES['choices']) Rache = helper.make_int( label=f"{C.RACHE_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.RACHE_CHOICES['choices']) Banane = helper.make_int( label=f"{C.BANANE_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.BANANE_CHOICES['choices']) Wohnhaus = helper.make_int( label=f"{C.WOHNHAUS_LABEL} (Es kann eine Antwort ausgewählt werden)

", choices=C.WOHNHAUS_CHOICES['choices']) Geschlecht = models.StringField(label="Was ist Ihr Geschlecht?

", choices=C.GESCHLECHT_CHOICES['choices']) Geburtsjahr = models.StringField(label="In welchem Jahr sind Sie geboren?

", choices=C.GEBURTSJAHR_CHOICES['choices'], widget=None ) # add str(year) falls benötigt Studienfeld = models.StringField(label="Was ist Ihr Studienfeld?

", blank=False) # choices=C.STUDIENFELD_CHOICES) Studiengang = models.StringField(label="Was ist Ihr Studiengang?

", blank=False) # , choices=C.STUDIENGANG_CHOICES) Herkunftsland = models.CharField(label="In welchem Land sind Sie geboren?

", choices=helper.get_countries(), verbose='Land', initial='Deutschland') Wohnort = models.CharField(label="In welcher Stadt leben Sie aktuell?

", choices=helper.get_cities(), verbose='Stadt', initial='Paderborn') # wie ähnlich sich Transaktionspartner sehen PerceivedSimilarity_Partner = 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"], ]) Liking_Partner = 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"], ]) Proximity_Partner = 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"], ]) ### Session Creation def creating_session(subsession: Subsession): if 'treatment' in subsession.session.config: subsession.TREATMENT = subsession.session.config['treatment'] if 'type_of_sevens' in subsession.session.config: subsession.TYPE_OF_SEVENS = subsession.session.config['type_of_sevens'] if 'skip_questionaire' in subsession.session.config: subsession.SKIP_QUESTIONAIRE = subsession.session.config['skip_questionaire'] if 'skip_test_rounds' in subsession.session.config: subsession.SKIP_TEST_ROUNDS = subsession.session.config['skip_test_rounds'] if 'show_providers_performance_average' in subsession.session.config: subsession.SHOW_PROVIDERS_PERFORMANCE_AVERAGE = subsession.session.config['show_providers_performance_average'] if subsession.TREATMENT == 'social_interaction': subsession.SOCIAL_INTERACTION = True else: subsession.SOCIAL_INTERACTION = False if subsession.TYPE_OF_SEVENS == 'old': subsession.OLD_SEVENS = True if subsession.round_number == 1: for player in subsession.get_players(): helper.generate_order_for_tasks(player, len(C.ANALOGY_LIST), len(C.NUM_SEQUENCE_LIST)) player.participant.total_points_test = 0 swap = C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS + C.CHANGE_ORDER_ROUNDS # ## Order for NumSeq & Analogy if subsession.round_number == 1: for player in subsession.get_players(): helper.generate_order_for_tasks(player, len(C.ANALOGY_LIST), len(C.NUM_SEQUENCE_LIST)) ## Debug Prints for Sessionvariables if settings.DEBUG: pass # PAGES class Welcome_Page(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instruktionen(Page): timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player: Player): return player.round_number == 1 @staticmethod def get_timeout_seconds(player): return C.INSTRUCTION_READ_TIME @staticmethod def vars_for_template(player: Player): show_up = 3.50 if player.subsession.SOCIAL_INTERACTION: show_up=4.00 return dict( showup=show_up ) class Questionaire_Introtext(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Persoenlichkeit(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Hobbies(Page): form_model = 'player' form_fields = ['Hobbies'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.HOBBY_LABEL, antwort_moeglichkeiten=3, nummer=1, cat=C.Hobbies ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Hobbies) @staticmethod def error_message(player, values): return helper.error_message(C.Hobbies, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Sport(Page): form_model = 'player' form_fields = ['Sports'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.SPORT_LABEL, antwort_moeglichkeiten=3, nummer=2, cat=C.Sports ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Sports) @staticmethod def error_message(player, values): return helper.error_message(C.Sports, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Musik(Page): form_model = 'player' form_fields = ['Music'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.MUSIC_LABEL, antwort_moeglichkeiten=3, nummer=3, cat=C.Music ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Music) @staticmethod def error_message(player, values): return helper.error_message(C.Music, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Film(Page): form_model = 'player' form_fields = ['Film'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.FILM_LABEL, antwort_moeglichkeiten=3, nummer=4, cat=C.Film ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Film) @staticmethod def error_message(player, values): return helper.error_message(C.Film, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Urlaub(Page): form_model = 'player' form_fields = ['Urlaub'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.URLAUB_LABEL, antwort_moeglichkeiten=3, nummer=5, cat=C.Urlaub ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Urlaub) @staticmethod def error_message(player, values): return helper.error_message(C.Urlaub, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Eigenschaften(Page): form_model = 'player' form_fields = ['Eigenschaften'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.EIGENSCHAFT_LABEL, antwort_moeglichkeiten=3, nummer=6, cat=C.Eigenschaften ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Eigenschaften) @staticmethod def error_message(player, values): return helper.error_message(C.Eigenschaften, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Denken(Page): form_model = 'player' form_fields = ['Denken'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.DENKEN_LABEL, antwort_moeglichkeiten=3, nummer=7, cat=C.Denken ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Denken) @staticmethod def error_message(player, values): return helper.error_message(C.Denken, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Wichtigste(Page): form_model = 'player' form_fields = ['Wichtigste'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire.html' @staticmethod def vars_for_template(player: Player): return dict( frage=C.WICHTIG_LABEL, antwort_moeglichkeiten=3, nummer=8, cat=C.Wichtigsten ) @staticmethod def get_form_fields(player: Player): return helper.get_form_fields(C.Wichtigsten) @staticmethod def error_message(player, values): return helper.error_message(C.Wichtigsten, values, 1, 3) ## HIER BITTE DAS MAX MIT EINTRAGEN @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Religion(Page): form_model = 'player' form_fields = ['Religion'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=9 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Diskussion(Page): form_model = 'player' form_fields = ['Diskussion'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=10 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Vertrauen(Page): form_model = 'player' form_fields = ['Vertrauen'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=11 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Privat(Page): form_model = 'player' form_fields = ['Privat'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=12 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Widerspruch(Page): form_model = 'player' form_fields = ['Widerspruch'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=13 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Impuls(Page): form_model = 'player' form_fields = ['Impuls'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=14 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Kraenkung(Page): form_model = 'player' form_fields = ['Kraenkung'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=15 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_UeberVerhaeltnisse(Page): form_model = 'player' form_fields = ['UeberVerhaeltnisse'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=16 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Rache(Page): form_model = 'player' form_fields = ['Rache'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=17 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Banane(Page): form_model = 'player' form_fields = ['Banane'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=18 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Wohnhaus(Page): form_model = 'player' form_fields = ['Wohnhaus'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=19 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Geschlecht(Page): form_model = 'player' form_fields = ['Geschlecht'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=20 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Geburtstjahr(Page): form_model = 'player' form_fields = ['Geburtsjahr'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=21 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Studium(Page): form_model = 'player' form_fields = ['Studienfeld', 'Studiengang'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Studienfeld.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=22, studienfeld=C.STUDIENFELD_CHOICES, studiengang=C.STUDIENGANG_CHOICES ) @staticmethod def js_vars(player): return dict( studiengang_text="Bitte wählen Sie Ihren Studiengang", studiengang=C.STUDIENGANG_CHOICES, studienfeld=C.STUDIENFELD_CHOICES ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Herkunftsland(Page): form_model = 'player' form_fields = ['Herkunftsland'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=23 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Frage_Wohnort(Page): form_model = 'player' form_fields = ['Wohnort'] ## Hier und in Form Fields ändern template_name = 'social_proximity_single_session/Questionaire-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=24 ) @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class Questionaire_Endtext(Page): @staticmethod def is_displayed(player): return player.round_number == 1 and not player.subsession.SKIP_QUESTIONAIRE class FragebogenEnde(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def vars_for_template(player: Player): body_text = 'Bitte warten Sie, bis alle Teilnehmer den Fragebogen beendet haben.' return dict(body_text=body_text) @staticmethod def after_all_players_arrive(subsession): if subsession.SKIP_QUESTIONAIRE and subsession.round_number == 1: helper.set_random_answers(subsession.get_players()) ## evtl hier die Daten aus der vorrunde für alle holen for player in subsession.get_players(): player.participant.social_proximity_list = helper.generate_subject_vector(player) #### FRAGEBOGEN VORBEI class Instruktionen2(Page): timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): return player.round_number == C.TEST_ROUNDS + 1 @staticmethod def vars_for_template(player: Player): return dict(numroundsPart2=C.NUM_ROUNDS - C.TEST_ROUNDS, round_marketinteraction=C.TEST_ROUNDS + 1, social_treatment=player.subsession.SOCIAL_INTERACTION ) @staticmethod def get_timeout_seconds(player): return C.INSTRUCTION2_READ_TIME class RoleAssignmentInfo(Page): @staticmethod def is_displayed(player): return player.round_number == C.TEST_ROUNDS + 1 @staticmethod def vars_for_template(player: Player): return dict(round_display=player.round_number - C.TEST_ROUNDS) class RoleAllocation(WaitPage): #### PASSIERT GENAU 1 mal - Übernahme? wait_for_all_groups = True @staticmethod def is_displayed(player: Player): if player.round_number > C.TEST_ROUNDS + 2: ## ab der Runde nach dem zeigen player.customer = player.in_round(player.round_number - 1).customer return player.round_number == C.TEST_ROUNDS + 1 @staticmethod def after_all_players_arrive(subsession: Subsession): ### TODO: Check if you come in here if not displayed small = False seller_order = C.SELLER_ORDER ## nur das erste mal if subsession.session.num_participants != 6: ## hier für alle einmal die Zuordnung machen customer, seller = helper.role_assignment(subsession, "Anbieter", "Kunde") else: seller_order = [2, 1, 0] small = True customer, seller = helper.role_assignment_small(subsession, "Anbieter", "Kunde") # C.SELLER_ORDER seller_part = [player.id_in_group for player in seller] customer_part = [player.id_in_group for player in customer] subsession.set_group_matrix(helper.matching(customer, seller, seller_order, small)) subsession.session.social_proximity_anbieter = seller_part subsession.session.social_proximity_kunde = customer_part class RoleAssignmentResult(Page): @staticmethod def vars_for_template(player: Player): player_customer = True player_name = "Kunden" player.participant.vars['sp_playertype'] = 'customer' if player.type > 0: # Spieler ist vom Typ Anbieter player_customer = False player_name = "Anbieters" player.participant.vars['sp_playertype'] = 'seller' return dict( player_customer=player_customer, role_label=player.tag, player_name=player_name ) @staticmethod def is_displayed(player: Player): return player.round_number == C.TEST_ROUNDS + 1 class InfoTransaktionZuteilung(Page): @staticmethod def vars_for_template(player: Player): if player.round_number > C.TEST_ROUNDS + 1: ## ab dem 2ten ### hol mir die Daten: player_round_before = player.in_round(player.round_number - 1) player.type = player_round_before.type player.customer = player_round_before.customer player_customer = True role = 'Anbieters' if player.type > 0: # Spieler ist vom Typ Anbieter player_customer = False role = 'Kunden' # Runde 1+2 oder mehr als Runde 3 market_interaction = False if player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS: market_interaction = True return dict( player_customer=player_customer, market_interaction=market_interaction, round_display=player.round_number - C.TEST_ROUNDS, role=role ) @staticmethod def is_displayed(player: Player): return player.round_number > C.TEST_ROUNDS class MarketInteractionGroupMatrix(WaitPage): wait_for_all_groups = True body_text = "Bitte warten Sie auf alle Teilnehmer." @staticmethod def is_displayed(player): return player.round_number > C.START_MARKET_INTERACTION @staticmethod def after_all_players_arrive(subsession): swap = C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS + C.CHANGE_ORDER_ROUNDS small = False ## Wenns hier knallt , dann [2,0,1] oder ähnlioch für die seller order einfügen, dann läuft es weiter seller_order = C.SELLER_ORDER_SWAP if subsession.round_number >= swap else C.SELLER_ORDER if len(subsession.get_players()) == 6: seller_order = [2, 1, 0] random.shuffle(seller_order) small = True subsession.set_group_matrix( helper.matching( subsession.session.social_proximity_kunde, subsession.session.social_proximity_anbieter, seller_order, small ) ) #### Setze hier Gruppenweit die seller_first, second, third for group in subsession.get_groups(): group.seller_first, group.seller_second, group.seller_third = helper.create_group_seller_order(group) class MarketInteraction(Page): form_model = 'player' form_fields = ['market_interaction_choice_1', 'market_interaction_choice_2', 'market_interaction_choice_3'] @staticmethod def is_displayed(player): return player.round_number > C.START_MARKET_INTERACTION and player.type == 0 ## oder customer -- zu testen @staticmethod def vars_for_template(player): first_before, second_before, third_before = (player.group.seller_first, player.group.seller_second, player.group.seller_third) (first, second, third), performance = helper.get_market_interaction_data(player.group, player.round_number) player.performance_info_group = performance player.group.seller_first = first.id_in_group player.group.seller_second = second.id_in_group player.group.seller_third = third.id_in_group player.avg_rating = player.in_round(player.round_number - 1).avg_rating return dict( round_display=player.round_number - C.TEST_ROUNDS, ### falls du die Spieler da anzeigen willst seller_1=first.avg_rating, seller_2=second.avg_rating, seller_3=third.avg_rating, seller_1_label="X", seller_2_label="Y", seller_3_label="Z", group_average=performance # ) @staticmethod def before_next_page(player, timeout_happened): input_customer = [player.market_interaction_choice_1, player.market_interaction_choice_2, player.market_interaction_choice_3] input_x = ( player.market_interaction_choice_1, player.market_interaction_choice_2, player.market_interaction_choice_3) if settings.DEBUG and input_x in [(-1, -1, -1), (0, 0, 0)]: player.market_interaction_choice_1, player.market_interaction_choice_2, player.market_interaction_choice_3 = 1, 2, 3 if set(input_customer) != set([1, 2, 3]): return "Ihre Präferenzangaben sind fehlerhaft. Bitte weisen Sie jedem Anbieter genau einen Präferenzrang zu." class MarketInteractionWaitPage(WaitPage): wait_for_all_groups = True body_text = "Bitte warten Sie, bis die Kunden ihre Anbieterpräferenzen abgegeben haben." @staticmethod def is_displayed(player): return player.round_number > C.START_MARKET_INTERACTION @staticmethod def after_all_players_arrive(subsession): helper.one_to_one_matching_after_vote( subsession ) class MarketInteractionResultAndConfirmation(Page): # Todo: Textanpassen wenn ich kein Mitspieler hab form_model = 'player' form_fields = ['play_together'] @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS and player.customer @staticmethod def vars_for_template(player): return dict( anbieter_match=player.match_letter, preference=player.matched_pref, round_display=player.round_number - C.TEST_ROUNDS ) @staticmethod def before_next_page(player, timeout_happened): if player.match == -1: player.play_together = False else: player.group.get_player_by_id(player.match).play_together = player.play_together class GroupPerformanceWaitPage(WaitPage): body_text = "Bitte warten Sie auf die anderen Teilnehmer." wait_for_all_groups = True @staticmethod def is_displayed(player): return player.round_number > C.START_ONE_TO_ONE @staticmethod def after_all_players_arrive(subsession): players = subsession.get_players() for player in players: player_before = player.in_round(C.TEST_ROUNDS + 1) player.tag = player_before.tag player.customer = player_before.customer player.type = player_before.type if subsession.round_number == 4 and len(players) != 6: ### machen wir gerade nochmal so @ Behnud subsession.set_group_matrix( helper.get_group_before(players)) for group in subsession.get_groups(): performance = helper.generate_performance_info_group(group) for player in group.get_players(): player.performance_info_group = performance class OneToOneMatching(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player): return player.round_number > C.START_ONE_TO_ONE and player.round_number <= C.START_MARKET_INTERACTION @staticmethod def after_all_players_arrive(subsession): for i, group in enumerate(subsession.get_groups()): for player in group.get_players(): player.group_before_one_to_one_matching = i + 1 ##wenns knallt hier, dann auskommentieren second_time = subsession.round_number == C.START_MARKET_INTERACTION subsession.set_group_matrix( helper.one_to_one_matching( # subsession.session.social_proximity_kunde, subsession.session.social_proximity_anbieter, subsession.get_players(), second_time ) ) class OneToOneMatchingResult(Page): @staticmethod def is_displayed(player): return player.round_number > C.START_ONE_TO_ONE and player.round_number <= C.START_MARKET_INTERACTION @staticmethod def vars_for_template(player): player_customer = True if player.type > 0: # Spieler ist vom Typ Anbieter player_customer = False return dict( player_customer=player_customer, group_average=player.performance_info_group, round_display=player.round_number - C.TEST_ROUNDS, play_together=player.play_together ) class TransactionDecisionKunde(Page): ## Anzeige Kunde &/ Anbieter ja oder nein Transaktion ## Info abgespielt & Payoff setzen & ===> wenn das nein ist müssen die ANzeigen danach übersprungen werden @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS @staticmethod def vars_for_template(player): player_customer = True if player.type > 0: # Spieler ist vom Typ Anbieter player_customer = False return dict( player_customer=player_customer, social_treatment=player.subsession.SOCIAL_INTERACTION, round_display=player.round_number - C.TEST_ROUNDS ) class CalculateSimilarity(WaitPage): @staticmethod def is_displayed(player): return player.round_number == 5 @staticmethod def after_all_players_arrive(group): for player in group.get_players(): # if player.id_in_group == 3: other_players = [p for p in player.group.subsession.get_players() if p.participant.id != player.id_in_subsession and p.customer != player.customer] ### Untescheidung bin ich kunde - dann alle Verkäufer aufsummiert / anzahl #### Verkäufer - dann alle Kunden aufsummiert / anzahl player.similarity_avg = helper.avg_similarities(player, opp_group=other_players) class Similarity(Page): @staticmethod def js_vars(player): combined_answers = helper.show_similarity(player, player.group.get_player_by_id(player.match)) # samebinary, samemultiple = helper.show_similarity(player, player.group.get_player_by_id(player.match)) field_labels = helper.field_labels eg_dict = [ dict(name='Religion', label=C.RELIGION_LABEL), dict(name='Diskussion', label=C.DISKUSSION_LABEL), dict(name='Vertrauen', label=C.VERTRAUEN_LABEL), dict(name='Privat', label=C.PRIVAT_LABEL), ] vr_dict = [ dict(name='Widerspruch', label=C.WIDERSPRUCH_LABEL), dict(name='Impuls', label=C.IMPULS_LABEL), dict(name='Kraenkung', label=C.KRAENKUNG_LABEL), dict(name='UeberVerhaeltnisse', label=C.UEBERVERHAELTNISSE_LABEL), dict(name='Rache', label=C.RACHE_LABEL), dict(name='Banane', label=C.BANANE_LABEL), dict(name='Wohnhaus', label=C.WOHNHAUS_LABEL) ] so_dict = [ dict(name='Geschlecht', label='Geschlecht'), dict(name='Geburtsjahr', label='Geburtsjahr'), dict(name='Studienfeld', label='Studienfeld'), dict(name='Studiengang', label='Studiengang'), dict(name='Herkunftsland', label='Herkunftsland'), dict(name='Wohnort', label='Wohnort'), ## todo: check ob das angezeigt wird ] question_groups = dict( ismfu=C.Hobbies + C.Sports + C.Music + C.Film + C.Urlaub, ### diese besonders behandeln eg=eg_dict + C.Eigenschaften + C.Denken + C.Wichtigsten, so=so_dict, vr=vr_dict, ) header_labels = dict( hobbies=C.HOBBY_LABEL, sport=C.SPORT_LABEL, music=C.MUSIC_LABEL, film=C.FILM_LABEL, urlaub=C.URLAUB_LABEL, eigenschaft=C.EIGENSCHAFT_LABEL, denken=C.DENKEN_LABEL, wichtig=C.WICHTIG_LABEL, ) besonderen = dict( eg='Eigenschaften, Ansichten und Werte', vr='Verhaltensweisen und Reaktionen', so='Soziodemographische Merkmale', ismfu='Interessen, Sport, Musik, Film u. Urlaubsziel' ) ### todo: in Variable speichern , sonst passiert das jedesmal studienfelder = {'name': 'Studienfeld', 'choices': [[field, field] for field in C.STUDIENFELD_CHOICES]} studiengaenge = { 'name': 'Studiengang', 'choices': [[sg, sg] for category in C.STUDIENGANG_CHOICES.values() for sg in category] } ### Todo: pcds : lies die dateien ein (bzw die Felder aus und bau dict(name=Herkunftsland, choices="entries") singular_data_choices = [C.RELIGION_CHOICES, C.DISKUSSION_CHOICES, C.VERTRAUEN_CHOICES, C.PRIVAT_CHOICES, C.WIDERSPRUCH_CHOICES, C.IMPULS_CHOICES, C.KRAENKUNG_CHOICES, C.UEBERVERHAELTNISSE_CHOICES, C.RACHE_CHOICES, C.BANANE_CHOICES, C.WOHNHAUS_CHOICES, C.GESCHLECHT_CHOICES, C.GEBURTSJAHR_CHOICES, studienfelder, studiengaenge] tabs_data = helper.prepare_similarity_data_for_js(combined_answers.tolist(), question_groups, header_labels, besonderen, player, singular_data_choices, C.KEINE_UEBEREINSTIMMUNG) return dict( combined_answers=combined_answers.tolist(), # +(samebinary+samemultiple).tolist(), tabs_data=tabs_data, field_labels=field_labels, all_tags=C.Hobbies + C.Sports + C.Eigenschaften + C.Music + C.Film + C.Urlaub + C.Denken + C.Wichtigsten, not_found=C.KEINE_UEBEREINSTIMMUNG, header_tags=[C.HOBBY_LABEL, C.SPORT_LABEL, C.EIGENSCHAFT_LABEL, C.MUSIC_LABEL, C.FILM_LABEL, C.URLAUB_LABEL, C.DENKEN_LABEL, C.WICHTIG_LABEL, ## mehrfachfragen C.RELIGION_LABEL, C.DISKUSSION_LABEL, C.VERTRAUEN_LABEL, C.PRIVAT_LABEL, C.WIDERSPRUCH_LABEL, C.IMPULS_LABEL, C.KRAENKUNG_LABEL, C.UEBERVERHAELTNISSE_LABEL, C.RACHE_LABEL, C.BANANE_LABEL, C.WOHNHAUS_LABEL], ) pass @staticmethod def is_displayed(player: Player): return player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS and player.subsession.SOCIAL_INTERACTION and player.play_together @staticmethod def vars_for_template(player): round = player.round_number - C.TEST_ROUNDS score = helper.count_similarities(player, player.group.get_player_by_id(player.match)) if player.round_number != 5: player.similarity_avg = player.in_round(5).similarity_avg above_avg = score >= player.similarity_avg ## Extra speichern für Behnud player.score = score player.above_avg = above_avg return dict( score=score, type="Überdurchschnittlich" if above_avg else "unterdurchschnittlich", round_display=round, social_proximity_score=player.similarity_avg, # Anzahl an Gemeinsamkeiten mit anderen Transaktionspartnern above_average=above_avg # ob man mit jetzigem Transaktionsparner über- und unterdurchschnittliche viele Gemeinsamkeiten hat ) class PerceivedSimilarity(Page): form_model = 'player' form_fields = ['PerceivedSimilarity_Partner', 'Liking_Partner', 'Proximity_Partner' ] @staticmethod def is_displayed(player: Player): return player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS and player.subsession.SOCIAL_INTERACTION and player.play_together @staticmethod def vars_for_template(player: Player): return dict(round_display=player.round_number - C.TEST_ROUNDS) class TaskSelectionEstimationKunde(Page): form_model = 'player' form_fields = ['type_of_task', 'estimated_points'] @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS and player.type == 0 and player.play_together ##nur kunden und transaktion akzeptiert @staticmethod def vars_for_template(player): return dict( round_display=player.round_number - C.TEST_ROUNDS ) class BeginTasks(Page): # TODO BeginTasks Seite soll selbst auch einen Timer haben, der höchstens 30 Sekunden aktiv ist. Dann bräuchten wir die Seite CountdownTask nicht mehr. @staticmethod def is_displayed(player: Player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: # Kunde der keine Aufgabe macht, soll die Seite auch überspringen not_skip = True if player.type == 0 and player.type_of_task == 1: # spieler ist vom Typ Kunde und keine eigene Aufgabenbearbeitung not_skip = False return (player.play_together and not_skip) or player.round_number <= C.TEST_ROUNDS @staticmethod def vars_for_template(player: Player): first_round = player.round_number == 1 if first_round: wait_time = int(player.participant.id_in_session) + 40 # P1: 41 seconds, P24: 64 seconds else: wait_time = 0 round_display = player.round_number - C.TEST_ROUNDS if player.round_number <= C.TEST_ROUNDS: round_display = player.round_number return dict(round_display=round_display, round_text=("Teil 1 - " if player.round_number < 3 else "") + "Runde " + str(round_display), first_round=first_round, wait_time=wait_time ) @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant ## Timer auf participant Field hinzufügen if player.round_number > C.START_ONE_TO_ONE and player.type == 0: if player.type_of_task == 2: # Typ A 7er zählen participant.sp_task_timer = time.time() + C.TIMER_TASK_CUSTOMER_TASK_A else: # Typ B Aufgaben zählen participant.sp_task_timer = time.time() + C.TIMER_TASK_CUSTOMER_TASK_B else: participant.sp_task_timer = time.time() + C.TIMER_TASK # 60 * C.TIMER_MINUTES ## player.stage_reached = 1 ## Todo: Berechnet für Spieler welche "runde" er ist @staticmethod def js_vars(player: Player): wait_time = int(player.participant.id_in_session) + 40 # P1: 41 seconds, P24: 64 seconds return dict(wait_time=wait_time) class CountdownTask(Page): @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS @staticmethod def vars_for_template(player: Player): return dict(round_from=player.round_number - C.TEST_ROUNDS, round_to=player.round_number - C.NUM_ROUNDS) ## TIMER für X Sekunden class CountSevensText(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num'] timer_text = C.TIMER_TEXT_TASK # @staticmethod # def vars_for_template(player: Player): # numbers, solution = helper.seven_old_generator() # player.solution_7num = solution # return dict( # Numbers=numbers, # solution=player.solution_7num, # cheat=settings.DEBUG, # round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS # ) @staticmethod def vars_for_template(player: Player): generated_task = tasks_image_generator.count_seven_generator() numbers = generated_task['numbers'] solution = generated_task['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(numbers, is_7er_task=True)) player.solution_7num = solution return dict( Numbers=numbers, solution=player.solution_7num, task_image=task_image, cheat=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS ) @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 1, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) ## todo: Wenn Kunde eine Aufgabe auswählt bekommt er doch wieder alle Aufgaben in abwechselnder Reihenfolge angezeigt. Soll aber nur die Aufgabe angezeigt bekommen, die er bekommen hat. Wahrscheinlich wird die formfield 'type_of_task' nicht richtig ausgewertet return show_screen and player.subsession.OLD_SEVENS ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() @staticmethod def before_next_page(player: Player, timeout_happened): player.points_count_seven_1 = helper.delta_number_count(player.count_7num, player.solution_7num) player.stage_reached += 1 class CountSevensPicture(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 1, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and not player.subsession.OLD_SEVENS ## Runde hinzufügen ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() @staticmethod def before_next_page(player: Player, timeout_happened): player.stage_reached += 1 class Analogy(Page): form_model = 'player' form_fields = ['response_games'] timer_text = C.TIMER_TEXT_TASK template_name = 'social_proximity_single_session/Analogy.html' @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 2, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) ## todo: Wenn Kunde eine Aufgabe auswählt bekommt er doch wieder alle Aufgaben in abwechselnder Reihenfolge angezeigt. Soll aber nur die Aufgabe angezeigt bekommen, die er bekommen hat. Wahrscheinlich wird die formfield 'type_of_task' nicht richtig ausgewertet return show_screen @staticmethod def vars_for_template(player): analogy_for_image = C.ANALOGY_LIST[helper.get_number_for_player(player, stage=1)] question = analogy_for_image['question'] solution = analogy_for_image['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(question, is_7er_task=False)) return dict( DEBUG=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS, task_image=task_image, solution=solution ) @staticmethod def js_vars(player): ## todo: Runden anpassen analogy = C.ANALOGY_LIST[helper.get_number_for_player(player, stage=1)] return dict( analogy=analogy # analogy=vars(analogy) ) @staticmethod def before_next_page(player, timeout_happened): game_object = C.ANALOGY_LIST[helper.get_number_for_player(player, stage=1)] answer = helper.check_for_correct_answer(player, game_object, player.response_games) player.points_analogy_1 = answer * C.ANALOGY_POINTS ##todo: nimm das wieder raus, ist falsch hier player.points_analogy += player.points_analogy_1 player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant ## Sonderfall Customer 25 Sekunden (Constants) return participant.sp_task_timer - time.time() class CountSevensText2(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num2'] timer_text = C.TIMER_TEXT_TASK # @staticmethod # def vars_for_template(player: Player): # numbers, solution = helper.seven_old_generator() # player.solution_7num = solution # return dict( # Numbers=numbers, # solution=player.solution_7num, # cheat=settings.DEBUG, # round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS # ) @staticmethod def vars_for_template(player: Player): generated_task = tasks_image_generator.count_seven_generator() numbers = generated_task['numbers'] solution = generated_task['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(numbers, is_7er_task=True)) player.solution_7num = solution return dict( Numbers=numbers, solution=player.solution_7num, task_image=task_image, cheat=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS ) @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 3, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and player.subsession.OLD_SEVENS @staticmethod def before_next_page(player: Player, timeout_happened): player.points_count_seven_2 = helper.delta_number_count(player.count_7num2, player.solution_7num) player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class CountSevensPicture2(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT_TASK @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 3, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and not player.subsession.OLD_SEVENS ## Runde hinzufügen ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() @staticmethod def before_next_page(player: Player, timeout_happened): player.stage_reached += 1 class Sequence(Page): form_model = 'player' form_fields = ['response_games'] template_name = 'social_proximity_single_session/Sequence.html' timer_text = C.TIMER_TEXT_TASK @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 4, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() @staticmethod def js_vars(player: Player): sequence = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, stage=1)] return dict( number_sequence=sequence, ) @staticmethod def vars_for_template(player: Player): sequence_for_image = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, stage=1)] question = sequence_for_image['question'] solution = sequence_for_image['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(question, is_7er_task=False)) return dict( DEBUG=settings.DEBUG, # False ## Beispiel für Testrunde todo behnud "Testrunde "+player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS, task_image=task_image, solution=solution ) @staticmethod def before_next_page(player, timeout_happened): ### game object hier auf answer chekcen ''' game_object = C.NUM_SEQUENCE_LIST[get_number_for_player(player=player, customer=True, stage=1)] answer = check_for_correct_answer(player, game_object, player.response_games) ## todo: Behnud : reicht hier die summe als punkte oder willst du beide print('richtige Antwort ? ', answer) player.points_number_seq += answer * C.NUMBER_SEQ_POINTS player.response_games = '' # leer machen ''' game_object = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, stage=1)] answer = helper.check_for_correct_answer(player, game_object, player.response_games) player.stage_reached += 1 player.points_num_seq_1 = answer * C.ANALOGY_POINTS ##todo: nimm das wieder raus, ist falsch hier player.points_num_seq += player.points_num_seq_1 class CountSevensText3(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num3'] timer_text = C.TIMER_TEXT_TASK # @staticmethod # def vars_for_template(player: Player): # numbers, solution = helper.seven_old_generator() # player.solution_7num = solution # return dict( # Numbers=numbers, # solution=player.solution_7num, # cheat=settings.DEBUG, # round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS # ) @staticmethod def vars_for_template(player: Player): generated_task = tasks_image_generator.count_seven_generator() numbers = generated_task['numbers'] solution = generated_task['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(numbers, is_7er_task=True)) player.solution_7num = solution return dict( Numbers=numbers, solution=player.solution_7num, task_image=task_image, cheat=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS ) @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 5, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and player.subsession.OLD_SEVENS # Runde hinzufügen @staticmethod def before_next_page(player: Player, timeout_happened): player.points_count_seven_3 = helper.delta_number_count(player.count_7num3, player.solution_7num) player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class CountSevensPicture3(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT_TASK @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 5, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and not player.subsession.OLD_SEVENS ## Runde hinzufügen @staticmethod def before_next_page(player: Player, timeout_happened): player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class Analogy2(Page): form_model = 'player' form_fields = ['response_games'] timer_text = C.TIMER_TEXT_TASK template_name = 'social_proximity_single_session/Analogy.html' @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 6, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen @staticmethod def vars_for_template(player): analogy_for_image = C.ANALOGY_LIST[helper.get_number_for_player(player, stage=2)] question = analogy_for_image['question'] solution = analogy_for_image['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(question, is_7er_task=False)) return dict( DEBUG=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS, task_image=task_image, solution=solution ) @staticmethod def js_vars(player): ## todo: Runden anpassen analogy = C.ANALOGY_LIST[helper.get_number_for_player(player, 2)] return dict( analogy=analogy # analogy=vars(analogy) ) @staticmethod def before_next_page(player, timeout_happened): game_object = C.ANALOGY_LIST[helper.get_number_for_player(player, stage=2)] answer = helper.check_for_correct_answer(player, game_object, player.response_games) player.points_analogy_2 = answer * C.ANALOGY_POINTS player.points_analogy += player.points_analogy_2 player.response_games = '' # leer machen player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class CountSevensText4(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num4'] timer_text = C.TIMER_TEXT_TASK # @staticmethod # def vars_for_template(player: Player): # numbers, solution = helper.seven_old_generator() # player.solution_7num = solution # return dict( # Numbers=numbers, # solution=player.solution_7num, # cheat=settings.DEBUG, # round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS # ) @staticmethod def vars_for_template(player: Player): generated_task = tasks_image_generator.count_seven_generator() numbers = generated_task['numbers'] solution = generated_task['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(numbers, is_7er_task=True)) player.solution_7num = solution return dict( Numbers=numbers, solution=player.solution_7num, task_image=task_image, cheat=settings.DEBUG, round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS ) @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 7, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and player.subsession.OLD_SEVENS # Runde hinzufügen @staticmethod def before_next_page(player: Player, timeout_happened): player.points_count_seven_4 = helper.delta_number_count(player.count_7num4, player.solution_7num) player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class CountSevensPicture4(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT_TASK @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 7, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen and not player.subsession.OLD_SEVENS ## Runde hinzufügen @staticmethod def before_next_page(player: Player, timeout_happened): player.stage_reached += 1 ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() class Sequence2(Page): form_model = 'player' form_fields = ['response_games'] timer_text = C.TIMER_TEXT_TASK template_name = 'social_proximity_single_session/Sequence.html' @staticmethod def is_displayed(player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: return False else: show_screen = helper.get_boolean_for_tasks(player.customer, 8, player.round_number, player.type_of_task, player.play_together, test_round=C.TEST_ROUNDS) return show_screen ## Benutz den gleichen Timer über alle Aufgaben @staticmethod def get_timeout_seconds(player: Player): participant = player.participant return participant.sp_task_timer - time.time() @staticmethod def js_vars(player): ## todo: Runden anpassen num_seq = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, 2)] return dict( number_sequence=num_seq ) @staticmethod def vars_for_template(player: Player): sequence_for_image = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, stage=2)] question = sequence_for_image['question'] solution = sequence_for_image['solution'] task_image = tasks_image_generator.encode_image_to_base64( tasks_image_generator.generate_image(question, is_7er_task=False)) return dict( DEBUG=settings.DEBUG, # False ## Beispiel für Testrunde todo behnud "Testrunde "+player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS round_number=player.round_number if player.round_number <= C.TEST_ROUNDS else player.round_number - C.TEST_ROUNDS, task_image=task_image, solution=solution ) @staticmethod def before_next_page(player, timeout_happened): game_object = C.NUM_SEQUENCE_LIST[helper.get_number_for_player(player, stage=2)] answer = helper.check_for_correct_answer(player, game_object, player.response_games) player.points_num_seq_2 = answer * C.ANALOGY_POINTS ##todo: nimm das wieder raus, ist falsch hier player.points_num_seq += player.points_num_seq_2 player.stage_reached += 1 class TaskResult(Page): @staticmethod def is_displayed(player): return player.play_together or player.round_number <= C.TEST_ROUNDS ## überspringen wenn keine Transaktion zustandegekommen ist @staticmethod def vars_for_template(player: Player): if player.round_number <= C.TEST_ROUNDS and player.subsession.SKIP_TEST_ROUNDS: player.points_total = random.randint(5, 24) player.points_logic_task, player.points_analogy, player.points_num_seq = 0, 0, 0 else: player.points_total, player.points_logic_task, player.points_analogy, player.points_num_seq = helper.calc_points_round( player) round_display = player.round_number if round_display > C.TEST_ROUNDS: round_display = round_display - C.TEST_ROUNDS test_round_finished = player.round_number == C.TEST_ROUNDS if player.round_number <= C.TEST_ROUNDS: player.payoff = player.points_total # TODO Benötige den player.payoff von Runde 1 bis aktuell. Ist das so richtig? payoff_current = player.participant.payoff ### https://otree.readthedocs.io/en/latest/currency.html#payoffs sieht richtig aus return dict( points_reached=player.points_total, points_logic=player.points_logic_task, points_count_seven=player.points_total - player.points_logic_task, points_analogy=player.points_analogy, points_numseq=player.points_num_seq, round_display=round_display, test_round_finished=test_round_finished, payoff_current=int(payoff_current) ) @staticmethod def before_next_page(player, timeout_happened): if player.round_number <= C.TEST_ROUNDS: player.participant.total_points_test += player.points_total class TaskTestEnde(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player): return player.round_number == C.TEST_ROUNDS @staticmethod def vars_for_template(player: Player): body_text = 'Bitte warten Sie, bis alle Teilnehmer Teil 1 des Experiments beendet haben.' return dict(body_text=body_text) class ResultsWaitPage(WaitPage): ## TOdo: Behnud hier Text anpassen body_text = "Bitte warten Sie, bis die anderen Teilnehmer die Aufgabenbearbeitung abgeschlossen haben." @staticmethod def is_displayed(player: Player): return player.round_number > C.TEST_ROUNDS # and player.play_together # rausgenommen, damit man nach den Testrunden in WartePage kommt, und der Payoff auch für # die Nicht-Transaktionspartner richtig berechnet werden # return player.round_number >= C.TEST_ROUNDS + 1 @staticmethod def after_all_players_arrive(group): for player in group.get_players(): helper.calc_payoff_round(player=player, round=player.round_number, exchange_rate_anbieter=C.EXCHANGE_RATE_POINTS_TALER_ANBIETER, exch_rate_kunde_anbieter=C.EXCHANGE_RATE_POINTS_UTILITY_KUNDE_ANBIETERTASKS, exch_rate_kunde_owntask=C.EXCHANGE_RATE_POINTS_UTILITY_KUNDE_OWNTASKS, exch_rate_util=C.EXCHANGE_RATE_UTILITY_TALER, cost_util_fail_kunde=C.COSTS_UTILITY_FAIL_KUNDE_OWNTASKS, no_transact_payoff=C.NO_TRANSACTION_PAYMENT_TALER, bonus_pref_anbieter=C.BONUS_TALER_PREFERRED_ANBIETER, bonus_util_correct_interaction=C.BONUS_UTILITY_CORRECT_ESTIMATION, bound_estimation=C.BOUNDARY_ESTIMATION, max_points_kunde_owntasks=C.MAX_POINTS_KUNDE_OWNTASKS, start_market=C.START_MARKET_INTERACTION + 1 ## todo: lisa checkt das , aber das heißt nach runde 4 ) class TeamResult(Page): @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS and player.play_together ### TODO : SWieviel Punkte geschafft; Nutzen Anbieter; Nutzen Kunde;Estimation korrekt;Rundenauszahlung in Taler @staticmethod def vars_for_template(player: Player): player_customer = True if player.type > 0: # Spieler ist vom Typ Anbieter player_customer = False return dict( player_customer=player_customer, utility_seller=player.util_seller, ##bereinigungsaddition points_seller = round(player.util_seller/C.EXCHANGE_RATE_POINTS_UTILITY_KUNDE_ANBIETERTASKS, 2), # Nutzen: Punkte vom Anbieter * Nutzenumrechnungsfaktor vom Anbieter für Kunden utility_customer_self=player.util_customer, # Punkte vom Kunden * Nutzenumrechnungsfaktor vom Kunden utility_customer_forseller=player.utility_customer_forseller, # Nutzen oder Disnutzen den Kunden für Anbieter schafft estimation_customer=player.estimation_customer, # 0 oder 3 je nachdem ob Kunde Punktezahl vom Anbieter geschätzt hat payment_toseller=player.payment_toseller, # Lohn von Kunde an Anbieter: Punkte vom Anbieter*Talerumrechnungskurs für Anbieter bonus_most_preferred=player.bonus_most_preferred, # 0 oder 3 je nachdem ob Anbieter meistpräferierter Anbieter in Gruppe ist round_display=player.round_number - C.TEST_ROUNDS, market_interaction_round=player.round_number > C.TEST_ROUNDS + C.ONE_TO_ONE_ROUNDS, payoff_to_show=round(player.payoff_show_float, 2) ) # Transaktionspartner bewerten sich # TODO Abgabe der Bewertung für Transaktionspartner class RatingGroupMember(Page): form_model = 'player' form_fields = ['rating'] @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS and player.play_together @staticmethod def vars_for_template(player: Player): return dict( round_display=player.round_number - C.TEST_ROUNDS, opposite="Anbieter" if player.type == 0 else "Kunde", suffix="s" if player.type == 0 else "n" ) class RatingComputation(WaitPage): body_text = "Bitte warten Sie, bis Ihr Transaktionspartner eine Bewertung abgegeben hat." @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS @staticmethod def after_all_players_arrive(group): for p in group.get_players(): if not p.play_together: ## ich hab keinen partner p_before = p.in_round(p.round_number-1) p.amount_rating_received = p_before.amount_rating_received p.avg_rating = p_before.avg_rating else: matched_partner = group.get_player_by_id(p.match) matched_partner.amount_rating_received = matched_partner.in_round( p.round_number - 1).amount_rating_received + 1 matched_partner.rating_received = p.rating class RatingResult(Page): @staticmethod def is_displayed(player): return player.round_number > C.TEST_ROUNDS and player.play_together @staticmethod def vars_for_template(player: Player): prev_player = player.in_round(player.round_number - 1) player.avg_rating = helper.calc_average_amounts(player.rating_received, prev_player.avg_rating, player.amount_rating_received) return dict( round_display=player.round_number - C.TEST_ROUNDS, first_round=player.round_number == C.TEST_ROUNDS + 1, last_round=player.round_number == C.NUM_ROUNDS, current_rating=player.rating_received, # rating in aktueller Runde avg_rating=player.avg_rating # durchschnittliches Rating von Runde 3 bis aktueller Runde ) class ExperimentResults(Page): @staticmethod def is_displayed(player): return player.round_number == C.NUM_ROUNDS @staticmethod def vars_for_template(player: Player): return dict( payoff_testrounds_points=player.participant.total_points_test, payoff_interaction_taler=round(player.participant.payoff - player.participant.total_points_test, 2), # geht hier weil Umrechnung Taler und Punkte 1:1 payoff_Euro=player.participant.payoff_plus_participation_fee(), ) page_sequence = [Welcome_Page, # Runde 1 Start des Experiments Instruktionen, # Runde 1 Instruktionen2, # Runde 3 Questionaire_Introtext, # Runde 1 Start des Fragebogens # Persoenlichkeit, ## RUNDE 1 Frage_Hobbies, # Runde 1 Frage_Sport, # Runde 1 Frage_Musik, # Runde 1 Frage_Film, # Runde 1 Frage_Urlaub, # Runde 1 Frage_Eigenschaften, # Runde 1 Frage_Denken, # Runde 1 Frage_Wichtigste, # Runde 1 Frage_Religion, # Runde 1 Frage_Diskussion, # Runde 1 Frage_Vertrauen, # Runde 1 Frage_Privat, # Runde 1 Frage_Widerspruch, # Runde 1 Frage_Impuls, # Runde 1 Frage_Kraenkung, # Runde 1 Frage_UeberVerhaeltnisse, # Runde 1 Frage_Rache, # Runde 1 Frage_Banane, # Runde 1 Frage_Wohnhaus, # Runde 1 Frage_Geschlecht, # Runde 1 Frage_Geburtstjahr, # Runde 1 Frage_Studium, # Runde 1 Frage_Herkunftsland, # Runde 1 Frage_Wohnort, # Runde 1 Questionaire_Endtext, # Runde 1 FragebogenEnde, # Runde 1 ## 2 Runden Test Zählen ( 7er Task , Analogie , 7er Task , RoleAssignmentInfo, ##Runde 2 RoleAllocation, ## Runde 2 RoleAssignmentResult, ##Runde 2 InfoTransaktionZuteilung, # ab Runde 2 MarketInteractionGroupMatrix, ## Runde 5+ MarketInteraction, # Runde 5+ MarketInteractionWaitPage, # Runde 5+ MarketInteractionResultAndConfirmation, # Runde 5+ GroupPerformanceWaitPage, OneToOneMatching, ## Runde 3/4 geforced, 5+ gewählt OneToOneMatchingResult, ## Runde 3/4 geforced, 5+ gewählt TransactionDecisionKunde, CalculateSimilarity, ## einmalige Berechnung in Runde 5 zur Similarity mit allen anderen Similarity, # ab Runde 5 PerceivedSimilarity, # ab Runde 5 TaskSelectionEstimationKunde, # ab Runde 3 ## AUswahl Typ (kunden) - Logik oder 7er oder nein BeginTasks, CountSevensText, CountSevensPicture, Analogy, CountSevensText2, CountSevensPicture2, Sequence, CountSevensText3, CountSevensPicture3, Analogy2, CountSevensText4, CountSevensPicture4, Sequence2, ## CALC PAYOFF WAITPAGE TaskResult, TaskTestEnde, # Waitpage für Kunden und Anbietergruppierung # TeamResult, ShowPayOffRound # Rating, RatingGroupMember ## SOcial Proximity Part 2 nehmen ResultsWaitPage, TeamResult, # ab Runde 3 RatingGroupMember, # ab Runde 3 RatingComputation, RatingResult, # ab Runde 3 ExperimentResults] """ To Test - Fragebogen similarities richtig? - Weniger anbieter als Kunden - AVG Rating der nicht gewählten """