]> git.parisson.com Git - django_quiz.git/commitdiff
Store session info for anonymous users taking max_questions quiz
authorRichard Mansfield <richard@dragonfly.co.nz>
Tue, 5 Aug 2014 23:10:54 +0000 (11:10 +1200)
committerRichard Mansfield <richard@dragonfly.co.nz>
Tue, 5 Aug 2014 23:24:54 +0000 (11:24 +1200)
Keep track of the question subset and incorrect questions to allow
anonymous users to sit quizzes with max_questions set.

quiz/models.py
quiz/views.py

index feb16ae77e78830256af50bc155f161672add59a..8a7a18d253665593a7c521b2b22b2895ff0a2919 100644 (file)
@@ -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):
 
index 558f692c8228723a99829ab85655f8fe3e7cc8da..2608f48110c6c42b597a1b1e9678425074478a39 100644 (file)
@@ -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)