from otree.api import * doc = """ Choice list (Holt/Laury, risk preferences, price list, equivalence test, etc) From: Gerhard Riener, https://www.otreehub.com/projects/morning-beach-6401/ """ class Constants(BaseConstants): name_in_url = 'holt_laury' players_per_group = None num_rounds = 1 table_template = __name__ + '/table.html' def read_csv(): import csv import random f = open(__name__ + '/stimuli.csv', encoding='utf8') rows = list(csv.DictReader(f)) random.shuffle(rows) return rows class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): for p in subsession.get_players(): stimuli = read_csv() for stim in stimuli: Trial.create(player=p, **stim) class Group(BaseGroup): pass class Player(BasePlayer): raw_responses = models.LongStringField() chose_safe = models.BooleanField() won_lottery = models.BooleanField() class Trial(ExtraModel): player = models.Link(Player) lottery_high_a = models.CurrencyField() lottery_low_a = models.CurrencyField() lottery_high_b = models.CurrencyField() lottery_low_b = models.CurrencyField() probability = models.IntegerField() chose_safe = models.BooleanField() randomly_chosen = models.BooleanField(initial=False) # PAGES class Stimuli(Page): form_model = 'player' form_fields = ['raw_responses'] @staticmethod def vars_for_template(player: Player): return dict(trials=Trial.filter(player=player)) @staticmethod def before_next_page(player: Player, timeout_happened): import json import random trials = Trial.filter(player=player) responses = json.loads(player.raw_responses) for trial in trials: trial.chose_safe = responses["{} - {}".format(trial.id,trial.probability)] trial = random.choice(trials) trial.randomly_chosen = True player.chose_safe = trial.chose_safe if player.chose_safe: player.won_lottery = (trial.probability / 100) > random.random() if player.won_lottery: payoff = trial.lottery_high_a else: payoff = trial.lottery_low_a else: player.won_lottery = (trial.probability / 100) > random.random() if player.won_lottery: payoff = trial.lottery_high_b else: payoff = trial.lottery_low_b player.payoff = payoff class Results(Page): @staticmethod def vars_for_template(player: Player): trials = Trial.filter(player=player, randomly_chosen=True) return dict(trials=trials) page_sequence = [Stimuli, Results]