import random import json from json import JSONDecodeError import time from otree import settings from otree.api import * # 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 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 """ class C(BaseConstants): NAME_IN_URL = 'social_proximity_single_session' PLAYERS_PER_GROUP = None NUM_ROUNDS = 12 AMOUNT_QUESTIONS = 24 TIMER_TEXT = "Die verbleibende Zeit dieses Abschnittes: " 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 = 3 TIMER_MINUTES = 10#5 ##TEST ZWECKE HOCH GESETZT LOGIC_POINTS = 2 INSTRUCTION_READ_TIME = 120 TEST_ROUNDS = 2 ONE_TO_ONE_ROUNDS = 2 CHANGE_ORDER_ROUNDS = 4 CUSTOMER_ROLE = 'Kunde' SELLER_ROLE = 'Verkäufer' ## 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 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 = "Was für Hobbies haben sie?" SPORT_LABEL = "Was für Sport machen Sie?" MUSIC_LABEL = "Musik?" FILM_LABEL = "Filme?" URLAUB_LABEL = "Urlaubsort?" EIGENSCHAFT_LABEL = "Eigenschaften?" DENKEN_LABEL = "Denken?" WICHTIG_LABEL = "Was ist ihnen Wichtig?" ### Count Sevens ## Old 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 class Group(BaseGroup): pass class Player(BasePlayer): ### Wird voll , gerne einklappen ''' Generelles ''' time_round = models.IntegerField() customer = models.BooleanField(initial=False) play_together = models.BooleanField(label="Bitte treffen Sie Ihre Auswahl:", widget=widgets.RadioSelect, choices=[ [True, "Ich möchte mit dem mir zugeordneten Anbieter keine Transaktion eingehen."], [False, "Ich möchte mit dem mir zugeordneten Anbieter eine Transaktion eingehen."], ], doc='Kundenwahl ob zusammengespielt/Transaktion gemacht wird' ) 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") 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 (1 Analogie und 1 Zahlenreihe) selbst bearbeiten. "] ], doc="Welche Art von Aufgabe möchte der Kunde bearbeiten") type = models.IntegerField(initial=-1, doc='Typ des Spielers: Kunde:0, Verkäufer: 1-Bottom , 2-Middle, 3-Top') response_games = models.StringField() points_analogy = models.IntegerField(initial=0) ### HARIS 7 Task - didnt touch count_7num = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein") count_7num2 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein") count_7num3 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein") count_7num4 = models.IntegerField(label="Bitte geben Sie hier Ihre Antwort ein") ### 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") ''' 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 = helper.make_int(label="Welcher Religion fühlen Sie sich zugehörig? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Katholisch'], [2, 'Evangelisch '], [3, 'Muslimisch '], [4, 'Jüdisch '], [5, 'Buddhistisch '], [6, 'Hinduistisch'], [7, 'Andere Religionsgemeinschaft'], [8, 'Konfessionslos'], ]) Diskussion = helper.make_int(label="Es wird viel diskutiert über Klimawandel, Umweltschutz, Energiequellen usw. Welche Aussage steht Ihrer Meinung am nächsten? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Angesichts unserer fortgeschrittenen Technologie sollte uns doch was Vernünftiges einfallen.'], [2, 'Wir sollten einfach akzeptieren, dass wir mit der Natur pfleglicher umgehen müssen. '], [3, 'Am liebsten würde ich gar nicht daran denken, was da noch alles auf uns zukommt. '], [4, 'Ich sehe das Problem nicht. '], ]) Vertrauen = helper.make_int(label="Glauben Sie an das Gute im Menschen? (Es kann eine Antwort ausgewählt werden)",choices=[ [1, 'Ja, immer.'], [2, 'Ich versuche es, aber es fällt mir manchmal schwer. '], [3, 'Kommt darauf an, in welchem Zusammenhang. '], [4, 'Nein. '], ]) Privat = helper.make_int(label="Wie gehen Sie vor, wenn Sie sich privat etwas vorgenommen haben? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich gehe ziemlich systematisch vor.'], [2, 'Ich denke, das wird sich schon irgendwie ergeben. '], [3, 'Ich warte, bis ich dafür in der richtigen Stimmung bin. '], ]) Widerspruch = helper.make_int(label="Wenn Ihnen jemand widerspricht, obwohl Sie genau wissen, dass Sie Recht haben, wie reagieren Sie dann üblicherweise? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich ärgere mich über die Rechthaberei des anderen, belasse es aber dabei. '], [2, 'Es ist mir gar nicht so wichtig, Recht zu bekommen. '], [3, 'Ich versuche, den anderen zu überzeugen. '], [4, 'Ich werde klarstellen, wer Recht hat. '], ]) Impuls = helper.make_int(label="Was ist Ihr erster Impuls, wenn Sie sich über das Verhalten eines Menschen, der Ihnen nahesteht, sehr ärgern? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich sage deutlich, dass ich verärgert bin.'], [2, 'Ich bleibe ruhig und versuche, die Situation zu klären. '], [3, 'Ich denke mir: Das kommt ja nicht so oft vor. '], [4, 'Ich schlucke den Ärger runter und beiße die Zähne zusammen. '], ]) Kraenkung = helper.make_int(label="Manchmal geschieht es, dass man von einem Menschen gekränkt wird. Wie reagieren Sie dann darauf? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich denke, vielleicht war es gar nicht so gemeint.'], [2, 'Ich bin mir sicher, dass ich schon einen Weg finden werde damit umzugehen. '], [3, 'Da habe ich schon eine Weile dran zu nagen. '], [4, 'Am liebsten würde ich so etwas sofort heimzahlen. '], ] ) UeberVerhaeltnisse = helper.make_int(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? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Man sollte nicht über seine Verhältnisse leben. Wann wirst du endlich erwachsen?'], [2, 'Der ist so schön, da hätte ich Angst, den öffentlich zu parken und direkt eine Beule oder einen Kratzer zu bekommen. '], [3, 'Denk doch mal nach, sobald du einen Meter damit gefahren bist, ist der Wagen nur noch die Hälfte wert. '], [4, 'Oh, toll! Lass uns eine Spritztour machen! '], ] ) Rache = helper.make_int(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? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich weiß nicht. Das würde ich mir zweimal überlegen. Wer anderen eine Grube gräbt, fällt selbst hinein.'], [2, 'Vergiss es, in einem Jahr lachen wir darüber. '], [3, 'Das ist gemein, da mache ich nicht mit. '], [4, 'Ich denke, das könnte ganz lustig sein. '], ] ) Banane = helper.make_int(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? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, 'Ich ärgere mich darüber, dass es Menschen gibt, die ohne darüber nachzudenken, eine Bananenschale auf den Bürgersteig werfen.'], [2, 'Ich stehe auf und trage die Bananenschale zum nächsten Abfallkorb, damit anderen nicht dasselbe passiert. '], [3, 'Während ich noch sitze, schaue ich mir von unten die Leute an und sage: „Was für eine Show, damit könnte ich auftreten, oder?" '], [4, 'Ich stehe auf, sage "Nichts passiert!" und gehe weiter. '], ] ) Wohnhaus = helper.make_int(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? (Es kann eine Antwort ausgewählt werden)", choices=[ [1, '„Dafür haben Sie mich aus dem tiefsten Schlaf gerissen!“ Und ich beende das Gespräch.'], [2, 'Ich denke, es könnte ja was passiert sein. Wenn dann nach Müller gefragt wird, schimpfe ich in den Apparat: „Sind Sie wahnsinnig! Was fällt Ihnen ein, mitten in der Nacht fremde Leute zu stören?“ '], [3, '„Wenn Sie den Müller mögen, dann lassen Sie ihn schlafen.“ '], [4, 'Ich denke, es könnte ja was passiert sein. Wenn dann nach Müller gefragt wird, lasse ich mir erklären, was er/sie nachts von Herrn Müller will. '], ] ) Geschlecht = helper.make_int(label="Was ist Ihr Geschlecht?", choices=[ [1, 'Weiblich '], [2, 'Männlich '], [3, 'Divers '], ] ) Geburtsjahr= helper.make_int(label="Was ist Ihr Geschlecht?", choices= [[year, str(year)] for year in range(1970, 2006)], widget=None ) # add str(year) falls benötigt Studienfeld = models.StringField(blank=False) Studiengang = models.StringField(blank=False) Herkunftsland = models.CharField(label="In welchem Land sind Sie geboren?", choices=helper.get_countries(), verbose='Land') Herkunftsstadt = models.CharField(label="In welcher Stadt leben Sie aktuell?", choices=helper.get_cities(), verbose='Stadt') ### 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 subsession.TREATMENT == 'social_interaction': subsession.SOCIAL_INTERACTION = True 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 if subsession.session.num_participants == 6: ## Hier nur den Testteil pass else: if subsession.round_number == swap: # hier die Swap Order einmalig setzen C.SELLER_ORDER_SWAP = helper.seller_order_swap() C.PART2 = True ## steuern if settings.DEBUG: print('Seller Order Swapped: ', C.SELLER_ORDER_SWAP) if C.TEST_ROUNDS < subsession.round_number <= C.TEST_ROUNDS+C.ONE_TO_ONE_ROUNDS : ## onetoone matching subsession.set_group_matrix( helper.one_to_one_matching( subsession.session.social_proximity_kunde, subsession.session.social_proximity_anbieter, ) ) elif subsession.round_number > C.TEST_ROUNDS+C.ONE_TO_ONE_ROUNDS: # markinteraktion matching seller_order = C.SELLER_ORDER_SWAP if subsession.round_number >= swap else C.SELLER_ORDER subsession.set_group_matrix( helper.matching( subsession.session.social_proximity_kunde, subsession.session.social_proximity_anbieter, seller_order ) ) ## one-to-one-matching if subsession.round_number > C.TEST_ROUNDS: ## Player Typen mitnehmen for player in subsession.get_players(): player.type = player.in_round(C.TEST_ROUNDS).type player.customer = player.in_round(C.TEST_ROUNDS).customer ## nur nochmal für boolsch ## Order for NumSeq & Analogy ## Todo : check if this is only first round 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 Instruktionen(Page): pass 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 = ['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=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-Single.html' @staticmethod def vars_for_template(player: Player): return dict( nummer=22 ) @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_Herkunftsstadt(Page): form_model = 'player' form_fields = ['Herkunftsstadt'] ## 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 FragebogenEnde(WaitPage): pass class MarketInteraction(Page): pass class OneToOneMatching(Page): pass class Instruktionen2(Page): @staticmethod def is_displayed(player): return player.round_number == 3 class BeginTasks(Page): @staticmethod def is_displayed(player: Player): return True @staticmethod def before_next_page(player: Player, timeout_happened): participant = player.participant ## Timer auf participant Field hinzufügen participant.sp_task_timer = time.time() + 60*C.TIMER_MINUTES ## Todo: Berechnet für Spieler welche "runde" er ist class CountSevensText(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num'] timer_text = C.TIMER_TEXT @staticmethod def vars_for_template(player: Player): numbers, solution = helper.seven_old_generator() player.count_7num = solution return dict( Numbers=numbers, solution=player.count_7num, cheat = settings.DEBUG ) @staticmethod def is_displayed(player): return 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() class CountSevensPicture(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): return 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() class Analogy(Page): form_model = 'player' form_fields = ['response_games'] timer_text = C.TIMER_TEXT template_name = 'social_proximity_single_session/Analogy.html' @staticmethod def is_displayed(player): return True @staticmethod def vars_for_template(player): return dict( DEBUG=settings.DEBUG ) @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=0 ##todo: nimm das wieder raus, ist falsch hier ## Welcher eintrag - (Analogy #25 zB) , Punkte ; Antwort des Participants auch mit Ausgeben player.points_analogy += answer * C.ANALOGY_POINTS player.response_games = '' # leer machen ## 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 CountSevensText2(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num2'] timer_text = C.TIMER_TEXT @staticmethod def vars_for_template(player: Player): numbers, solution = helper.seven_old_generator() player.count_7num2 = solution return dict( Numbers=numbers, solution=player.count_7num2, cheat=settings.DEBUG ) @staticmethod def is_displayed(player): return 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() class CountSevensPicture2(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): return 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() class Sequence(Page): template_name = 'social_proximity_single_session/Sequence.html' timer_text = C.TIMER_TEXT ## 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): return dict( DEBUG=settings.DEBUG # False ) @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) print('correct numseq?', answer) pass class CountSevensText3(Page): template_name = 'social_proximity_single_session/CountSevenTextOnly.html' form_model = 'player' form_fields = ['count_7num3'] timer_text = C.TIMER_TEXT @staticmethod def vars_for_template(player: Player): numbers, solution = helper.seven_old_generator() player.count_7num3 = solution return dict( Numbers=numbers, solution=player.count_7num3, cheat = settings.DEBUG ) @staticmethod def is_displayed(player): return 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() class CountSevensPicture3(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): return 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() class Analogy2(Page): form_model = 'player' form_fields = ['response_games'] timer_text = C.TIMER_TEXT template_name = 'social_proximity_single_session/Analogy.html' @staticmethod def is_displayed(player): return True @staticmethod def vars_for_template(player): return dict( DEBUG=settings.DEBUG ) @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[player.round_number - 1] answer = helper.check_for_correct_answer(player, game_object, player.response_games) player.points_analogy += answer * C.ANALOGY_POINTS player.response_games = '' # leer machen ## 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 @staticmethod def vars_for_template(player: Player): numbers, solution = helper.seven_old_generator() player.count_7num4 = solution return dict( Numbers=numbers, solution=player.count_7num4, cheat=settings.DEBUG ) @staticmethod def is_displayed(player): return 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() class CountSevensPicture4(Page): template_name = 'social_proximity_single_session/CountSevenPicture.html' timer_text = C.TIMER_TEXT @staticmethod def is_displayed(player): return 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() class Sequence2(Page): timer_text = C.TIMER_TEXT template_name = 'social_proximity_single_session/Sequence.html' ## 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): return dict( DEBUG=settings.DEBUG#False#settings.DEBUG ) @staticmethod def before_next_page(player, timeout_happened): 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) print('correct numseq?', answer) class TaskResult(Page): @staticmethod def vars_for_template(player: Player): return dict( points_reached = 5 ) @staticmethod def before_next_page(player, timeout_happened): ## build points for this round points_total = helper.calc_points_round(player) if player.round_number <= C.TEST_ROUNDS: player.participant.total_points_test += points_total class RoleAllocation(WaitPage): wait_for_all_groups = True @staticmethod def is_displayed(player: Player): return C.TEST_ROUNDS @staticmethod def after_all_players_arrive(subsession: Subsession): if subsession.session.num_participants == 24: ## hier für alle einmal die Zuordnung machen customer, seller = helper.role_assignment(subsession, C.SELLER_ROLE, C.CUSTOMER_ROLE) else: customer, seller = helper.role_assignment_small(subsession, C.SELLER_ROLE, C.CUSTOMER_ROLE) subsession.set_group_matrix(helper.matching(customer, seller, False)) subsession.session.social_proximity_anbieter = seller subsession.session.social_proximity_kunde = customer class ResultsWaitPage(WaitPage): pass class Results(Page): pass page_sequence = [Instruktionen, # Runde 1 Instruktionen2, # Runde 3 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_Herkunftsstadt,# Runde 1 FragebogenEnde, # Runde 1 ## 2 Runden Test Zählen ( 7er Task , Analogie , 7er Task , MarketInteraction, ## Runde 5+ OneToOneMatching, ## Runde 3/4 geforced, 5+ gewählt BeginTasks, CountSevensText, CountSevensPicture, Analogy, CountSevensText2, CountSevensPicture2, Sequence, CountSevensText3, CountSevensPicture3, Analogy2, CountSevensText4, CountSevensPicture4, Sequence2, TaskResult, RoleAllocation, ## Runde 2 ResultsWaitPage, Results] """ Notizen 25.09.2023 Vorschlag für neues Programm Instruktionen 1 (5 Minuten) -> Persönlichkeitsfragebogen (15 Min) -> 2 Runden Test von Aufgaben (5 min) -> Instruktionen 2 (10 Minuten) -> 2 Runden Aufgaben mit 1:1 Matching (8 min) -> 8 Runden Markt-Interaktion (40 Min) -> Ex-post Fragebogen (10 Min) """