def cp_student_quizzes(request, eid, qindex=0): """for AJAX calls""" quizzes = Quiz.objects.filter(student__id=eid).values( "annal", "submitted", "number_of_questions", "start_time", "finish_time", "score", "max_score") try: q = quizzes[int(qindex)] if q['max_score']: q['score'] = "{}/100".format( round(100 * q['score'] / q['max_score'])) else: q['score'] = "0/100" annal = Annal.objects.filter(id=q['annal']) if annal: q['annal'] = annal[0].annal_name else: q['annal'] = "--" if not q['start_time']: q['start_time'] = "--" else: q['start_time'] = q['start_time'].strftime("%d/%m/%Y %H:%M") q['submitted'] = _("Yes") if q['submitted'] else _("No") q['finish_time'] = Utils.format_duration(annal[0].annal_duration - q['finish_time']) q['student_id'] = eid return HttpResponse(json.dumps(q), content_type="application/json") except: return HttpResponse(json.dumps({}), content_type="application/json")
def result(request, quiz_code): try: quiz = get_object_or_404(Quiz, quiz_code=quiz_code) if not quiz.submitted: # quiz is not submitted yet return render(request, "what/result.html", { "student": quiz.student, "quiz_url": Utils.get_quiz_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_not_submitted" }) else: # display results try: score = round(quiz.score * 100 / quiz.max_score) except ZeroDivisionError: score = 0 return render(request, "what/result.html", { "quiz_code": quiz_code, "quiz_name": quiz.annal.annal_name, "score": score, "start_time": quiz.start_time, "finish_time": Utils.format_duration( quiz.annal.annal_duration - quiz.finish_time), "number_of_questions": quiz.number_of_questions, "student": quiz.student, "user_message": _("Hello,"), "message": "show_result", }) except Quiz.MultipleObjectsReturned: # shouldn't happen because quiz_code must be unique raise
def cp_student_quizzes(request, eid, qindex=0): """for AJAX calls""" quizzes = Quiz.objects.filter(student__id=eid).values("annal", "submitted", "number_of_questions", "start_time", "finish_time", "score", "max_score") try: q = quizzes[int(qindex)] if q['max_score']: q['score'] = "{}/100".format(round(100 * q['score'] / q['max_score'])) else: q['score'] = "0/100" annal = Annal.objects.filter(id=q['annal']) if annal: q['annal'] = annal[0].annal_name else: q['annal'] = "--" if not q['start_time']: q['start_time'] = "--" else: q['start_time'] = q['start_time'].strftime("%d/%m/%Y %H:%M") q['submitted'] = _("Yes") if q['submitted'] else _("No") q['finish_time'] = Utils.format_duration(annal[0].annal_duration - q['finish_time']) q['student_id'] = eid return HttpResponse(json.dumps(q), content_type="application/json") except: return HttpResponse(json.dumps({}), content_type="application/json")
def result(request, quiz_code): try: quiz = get_object_or_404(Quiz, quiz_code=quiz_code) if not quiz.submitted: # quiz is not submitted yet return render( request, "what/result.html", { "student": quiz.student, "quiz_url": Utils.get_quiz_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_not_submitted" }) else: # display results try: score = round(quiz.score * 100 / quiz.max_score) except ZeroDivisionError: score = 0 return render( request, "what/result.html", { "quiz_code": quiz_code, "quiz_name": quiz.annal.annal_name, "score": score, "start_time": quiz.start_time, "finish_time": Utils.format_duration(quiz.annal.annal_duration - quiz.finish_time), "number_of_questions": quiz.number_of_questions, "student": quiz.student, "user_message": _("Hello,"), "message": "show_result", }) except Quiz.MultipleObjectsReturned: # shouldn't happen because quiz_code must be unique raise
def quiz(request, quiz_code): try: if request.method == "POST" and "remaining-time-heidden" in request.POST: # quiz answered are POSTed quiz = get_object_or_404(Quiz, quiz_code=quiz_code) quiz.submitted = True if quiz.start_time and Utils.quiz_expired(quiz): # quiz has already expired quiz.save() return render( request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_expired", }) elif quiz.start_time: # calculate the score score = 0 max_score = 0 student_answers = [] for key in request.POST.keys(): if key.startswith("chosen-answer-q"): try: question = get_object_or_404(Question, id=int(key[15:])) max_score += question.points_rewarded answer = get_object_or_404(Answer, id=int( request.POST[key])) student_answers.append(answer) if answer.answer_is_correct: score += question.points_rewarded except ValueError: # non-int instead of question/answer id continue quiz.student_answers = student_answers quiz.score = score quiz.max_score = max_score try: quiz.finish_time = max( int(request.POST.get("remaining-time-hidden", 0)), 0) except: quiz.finish_time = 0 quiz.save() return redirect("result", quiz_code=quiz_code) else: # dude, how did you get here?! raise Http404 else: quiz = get_object_or_404(Quiz, quiz_code=quiz_code) is_enabled = quiz.annal.enabled if quiz.annal.auto_enable and quiz.annal.auto_enable_date: if Utils.date_is_in_past(quiz.annal.auto_enable_date): is_enabled = True if quiz.annal.auto_disable and quiz.annal.auto_disable_date: if Utils.date_is_in_past(quiz.annal.auto_disable_date): is_enabled = False quiz.annal.enabled = is_enabled quiz.annal.save() quiz.save() if not is_enabled: # Quiz is disabled return render( request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_disabled", }) if quiz.submitted: # User cannot take the quiz twice return render( request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_submitted", }) else: if quiz.start_time and Utils.quiz_expired(quiz): # quiz time has already expired quiz.submitted = True quiz.save() return render( request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_expired", }) # show the questions and start the quiz quiz.start_time = datetime.now() if quiz.selected_questions.all(): questions = quiz.selected_questions.all() else: questions = Question.objects.filter( annal=quiz.annal).order_by( "?")[:quiz.number_of_questions] quiz.selected_questions.add(*questions) quiz.save() answers = [] for q in questions: answers.append( Answer.objects.filter(question=q).order_by("?")) return render( request, "what/quiz.html", { "quiz": quiz, "rules": quiz.annal.rules, "teacher": quiz.annal.teacher.user, "duration": Utils.format_duration(quiz.annal.annal_duration), "student": quiz.student, "indexes": range(len(questions)), "questions": list(questions), "answers": answers, "user_message": _("Good luck,"), "message": "show_quiz", }) except Quiz.MultipleObjectsReturned: # shouldn't happen because quiz_code must be unique raise
def get_finish_time(self, obj): return Utils.format_duration(obj.annal.annal_duration - obj.finish_time)
def quiz(request, quiz_code): try: if request.method == "POST" and "remaining-time-heidden" in request.POST: # quiz answered are POSTed quiz = get_object_or_404(Quiz, quiz_code=quiz_code) quiz.submitted = True if quiz.start_time and Utils.quiz_expired(quiz): # quiz has already expired quiz.save() return render(request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_expired", }) elif quiz.start_time: # calculate the score score = 0 max_score = 0 student_answers = [] for key in request.POST.keys(): if key.startswith("chosen-answer-q"): try: question = get_object_or_404(Question, id=int(key[15:])) max_score += question.points_rewarded answer = get_object_or_404(Answer, id=int(request.POST[key])) student_answers.append(answer) if answer.answer_is_correct: score += question.points_rewarded except ValueError: # non-int instead of question/answer id continue quiz.student_answers = student_answers quiz.score = score quiz.max_score = max_score try: quiz.finish_time = max(int(request.POST.get("remaining-time-hidden", 0)), 0) except: quiz.finish_time = 0 quiz.save() return redirect("result", quiz_code=quiz_code) else: # dude, how did you get here?! raise Http404 else: quiz = get_object_or_404(Quiz, quiz_code=quiz_code) is_enabled = quiz.annal.enabled if quiz.annal.auto_enable and quiz.annal.auto_enable_date: if Utils.date_is_in_past(quiz.annal.auto_enable_date): is_enabled = True if quiz.annal.auto_disable and quiz.annal.auto_disable_date: if Utils.date_is_in_past(quiz.annal.auto_disable_date): is_enabled = False quiz.annal.enabled = is_enabled quiz.annal.save() quiz.save() if not is_enabled: # Quiz is disabled return render(request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_disabled", }) if quiz.submitted: # User cannot take the quiz twice return render(request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_submitted", }) else: if quiz.start_time and Utils.quiz_expired(quiz): # quiz time has already expired quiz.submitted = True quiz.save() return render(request, "what/quiz.html", { "student": quiz.student, "rules": quiz.annal.rules, "result_url": Utils.get_result_url(quiz_code), "user_message": _("Hello,"), "message": "quiz_expired", }) # show the questions and start the quiz quiz.start_time = datetime.now() if quiz.selected_questions.all(): questions = quiz.selected_questions.all() else: questions = Question.objects.filter(annal=quiz.annal).order_by( "?")[:quiz.number_of_questions] quiz.selected_questions.add(*questions) quiz.save() answers = [] for q in questions: answers.append(Answer.objects.filter(question=q).order_by("?")) return render(request, "what/quiz.html", { "quiz": quiz, "rules": quiz.annal.rules, "teacher": quiz.annal.teacher.user, "duration": Utils.format_duration(quiz.annal.annal_duration), "student": quiz.student, "indexes": range(len(questions)), "questions": list(questions), "answers": answers, "user_message": _("Good luck,"), "message": "show_quiz", }) except Quiz.MultipleObjectsReturned: # shouldn't happen because quiz_code must be unique raise