From f6282193afcab33da3d689509ba0c72f291e0d7f Mon Sep 17 00:00:00 2001 From: Ross Date: Wed, 15 Dec 2021 19:48:08 +0000 Subject: [PATCH] . --- anatomy/models.py | 8 ++--- anatomy/urls.py | 2 +- anatomy/views.py | 2 +- generic/views.py | 39 +++++++++++++++++++----- longs/views.py | 2 +- physics/views.py | 2 +- rapids/models.py | 12 +++++++- rapids/templates/rapids/base.html | 31 ++++++++++--------- rapids/templates/rapids/exam_scores.html | 1 + rapids/urls.py | 6 ++++ rapids/views.py | 2 +- sbas/views.py | 2 +- 12 files changed, 76 insertions(+), 33 deletions(-) diff --git a/anatomy/models.py b/anatomy/models.py index 0f4b70d5..548094cc 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -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: diff --git a/anatomy/urls.py b/anatomy/urls.py index bdd8ed6f..fe33e029 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -84,7 +84,7 @@ urlpatterns = [ ), path( "exam//scores/refresh", - views.exam_scores_refresh, + views.AnatomyExamViews.exam_scores_refresh, # cache_page(60 * 1)(views.exam_scores_cid), name="exam_scores_refresh", ), diff --git a/anatomy/views.py b/anatomy/views.py index a49bd4b3..ca9b0007 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -987,7 +987,7 @@ def question_save_annotation(request, pk): AnatomyExamViews = ExamViews( - Exam, AnatomyQuestion, "anatomy", "anatomy", loadJsonAnswer + Exam, AnatomyQuestion, CidUserAnswer, "anatomy", "anatomy", loadJsonAnswer ) diff --git a/generic/views.py b/generic/views.py index 558badb6..da0ba0af 100644 --- a/generic/views.py +++ b/generic/views.py @@ -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): diff --git a/longs/views.py b/longs/views.py index 4d24b82f..834456fb 100755 --- a/longs/views.py +++ b/longs/views.py @@ -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): diff --git a/physics/views.py b/physics/views.py index 2c3357d8..6215a525 100644 --- a/physics/views.py +++ b/physics/views.py @@ -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) diff --git a/rapids/models.py b/rapids/models.py index 245b1843..bd800d38 100644 --- a/rapids/models.py +++ b/rapids/models.py @@ -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 diff --git a/rapids/templates/rapids/base.html b/rapids/templates/rapids/base.html index 78c4be0f..20974aa9 100755 --- a/rapids/templates/rapids/base.html +++ b/rapids/templates/rapids/base.html @@ -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 %} -Packets / -Exams / -Create Exam / -Questions / -Create Question -{% endif %} -{% if request.user.is_superuser %} - / Answers -{% endif %} -{% comment %}
+ Rapids: + {% if request.user.is_authenticated %} + Packets / + Exams / + Create Exam / + Questions / + Create Question + {% endif %} + {% if request.user.is_superuser %} + / Answers + {% endif %} + {% comment %}
Questions by: author {% endcomment %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/rapids/templates/rapids/exam_scores.html b/rapids/templates/rapids/exam_scores.html index 6ec2159e..2a0d9042 100644 --- a/rapids/templates/rapids/exam_scores.html +++ b/rapids/templates/rapids/exam_scores.html @@ -4,6 +4,7 @@
{{plot|safe}}

{{ exam.name }}

+ User answer scores are cached, if you update or change an answer you will need to refresh the scores. {% if unmarked %}