import re
from django.db import models
+from django.core.exceptions import ValidationError
+from django.core.validators import MaxValueValidator
+
from model_utils.managers import InheritanceManager
" permitted. Non users"
" cannot sit this exam.")
+ pass_mark = models.SmallIntegerField(blank=True,
+ default=0,
+ help_text="Percentage required to"
+ " pass exam.",
+ validators=[
+ MaxValueValidator(100)])
+
def save(self, force_insert=False, force_update=False, *args, **kwargs):
self.url = re.sub('\s+', '-', self.url).lower()
if self.single_attempt is True:
self.exam_paper = True
+ if self.pass_mark > 100:
+ raise ValidationError(u'%s is above 100' % self.pass_mark)
+
super(Quiz, self).save(force_insert, force_update, *args, **kwargs)
class Meta:
"""
return filter(None, self.incorrect_questions.split(','))
+ @property
+ def check_if_passed(self):
+ if self.get_percent_correct >= self.quiz.pass_mark:
+ return True
+ else:
+ return False
+
class Question(models.Model):
"""
You answered {{ score }} questions correctly out of {{ max_score }}, giving you {{ percent }} percent correct
</p>
+ {% if quiz.pass_mark %}
+
+ {% if sitting.check_if_passed %}
+ <p class="lead">You have passed this exam.</p>
+ {% else %}
+ <p class="lead">You have not passed this exam.</p>
+ {% endif %}
+
+
+ {% endif %}
+
<p>Review the questions below and try the exam again in the future.</p>
{% if user.is_authenticated %}
from django.conf import settings
from django.contrib.auth.models import User
+from django.core.exceptions import ValidationError
from django.core.urlresolvers import resolve
from django.http import HttpRequest
from django.test import TestCase
def test_anon_q_list(self):
self.assertEqual(self.quiz1.anon_q_list(), '1_q_list')
+ def test_pass_mark(self):
+ self.assertEqual(self.quiz1.pass_mark, False)
+ self.quiz1.pass_mark = 50
+ self.assertEqual(self.quiz1.pass_mark, 50)
+ self.quiz1.pass_mark = 101
+ with self.assertRaises(ValidationError):
+ self.quiz1.save()
+
class TestProgress(TestCase):
def setUp(self):
self.quiz1 = Quiz.objects.create(id=1,
title='test quiz 1',
description='d1',
- url='tq1')
+ url='tq1',
+ pass_mark=50)
self.question1 = MCQuestion.objects.create(id=1,
content='squawk')
def test_scoring(self):
self.assertEqual(self.sitting.get_current_score, 0)
+ self.assertEqual(self.sitting.check_if_passed, False)
self.sitting.add_to_score(1)
self.assertEqual(self.sitting.get_current_score, 1)
self.assertEqual(self.sitting.get_current_score, 3)
self.assertEqual(self.sitting.get_percent_correct, 100)
+ self.assertEqual(self.sitting.check_if_passed, True)
+
def test_incorrect_and_complete(self):
self.assertEqual(self.sitting.get_incorrect_questions(), [])
title='test quiz 1',
description='d1',
url='tq1',
- category=self.c1)
+ category=self.c1,
+ pass_mark=50)
self.quiz2 = Quiz.objects.create(id=2,
title='test quiz 2',
self.assertEqual(Sitting.objects.count(), 0)
self.assertTemplateUsed('result.html')
self.assertEqual(response.context['score'], 1)
+ self.assertContains(response, 'You have passed')
def test_quiz_take_user_answer_end(self):
self.client.login(username='jacob', password='top_secret')