From: Tom Walker Date: Mon, 28 Jul 2014 17:18:33 +0000 (+0100) Subject: Added a new manager for the sitting object to load sitting for a user X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=4638e21e8811366763010554f8af1493d9f94e9b;p=django_quiz.git Added a new manager for the sitting object to load sitting for a user doing a quiz. Allows me to thin the views a bit more. --- diff --git a/quiz/models.py b/quiz/models.py index d6b97e5..8a7b62c 100644 --- a/quiz/models.py +++ b/quiz/models.py @@ -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): """ diff --git a/quiz/tests.py b/quiz/tests.py index 8800d48..b0db57d 100644 --- a/quiz/tests.py +++ b/quiz/tests.py @@ -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): ''' diff --git a/quiz/views.py b/quiz/views.py index e22b194..3ad8d8b 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -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()