]> git.parisson.com Git - django_quiz.git/commitdiff
Added a new manager for the sitting object to load sitting for a user
authorTom Walker <tomwalker0472@gmail.com>
Mon, 28 Jul 2014 17:18:33 +0000 (18:18 +0100)
committerTom Walker <tomwalker0472@gmail.com>
Mon, 28 Jul 2014 17:18:33 +0000 (18:18 +0100)
doing a quiz. Allows me to thin the views a bit more.

quiz/models.py
quiz/tests.py
quiz/views.py

index d6b97e553c01d79b2447121947d6a0cf6f282a32..8a7b62cb7998a2dc0b79e18b26dd80776877794d 100644 (file)
@@ -294,6 +294,22 @@ class SittingManager(models.Manager):
         new_sitting.save()
         return new_sitting
 
+    def user_sitting(self, user, quiz):
+        if quiz.single_attempt is True and self.filter(user=user,
+                                                       quiz=quiz,
+                                                       complete=True)\
+                                               .count() > 0:
+            return False
+
+        try:
+            sitting = self.get(user=user, quiz=quiz, complete=False)
+        except Sitting.DoesNotExist:
+            sitting = self.new_sitting(user, quiz)
+        except Sitting.MultipleObjectsReturned:
+            sitting = self.filter(user=user, quiz=quiz, complete=False)[0]
+        finally:
+            return sitting
+
 
 class Sitting(models.Model):
     """
index 8800d483440147dee8ff06b0255d6f78c71ece3a..b0db57d5f3ef3d69e217223459891975c67fe704 100644 (file)
@@ -276,6 +276,10 @@ class TestSitting(TestCase):
         self.assertEqual(self.sitting.incorrect_questions, '2')
         self.assertEqual(self.sitting.current_score, 1)
 
+    def test_return_user_sitting(self):
+        via_manager = Sitting.objects.user_sitting(self.user, self.quiz1)
+        self.assertEqual(self.sitting, via_manager)
+
 
 class TestNonQuestionViews(TestCase):
     '''
index e22b19423ab67c908fe14c4429d2f0c6a4d41f92..3ad8d8b0d1885191ccb8ca2c10887bbe220739bc 100644 (file)
@@ -17,9 +17,9 @@ class QuizMarkerMixin(object):
     def dispatch(self, *args, **kwargs):
         return super(QuizMarkerMixin, self).dispatch(*args, **kwargs)
 
-class QuizFilterByTitleMixin(object):
+class SittingFilterTitleMixin(object):
     def get_queryset(self):
-        queryset = super(QuizFilterByTitleMixin, self).get_queryset()
+        queryset = super(SittingFilterTitleMixin, self).get_queryset()
         quiz_filter = self.request.GET.get('quiz_filter')
         if quiz_filter:
             queryset = queryset.filter(quiz__title__icontains=quiz_filter)
@@ -81,7 +81,7 @@ class QuizUserProgressView(TemplateView):
         return context
 
 
-class QuizMarkingList(QuizMarkerMixin, QuizFilterByTitleMixin, ListView):
+class QuizMarkingList(QuizMarkerMixin, SittingFilterTitleMixin, ListView):
     model = Sitting
 
     def get_queryset(self):
@@ -120,7 +120,8 @@ class QuizTake(FormView):
         self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
 
         if request.user.is_authenticated():
-            self.sitting = user_sitting(request, self.quiz)
+            self.sitting = Sitting.objects.user_sitting(request.user,
+                                                        self.quiz)
         else:
             self.sitting = anon_load_sitting(request, self.quiz)
 
@@ -130,7 +131,7 @@ class QuizTake(FormView):
         return super(QuizTake, self).dispatch(request, *args, **kwargs)
 
     def get_form(self, form_class):
-        if self.request.user.is_authenticated() is True:
+        if self.request.user.is_authenticated():
             self.question = self.sitting.get_first_question()
         else:
             self.question = anon_next_question(self)
@@ -169,28 +170,6 @@ class QuizTake(FormView):
         return context
 
 
-def user_sitting(request, quiz):
-    if quiz.single_attempt is True and\
-        Sitting.objects.filter(user=request.user,
-                               quiz=quiz,
-                               complete=True)\
-                       .count() > 0:
-        return False
-
-    try:
-        sitting = Sitting.objects.get(user=request.user,
-                                      quiz=quiz,
-                                      complete=False)
-    except Sitting.DoesNotExist:
-        sitting = Sitting.objects.new_sitting(request.user, quiz)
-    except Sitting.MultipleObjectsReturned:
-        sitting = Sitting.objects.filter(user=request.user,
-                                         quiz=quiz,
-                                         complete=False)[0]
-    finally:
-        return sitting
-
-
 def form_valid_user(self, form):
     progress, c = Progress.objects.get_or_create(user=self.request.user)
     guess = form.cleaned_data['answers']
@@ -264,6 +243,7 @@ def anon_load_sitting(request, quiz):
 def new_anon_quiz_session(request, quiz):
     """
     Sets the session variables when starting a quiz for the first time
+    as a non signed-in user
     """
     request.session.set_expiry(259200)  # expires after 3 days
     questions = quiz.get_questions()