from otree.api import * import csv c = Currency doc = """ This is the quiz portion of the experiment. """ class Constants(BaseConstants): name_in_url = 'csr_quiz' players_per_group = None with open('csr_quiz/static/csr_quiz/quiz.csv') as f: questions = list(csv.DictReader(f)) num_rounds = len(questions) code = ['overhead'] class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): question_id = models.IntegerField() question = models.StringField() solution = models.StringField() submitted_answer = models.StringField(widget=widgets.RadioSelect) is_correct = models.BooleanField() specific = models.IntegerField() # FUNCTIONS def creating_session(subsession: Subsession): if subsession.round_number == 1: subsession.session.vars['questions'] = Constants.questions.copy() for p in subsession.get_players(): question_data = current_question(p) p.question_id = int(question_data['id']) p.question = question_data['question'] p.solution = question_data['solution'] def current_question(player: Player): return player.session.vars['questions'][player.round_number - 1] def check_correct(player: Player): player.is_correct = (player.submitted_answer == player.solution) def submitted_answer_choices(player: Player): qd = current_question(player) return [ qd['choice1'], qd['choice2'], ] def submitted_answer_error_message(player: Player, value): if value != player.solution: msg = "Your answer is incorrect. Please try again." return msg # PAGES class Question(Page): form_model = 'player' form_fields = ['submitted_answer'] @staticmethod def vars_for_template(player: Player): if player.round_number == 1 and player.participant.treatment in ['A', 'D']: player.solution = 'TRUE' return dict() @staticmethod def before_next_page(player: Player, timeout_happened): check_correct(player) class Results(Page): @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds @staticmethod def vars_for_template(player: Player): player_in_all_rounds = player.in_all_rounds() return { 'player_in_all_rounds': player_in_all_rounds, 'questions_correct': sum([p.is_correct for p in player_in_all_rounds]) } class PrePromptCOO (Page): @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds and player.participant.role == 'COO' class PrePromptDM (Page): @staticmethod def is_displayed(player: Player): return player.round_number == Constants.num_rounds and player.participant.role == 'DM' page_sequence = [ Question, Results, PrePromptCOO, PrePromptDM ]