from django.utils.importlib import import_module
from .models import Category, Quiz, Progress, Sitting
-from .views import quiz_take, anon_session_score
+from .views import anon_session_score, QuizTake
from multichoice.models import MCQuestion, Answer
from true_false.models import TF_Question
request = HttpRequest()
engine = import_module(settings.SESSION_ENGINE)
request.session = engine.SessionStore(None)
- score, possible = anon_session_score(request)
+ score, possible = anon_session_score(request.session)
self.assertEqual((score, possible), (0, 0))
- score, possible = anon_session_score(request, 1, 0)
+ score, possible = anon_session_score(request.session, 1, 0)
self.assertEqual((score, possible), (0, 0))
- score, possible = anon_session_score(request, 1, 1)
+ score, possible = anon_session_score(request.session, 1, 1)
self.assertEqual((score, possible), (1, 1))
- score, possible = anon_session_score(request, -0.5, 1)
+ score, possible = anon_session_score(request.session, -0.5, 1)
self.assertEqual((score, possible), (0.5, 2))
- score, possible = anon_session_score(request)
+ score, possible = anon_session_score(request.session)
self.assertEqual((score, possible), (0.5, 2))
def test_quiz_take_anon_view_only(self):
found = resolve('/q/tq1/take/')
- self.assertEqual(found.func, quiz_take)
self.assertEqual(found.kwargs, {'quiz_name': 'tq1'})
self.assertEqual(found.url_name, 'quiz_question')
self.assertEqual(response.context['quiz'].id, self.quiz1.id)
self.assertEqual(response.context['question'].content,
self.question1.content)
- self.assertEqual(response.context['question_type'],
- {self.question1.__class__.__name__: True})
- self.assertEqual(response.context['previous'], False)
+ self.assertNotIn('previous', response.context)
self.assertTemplateUsed('question.html')
session = self.client.session
# show first question
response = self.client.get('/q/tq1/take/')
self.assertNotContains(response, 'previous question')
- first_question = response.context['question']
-
# submit first answer
- response = self.client.get('/q/tq1/take/',
- {'guess': '123',
- 'question_id':
- self.client.session['1_q_list'][0]})
+ response = self.client.post('/q/tq1/take/',
+ {'answers': '123',
+ 'question_id':
+ self.client.session['1_q_list'][0]})
- self.assertContains(response, 'previous question', status_code=200)
+ self.assertContains(response, 'previous', status_code=200)
self.assertContains(response, 'incorrect')
self.assertContains(response, 'Explanation:')
self.assertContains(response, 'squeek')
self.assertEqual(self.client.session['1_q_list'], [2])
self.assertEqual(self.client.session['session_score'], 0)
self.assertEqual(self.client.session['session_score_possible'], 1)
- self.assertEqual(response.context['previous'],
- {'previous_answer': '123',
- 'previous_outcome': False,
- 'previous_question': first_question})
+ self.assertEqual(response.context['previous']['question_type'],
+ {self.question1.__class__.__name__: True})
+ self.assertIn(self.answer1, response.context['previous']['answers'])
self.assertTemplateUsed('question.html')
second_question = response.context['question']
# submit second and final answer of quiz, show final result page
- response = self.client.get('/q/tq1/take/',
- {'guess': '456',
- 'question_id':
- self.client.session['1_q_list'][0]})
+ response = self.client.post('/q/tq1/take/',
+ {'answers': '456',
+ 'question_id':
+ self.client.session['1_q_list'][0]})
self.assertContains(response, 'previous question', status_code=200)
self.assertNotContains(response, 'incorrect')
self.assertEqual(response.context['percent'], 50)
self.assertEqual(response.context['session'], 1)
self.assertEqual(response.context['possible'], 2)
- self.assertEqual(response.context['previous'],
- {'previous_answer': '456',
- 'previous_outcome': True,
- 'previous_question': second_question})
+ self.assertEqual(response.context['previous']['previous_answer'],
+ '456')
+ self.assertEqual(response.context['previous']['previous_outcome'],
+ True)
+ self.assertEqual(response.context['previous']['previous_question'],
+ second_question)
self.assertTemplateUsed('result.html')
# quiz restarts
self.assertNotContains(response, 'previous question')
# session score continues to increase
- response = self.client.get('/q/tq1/take/',
- {'guess': '123',
- 'question_id':
- self.client.session['1_q_list'][0]})
+ response = self.client.post('/q/tq1/take/',
+ {'answers': '123',
+ 'question_id':
+ self.client.session['1_q_list'][0]})
self.assertEqual(self.client.session['session_score'], 1)
self.assertEqual(self.client.session['session_score_possible'], 3)
self.assertEqual(response.context['quiz'].id, self.quiz1.id)
self.assertEqual(response.context['question'].content,
self.question1.content)
- self.assertEqual(response.context['question_type'],
- {self.question1.__class__.__name__: True})
- self.assertEqual(response.context['previous'], False)
+ self.assertNotIn('previous', response.context)
self.assertTemplateUsed('question.html')
response = self.client.get('/q/tq1/take/')
next_question = Sitting.objects.get(quiz=self.quiz1)\
.get_first_question()
- response = self.client.get('/q/tq1/take/',
- {'guess': '123',
- 'question_id':
- next_question.id})
+ response = self.client.post('/q/tq1/take/',
+ {'answers': '123',
+ 'question_id':
+ next_question.id})
sitting = Sitting.objects.get(quiz=self.quiz1)
progress_count = Progress.objects.count()
self.question2.content)
self.assertTemplateUsed('question.html')
- response = self.client.get('/q/tq1/take/',
- {'guess': '456',
- 'question_id': 2})
+ response = self.client.post('/q/tq1/take/',
+ {'answers': '456',
+ 'question_id': 2})
self.assertEqual(Sitting.objects.count(), 0)
self.assertTemplateUsed('result.html')
def test_quiz_take_user_answer_end(self):
self.client.login(username='jacob', password='top_secret')
- response = self.client.get('/q/tq2/take/',
- {'guess': '123',
- 'question_id': 1})
-
+ response = self.client.post('/q/tq2/take/',
+ {'answers': '123',
+ 'question_id': 1})
self.assertNotContains(response, 'previous question')
- self.assertEqual(response.context['previous'], False)
- response = self.client.get('/q/tq2/take/',
- {'guess': 'T',
- 'question_id': 3})
+ response = self.client.post('/q/tq2/take/',
+ {'answers': True,
+ 'question_id': 3})
self.assertEqual(response.context['score'], 1)
self.assertEqual(response.context['max_score'], 2)
self.quiz2.single_attempt = True
self.quiz2.save()
self.client.login(username='jacob', password='top_secret')
- response = self.client.get('/q/tq2/take/',
- {'guess': '123',
- 'question_id': 1})
- response = self.client.get('/q/tq2/take/',
- {'guess': 'T',
- 'question_id': 3})
+ response = self.client.post('/q/tq2/take/',
+ {'answers': '123',
+ 'question_id': 1})
+ response = self.client.post('/q/tq2/take/',
+ {'answers': True,
+ 'question_id': 3})
# quiz complete, trying it again
response = self.client.get('/q/tq2/take/')
model = Quiz
template_name = 'view_quiz_category.html'
+ def dispatch(self, request, *args, **kwargs):
+ self.category = get_object_or_404(Category,
+ category=
+ self.kwargs['category_name'])
+
+ return super(ViewQuizListByCategory, self).\
+ dispatch(request, *args, **kwargs)
+
def get_context_data(self, **kwargs):
context = super(ViewQuizListByCategory, self)\
.get_context_data(**kwargs)
- category = get_object_or_404(Category,
- category=self.kwargs['category_name'])
- context['category'] = category
+ context['category'] = self.category
return context
def get_queryset(self):
- category = get_object_or_404(Category,
- category=self.kwargs['category_name'])
queryset = super(ViewQuizListByCategory, self).get_queryset()
- return queryset.filter(category=category)
+ return queryset.filter(category=self.category)
class QuizUserProgressView(TemplateView):
def get_context_data(self, **kwargs):
context = super(QuizUserProgressView, self).get_context_data(**kwargs)
-
- progress = get_object_or_404(Progress, user=self.request.user)
+ progress, c = Progress.objects.get_or_create(user=self.request.user)
context['cat_scores'] = progress.list_all_cat_scores()
context['exams'] = progress.show_exams()
-
return context
if request.user.is_authenticated() is True:
self.sitting = user_sitting(self.request, self.quiz)
else:
- anon_load_sitting(self.request, self.quiz)
+ self.sitting = anon_load_sitting(self.request, self.quiz)
+
+ if self.sitting is False:
+ return render(request, 'single_complete.html')
- return super(QuizTake, self).dispatch(request, *args, **kwargs)
+ return super(QuizTake, self).dispatch(self.request, *args, **kwargs)
def get_form_kwargs(self):
+ kwargs = super(QuizTake, self).get_form_kwargs()
if self.request.user.is_authenticated() is True:
self.question = self.sitting.get_first_question()
else:
self.question = anon_next_question(self)
- kwargs = super(QuizTake, self).get_form_kwargs()
+
return dict(kwargs, question=self.question)
def form_valid(self, form):
return final_result_anon(self.request,
self.quiz, self.previous)
+ self.request.POST = ''
return super(QuizTake, self).get(self, self.request)
def get_context_data(self, **kwargs):
context = super(QuizTake, self).get_context_data(**kwargs)
context['question'] = self.question
+ context['quiz'] = self.quiz
if hasattr(self, 'previous'):
context['previous'] = self.previous
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 render(request, 'single_complete.html')
+ 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 anon_load_sitting(request, quiz):
if quiz.single_attempt is True:
- return render(request, 'single_complete.html')
+ return False
if quiz.anon_q_list() in request.session:
return request.session[quiz.anon_q_list()]
if is_correct is True:
self.request.session[self.quiz.anon_score_id()] += 1
- anon_session_score(self.request, 1, 1)
+ anon_session_score(self.request.session, 1, 1)
else:
- anon_session_score(self.request, 0, 1)
+ anon_session_score(self.request.session, 0, 1)
if self.quiz.answers_at_end is not True:
self.previous = {'previous_answer': guess,
(self.request.session[self.quiz.anon_q_list()][1:])
-def anon_session_score(request, to_add=0, possible=0):
+def anon_session_score(session, to_add=0, possible=0):
"""
Returns the session score for non-signed in users.
If number passed in then add this to the running total and
x, y = anon_session_score() will return the session score
without modification
"""
- if "session_score" not in request.session:
- request.session["session_score"] = 0
- request.session["session_score_possible"] = 0
+ if "session_score" not in session:
+ session["session_score"] = 0
+ session["session_score_possible"] = 0
if possible > 0:
- request.session["session_score"] = (request.session["session_score"] +
- to_add)
+ session["session_score"] = session["session_score"] + to_add
- request.session["session_score_possible"] = \
- (request.session["session_score_possible"] + possible)
+ session["session_score_possible"] =\
+ session["session_score_possible"] + possible
- return request.session["session_score"], \
- request.session["session_score_possible"]
+ return session["session_score"], session["session_score_possible"]
def final_result_anon(request, quiz, previous):
if score is 0:
score = "0"
- session_score, session_possible = anon_session_score(request)
+ session_score, session_possible = anon_session_score(request.session)
del request.session[quiz.anon_q_list()]
if quiz.answers_at_end is False: