from otree.api import * author = 'Nathaniel Lawrence, LEMMA, Université Panthéon-Assas' doc = """ This app provides a consumption simultion app, combined with surveys on demographics; financial knowledge, behavior, and attitude; and numeracy; as well as tests of time preferences and compulsivity/learning rates. """ def read_csv_stimuli(): import csv # import random f = open(__name__ + '/stimuli.csv', encoding='utf-8-sig') rows = [row for row in csv.DictReader(f)] # random.shuffle(rows) for row in rows: # all values in CSV are string unless you convert them row['later'] = cu(row['later']) return rows def read_csv_delay(): import csv import random f = open(__name__ + '/delay.csv', encoding='utf-8-sig') rows = [row for row in csv.DictReader(f)] random.shuffle(rows) return rows def jsonDelay(delayDict): import json delayJson = json.dumps({"delay":[delay for delay in delayDict]}) return delayJson ### Define constants here, in all-caps class C(BaseConstants): NAME_IN_URL = 'tp' PLAYERS_PER_GROUP = None NUM_ROUNDS = 6 # get larger-later options LATER = read_csv_stimuli() # get delay DELAY = read_csv_delay() # DELAY_INDEX = [0,1,2,3,4,5] NOW_REWARD = cu(20) DELAY_JSON = jsonDelay(DELAY) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass ### define the questions a player must answer here class Player(BasePlayer): def make_field(number): return models.FloatField( choices=[[float(C.NOW_REWARD),C.NOW_REWARD],[float(C.LATER[number]['later']),C.LATER[number]['later']]], label='',#f"{C.NOW_REWARD} right now or {C.LATER[number]['later']} in ", widget=widgets.RadioSelect ) delay = models.LongStringField(initial=C.DELAY_JSON) q1 = make_field(0) q2 = make_field(1) q3 = make_field(2) q4 = make_field(3) q5 = make_field(4) q6 = make_field(5) q7 = make_field(6) q8 = make_field(7) q9 = make_field(8) q10 = make_field(9) # q10 = models.FloatField(initial=0) # def make_field(number,self): # return models.FloatField( # choices=[[float(C.NOW_REWARD),C.NOW_REWARD],[float(C.LATER[number]['later']),C.LATER[number]['later']]], # label=f"{C.NOW_REWARD} right now or {C.LATER[number]['later']} in {C.DELAY[self.round_number]['delay']}", # widget=widgets.RadioSelect # ) # delay = models.StringField(initial='') # q1 = make_field(0,0) # q2 = models.FloatField(initial=0) # q3 = models.FloatField(initial=0) # q4 = models.FloatField(initial=0) # q5 = models.FloatField(initial=0) # q6 = models.FloatField(initial=0) # q7 = models.FloatField(initial=0) # q8 = models.FloatField(initial=0) # q9 = models.FloatField(initial=0) # q10 = models.FloatField(initial=0) # # Functions # def live_method(player: Player, data): # def make_field(number,numberRound): # return models.FloatField( # choices=[[float(C.NOW_REWARD),C.NOW_REWARD],[float(C.LATER[number]['later']),C.LATER[number]['later']]], # label=f"{C.NOW_REWARD} right now or {C.LATER[number]['later']} in {C.DELAY[numberRound]['delay']}", # widget=widgets.RadioSelect # ) # delay = models.StringField(initial=C.DELAY[0]['delay']) # q1 = make_field(0,numberRound) # q2 = make_field(1,0) # q3 = make_field(2,0) # q4 = make_field(3,0) # q5 = make_field(4,0) # q6 = make_field(5,0) # q7 = make_field(6,0) # q8 = make_field(7,0) # q9 = make_field(8,0) # q10 = make_field(9,C.NUM_ROUNDS) # PAGES class TimePreferences(Page): form_model = 'player' # form_fields = ['q1','q2','q3','q4','q5','q6','q7','q8','q9','q10'] @staticmethod def get_form_fields(player: Player): import random form_fields = ['q1','q2','q3','q4','q5','q6','q7','q8','q9','q10'] random.shuffle(form_fields) return form_fields @staticmethod def vars_for_template(player): delay = C.DELAY[(player.round_number - 1)]['delay'] return dict(delay=delay) class ResultsWaitPage(WaitPage): pass class Results(Page): pass page_sequence = [TimePreferences] def custom_export(players): yield ['participant_code', 'delay'] for player in players: yield [player.participant.code, player.delay]