]> git.parisson.com Git - django_quiz.git/commitdiff
added Essay question to admin, changed templates so they dont show
authorTom Walker <tomwalker0472@gmail.com>
Fri, 25 Jul 2014 22:23:13 +0000 (23:23 +0100)
committerTom Walker <tomwalker0472@gmail.com>
Fri, 25 Jul 2014 22:23:13 +0000 (23:23 +0100)
previous question if it was an essay question since it is not marked
automatically, updated sitting_detail view to show the answers that the
user gave for each question. next up - allow teacher to mark questions
in this view, resulting in updated score etc

essay/models.py
essay/tests.py
quiz/admin.py
quiz/models.py
quiz/templates/correct_answer.html
quiz/templates/question.html
quiz/templates/quiz/sitting_detail.html
quiz/templates/result.html
quiz/tests.py
quiz/views.py

index 1a077c943688f557e052ebda6f3870dbd55b7cca..96a6b43f61e0565dc636273bdb57da5e92c1f80b 100644 (file)
@@ -3,7 +3,7 @@ from quiz.models import Question
 
 class Essay_Question(Question):
 
-    def check_if_correct(self):
+    def check_if_correct(self, guess):
         return False
 
     def get_answers(self):
index 6f56d07a4508076a4e1c32b27b7b3be57ac336ae..c261a45072e2da3b78e296041e6724730a3ba577 100644 (file)
@@ -9,7 +9,7 @@ class TestEssayQuestionModel(TestCase):
                                                    explanation="Wow!")
 
     def test_always_false(self):
-        self.assertEqual(self.essay.check_if_correct(), False)
+        self.assertEqual(self.essay.check_if_correct('spam'), False)
         self.assertEqual(self.essay.get_answers(), False)
         self.assertEqual(self.essay.get_answers_list(), False)
 
index 7760b9f869796f1dadac3e7572e7f8aa46873f30..1ba051f3770df80bb7df674ad97e015d73f175d5 100644 (file)
@@ -5,7 +5,7 @@ from django.contrib.admin.widgets import FilteredSelectMultiple
 from .models import Quiz, Category, Progress, Question
 from multichoice.models import MCQuestion, Answer
 from true_false.models import TF_Question
-
+from essay.models import Essay_Question
 
 class AnswerInline(admin.TabularInline):
     model = Answer
@@ -82,8 +82,16 @@ class TFQuestionAdmin(admin.ModelAdmin):
     search_fields = ('content', 'explanation')
     filter_horizontal = ('quiz',)
 
+class EssayQuestionAdmin(admin.ModelAdmin):
+    list_display = ('content', 'category', )
+    list_filter = ('category',)
+    fields = ('content', 'category', 'quiz', 'explanation', )
+    search_fields = ('content', 'explanation')
+    filter_horizontal = ('quiz',)
+
 admin.site.register(Quiz, QuizAdmin)
 admin.site.register(Category, CategoryAdmin)
 admin.site.register(MCQuestion, MCQuestionAdmin)
 admin.site.register(Progress, ProgressAdmin)
 admin.site.register(TF_Question, TFQuestionAdmin)
+admin.site.register(Essay_Question, EssayQuestionAdmin)
index 93e0b05d6a3111f01194569dea7160bf9d6bbe92..97d64f0c31cc09e2720b46ea768638eb7641ac78 100644 (file)
@@ -67,7 +67,8 @@ class Quiz(models.Model):
                                      default=False,
                                      help_text="If yes, the result of each"
                                                " attempt by a user will be"
