Example #1
0
File: views.py Project: TyVik/husky
    def post(self, request, quiz_id: str, question_num: str, *args,
             **kwargs) -> HttpResponseRedirect:
        def check_correct() -> Tuple[int, bool]:
            obj = self.get_object()
            answers = map(int, request.POST.getlist('answers', []))
            corrects = Answer.objects.filter(
                question=obj, is_correct=True).values_list('id', flat=True)
            return obj.id, set(answers) == set(corrects)

        def save_result_to_session(question_id: int, result: bool) -> None:
            if 'answers' not in request.session:
                request.session['answers'] = {}
            request.session['answers'][question_id] = result
            request.session.save()

        # keep in mind situation when admin changing question
        save_result_to_session(*check_correct())
        question_num = int(question_num)
        if Question.objects.filter(quiz_id=quiz_id).count() == question_num:
            # For production I'll create my own session storage (based on default) for working with answers.
            # Next line must be encapsulated into session object.
            answers = {
                int(key): value
                for key, value in request.session['answers'].items()
            }
            quiz_result = QuizResult.create_from_answers(
                quiz_id=int(quiz_id), user_id=request.user.id, answers=answers)
            url = quiz_result.get_absolute_url()
        else:
            url = reverse('question',
                          kwargs={
                              'quiz_id': quiz_id,
                              'question_num': question_num + 1
                          })
        return HttpResponseRedirect(
            url
        )  # yes, I know about unnecessary request, but it's just for demo