]> git.parisson.com Git - django_quiz.git/commitdiff
Allow quizzes to be marked as draft and hidden from the public quiz list
authorRichard Mansfield <richard@dragonfly.co.nz>
Fri, 19 Sep 2014 01:25:28 +0000 (13:25 +1200)
committerRichard Mansfield <richard@dragonfly.co.nz>
Fri, 19 Sep 2014 01:25:28 +0000 (13:25 +1200)
quiz/models.py
quiz/views.py

index 6b5f0e12874f926109824844def08ed0f6596095..4ab5a56116ec4f8bf3aca891f6a67c7f5bb249b7 100644 (file)
@@ -118,6 +118,13 @@ class Quiz(models.Model):
     fail_text = models.TextField(blank=True,
                                  help_text="Displayed if user fails.")
 
+    draft = models.BooleanField(blank=True,
+                                default=False,
+                                help_text="If yes, the quiz is not displayed"
+                                          " in the quiz list and can only be"
+                                          " taken by users who can edit"
+                                          " quizzes.")
+
     def save(self, force_insert=False, force_update=False, *args, **kwargs):
         self.url = re.sub('\s+', '-', self.url).lower()
 
index d8a1bbd2c69fb6507215323cbfa941b5dddfdea5..be2c03cfaf8c88b074a957db5e3f6e9422720b6e 100644 (file)
@@ -1,6 +1,7 @@
 import random
 
 from django.contrib.auth.decorators import login_required, permission_required
+from django.core.exceptions import PermissionDenied
 from django.shortcuts import get_object_or_404, render
 from django.utils.decorators import method_decorator
 from django.views.generic import DetailView, ListView, TemplateView, FormView
@@ -30,11 +31,22 @@ class SittingFilterTitleMixin(object):
 class QuizListView(ListView):
     model = Quiz
 
+    def get_queryset(self):
+        queryset = super(QuizListView, self).get_queryset()
+        return queryset.filter(draft=False)
 
 class QuizDetailView(DetailView):
     model = Quiz
     slug_field = 'url'
 
+    def get(self, request, *args, **kwargs):
+        self.object = self.get_object()
+
+        if self.object.draft and not request.user.has_perm('quiz.change_quiz'):
+            raise PermissionDenied
+
+        context = self.get_context_data(object=self.object)
+        return self.render_to_response(context)
 
 class CategoriesListView(ListView):
     model = Category
@@ -62,7 +74,7 @@ class ViewQuizListByCategory(ListView):
 
     def get_queryset(self):
         queryset = super(ViewQuizListByCategory, self).get_queryset()
-        return queryset.filter(category=self.category)
+        return queryset.filter(category=self.category, draft=False)
 
 
 class QuizUserProgressView(TemplateView):
@@ -124,6 +136,9 @@ class QuizTake(FormView):
 
     def dispatch(self, request, *args, **kwargs):
         self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
+        if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
+            raise PermissionDenied
+
         self.logged_in_user = self.request.user.is_authenticated()
 
         if self.logged_in_user: