import random import math from otree.api import * from otree.api import Currency doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'Studie' players_per_group = None num_rounds = 4 instructions_template = 'Deontologe/instructions.html' class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): comprehension1 = models.IntegerField( choices=[[1, 'Die Auszahlung für Person 1 setzt sich aus der Anfangsausstattung zuzüglich der zusätzlichen Auszahlung zusammen.'], [2, 'Person 1 bekommt nur eine Auszahlung in Höhe der Anfangsausstattung.'], [3, 'Die Auszahlung für Person 2 beträgt immer 80 Punkte, egal welches Produkt ausgewählt wird.']], label='Welche der folgenden Aussagen ist richtig?', widget=widgets.RadioSelect, ) comprehension2 = models.IntegerField( choices=[[1, 'Jede Runde ist auszahlungsrelevant und bestimmt Ihre Auszahlung.'], [2, 'Am Ende des Experiments wird eine Runde zufällig zur Auszahlung ausgewählt.'], ], label='Welche der folgenden Aussagen ist richtig?', widget=widgets.RadioSelect, ) endowment = models.CurrencyField() endowment2 = models.IntegerField() endowment2_schaden = models.IntegerField() Frage_1 = models.IntegerField( choices=[ [1, "Produkt a"], [2, "Produkt b"], [3, "Produkt c"], [4, "Produkt d"], [5, "Produkt e"], [6, "Produkt f"], [7, "Produkt g"], [8, "Produkt h"], [9, "Produkt i"], [10, "Produkt j"], [11, "Produkt k"], [12, "Ich lehne die Wahl ab"]] ) Sicht1 = models.IntegerField( choices=[ [0, ""], [1, "Produkt a"], [2, "Produkt b"], [3, "Produkt c"], [4, "Produkt d"], [5, "Produkt e"], [6, "Produkt f"], [7, "Produkt g"], [8, "Produkt h"], [9, "Produkt i"], [10, "Produkt j"], [11, "Produkt k"]], initial=0, ) Sicht2 = models.IntegerField( choices=[ [0, ""], [1, "Produkt a"], [2, "Produkt b"], [3, "Produkt c"], [4, "Produkt d"], [5, "Produkt e"], [6, "Produkt f"], [7, "Produkt g"], [8, "Produkt h"], [9, "Produkt i"], [10, "Produkt j"], [11, "Produkt k"]], initial=0, ) #zugewiesene_elemente = JSONField(default=list) def creating_session(subsession): for player in subsession.get_players(): elemente_liste = [(60, 60), (60, 150), (150, 60), (80, 80)] random.shuffle(elemente_liste) participant = player.participant if 'elemente_liste' not in participant.vars: participant.vars['elemente_liste'] = elemente_liste.copy() zugewiesenes_element = participant.vars['elemente_liste'].pop(0) player.endowment = zugewiesenes_element[0] player.endowment2 = zugewiesenes_element[1] player.endowment2_schaden = player.endowment2 - 40 # PAGES class Start(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Introduction(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Comprehension_Intro(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Comprehension(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 form_model = 'player' form_fields = ['comprehension1', 'comprehension2'] def error_message(player: Player, values): solutions = dict(comprehension1=1, comprehension2=2) errors = {f: 'Diese Antwort ist leider nicht richtig.' for f in solutions if values[f] != solutions[f]} if errors: return errors class NeueRunde(Page): pass class Deontology(Page): form_model = 'player' form_fields = ['Frage_1', 'Sicht1', 'Sicht2'] @staticmethod def vars_for_template(player: Player): auszahlung = { 0: player.endowment + 20, 1: player.endowment + 36, 2: player.endowment + 47, 3: player.endowment + 56, 4: player.endowment + 62, 5: player.endowment + 67, 6: player.endowment + 70, 7: player.endowment + 73, 8: player.endowment + 75, 9: player.endowment + 76, 10: player.endowment + 77, } return dict(auszahlung=auszahlung) def error_message(player: Player, values): print('values is', values) if (values['Sicht1'] != 0 or values['Sicht2'] != 0) and values['Frage_1'] != 12: return 'Bitte wählen Sie bei Sicht Person 1 und Sicht Person 2 nur etwas aus, wenn Sie die Wahl des Produktes oben auf der Seite ablehnen.' elif values['Frage_1'] == 12 and (values['Sicht1'] == 0 or values['Sicht2'] == 0): return 'Bitte wählen Sie bei Sicht Person 1 und Sicht Person 2 ein Produkt aus.' def before_next_page(player: Player, timeout_happened): if player.round_number == 3: initial = random.randint(1, 100) p = (player.Frage_1 - 1) / 10 if player.id_in_group % 5 == 0: if player.Frage_1 != 12 and initial < 50: player.payoff = player.endowment + 80 - 60 * math.exp(-3 * p) elif player.Frage_1 != 12 and initial >= 50: if p == 0: player.payoff = player.endowment2 elif p > 0 and p < 1: schaden = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] schaden_Wert = random.choice(schaden) if schaden_Wert >= p: player.payoff = player.endowment2_schaden else: player.payoff = player.endowment2 elif p == 1: player.payoff = player.endowment2_schaden else: pass #Sicht1 elif player.Frage_1 == 12 and initial < 50: r = (player.Sicht1 - 1) / 10 player.payoff = player.endowment + 80 - 60 * math.exp(-3 * r) #Sicht 2 elif player.Frage_1 == 12 and initial >= 50: s = ((player.Sicht2 - 1) / 10) if s == 0: player.payoff = player.endowment2 elif s > 0 and s < 1: schaden = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] schaden_Wert = random.choice(schaden) if schaden_Wert >= s: player.payoff = player.endowment2_schaden else: player.payoff = player.endowment2 elif s == 1: player.payoff = player.endowment2_schaden else: pass else: player.payoff = 0 else: player.payoff = 0 class Result(Page): @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds page_sequence = [ Start, Introduction, Comprehension, NeueRunde, Deontology, Result ]