def test_results(request, login, id): user = check_sign_in(request) test = get_object_or_404(Test,id=id, creator=user) if request.is_ajax(): probationers = models_to_dict(Probationer.objects.filter(test=test).order_by('-date')) return HttpResponse(json.dumps(probationers)) else: return render_to_response('test_results.html', {'login': user, 'test': test})
def test(request, id): login = check_sign_in(request) test = get_object_or_404(Test, id=id, public_access=True) if request.is_ajax(): #Если не существует сессии с данным тестом , мы ее создаем if 'test' not in request.session or request.session['test']['id'] != test.id: questions = models_to_dict(Query.objects.filter(test=test).order_by('?')[:test.questions_count]) random.shuffle(questions) request.session['test'] = { 'id': test.id, 'questions' : list(map(lambda quest: quest['id'], questions)), 'answers' : [], 'current_quset': 0, 'user': '' } quest = Query.objects.get(id=request.session['test']['questions'][request.session['test']['current_quset']]) answers = models_to_dict(Answer.objects.filter(query=quest)) random.shuffle(answers) #проверяем включены ли подсказки и время сдачи test = model_to_dict(test) quest = model_to_dict(quest) if not test['time_completion']: quest['time'] = False if not test['helps']: quest['help'] = False #проверяем авторизирован ли пользователь и присутствие имении в сессии #Включаем возможность модификации сесии request.session.modified = True if login.is_authenticated() and len(login.get_full_name()) != 0: request.session['test']['user'] = login.get_full_name() name = True elif len(request.session['test']['user']) == 0: name = False return HttpResponse(json.dumps({'quest': quest, 'answers': answers, 'name': name})) else: return render_to_response('test.html', {'login': login, 'test': test})
def test_next_quest(request): if request.is_ajax(): if 'test' in request.session: #Включаем возможность модификации сесии request.session.modified = True #сохраняем ответы answers = list(map(lambda answer: {'id': answer['id'], 'selection': answer['selection']},json.loads(request.POST['answers']))) request.session['test']['answers'].append(answers) #отдаем следующий вопрос или завершаем тест next_question = request.session['test']['current_quset'] + 1 if next_question <= len(request.session['test']['questions']) - 1: #увеличиваем индекс текущего вопроса request.session['test']['current_quset'] = next_question #находим данные test = Test.objects.get(id=request.session['test']['id']) quest = Query.objects.get(id=request.session['test']['questions'][next_question], test=test) answers = models_to_dict(Answer.objects.filter(query=quest)) random.shuffle(answers) #проверяем включены ли подсказки и время сдачи test = model_to_dict(test) quest = model_to_dict(quest) if not test['time_completion']: quest['time'] = False if not test['helps']: quest['help'] = False return HttpResponse(json.dumps({'quest': quest, 'answers': answers})) else: #расчитываем результаты test_data = request.session['test'] test = Test.objects.get(id=test_data['id']) max_points = 0 user_points = 0 #начинаем обработку вопросов и ответов for num in range(len(test_data['questions'])): question = Query.objects.get(id=test_data['questions'][num]) test_data['questions'][num] = model_to_dict(question) max_points += test_data['questions'][num]['point'] check_question = True #перебираем ответы и формируем ответ, так же полученный бал и максимально возможный балл for answer in test_data['answers'][num]: answer_data = model_to_dict(Answer.objects.get(id=answer['id'],query=question)) if answer_data['correct'] != answer['selection']: check_question = False answer['error'] = True else: answer['error'] = False answer['correct'] = answer_data['correct'] answer['text'] = answer_data['text'] if check_question: user_points += test_data['questions'][num]['point'] test_data['questions'][num]['answers'] = test_data['answers'][num] #получаем процент user_percent = user_points * 100 / max_points test = model_to_dict(test) if user_percent >= 0 and user_percent < test['two_mark']: color = 'red' result = 2 elif user_percent >= test['two_mark'] and user_percent < test['three_mark']: color = 'yellow' result = 3 elif user_percent >= test['three_mark'] and user_percent < test['four_mark']: color = 'blue' result = 4 else: color = 'green' result = 5 #создаем объект тестируемого user = check_sign_in(request) if user.is_authenticated(): probationer = Probationer( test = Test.objects.get(id=test['id']), user = user, name = test_data['user'], precent = round(user_percent, 1), mark = result, date = datetime.datetime.now() ) else: probationer = Probationer( test = Test.objects.get(id=test['id']), name = test_data['user'], precent = round(user_percent, 1), mark = result, date = datetime.datetime.now() ) probationer.save() #удаляем сессию questions = test_data['questions'] del request.session['test'] return HttpResponse(json.dumps({'test_result': result, 'color': color, 'questions': questions})) else: raise Http404('Отсутствует сессия') else: raise Http404('Такая страница не существует!')