diff --git a/physics/templates/physics/exam_take.html b/physics/templates/physics/exam_take.html index e6f2a7e0..17819ee7 100755 --- a/physics/templates/physics/exam_take.html +++ b/physics/templates/physics/exam_take.html @@ -116,9 +116,6 @@ //$("ul.physics-answer-list li[data-ans='{{question.best_answer}}']").addClass("correct"); {% endif %} - {% comment %} {% if saved_answer %} - $("ul.physics-answer-list li[data-ans='{{saved_answer}}']").addClass("selected"); {% endif %} {% endcomment %} - for (let i = 0; i < {{ exam_length }}; i++) { $("#menu-list").append($( ``)); diff --git a/physics/views.py b/physics/views.py index 720a5e03..fd5700d6 100644 --- a/physics/views.py +++ b/physics/views.py @@ -47,7 +47,11 @@ from rest_framework.pagination import PageNumberPagination from django.core.exceptions import PermissionDenied from .forms import CidUserAnswerForm, ExamForm -from .decorators import user_is_author_or_physics_checker, user_is_exam_author_or_physics_checker +from .decorators import ( + user_is_author_or_physics_checker, + user_is_exam_author_or_physics_checker, +) + class AuthorOrCheckerRequiredMixin(object): def get_object(self, *args, **kwargs): @@ -58,6 +62,7 @@ class AuthorOrCheckerRequiredMixin(object): raise PermissionDenied() # or Http404 return obj + def question_list(request): questions = Question.objects.all() return render(request, "physics/question_list.html", {"questions": questions}) @@ -196,7 +201,6 @@ def exam_scores_cid_user(request, pk, sk): answers_marks = [] answers = [] - view_all_results = False if request.user.groups.filter(name="view_all_results").exists(): view_all_results = True @@ -258,6 +262,7 @@ def exam_take_old(request, pk): }, ) + def exam_start(request, pk): exam = get_object_or_404(Exam, pk=pk) @@ -272,13 +277,13 @@ def exam_start(request, pk): }, ) + def exam_finish(request, pk, cid): exam = get_object_or_404(Exam, pk=pk) questions = exam.exam_questions.all() - answers = CidUserAnswer.objects.filter( - cid=cid, exam=exam) + answers = CidUserAnswer.objects.filter(cid=cid, exam=exam) answer_question_map = {} for ans in answers: @@ -287,8 +292,8 @@ def exam_finish(request, pk, cid): question_answer_tuples = [] answer_count = 0 for q in questions: - #if q in answer_question_map and answer_question_map[q].answer: - if q in answer_question_map: # might need to improve this + # if q in answer_question_map and answer_question_map[q].answer: + if q in answer_question_map: # might need to improve this question_answer_tuples.append((q, answer_question_map[q])) answer_count += 1 else: @@ -309,6 +314,7 @@ def exam_finish(request, pk, cid): }, ) + def exam_take(request, pk, sk, cid): exam = get_object_or_404(Exam, pk=pk) @@ -322,15 +328,14 @@ def exam_take(request, pk, sk, cid): pos = exam.get_question_index(question) - answer = question.cid_user_answers.filter( - cid=cid, exam=exam).first() + answer = question.cid_user_answers.filter(cid=cid, exam=exam).first() if request.method == "POST": if answer: form = CidUserAnswerForm(request.POST, instance=answer) else: form = CidUserAnswerForm(request.POST) - if form.is_valid(): + if form.is_valid() and not exam.publish_results: answer = form.save(commit=False) answer.cid = cid answer.question = question @@ -344,7 +349,9 @@ def exam_take(request, pk, sk, cid): elif "finish" in request.POST: return redirect("physics:exam_finish", pk=pk, cid=cid) elif "goto" in request.POST: - return redirect("physics:exam_take", pk=pk, sk=int(request.POST.get("goto")), cid=cid) + return redirect( + "physics:exam_take", pk=pk, sk=int(request.POST.get("goto")), cid=cid + ) else: form = CidUserAnswerForm(instance=answer) @@ -359,7 +366,6 @@ def exam_take(request, pk, sk, cid): if answer is not None: saved_answer = [answer.a, answer.b, answer.c, answer.d, answer.e] - return render( request, "physics/exam_take.html", @@ -372,10 +378,10 @@ def exam_take(request, pk, sk, cid): "previous": previous, "exam_length": exam_length, "pos": pos, - "saved_answer": saved_answer, }, ) + def loadJsonAnswer(answer): # As access is not restricted make sure the data appears valid if (not isinstance(answer["cid"], int)) or (not isinstance(answer["eid"], int)): @@ -388,7 +394,7 @@ def loadJsonAnswer(answer): exam = get_object_or_404(Exam, pk=answer["eid"]) - #if not exam.active: + # if not exam.active: # return False, JsonResponse( # {"success": False, "error": "No active exam: {}".format(answer["eid"])} # ) @@ -432,10 +438,12 @@ def loadJsonAnswer(answer): return True, None + PhysicsExamViews = ExamViews(Exam, Question, "physics", "physics", loadJsonAnswer) GenericViews = GenericViewBase("physics", Question, CidUserAnswer, Exam) + class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView): model = Exam form_class = ExamForm @@ -447,21 +455,28 @@ class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView): form.instance.author.add(self.request.user.id) return super().form_valid(form) + class ExamClone(AuthorOrCheckerRequiredMixin, ExamCloneMixin, ExamCreate): """Clone exam view""" -class QuestionView(LoginRequiredMixin, SingleTableMixin, FilterView, AuthorOrCheckerRequiredMixin): + +class QuestionView( + LoginRequiredMixin, SingleTableMixin, FilterView, AuthorOrCheckerRequiredMixin +): model = Question table_class = QuestionTable template_name = "physics/question_view.html" filterset_class = QuestionFilter + class UserAnswerView(AuthorOrCheckerRequiredMixin, LoginRequiredMixin, DetailView): model = CidUserAnswer -class UserAnswerTableView(AuthorOrCheckerRequiredMixin, LoginRequiredMixin, SingleTableMixin, FilterView): +class UserAnswerTableView( + AuthorOrCheckerRequiredMixin, LoginRequiredMixin, SingleTableMixin, FilterView +): model = CidUserAnswer table_class = UserAnswerTable template_name = "physics/user_answer_question_view.html" @@ -472,4 +487,4 @@ class UserAnswerTableView(AuthorOrCheckerRequiredMixin, LoginRequiredMixin, Sing class UserAnswerDelete(SuperuserRequiredMixin, DeleteView): model = CidUserAnswer template_name = "user_answer_delete.html" - success_url = reverse_lazy("physics:user_answer_table_view") \ No newline at end of file + success_url = reverse_lazy("physics:user_answer_table_view")