From e7d46fa6779b13ec07e6917d6964a187aeb99be8 Mon Sep 17 00:00:00 2001 From: Ross Date: Fri, 5 Aug 2022 12:13:41 +0100 Subject: [PATCH] . --- .../templates/generic/user_scores_header.html | 2 +- .../templates/physics/exam_scores_user.html | 2 + physics/templates/physics/exam_start.html | 4 ++ physics/templates/physics/exam_take.html | 6 +- .../templates/physics/exam_take_overview.html | 13 +++- physics/urls.py | 15 +++++ physics/views.py | 61 +++++++++++++------ 7 files changed, 81 insertions(+), 22 deletions(-) diff --git a/generic/templates/generic/user_scores_header.html b/generic/templates/generic/user_scores_header.html index 45b56ffa..7591e625 100644 --- a/generic/templates/generic/user_scores_header.html +++ b/generic/templates/generic/user_scores_header.html @@ -1,5 +1,5 @@

Exam: {{ exam.name }}

-

Candidate: {{ cid }}

+

Candidate: {{ cid|default_if_none:request.user.username }}

{% if view_all_results %} {% endblock %} \ No newline at end of file diff --git a/physics/templates/physics/exam_start.html b/physics/templates/physics/exam_start.html index 1a190f74..87b2d245 100755 --- a/physics/templates/physics/exam_start.html +++ b/physics/templates/physics/exam_start.html @@ -4,6 +4,9 @@

Start exam: {{exam.name}}

+ {% if request.user %} + Start Exam + {% else %} Enter your CID and passcode in the below boxes.

@@ -45,4 +48,5 @@ }); }); + {% endif %} {% endblock %} diff --git a/physics/templates/physics/exam_take.html b/physics/templates/physics/exam_take.html index f9d784b9..abb616f3 100755 --- a/physics/templates/physics/exam_take.html +++ b/physics/templates/physics/exam_take.html @@ -1,7 +1,11 @@ {% extends 'base.html' %} {% block content %} - CID: {{cid}} + {% if request.user %} + User: {{request.user}} + {% else %} + CID: {{cid}} + {% endif %}
Allocated time over.
diff --git a/physics/templates/physics/exam_take_overview.html b/physics/templates/physics/exam_take_overview.html index d2591700..4ea60e29 100644 --- a/physics/templates/physics/exam_take_overview.html +++ b/physics/templates/physics/exam_take_overview.html @@ -1,7 +1,11 @@ {% extends 'base.html' %} {% block content %} - CID: {{cid}} + {% if request.user %} + User: {{request.user}} + {% else %} + CID: {{cid}} + {% endif %}

Exam: {{exam.name}}