-                                               " stored.")
+                                               " stored. Necessary for"
+                                               " marking.")
 
     single_attempt = models.BooleanField(blank=False,
                                          default=False,
@@ -421,12 +422,12 @@ class Sitting(models.Model):
         current = json.loads(self.user_answers)
         current[question.id] = guess
         self.user_answers = json.dumps(current)
+        self.save()
 
     def questions_with_user_answers(self):
         output = {}
         user_answers = json.loads(self.user_answers)
-        questions = self.quiz.question_set.all().select_subclasses()
-        for question in questions:
+        for question in self.quiz.question_set.all().select_subclasses():
             output[question] = user_answers[unicode(question.id)]
 
         return output
index b24eeb8d060d9a806b2a18d8785878e4149425b3..49f7c36d63c5a4cdfb8bd4d2cdc8a7673e61787a 100644 (file)
@@ -1,28 +1,31 @@
-{% if user_was_incorrect %}
-  <div class="alert alert-error">
-       <strong>You answered the above question incorrectly</strong>
-  </div>
-{% endif %}
+{% if previous.answers %}
+
+  {% if user_was_incorrect %}
+    <div class="alert alert-error">
+         <strong>You answered the above question incorrectly</strong>
+    </div>
+  {% endif %}
 
-<table class="table table-striped table-bordered">
-  <tbody>
-       {% for answer in previous.answers %}
-      {% if answer.correct %}
-           <tr class="success">
-                 <td>{{ answer.content }}</td>
-                 <td><strong>This is the correct answer</strong></td>
-      {% else %}
-               <tr>
-         <td>{{ answer.content }}</td>
-                 <td>
-                       {% if previous.question_type.MCQuestion %}
-                         {% if answer.id|add:"0" == previous.previous_answer|add:"0" %}
-                           This was your answer.
-                         {% endif %}
-                       {% endif %}
-                 </td>
-         {% endif %}
-           </tr>
-       {% endfor %}
-  </tbody>
-</table>
+  <table class="table table-striped table-bordered">
+    <tbody>
+         {% for answer in previous.answers %}
+        {% if answer.correct %}
+           <tr class="success">
+                 <td>{{ answer.content }}</td>
+                 <td><strong>This is the correct answer</strong></td>
+        {% else %}
+               <tr>
+         <td>{{ answer.content }}</td>
+                 <td>
+                       {% if previous.question_type.MCQuestion %}
+                         {% if answer.id|add:"0" == previous.previous_answer|add:"0" %}
+                           This was your answer.
+                         {% endif %}
+                       {% endif %}
+                 </td>
+         {% endif %}
+           </tr>
+       {% endfor %}
+    </tbody>
+  </table>
+{% endif %}
index 6890965670c54eec01335dc429fa47dbc45e628b..b980c7432d19b2c490cd9d4dc6edcb58eecfb23c 100644 (file)
 
   <ul class="list-group">
 
-       {{ form }}
-       <!--  {% for answer in form.answers %} -->
-<!--     <li class="list-group-item">  -->
-       <!--  {{ answer }} -->
-<!--     </li> -->
-<!--   {% endfor %} -->
+       {% for answer in form.answers %}
+         <li class="list-group-item">
+           {{ answer }}
+         </li>
+       {% endfor %}
 
   </ul>
   <input type="submit" value="Check" class="btn btn-large btn-block btn-warning" >
index 65e8fc7fe0f47b2099c7d6029f4ced551fff3434..a685b9a525b676983affc62fcecbde66c3dc04b4 100644 (file)
@@ -16,15 +16,17 @@ Result of {{ sitting.quiz.title }} for {{ sitting.user }}
   <thead>
        <tr>
          <th>Question</th>
+         <th>User answer</th>
          <th></th>
        </tr>
   </thead>
-
+n
   <tbody>
-{% for question in questions %}
+{% for question, user_name in questions.items %}
 
        <tr>
          <td>{{ question.content }}</td>
+         <td>{{ user_name }}</td>
          <td>
                {% if question.id in incorrect %}
                  <p>incorrect</p>
index efb8cb82ba124a65076e47ce44f51b9af7ca1096..4ed25ff97e9d3769f3832abbf07b19a0f19b54a1 100644 (file)
@@ -7,7 +7,7 @@
 
 {% block content %}
 
-  {% if previous %}
+  {% if previous.answers %}
 
   <p class="muted"><small>The previous question:</small></p>
   <p>{{ previous.previous_question }}</p>
index 195c5e3c9e08337ef518cf626462ea21b1748485..0e4a2f765cf043037caab19ae04e53b604edc0e5 100644 (file)
@@ -399,6 +399,9 @@ class TestQuestionMarking(TestCase):
         sitting2.complete = True
         sitting2.save()
 
+        sitting1.add_user_answer(self.question1, '123')
+        # sitting1.add_user_answer(self.question2, '456')
+
     def test_paper_marking_list_view(self):
         response = self.client.get('/marking/')
         self.assertRedirects(response, 'accounts/login/?next=/marking/',
@@ -449,6 +452,7 @@ class TestQuestionMarking(TestCase):
     def test_paper_marking_detail_view(self):
         self.client.login(username='yoda', password='use_d@_force')
         response = self.client.get('/marking/1/')
+
         self.assertContains(response, 'test quiz 1')
         self.assertContains(response, 'squawk')
         self.assertContains(response, 'incorrect')
index fafc504b9e047bc046957ddaf6f7bd30157dde92..aba7d5ecd2ddd8ae1a3e867518253530218e4993 100644 (file)
@@ -8,7 +8,8 @@ from django.views.generic import DetailView, ListView, TemplateView, FormView
 
 from .forms import QuestionForm, EssayForm
 from .models import Quiz, Category, Progress, Sitting, Question
-from Essay_Question.models import Essay_Question
+from essay.models import Essay_Question
+
 
 class QuizMarkerMixin(object):
     @method_decorator(login_required)
@@ -100,7 +101,8 @@ class QuizMarkingDetail(QuizMarkerMixin, DetailView):
 
     def get_context_data(self, **kwargs):
         context = super(QuizMarkingDetail, self).get_context_data(**kwargs)
-        context['questions'] = context['object'].quiz.question_set.all()
+        # context['questions'] = context['object'].quiz.question_set.all()
+        context['questions'] = context['object'].questions_with_user_answers()
         context['incorrect'] = context['object'].get_incorrect_questions
         return context
 
@@ -113,27 +115,29 @@ class QuizTake(FormView):
         self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
 
         if request.user.is_authenticated() is True:
-            self.sitting = user_sitting(self.request, self.quiz)
+            self.sitting = user_sitting(request, self.quiz)
         else:
-            self.sitting = anon_load_sitting(self.request, self.quiz)
+            self.sitting = anon_load_sitting(request, self.quiz)
 
         if self.sitting is False:
             return render(request, 'single_complete.html')
 
+        return super(QuizTake, self).dispatch(request, *args, **kwargs)
+
+    def get_form(self, form_class):
         if self.request.user.is_authenticated() is True:
             self.question = self.sitting.get_first_question()
         else:
             self.question = anon_next_question(self)
 
-        return super(QuizTake, self).dispatch(self.request, *args, **kwargs)
-
-    def get_form(self, form_class):
         if self.question.__class__ is Essay_Question:
             form_class = EssayForm
+
         return form_class(**self.get_form_kwargs())
 
     def get_form_kwargs(self):
         kwargs = super(QuizTake, self).get_form_kwargs()
+
         return dict(kwargs, question=self.question)
 
     def form_valid(self, form):
@@ -205,6 +209,7 @@ def form_valid_user(self, form):
     else:
         self.previous = {}
 
+    self.sitting.add_user_answer(self.question, guess)
     self.sitting.remove_first_question()
 
 
@@ -295,7 +300,7 @@ def form_valid_anon(self, form):
     else:
         self.previous = {}
     self.request.session[self.quiz.anon_q_list()] =\
-        (self.request.session[self.quiz.anon_q_list()][1:])
+        self.request.session[self.quiz.anon_q_list()][1:]
 
 
 def anon_session_score(session, to_add=0, possible=0):