From 9ebfed33de35d0e015057d48d4feb65bf79841b8 Mon Sep 17 00:00:00 2001 From: Richard Mansfield Date: Wed, 6 Aug 2014 11:10:54 +1200 Subject: [PATCH] Store session info for anonymous users taking max_questions quiz Keep track of the question subset and incorrect questions to allow anonymous users to sit quizzes with max_questions set. --- quiz/models.py | 3 +++ quiz/views.py | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/quiz/models.py b/quiz/models.py index feb16ae..8a7a18d 100644 --- a/quiz/models.py +++ b/quiz/models.py @@ -149,6 +149,9 @@ class Quiz(models.Model): def anon_q_list(self): return str(self.id) + "_q_list" + def anon_q_data(self): + return str(self.id) + "_data" + class ProgressManager(models.Manager): diff --git a/quiz/views.py b/quiz/views.py index 558f692..2608f48 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -234,6 +234,8 @@ class QuizTake(FormView): question_list = [question.id for question in questions] if self.quiz.random_order is True: random.shuffle(question_list) + if self.quiz.max_questions and self.quiz.max_questions < len(question_list): + question_list = question_list[:self.quiz.max_questions] # session score for anon users self.request.session[self.quiz.anon_score_id()] = 0 @@ -241,6 +243,12 @@ class QuizTake(FormView): # session list of questions self.request.session[self.quiz.anon_q_list()] = question_list + # session list of question order and incorrect questions + self.request.session[self.quiz.anon_q_data()] = dict( + incorrect_questions = [], + order = question_list, + ) + return self.request.session[self.quiz.anon_q_list()] def anon_next_question(self): @@ -256,6 +264,7 @@ class QuizTake(FormView): anon_session_score(self.request.session, 1, 1) else: anon_session_score(self.request.session, 0, 1) + self.request.session[self.quiz.anon_q_data()]['incorrect_questions'].append(self.question.id) self.previous = {} if self.quiz.answers_at_end is not True: @@ -271,7 +280,8 @@ class QuizTake(FormView): def final_result_anon(self): score = self.request.session[self.quiz.anon_score_id()] - max_score = self.quiz.get_max_score + q_order = self.request.session[self.quiz.anon_q_data()]['order'] + max_score = len(q_order) percent = int(round((float(score) / max_score) * 100)) session, session_possible = anon_session_score(self.request.session) if score is 0: @@ -288,10 +298,16 @@ class QuizTake(FormView): del self.request.session[self.quiz.anon_q_list()] if self.quiz.answers_at_end: - results['questions'] = self.quiz.get_questions() + results['questions'] = sorted( + self.quiz.question_set.filter(id__in=q_order).select_subclasses(), + key=lambda q: q_order.index(q.id) + ) + results['incorrect_questions'] = self.request.session[self.quiz.anon_q_data()]['incorrect_questions'] else: results['previous'] = self.previous + del self.request.session[self.quiz.anon_q_data()] + return render(self.request, 'result.html', results) -- 2.39.5