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
"""