def quiz(request, template_name): """Start the quiz and show the first question""" data = {} exclude = [] question, proverb = utils.generate_question(request, exclude) data.update(question) exclude.append(proverb.id) uuid = str(uuid4()) data['uuid'] = uuid data['check_url'] = reverse('proverbs:check_answer') data['next_url'] = reverse('proverbs:next_question') data['save_score_url'] = reverse('proverbs:save_quiz_score') data['hints'] = DEFAULT_HINT_COUNT data['time'] = request.user.userprofile.game_time data['number'] = 1 # the number of the question start = datetime.now() time_left = timedelta(0, data['time'] * 60) # todo: set expiration # proverb, start time, result (initally wrong) request.session['quiz-%s' % uuid] = { 'proverb': proverb, 'start': start, # start will change with each next question 'time_left': time_left, 'hints': DEFAULT_HINT_COUNT, 'time': data['time'], 'number': data['number'], 'score': 0, # in the beginning the user's score is 0 'exclude': exclude, # showed proverb ids # save the score only if there are no more questions to show 'is_score_saved': False } return render_to_response( template_name, data, context_instance=RequestContext(request) )
def next_question(request): if not request.is_ajax(): raise Http404 uuid = request.GET.get('uuid') if not uuid: return HttpResponse('error: uuid') session_quiz = request.session.get('quiz-%s' % uuid) if not session_quiz: return HttpResponse('error: session') data = {} # has the quiz end time reached? if session_quiz['time_left'].seconds <= 0: return HttpResponse('expired') question_data = utils.generate_question( request, session_quiz['exclude']) if not question_data: return HttpResponse('no more') question, proverb = question_data data.update(question) session_quiz['proverb'] = proverb session_quiz['exclude'].append(proverb.id) session_quiz['start'] = datetime.now() session_quiz['number'] += 1 request.session.modified = True data['number'] = session_quiz['number'] data['success'] = True # return a new question return HttpResponse(json.dumps(data), mimetype='application/json')