@@ -15,7 +19,12 @@ {{answer_count}} out of {{exam_length}} questions answered. Click to go to question.
{% for question, answer in question_answer_tuples %} - + {% if request.user %} + + + {% else %} + + {% endif %} {% endfor %}
Start time: {{cid_user_exam.start_time}}
diff --git a/physics/urls.py b/physics/urls.py index 409dc749..37129187 100644 --- a/physics/urls.py +++ b/physics/urls.py @@ -22,12 +22,22 @@ urlpatterns.extend( views.exam_take, name="exam_take", ), + path( + "exam///take", + views.exam_take, + name="exam_take_user", + ), path("exam//start", views.exam_start, name="exam_start"), path( "exam////finish", views.exam_take_overview, name="exam_take_overview", ), + path( + "exam//finish", + views.exam_take_overview, + name="exam_take_overview_user", + ), path( "exam//authors", views.ExamAuthorUpdate.as_view(), @@ -59,6 +69,11 @@ urlpatterns.extend( views.exam_scores_cid_user, name="exam_scores_cid_user", ), + path( + "exam//scores/", + views.exam_scores_cid_user, + name="exam_scores_user", + ), ] ) diff --git a/physics/views.py b/physics/views.py index 406cbd0a..d586103c 100644 --- a/physics/views.py +++ b/physics/views.py @@ -98,11 +98,10 @@ def active_exams(request): active_exams.append(exam) return render(request, "physics/available_exam_list.html", {"exams": active_exams}) - -def exam_scores_cid_user(request, pk, cid, passcode): +def exam_scores_cid_user(request, pk, cid=None, passcode=None): exam = get_object_or_404(Exam, pk=pk) - if not exam.check_cid_user(cid, passcode, request): + if not request.user and not exam.check_cid_user(cid, passcode, request): raise Http404("Error accessing exam") questions = exam.exam_questions.all() @@ -117,7 +116,12 @@ def exam_scores_cid_user(request, pk, cid, passcode): for q in questions: # Get user answer - user_answer = q.cid_user_answers.filter(cid=cid, exam__id=pk).first() + if cid is not None: + user_answer = q.cid_user_answers.filter(cid=cid, exam__id=pk).first() + else: + user_answer = q.cid_user_answers.filter( + user=request.user, exam__id=pk + ).first() if user_answer is None: answer_scores = (0, 0, 0, 0, 0) @@ -193,18 +197,21 @@ def exam_start(request, pk): ) -def exam_take_overview(request, pk, cid, passcode): +def exam_take_overview(request, pk, cid=None, passcode=None): exam = get_object_or_404(Exam, pk=pk) if not exam.active: raise Http404("Exam not found") - if not exam.check_cid_user(cid, passcode): + if not request.user and not exam.check_cid_user(cid, passcode): raise Http404("Error accessing exam") questions = exam.exam_questions.all() - answers = CidUserAnswer.objects.filter(cid=cid, exam=exam) + if request.user: + answers = CidUserAnswer.objects.filter(user=request.user, exam=exam) + else: + answers = CidUserAnswer.objects.filter(cid=cid, exam=exam) answer_question_map = {} for ans in answers: @@ -220,8 +227,11 @@ def exam_take_overview(request, pk, cid, passcode): else: question_answer_tuples.append((q, None)) - c = CidUser.objects.filter(cid=cid).first() - cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c) + if request.user: + cid_user_exam = exam.get_or_create_cid_user_exam(user_user=request.user) + else: + c = CidUser.objects.filter(cid=cid).first() + cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c) return render( request, @@ -238,18 +248,21 @@ def exam_take_overview(request, pk, cid, passcode): ) -def exam_take(request, pk, sk, cid, passcode): +def exam_take(request, pk, sk, cid=None, passcode=None): exam = get_object_or_404(Exam, pk=pk) if not exam.active: raise Http404("Exam not found") - if not exam.check_cid_user(cid, passcode): + if not request.user and not exam.check_cid_user(cid, passcode): raise Http404("Error accessing exam") - c = CidUser.objects.filter(cid=cid).first() - cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c) + if request.user: + cid_user_exam = exam.get_or_create_cid_user_exam(user_user=request.user) + else: + c = CidUser.objects.filter(cid=cid).first() + cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c) question = exam.exam_questions.all()[sk] @@ -257,7 +270,10 @@ def exam_take(request, pk, sk, cid, passcode): pos = exam.get_question_index(question) - answer = question.cid_user_answers.filter(cid=cid, exam=exam).first() + if request.user: + answer = question.cid_user_answers.filter(user=request.user, exam=exam).first() + else: + answer = question.cid_user_answers.filter(cid=cid, exam=exam).first() if request.method == "POST": if answer: @@ -266,7 +282,11 @@ def exam_take(request, pk, sk, cid, passcode): form = CidUserAnswerForm(request.POST) if form.is_valid() and not exam.publish_results: answer = form.save(commit=False) - answer.cid = cid + + if request.user: + answer.user = request.user + else: + answer.cid = cid answer.question = question answer.exam = exam # answer.published_date = timezone.now() @@ -275,9 +295,14 @@ def exam_take(request, pk, sk, cid, passcode): cid_user_exam.end_time = timezone.now() cid_user_exam.save() - kwargs = {"pk": pk, "cid": cid, "passcode": passcode} - take_url = "physics:exam_take" - finish_url = "physics:exam_take_overview" + if request.user: + kwargs = {"pk": pk} + take_url = "physics:exam_take_user" + finish_url = "physics:exam_take_overview_user" + else: + kwargs = {"pk": pk, "cid": cid, "passcode": passcode} + take_url = "physics:exam_take" + finish_url = "physics:exam_take_overview" if "next" in request.POST: return redirect(take_url, sk=pos + 1, **kwargs)