def first_page(self): """ Gets the first page a user id needs to start on. If they haven't answered any questions or up to 20 questions, that's page 1. If they've answered 21-40 questions, that's page 2, and so on. """ quiz_attempt = QuizAttempt.get_by_user_id(self.user_id, self.quiz_type) return (len(quiz_attempt.questions) / QUESTIONS_PER_PAGE) + 1
def get(self, **context): """ GET """ user = User.get_or_create_by_user_id(self.request.GET.get('userId')) attempt = QuizAttempt.get_by_user_id(user.user_id, context['quiz_type']) if not attempt: # Start up a new QuizAttempt! attempt = QuizAttempt.create(user_id=user.user_id, quiz_type=context['quiz_type']) if settings.is_devappserver(): user.paid = True context.update({ 'user': user, 'user_id': user.user_id, 'quiz_attempt': attempt }) logging.info(context) self.render_response('survey.html', **context)
def save_user_submitted_answers(self, submitted): """ Save answers submitted to the API. :param submitted: """ quiz_attempt = QuizAttempt.get_by_user_id(self.user_id, self.quiz_type) if type(submitted) == list and len(submitted) > 0: questions_start = submitted[0].question_number - 1 questions_end = submitted[-1].question_number else: return page_num = (questions_start / QUESTIONS_PER_PAGE) + 1 submitted = self._normalize_question_numbers(submitted, page_num, out=False) for question in quiz_attempt.questions[questions_start:questions_end]: if question.question_number == submitted[0].question_number: quiz_attempt.questions[question.question_number - 1].answer = submitted.pop(0).answer quiz_attempt.questions.extend(submitted) quiz_attempt.put()
def test_get_by_user_id_raises_ValueError_if_quiz_type_not_in_allowed_list(self): with self.assertRaises(ValueError): QuizAttempt.get_by_user_id(1, 'not_real')
def test_get_by_user_id_returns_attempt_when_long_is_passed_in(self): self.assertIsNotNone(QuizAttempt.get_by_user_id(87752083))
def test_get_by_user_id_coerces_to_int_if_string_passed_in(self): with self.assertRaises(TypeError): QuizAttempt.get_by_user_id([1]) # Raises a TypeError when it goes to convert a list to an int.
def test_get_by_user_id_returns_None_when_no_attempts_exist(self): self.assertIsNone(QuizAttempt.get_by_user_id(100))
def test_get_by_user_id_returns_short_a_quiz_type_if_param_is_passed(self): QuizAttempt.create(1, quiz_type='short_a') self.assertEqual('short_a', QuizAttempt.get_by_user_id(1, quiz_type='short_a').quiz_type)
def test_get_by_user_id_returns_fullform_quiz_type_by_default(self): self.assertEqual('fullform', QuizAttempt.get_by_user_id(1).quiz_type)
def test_get_by_user_id_returns_attempt_for_user_that_has_an_attempt(self): self.assertIsNotNone(QuizAttempt.get_by_user_id(1))
def test_get_by_user_id_raises_value_error_if_None_passed_in(self): with self.assertRaises(ValueError): QuizAttempt.get_by_user_id(None)