This commit is contained in:
Ross
2021-12-15 19:48:08 +00:00
parent c7311fe1f5
commit f6282193af
12 changed files with 76 additions and 33 deletions
+4 -4
View File
@@ -490,10 +490,10 @@ class CidUserAnswer(models.Model):
mark = 0
return mark
else:
q = self.question
ans = self.answer_compare
marked_ans = q.answers.filter(answer_compare__iexact=ans).first()
q = self.question
ans = self.answer_compare
marked_ans = q.answers.filter(answer_compare__iexact=ans).first()
mark = "unmarked"
if marked_ans is not None:
+1 -1
View File
@@ -84,7 +84,7 @@ urlpatterns = [
),
path(
"exam/<int:pk>/scores/refresh",
views.exam_scores_refresh,
views.AnatomyExamViews.exam_scores_refresh,
# cache_page(60 * 1)(views.exam_scores_cid),
name="exam_scores_refresh",
),
+1 -1
View File
@@ -987,7 +987,7 @@ def question_save_annotation(request, pk):
AnatomyExamViews = ExamViews(
Exam, AnatomyQuestion, "anatomy", "anatomy", loadJsonAnswer
Exam, AnatomyQuestion, CidUserAnswer, "anatomy", "anatomy", loadJsonAnswer
)
+31 -8
View File
@@ -215,9 +215,10 @@ def generic_exam_json_edit(request):
class ExamViews(View, LoginRequiredMixin):
def __init__(self, exam, question, app, question_type, loadJsonAnswer):
def __init__(self, exam, question, cid_user_answer, app, question_type, loadJsonAnswer):
self.Exam = exam
self.Question = question
self.CidUserAnswer = cid_user_answer
self.app_name = app
self.question_type = question_type
self.loadJsonAnswer = loadJsonAnswer
@@ -417,6 +418,29 @@ class ExamViews(View, LoginRequiredMixin):
},
)
@method_decorator(login_required)
def exam_scores_refresh(self, request, pk):
exam = get_object_or_404(self.Exam, pk=pk)
if not exam.exam_mode:
raise Http404("Packet not in exam mode")
questions = exam.exam_questions.all()
cids = self.CidUserAnswer.objects.filter(question__in=questions, exam__id=pk)
# Force a score update
for c in cids:
c.get_answer_score(cached=False)
return render(
request,
"rapids/base.html",
{
"simple_content": "Answer scores updated",
},
)
@method_decorator(login_required)
def exam_cids(self, request, exam_id):
exam = get_object_or_404(self.Exam, pk=exam_id)
@@ -966,17 +990,13 @@ class CidUserView(LoginRequiredMixin, SingleTableMixin, FilterView):
context = super().get_context_data(**kwargs)
# user = self.request.user
filters = { "archive": False, "exam_mode": True}
filters = {"archive": False, "exam_mode": True}
physics_exams = [
(i.name, i.pk) for i in PhysicsExam.objects.filter(**filters)
]
physics_exams = [(i.name, i.pk) for i in PhysicsExam.objects.filter(**filters)]
rapid_exams = [(i.name, i.pk) for i in RapidExam.objects.filter(**filters)]
sba_exams = [(i.name, i.pk) for i in SbasExam.objects.filter(**filters)]
longs_exams = [(i.name, i.pk) for i in LongExam.objects.filter(**filters)]
anatomy_exams = [
(i.name, i.pk) for i in AnatomyExam.objects.filter(**filters)
]
anatomy_exams = [(i.name, i.pk) for i in AnatomyExam.objects.filter(**filters)]
cid_user_groups = [
(i.name, i.pk) for i in CidUserGroup.objects.filter(archive=False)
@@ -990,6 +1010,7 @@ class CidUserView(LoginRequiredMixin, SingleTableMixin, FilterView):
context["cid_user_groups"] = cid_user_groups
return context
@login_required
@user_is_cid_user_manager
def group_view(request):
@@ -1001,6 +1022,7 @@ def group_view(request):
{"groups": groups},
)
@login_required
@user_is_cid_user_manager
def group_email(request, pk):
@@ -1017,6 +1039,7 @@ def group_email(request, pk):
{"users": users},
)
@login_required
@user_is_cid_user_manager
def manage_cid_users(request):
+1 -1
View File
@@ -1169,7 +1169,7 @@ def long_series_order_upload_filename(request, pk):
return redirect("longs:long_series_detail", pk=pk)
LongExamViews = ExamViews(Exam, Long, "longs", "long", loadJsonAnswer)
LongExamViews = ExamViews(Exam, Long, CidUserAnswer, "longs", "long", loadJsonAnswer)
class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView):
+1 -1
View File
@@ -452,7 +452,7 @@ def loadJsonAnswer(answer):
return True, None
PhysicsExamViews = ExamViews(Exam, Question, "physics", "physics", loadJsonAnswer)
PhysicsExamViews = ExamViews(Exam, Question, CidUserAnswer, "physics", "physics", loadJsonAnswer)
GenericViews = GenericViewBase("physics", Question, CidUserAnswer, Exam)
+11 -1
View File
@@ -685,7 +685,17 @@ class CidUserAnswer(models.Model):
def get_absolute_url(self):
return reverse("rapids:user_answer_view", kwargs={"pk": self.pk})
def get_answer_score(self):
def get_answer_score(self, cached=True):
if cached and self.score:
if self.score == Answer.MarkOptions.CORRECT:
mark = 2
elif self.score == Answer.MarkOptions.HALF_MARK:
mark = 1
elif self.score == Answer.MarkOptions.INCORRECT:
mark = 0
return mark
q = self.question
# First step we check that the normal/abnormal states match
+17 -14
View File
@@ -1,7 +1,7 @@
{% extends 'base.html' %}
{% block title %}
Rapids
Rapids
{% endblock %}
{% block css %}
@@ -13,20 +13,23 @@ Rapids
{% block content %}
{% if simple_content %}
{{simple_content}}
{% endif %}
{% endblock %}
{% block navigation %}
Rapids:
{% if request.user.is_authenticated %}
<a href="{% url 'rapids:index' %}">Packets</a> /
<a href="{% url 'rapids:exam_list' %}">Exams</a> /
<a href="{% url 'rapids:exam_create' %}" title="Create a new exam">Create Exam</a> /
<a href="{% url 'rapids:rapid_view' %}">Questions</a> /
<a href="{% url 'rapids:rapid_create' %}" title="Create a new question">Create Question</a>
{% endif %}
{% if request.user.is_superuser %}
/ <a href="{% url 'rapids:user_answer_table_view' %}" title="User answers">Answers</a>
{% endif %}
{% comment %} </br>
Rapids:
{% if request.user.is_authenticated %}
<a href="{% url 'rapids:index' %}">Packets</a> /
<a href="{% url 'rapids:exam_list' %}">Exams</a> /
<a href="{% url 'rapids:exam_create' %}" title="Create a new exam">Create Exam</a> /
<a href="{% url 'rapids:rapid_view' %}">Questions</a> /
<a href="{% url 'rapids:rapid_create' %}" title="Create a new question">Create Question</a>
{% endif %}
{% if request.user.is_superuser %}
/ <a href="{% url 'rapids:user_answer_table_view' %}" title="User answers">Answers</a>
{% endif %}
{% comment %} </br>
Questions by:
<span id="authors-link"><a href="{% url 'rapids:author_list' %}">author</a></span> {% endcomment %}
{% endblock %}
{% endblock %}
+1
View File
@@ -4,6 +4,7 @@
<div id="stats-plot">{{plot|safe}}</div>
<div class="rapids">
<h2>{{ exam.name }}</h2>
User answer scores are cached, if you update or change an answer you will need to <a href="{% url 'anatomy:exam_scores_refresh' exam.pk %}">refresh the scores</a>.
{% if unmarked %}
<div class="alert alert-warning" role="alert">
+6
View File
@@ -75,6 +75,12 @@ urlpatterns = [
cache_page(60 * 1)(views.exam_scores_cid),
name="exam_scores_cid",
),
path(
"exam/<int:pk>/scores/refresh",
views.RapidExamViews.exam_scores_refresh,
# cache_page(60 * 1)(views.exam_scores_cid),
name="exam_scores_refresh",
),
path(
"exam/<int:pk>/scores/<int:cid>/<str:passcode>/",
views.exam_scores_cid_user,
+1 -1
View File
@@ -928,7 +928,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
success_url = reverse_lazy("rapids:rapid_view")
RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer)
RapidExamViews = ExamViews(Exam, Rapid, CidUserAnswer, "rapids", "rapid", loadJsonAnswer)
class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView):
+1 -1
View File
@@ -373,7 +373,7 @@ def exam_take(request, pk, sk, cid, passcode):
def loadJsonAnswer(answer):
pass
SbasExamViews = ExamViews(Exam, Question, "sbas", "sbas", loadJsonAnswer)
SbasExamViews = ExamViews(Exam, Question, CidUserAnswer, "sbas", "sbas", loadJsonAnswer)
class QuestionView(LoginRequiredMixin, SingleTableMixin, FilterView):
model = Question