diff --git a/generic/models.py b/generic/models.py index 5a532397..a59711c9 100644 --- a/generic/models.py +++ b/generic/models.py @@ -129,11 +129,11 @@ class ExamBase(models.Model): def get_exam_stats(self): text = f"""{self.name} - ----- - Candidate number: {self.stats_candidates} - Max (possible) score: {self.stats_max_possible} - Mean: {self.stats_mean} Median: {self.stats_median} Mode: {self.stats_mode} [Min: {self.stats_min} / Max: {self.stats_max}] - """ + ----- + - Candidate number: {self.stats_candidates} + - Max (possible) score: {self.stats_max_possible} + - Mean: {self.stats_mean} Median: {self.stats_median} Mode: {self.stats_mode} [Min: {self.stats_min} / Max: {self.stats_max}] + """ return text def __str__(self): @@ -209,6 +209,13 @@ class ExamBase(models.Model): content_type=content_type, object_id=self.pk, cid_user=cid_user ) + def get_cid_user_score(self, cid_user): + c = str(cid_user) + if c in self.user_scores: + return self.user_scores[c] + else: + return False + class NoteType(models.Model): note_type = models.CharField(max_length=200) @@ -305,7 +312,7 @@ class CidUser(models.Model): for n, t in self.EXAM_TYPES: exam_rel = getattr(self, t) if exam_rel.exists(): - exams = exam_rel.filter(exam_mode=True) + exams = exam_rel.filter(exam_mode=True).order("name") available_exams.append((n, exams)) return available_exams @@ -315,10 +322,30 @@ class CidUser(models.Model): return False, "Already sent." # Get a list of taken exams - exams = self.get_cid_exams() + exam_list = self.get_cid_exams() - msg = f""" - """ + exam_text = [] + + for exam_type, exams in exam_list: + exam_text.append(f"{exam_type}\n====") + + for exam in exams: + print(exam) + try: + user_score = exam.user_scores[str(self.cid)] + except KeyError: + user_score = "Score not generated" + t = exam.get_exam_stats() + + exam_text.append( + f"""{t} + == Score: {user_score} + """ + ) + + msg = "\n\n".join(exam_text) + + print(msg) html_msg = f"""""" diff --git a/rad/urls.py b/rad/urls.py index 0ab0439b..9b35c54c 100644 --- a/rad/urls.py +++ b/rad/urls.py @@ -58,6 +58,7 @@ urlpatterns = [ path("", TemplateView.as_view(template_name="index.html"), name="home"), path("cid//", views.cid_scores, name="cid_scores"), path("cid//", views.cid_scores_admin, name="cid_scores_admin"), + path("cid//results", views.cid_results, name="cid_results"), path("cid/", views.cid_selector, name="cid_selector"), # Global url that registers RTS compatible exams path("exam/json/", views.active_exams, name="active_exams"), diff --git a/rad/views.py b/rad/views.py index 02a960c1..59bc7565 100644 --- a/rad/views.py +++ b/rad/views.py @@ -84,6 +84,49 @@ def cid_scores_admin(request, cid): return cid_scores(request, cid_user.cid, cid_user.passcode) +@login_required +@user_passes_test(lambda u: u.is_superuser) +def cid_results(request, cid): + cid_user = CidUser.objects.filter(cid=cid).first() + + if not cid_user: + raise Http404("CID not found") + + EXAM_ANSWER_MAP = { + "physics": (PhysicsCidUserAnswer, PhysicsExam), + "anatomy": (AnatomyCidUserAnswer, AnatomyExam), + "rapids": (RapidsCidUserAnswer, RapidsExam), + "longs": (LongsCidUserAnswer, LongsExam), + "sbas": (SbasCidUserAnswer, SbasExam), + } + kwargs = {"exam_mode": True} + + exams = [] + for exam_type in EXAM_ANSWER_MAP: + CidUserAnswer, Exam = EXAM_ANSWER_MAP[exam_type] + exam_answers = CidUserAnswer.objects.filter(cid=cid) + exam_ids = exam_answers.values_list("exam").distinct() + exams.append((exam_type, Exam.objects.filter(id__in=exam_ids, **kwargs))) + + available_exams = cid_user.get_cid_exams() + + return render( + request, + "cid_results.html", + { + # "physics_exams": physics_exams, + # "anatomy_exams": anatomy_exams, + # "rapid_exams": rapid_exams, + # "longs_exams": longs_exams, + # "sba_exams": sba_exams, + "all_exams": exams, + "cid": cid, + "cid_user": cid_user, + "available_exams": available_exams, + }, + ) + + def cid_scores(request, pk, passcode): # exam = get_object_or_404(Exam, pk=pk) diff --git a/templates/cid_results.html b/templates/cid_results.html new file mode 100644 index 00000000..84a480ad --- /dev/null +++ b/templates/cid_results.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} + +{% block content %} +
+

CID: {{ cid }}

+

The following exams will be available to take when active. + {% for t, exams in available_exams %} +

{{t}}

+ + {% endfor %} + +

Exam results

+ The following exam results been found. Click to view answers (and scores when the results are published): + {% for exam_type, exams in all_exams %} + {% if exams %} +

{{exam_type|title}}

+
    + {% for exam in exams %} +
  • {{exam.name}} {% if exam.active %}[Active]{% endif %} {% if exam.publish_results %}[Results Published]{% endif %}
  • + {% endfor %} +
+ {% endif %} + {% endfor %} + +
+{% endblock %} diff --git a/templates/cid_scores.html b/templates/cid_scores.html index d26462b2..4018d0bb 100644 --- a/templates/cid_scores.html +++ b/templates/cid_scores.html @@ -5,11 +5,11 @@

CID: {{ cid }}

Assigned exams

The following exams will be available to take when active. - {% for t, exams in available_exams %} -

{{t}}

+ {% for exam_type, exams in available_exams %} +

{{exam_type}}

{% endfor %}