.
This commit is contained in:
@@ -17,20 +17,23 @@
|
||||
</div>
|
||||
<div class="rapids">
|
||||
<h2>Exam: {{ exam.name }}</h2>
|
||||
<h3>Candidate: {{ cid }}</h3>
|
||||
<h3>Candidate: {{ cid|default_if_none:request.user.username }}</h3>
|
||||
Answers:
|
||||
<ul class="score-answer-list">{% for ans, score, correct_answer in answers_and_marks %}
|
||||
<li class="user-answer-li">Question {{forloop.counter}} - Correct answer: <span class="correct-answer">{{ correct_answer }}</span></li>
|
||||
<span class="user-answer-score user-answer-score-{{score}} rapid-ans">
|
||||
<pre>{{ans}}</pre> ({{score}})
|
||||
</span>
|
||||
<span class="view-question-link" data-qn={{forloop.counter0}}>View</span>
|
||||
{% endfor %}
|
||||
<ul class="score-answer-list">
|
||||
{% for ans, score, correct_answer in answers_and_marks %}
|
||||
<li class="user-answer-li">Question {{forloop.counter}} - Correct answer: <span class="correct-answer">{{ correct_answer }}</span></li>
|
||||
<span class="user-answer-score user-answer-score-{{score}} rapid-ans">
|
||||
<pre>{{ans}}</pre> ({{score}})
|
||||
</span>
|
||||
<span class="view-question-link" data-qn={{forloop.counter0}}>View</span>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<br /> Total mark: {{ total_score }} / {{max_score}}
|
||||
<br /> Normalised score: {{ normalised_score }}
|
||||
<div>
|
||||
{% if cid %}
|
||||
<a href="{% url 'cid_scores' cid passcode %}">Other exams</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from django.urls import path, include
|
||||
|
||||
from rapids.models import Answer
|
||||
from . import views
|
||||
|
||||
from django.views.decorators.cache import cache_page, cache_control
|
||||
@@ -92,6 +94,11 @@ urlpatterns = [
|
||||
views.exam_scores_cid_user,
|
||||
name="exam_scores_cid_user",
|
||||
),
|
||||
path(
|
||||
"exam/<int:pk>/scores/",
|
||||
views.exam_scores_user,
|
||||
name="exam_scores_user",
|
||||
),
|
||||
path(
|
||||
"exam/<int:pk>/toggle_active",
|
||||
views.GenericExamViews.exam_toggle_active,
|
||||
@@ -177,4 +184,11 @@ urlpatterns = [
|
||||
views.GenericViews.user_answer_delete_multiple,
|
||||
name="user_answer_delete_multiple",
|
||||
),
|
||||
path(
|
||||
"answer-autocomplete",
|
||||
views.AnswerAutocomplete.as_view(
|
||||
model=Answer, create_field="answer"
|
||||
),
|
||||
name="answer-autocomplete",
|
||||
),
|
||||
]
|
||||
|
||||
+20
-1
@@ -91,6 +91,8 @@ from .serializers import (
|
||||
|
||||
from generic.mixins import SuperuserRequiredMixin
|
||||
|
||||
from dal import autocomplete
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -684,8 +686,11 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False):
|
||||
},
|
||||
)
|
||||
|
||||
@login_required
|
||||
def exam_scores_user(request, pk):
|
||||
return exam_scores_cid_user(request, pk)
|
||||
|
||||
def exam_scores_cid_user(request, pk, cid, passcode):
|
||||
def exam_scores_cid_user(request, pk, cid=None, passcode=""):
|
||||
exam = get_object_or_404(Exam, pk=pk)
|
||||
|
||||
if not exam.exam_mode:
|
||||
@@ -1009,3 +1014,17 @@ def question_viewer(request):
|
||||
"ids": ids,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
class AnswerAutocomplete(autocomplete.Select2QuerySetView):
|
||||
def get_queryset(self):
|
||||
# Don't forget to filter out results depending on the visitor !
|
||||
if not self.request.user.is_authenticated:
|
||||
return Answer.objects.none()
|
||||
|
||||
qs = Answer.objects.all()
|
||||
|
||||
if self.q:
|
||||
qs = qs.filter(answer__istartswith=self.q)
|
||||
|
||||
return qs
|
||||
Reference in New Issue
Block a user