import csv from otree.api import * from . import models author = 'Your name here' doc = """ A quiz app that reads its questions from a spreadsheet (see quiz.csv in this directory). There is 1 question per page; the number of pages in the game is determined by the number of questions in the CSV. See the comment below about how to randomize the order of pages. Manual Changes: - topic_list - update number of topics - topic_switch = [3] - """ class Constants(BaseConstants): name_in_url = 'quiz' players_per_group = None with open('Chris - Quiz - Copy/Biology.csv') as f: questions = list(csv.DictReader(f)) num_rounds = len(questions) #print(questions) # def randomize_order(questions): # import random # questions['rand_q'] = random.randint(1000, 9999) # # topic_list = ['History', 'Computer Science'] # num_topic = len(topic_list) # for key in topic_list: # random.shuffle(topic_list) # topic = topic_list.pop() # random_value = random.randint(1000, 9999) # for key, val in questions.items(): # # checking for required value # if val == topic: # questions['rand_topic'] = random_value # # questions = sorted(questions, key=lambda d: d['rand_topic', 'rand_q']) # topic_list = randomize_order(questions) # # if questions['topic_name'] = 'History': # questions['random'] = random.randint # # # #if player.round_number in topic_switch: # # return player.round_number == topic_switch # # return [item[1] for item in questions] # topic_list = Extract_topics(quiz_file) # # # questions['random'] = random.randint # # topic_list = ['History', 'Computer Science'] # import random # random.shuffle(topic_list) # topic_1 = topic_list.pop # topic_2 = topic_list.pop # with open('quiz/quiz_materials/quiz.csv', 'r') as read_obj: # from csv import reader # csv_reader = reader(read_obj) # quiz_file = list(csv_reader) # list # # def Extract_topics(quiz_file): # return [item[1] for item in quiz_file] # topic_list = Extract_topics(quiz_file) # topic_list = list(dict.fromkeys(topic_list)) # topic_list = topic_list[1:] # num_topics = len(topic_list) # for dicts in questions: # for topic_id in dicts: # dicts['topic_id'] = int(dicts['topic_id']) # print("csv question file imported:", questions) # topics = questions['topic_name'] # type(questions[topic_id]) # # num_topics = len(questions['topic_id']) # print("questions['topic_id']", int(questions['topic_id'])) # print("topic_ids?:", questions) # # topics = questions.values() # print('topics',topics) # topic_list = list(topics) #topic_list = list(questions['topic_id']) #[dict([a, int(x)] for a, x in b.items()) for b in ] #topic_list= list(questions['topic_id'].values()) #type(num_rounds) #topic_list = len(list(questions['topic_id'])) #print("topic_list", topic_list) #num_topics = len(topic_list) #print('number of topics:', num_topics) class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): question_id = models.PositiveIntegerField() question = models.CharField() solution = models.CharField() submitted_answer = models.CharField(widget=widgets.RadioSelect) is_correct = models.BooleanField() topic = models.CharField() graphics_name = models.CharField() # FUNCTIONS def creating_session(subsession: Subsession): if subsession.round_number == 1: subsession.session.vars['questions'] = Constants.questions.copy() ## ALTERNATIVE DESIGN: ## to randomize the order of the questions, you could instead do: for self in subsession.get_players(): ### #questions = Constants.questions #topics = Constants.topic_list #questions['random_topic'] #self.participant.vars['questions'] = sorted(Constants.questions, key=lambda d: d['random_number']) ### import random #random.shuffle(Constants.questions['topic_id']) randomized_questions = random.sample(Constants.questions, len(Constants.questions)) print("randomized questions", randomized_questions) self.participant.vars['questions'] = randomized_questions # and to randomize differently for each participant, you could use # the random.sample technique, but assign into participant.vars # instead of session.vars. for p in subsession.get_players(): question_data = current_question(p) print('question_data', question_data) p.question_id = question_data['id'] p.question = question_data['question'] p.solution = question_data['solution'] p.topic = question_data['topic'] p.graphics_name = question_data['graphics_name'] 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'], qd['choice3'], qd['choice4'], ] # PAGES class Question(Page): form_model = 'player' form_fields = ['submitted_answer'] @staticmethod def before_next_page(player: Player, timeout_happened): check_correct(player) @staticmethod def vars_for_template(player: Player): # question_id = str(player.question_id) # question_topic = player.topic # # question_topic = question_topic.lower() # print('question_topic', question_topic) # question_topic = question_topic.replace(' ', '') # filler = '_' # graphic_name =question_topic+filler+question_id graphics_name = player.graphics_name print("Graphics Name", graphics_name) return dict( image_path='quiz/{}.png'.format(graphics_name) ) class Instructions(Page): @staticmethod def is_displayed(player: Player): topic_switch = [3] #if player.round_number in topic_switch: # return player.round_number == topic_switch return player.round_number in topic_switch @staticmethod def vars_for_template(player: Player): topic_player = player.topic return { 'topic': topic_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]), } page_sequence = [Instructions, Question, Results]