From 1876a7f84526230b201ec7c0418d366fcc251983 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 27 Apr 2026 21:49:59 +0100 Subject: [PATCH] feat: Enhance collection history page with detailed user and CID exam statistics --- atlas/templates/atlas/collection_history.html | 189 +++++++++++++----- atlas/views.py | 67 ++++--- 2 files changed, 184 insertions(+), 72 deletions(-) diff --git a/atlas/templates/atlas/collection_history.html b/atlas/templates/atlas/collection_history.html index a47ff6e2..f3fa9afa 100644 --- a/atlas/templates/atlas/collection_history.html +++ b/atlas/templates/atlas/collection_history.html @@ -1,67 +1,162 @@ {% extends 'atlas/exams.html' %} {% block content %} -
-

{{collection.name}}

- Global Messages Inbox +
+
+

{{ collection.name }}

+
Collection attempt history and message activity
+
+ +
+ +
+
+
+
+
Cases
+
{{ total_cases }}
+
+
+
+
+
+
+
Attempts
+
{{ total_attempt_count }}
+
+
+
+
+
+
+
Completed Attempts
+
{{ completed_attempt_count }}
+
+
+
+
+
+
+
Outstanding Messages
+
{{ total_outstanding_messages }}
+
+
+
{% if userexams %} -

Users

+
+

Users

+
{{ userexams|length }} user attempt{{ userexams|length|pluralize }}
+
- +
{% endif %} {% if cidexams %} -

CID Users

+
+

CID Users

+
{{ cidexams|length }} CID attempt{{ cidexams|length|pluralize }}
+
-
    +
    {% for cidexam in cidexams %} -
  • - {{cidexam.cid_user}}
    - Completed: {{cidexam.completed}}
    - Started: {{cidexam.start_time}}, Ended: {{cidexam.end_time}}
    - {% if cidexam.outstanding_feedback_count %} - {{ cidexam.outstanding_feedback_count }} outstanding feedback
    - {% elif cidexam.total_review_message_count %} - {{ cidexam.total_review_message_count }} conversation message{{ cidexam.total_review_message_count|pluralize }}
    - {% endif %} - - -
  • +
    +
    +
    +
    +
    + {{ cidexam.cid_user }} + {% if cidexam.completed %} + Completed + {% else %} + In progress + {% endif %} +
    +
    Started: {{ cidexam.start_time|default:"-" }}
    +
    Ended: {{ cidexam.end_time|default:"-" }}
    +
    + {% if cidexam.outstanding_feedback_count %} + {{ cidexam.outstanding_feedback_count }} outstanding message{{ cidexam.outstanding_feedback_count|pluralize }} + {% endif %} + {% if cidexam.total_review_message_count %} + {{ cidexam.total_review_message_count }} conversation message{{ cidexam.total_review_message_count|pluralize }} + {% else %} + No conversation yet + {% endif %} +
    +
    +
    + Open Attempt + Messages + +
    +
    +
    +
    {% endfor %} -
+ + {% endif %} + + {% if not userexams and not cidexams %} +
+
No attempts have been recorded for this collection yet.
+
{% endif %} {% endblock %} diff --git a/atlas/views.py b/atlas/views.py index 6050f5d4..db17fd7c 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -4095,35 +4095,48 @@ def collection_history(request, exam_id: int): """An overview page that shows who has attempted / finised the collection""" collection = get_object_or_404(CaseCollection, pk=exam_id) - casedetails = CaseDetail.objects.filter(collection=collection).order_by( - "sort_order" + casedetails = list(CaseDetail.objects.filter(collection=collection).order_by("sort_order")) + + userexams = list( + collection.get_user_exams() + .select_related("user_user") + .annotate( + outstanding_feedback_count=Count( + "case_review_messages", + filter=Q( + case_review_messages__requires_acknowledgement=True, + case_review_messages__acknowledged_at__isnull=True, + ), + distinct=True, + ), + total_review_message_count=Count("case_review_messages", distinct=True), + ) + .order_by("-outstanding_feedback_count", "completed", "-start_time") + ) + cidexams = list( + collection.get_cid_exams() + .select_related("cid_user") + .annotate( + outstanding_feedback_count=Count( + "case_review_messages", + filter=Q( + case_review_messages__requires_acknowledgement=True, + case_review_messages__acknowledged_at__isnull=True, + ), + distinct=True, + ), + total_review_message_count=Count("case_review_messages", distinct=True), + ) + .order_by("-outstanding_feedback_count", "completed", "-start_time") ) - userexams = collection.get_user_exams().annotate( - outstanding_feedback_count=Count( - "case_review_messages", - filter=Q( - case_review_messages__requires_acknowledgement=True, - case_review_messages__acknowledged_at__isnull=True, - ), - distinct=True, - ), - total_review_message_count=Count("case_review_messages", distinct=True), + total_outstanding_messages = sum(item.outstanding_feedback_count for item in userexams) + sum( + item.outstanding_feedback_count for item in cidexams ) - cidexams = collection.get_cid_exams().annotate( - outstanding_feedback_count=Count( - "case_review_messages", - filter=Q( - case_review_messages__requires_acknowledgement=True, - case_review_messages__acknowledged_at__isnull=True, - ), - distinct=True, - ), - total_review_message_count=Count("case_review_messages", distinct=True), + completed_attempt_count = sum(1 for item in userexams if item.completed) + sum( + 1 for item in cidexams if item.completed ) - - print("useruserexams:", userexams) - print("cidexams:", cidexams) + total_attempt_count = len(userexams) + len(cidexams) return render( request, @@ -4134,6 +4147,10 @@ def collection_history(request, exam_id: int): "can_edit": True, "userexams": userexams, "cidexams": cidexams, + "total_cases": len(casedetails), + "total_attempt_count": total_attempt_count, + "completed_attempt_count": completed_attempt_count, + "total_outstanding_messages": total_outstanding_messages, }, )