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 = 'h_l' players_per_group = None num_rounds = 1 table_template = __name__ + '/table.html' lottery_high_a = cu(200) lottery_low_a = cu(160) lottery_high_b = cu(385) lottery_low_b = cu(10) probability = 50 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): ## Session indices day = models.IntegerField() app_sequence = models.IntegerField() inf_sequence = models.IntegerField() intervention = models.IntegerField() practice = models.IntegerField( widget=widgets.RadioSelect, choices = [[0,0],[1,1]] ) 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 Intro(Page): form_model = 'player' form_fields = ['practice'] @staticmethod def error_message(player: Player, values): solutions = dict( practice=1 ) error_messages = dict( practice='That is not the correct selection. Please, try again.' ) for field_name in solutions: if values[field_name] != solutions[field_name]: error_messages = error_messages[field_name] return error_messages class Intro_2(Page): pass 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) print(responses) for trial in trials: trial.chose_safe = responses["{} - {}".format(trial.id,trial.probability)] print(trial.chose_safe) 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) print(trials) page_sequence = [ Intro, Intro_2, Stimuli, Results ]