from otree.api import * c = Currency doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'questionnaire' players_per_group = None num_rounds = 36 max_minutes_for_eyes_task = 30 class Subsession(BaseSubsession): pass def creating_session(subsession: Subsession): import csv with open('eyes_test/static/eyes_test/eyes_options.csv', newline='') as f: r = csv.reader(f) subsession.session.vars['eyes_options'] = [row for row in r] class Group(BaseGroup): pass class Player(BasePlayer): option = models.StringField() # PAGES class Unmatched(Page): @staticmethod def vars_for_template(player: Player): participant = player.participant participant.payoff = participant.vars.get('payoff_part_1', 0) + \ participant.vars.get('payoff_part_2', 0) + \ participant.vars.get('payoff_part_3', 0) + \ participant.vars.get('payoff_part_4', 0) return dict( payoff_in_real_currency=float(cu(participant.payoff).to_real_world_currency(player.session)) ) @staticmethod def is_displayed(player: Player): return player.participant.unmatched and player.round_number == 1 class PartIntro(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Instructions(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Example(Page): @staticmethod def vars_for_template(player: Player): return dict(options=player.session.vars['eyes_options'][0]) @staticmethod def is_displayed(player: Player): return player.round_number == 1 class TaskIntro(Page): @staticmethod def is_displayed(player: Player): return player.round_number == 1 class Task(Page): form_model = 'player' form_fields = ['option'] @staticmethod def vars_for_template(player: Player): return dict( options=player.session.vars['eyes_options'][player.round_number], eyes_img_url=f'eyes_test/eyes/{player.round_number}.png' ) page_sequence = [Unmatched, PartIntro, Instructions, Example, TaskIntro, Task]