.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<h2>Exam: {{ exam.name }}</h2>
|
<h2>Exam: {{ exam.name }}</h2>
|
||||||
<h3>Candidate: {{ cid }}</h3>
|
<h3>Candidate: {{ cid|default_if_none:request.user.username }}</h3>
|
||||||
{% if view_all_results %}
|
{% if view_all_results %}
|
||||||
<div class="alert alert-info" role="alert">
|
<div class="alert alert-info" role="alert">
|
||||||
Exam state: Active [{{exam.active}}] / Published [{{exam.publish_results}}]
|
Exam state: Active [{{exam.active}}] / Published [{{exam.publish_results}}]
|
||||||
|
|||||||
@@ -18,7 +18,9 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<br /> Total mark: {{ total_score }} / {{max_score}}
|
<br /> Total mark: {{ total_score }} / {{max_score}}
|
||||||
<div>
|
<div>
|
||||||
|
{% if cid %}
|
||||||
<a href="{% url 'cid_scores' cid passcode %}">Other exams</a>
|
<a href="{% url 'cid_scores' cid passcode %}">Other exams</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
<h2>Start exam: {{exam.name}}</h2>
|
<h2>Start exam: {{exam.name}}</h2>
|
||||||
|
|
||||||
|
{% if request.user %}
|
||||||
|
<a href="{% url 'physics:exam_take_user' pk=exam.pk sk=0 %}">Start Exam</a>
|
||||||
|
{% else %}
|
||||||
Enter your CID and passcode in the below boxes.<br />
|
Enter your CID and passcode in the below boxes.<br />
|
||||||
<p><input id="cid-box" type="text" value="Candidate ID"></p>
|
<p><input id="cid-box" type="text" value="Candidate ID"></p>
|
||||||
<p><input id="passcode-box" type="text" value="Passcode"></p>
|
<p><input id="passcode-box" type="text" value="Passcode"></p>
|
||||||
@@ -45,4 +48,5 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
CID: {{cid}}
|
{% if request.user %}
|
||||||
|
User: {{request.user}}
|
||||||
|
{% else %}
|
||||||
|
CID: {{cid}}
|
||||||
|
{% endif %}
|
||||||
<div id="timeup">
|
<div id="timeup">
|
||||||
Allocated time over.
|
Allocated time over.
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
CID: {{cid}}
|
{% if request.user %}
|
||||||
|
User: {{request.user}}
|
||||||
|
{% else %}
|
||||||
|
CID: {{cid}}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<h2>Exam: {{exam.name}}</h2>
|
<h2>Exam: {{exam.name}}</h2>
|
||||||
|
|
||||||
@@ -15,7 +19,12 @@
|
|||||||
{{answer_count}} out of {{exam_length}} questions answered. Click to go to question.
|
{{answer_count}} out of {{exam_length}} questions answered. Click to go to question.
|
||||||
<div class="physics-finish-list">
|
<div class="physics-finish-list">
|
||||||
{% for question, answer in question_answer_tuples %}
|
{% for question, answer in question_answer_tuples %}
|
||||||
<a href="{% url 'physics:exam_take' pk=exam.id sk=forloop.counter0 cid=cid passcode=passcode %}"><button {% if not answer %}class="unanswered"{% endif %}>{{forloop.counter}}: {{answer.answer}}</button></a>
|
{% if request.user %}
|
||||||
|
<a href="{% url 'physics:exam_take_user' pk=exam.id sk=forloop.counter0 %}"><button {% if not answer %}class="unanswered"{% endif %}>{{forloop.counter}}: {{answer.answer}}</button></a>
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
<a href="{% url 'physics:exam_take' pk=exam.id sk=forloop.counter0 cid=cid passcode=passcode %}"><button {% if not answer %}class="unanswered"{% endif %}>{{forloop.counter}}: {{answer.answer}}</button></a>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
Start time: {{cid_user_exam.start_time}}<br/>
|
Start time: {{cid_user_exam.start_time}}<br/>
|
||||||
|
|||||||
@@ -22,12 +22,22 @@ urlpatterns.extend(
|
|||||||
views.exam_take,
|
views.exam_take,
|
||||||
name="exam_take",
|
name="exam_take",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"exam/<int:pk>/<int:sk>/take",
|
||||||
|
views.exam_take,
|
||||||
|
name="exam_take_user",
|
||||||
|
),
|
||||||
path("exam/<int:pk>/start", views.exam_start, name="exam_start"),
|
path("exam/<int:pk>/start", views.exam_start, name="exam_start"),
|
||||||
path(
|
path(
|
||||||
"exam/<int:pk>/<str:cid>/<str:passcode>/finish",
|
"exam/<int:pk>/<str:cid>/<str:passcode>/finish",
|
||||||
views.exam_take_overview,
|
views.exam_take_overview,
|
||||||
name="exam_take_overview",
|
name="exam_take_overview",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"exam/<int:pk>/finish",
|
||||||
|
views.exam_take_overview,
|
||||||
|
name="exam_take_overview_user",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"exam/<int:pk>/authors",
|
"exam/<int:pk>/authors",
|
||||||
views.ExamAuthorUpdate.as_view(),
|
views.ExamAuthorUpdate.as_view(),
|
||||||
@@ -59,6 +69,11 @@ urlpatterns.extend(
|
|||||||
views.exam_scores_cid_user,
|
views.exam_scores_cid_user,
|
||||||
name="exam_scores_cid_user",
|
name="exam_scores_cid_user",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"exam/<int:pk>/scores/",
|
||||||
|
views.exam_scores_cid_user,
|
||||||
|
name="exam_scores_user",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+43
-18
@@ -98,11 +98,10 @@ def active_exams(request):
|
|||||||
active_exams.append(exam)
|
active_exams.append(exam)
|
||||||
return render(request, "physics/available_exam_list.html", {"exams": active_exams})
|
return render(request, "physics/available_exam_list.html", {"exams": active_exams})
|
||||||
|
|
||||||
|
def exam_scores_cid_user(request, pk, cid=None, passcode=None):
|
||||||
def exam_scores_cid_user(request, pk, cid, passcode):
|
|
||||||
exam = get_object_or_404(Exam, pk=pk)
|
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")
|
raise Http404("Error accessing exam")
|
||||||
|
|
||||||
questions = exam.exam_questions.all()
|
questions = exam.exam_questions.all()
|
||||||
@@ -117,7 +116,12 @@ def exam_scores_cid_user(request, pk, cid, passcode):
|
|||||||
|
|
||||||
for q in questions:
|
for q in questions:
|
||||||
# Get user answer
|
# 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:
|
if user_answer is None:
|
||||||
answer_scores = (0, 0, 0, 0, 0)
|
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)
|
exam = get_object_or_404(Exam, pk=pk)
|
||||||
|
|
||||||
if not exam.active:
|
if not exam.active:
|
||||||
raise Http404("Exam not found")
|
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")
|
raise Http404("Error accessing exam")
|
||||||
|
|
||||||
questions = exam.exam_questions.all()
|
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 = {}
|
answer_question_map = {}
|
||||||
for ans in answers:
|
for ans in answers:
|
||||||
@@ -220,8 +227,11 @@ def exam_take_overview(request, pk, cid, passcode):
|
|||||||
else:
|
else:
|
||||||
question_answer_tuples.append((q, None))
|
question_answer_tuples.append((q, None))
|
||||||
|
|
||||||
c = CidUser.objects.filter(cid=cid).first()
|
if request.user:
|
||||||
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c)
|
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(
|
return render(
|
||||||
request,
|
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)
|
exam = get_object_or_404(Exam, pk=pk)
|
||||||
|
|
||||||
if not exam.active:
|
if not exam.active:
|
||||||
raise Http404("Exam not found")
|
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")
|
raise Http404("Error accessing exam")
|
||||||
|
|
||||||
c = CidUser.objects.filter(cid=cid).first()
|
if request.user:
|
||||||
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c)
|
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]
|
question = exam.exam_questions.all()[sk]
|
||||||
|
|
||||||
@@ -257,7 +270,10 @@ def exam_take(request, pk, sk, cid, passcode):
|
|||||||
|
|
||||||
pos = exam.get_question_index(question)
|
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 request.method == "POST":
|
||||||
if answer:
|
if answer:
|
||||||
@@ -266,7 +282,11 @@ def exam_take(request, pk, sk, cid, passcode):
|
|||||||
form = CidUserAnswerForm(request.POST)
|
form = CidUserAnswerForm(request.POST)
|
||||||
if form.is_valid() and not exam.publish_results:
|
if form.is_valid() and not exam.publish_results:
|
||||||
answer = form.save(commit=False)
|
answer = form.save(commit=False)
|
||||||
answer.cid = cid
|
|
||||||
|
if request.user:
|
||||||
|
answer.user = request.user
|
||||||
|
else:
|
||||||
|
answer.cid = cid
|
||||||
answer.question = question
|
answer.question = question
|
||||||
answer.exam = exam
|
answer.exam = exam
|
||||||
# answer.published_date = timezone.now()
|
# 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.end_time = timezone.now()
|
||||||
cid_user_exam.save()
|
cid_user_exam.save()
|
||||||
|
|
||||||
kwargs = {"pk": pk, "cid": cid, "passcode": passcode}
|
if request.user:
|
||||||
take_url = "physics:exam_take"
|
kwargs = {"pk": pk}
|
||||||
finish_url = "physics:exam_take_overview"
|
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:
|
if "next" in request.POST:
|
||||||
return redirect(take_url, sk=pos + 1, **kwargs)
|
return redirect(take_url, sk=pos + 1, **kwargs)
|
||||||
|
|||||||
Reference in New Issue
Block a user