From efc67eb64e55631c58fa28a45a8b89f98694688d Mon Sep 17 00:00:00 2001 From: tomwalker Date: Fri, 25 Jul 2014 18:20:46 +0100 Subject: [PATCH] big commit, added a new method to questions to return guess as string, added sitting method to return questions with players guess for each --- essay/models.py | 3 +++ essay/tests.py | 4 ++++ multichoice/models.py | 3 +++ multichoice/tests.py | 2 ++ quiz/forms.py | 8 +++++++- quiz/models.py | 12 +++++++++++- quiz/templates/question.html | 11 ++++++----- quiz/tests.py | 22 ++++++++++++++++++---- quiz/views.py | 17 +++++++++++------ true_false/models.py | 3 +++ true_false/tests.py | 1 + 11 files changed, 69 insertions(+), 17 deletions(-) diff --git a/essay/models.py b/essay/models.py index 39f29a0..1a077c9 100644 --- a/essay/models.py +++ b/essay/models.py @@ -12,5 +12,8 @@ class Essay_Question(Question): def get_answers_list(self): return False + def answer_choice_to_string(self, guess): + return str(guess) + class Meta: verbose_name = "Essay style question" diff --git a/essay/tests.py b/essay/tests.py index 21f6258..6f56d07 100644 --- a/essay/tests.py +++ b/essay/tests.py @@ -12,3 +12,7 @@ class TestEssayQuestionModel(TestCase): self.assertEqual(self.essay.check_if_correct(), False) self.assertEqual(self.essay.get_answers(), False) self.assertEqual(self.essay.get_answers_list(), False) + + def test_returns_guess(self): + guess = "To be or not to be" + self.assertEqual(self.essay.answer_choice_to_string(guess), guess) diff --git a/multichoice/models.py b/multichoice/models.py index 54ccb53..ad5ee72 100644 --- a/multichoice/models.py +++ b/multichoice/models.py @@ -19,6 +19,9 @@ class MCQuestion(Question): return [(answer.id, answer.content) for answer in Answer.objects.filter(question=self)] + def answer_choice_to_string(self, guess): + return Answer.objects.get(id=guess).content + class Meta: verbose_name = "Multiple Choice Question" verbose_name_plural = "Multiple Choice Questions" diff --git a/multichoice/tests.py b/multichoice/tests.py index fd5eb6d..5171882 100644 --- a/multichoice/tests.py +++ b/multichoice/tests.py @@ -32,3 +32,5 @@ class TestMCQuestionModel(TestCase): self.assertEqual(self.q.check_if_correct(123), False) self.assertEqual(self.q.check_if_correct(456), True) self.assertEqual(answers_by_method.count(), 2) + self.assertEqual(self.q.answer_choice_to_string(123), + self.answer1.content) diff --git a/quiz/forms.py b/quiz/forms.py index 5bd8550..bb74388 100644 --- a/quiz/forms.py +++ b/quiz/forms.py @@ -1,5 +1,5 @@ from django import forms -from django.forms.widgets import RadioSelect +from django.forms.widgets import RadioSelect, Textarea class QuestionForm(forms.Form): @@ -8,3 +8,9 @@ class QuestionForm(forms.Form): choice_list = [x for x in question.get_answers_list()] self.fields["answers"] = forms.ChoiceField(choices=choice_list, widget=RadioSelect) + + +class EssayForm(forms.Form): + def __init__(self, question, *args, **kwargs): + super(EssayForm, self).__init__(*args, **kwargs) + self.fields["answers"] = forms.CharField(widget=Textarea) diff --git a/quiz/models.py b/quiz/models.py index 6ffea6c..93e0b05 100644 --- a/quiz/models.py +++ b/quiz/models.py @@ -296,7 +296,8 @@ class SittingManager(models.Manager): question_list=questions, incorrect_questions="", current_score=0, - complete=False) + complete=False, + user_answers='{}') new_sitting.save() return new_sitting @@ -421,6 +422,15 @@ class Sitting(models.Model): current[question.id] = guess self.user_answers = json.dumps(current) + 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: + output[question] = user_answers[unicode(question.id)] + + return output + class Question(models.Model): """ diff --git a/quiz/templates/question.html b/quiz/templates/question.html index d4327f3..6890965 100644 --- a/quiz/templates/question.html +++ b/quiz/templates/question.html @@ -53,11 +53,12 @@ diff --git a/quiz/tests.py b/quiz/tests.py index e4f3486..195c5e3 100644 --- a/quiz/tests.py +++ b/quiz/tests.py @@ -181,10 +181,20 @@ class TestSitting(TestCase): content='squawk') self.question1.quiz.add(self.quiz1) + self.answer1 = Answer.objects.create(id=123, + question=self.question1, + content='bing', + correct=False) + self.question2 = MCQuestion.objects.create(id=2, content='squeek') self.question2.quiz.add(self.quiz1) + self.answer2 = Answer.objects.create(id=456, + question=self.question2, + content='bong', + correct=True) + self.user = User.objects.create_user(username='jacob', email='jacob@jacob.com', password='top_secret') @@ -245,15 +255,19 @@ class TestSitting(TestCase): self.assertEqual(self.sitting.complete, True) def test_add_user_answer(self): - self.answer1 = Answer.objects.create(id=123, - question=self.question1, - content='bing', - correct=False) guess = '123' self.sitting.add_user_answer(self.question1, guess) self.assertIn('123', self.sitting.user_answers) + def test_return_questions_with_answers(self): + self.sitting.add_user_answer(self.question1, '123') + self.sitting.add_user_answer(self.question2, '456') + + user_answers = self.sitting.questions_with_user_answers() + self.assertEqual('123', user_answers[self.question1]) + self.assertEqual('456', user_answers[self.question2]) + ''' Tests relating to views diff --git a/quiz/views.py b/quiz/views.py index 5ed13d4..fafc504 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -6,9 +6,9 @@ from django.template import RequestContext from django.utils.decorators import method_decorator from django.views.generic import DetailView, ListView, TemplateView, FormView -from .forms import QuestionForm +from .forms import QuestionForm, EssayForm from .models import Quiz, Category, Progress, Sitting, Question - +from Essay_Question.models import Essay_Question class QuizMarkerMixin(object): @method_decorator(login_required) @@ -120,15 +120,20 @@ class QuizTake(FormView): if self.sitting is False: return render(request, 'single_complete.html') - 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) + 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): diff --git a/true_false/models.py b/true_false/models.py index 8f594ca..bc51ac8 100644 --- a/true_false/models.py +++ b/true_false/models.py @@ -31,6 +31,9 @@ class TF_Question(Question): def get_answers_list(self): return [(True, True), (False, False)] + def answer_choice_to_string(self, guess): + return str(guess) + class Meta: verbose_name = "True/False Question" verbose_name_plural = "True/False Questions" diff --git a/true_false/tests.py b/true_false/tests.py index ca08bba..46d02f1 100644 --- a/true_false/tests.py +++ b/true_false/tests.py @@ -29,3 +29,4 @@ class TestTrueFalseQuestionModel(TestCase): 'content': 'True'}, {'correct': False, 'content': 'False'}]) + self.assertEqual(self.red.answer_choice_to_string('True'), 'True') -- 2.39.5