improve collection overview page

This commit is contained in:
Ross
2025-07-21 12:52:45 +01:00
parent 6a919ffc53
commit ad4be1e9a6
6 changed files with 115 additions and 3 deletions
+5 -3
View File
@@ -1,14 +1,16 @@
{% extends 'atlas/exams.html' %}
{% load partials %}
{% block content %}
<h2>{{collection.name}}</h2>
{% include 'exam_notes.html' %}
<div>
Exam mode: {{collection.exam_mode}} (Exam open acess: {{collection.exam_open_access}})<br />
Publish results: {{collection.publish_results}}<br />
Active: {{collection.active}}<br />
Exam mode: {{collection.exam_mode}} (open access: {{collection.exam_open_access}})<br />
{% include "generic/partials/exams/exam_status.html#publish-results" %}
{% include "generic/partials/exams/exam_status.html#exam-active" %}
Collection Type: {{collection.get_collection_type_display}}<br />
Self review: {{collection.self_review}}<br />
</div>
+10
View File
@@ -81,6 +81,16 @@ urlpatterns = [
name="collection_take_start",
),
path("collection/<int:pk>/authors", views.CaseCollectionAuthorUpdate.as_view(), name="collection_authors"),
path(
"collection/<int:pk>/toggle_results_published",
views.GenericExamViews.exam_toggle_results_published_htmx,
name="exam_toggle_results_published",
),
path(
"collection/<int:pk>/toggle_active",
views.GenericExamViews.exam_toggle_active_htmx,
name="exam_toggle_active",
),
path(
"collection/<int:exam_id>/cids",
views.GenericExamViews.exam_cids,
+10
View File
@@ -104,6 +104,15 @@
</select>
</span>
<span>
Shorts Exams<br />
<select id="shorts-exams" multiple="multiple">
{% for name, id in shorts_exams %}
<option value="{{id}}">{{name}}</option>
{% endfor %}
</select>
</span>
<span>
CaseCollection Exams<br />
<select id="casecollection-exams" multiple="multiple">
@@ -213,6 +222,7 @@
sba_exams: JSON.stringify($("#sbas-exams").val()),
longs_exams: JSON.stringify($("#longs-exams").val()),
anatomy_exams: JSON.stringify($("#anatomy-exams").val()),
shorts_exams: JSON.stringify($("#shorts-exams").val()),
casecollection_exams: JSON.stringify($("#casecollection-exams").val()),
cid_groups: JSON.stringify($("#cid-groups").val()),
delete: false,
@@ -0,0 +1,30 @@
{% load partials %}
{% partialdef publish-results %}
<div id="publish-results-status">
Publish results: <span>{{collection.publish_results}}</span>
<button
hx-post="{% url 'atlas:exam_toggle_results_published' collection.pk %}"
hx-swap="outerHTML"
hx-target="#publish-results-status"
class="btn btn-sm btn-outline-primary reduce-opacity"
>
{% if collection.publish_results %}Unpublish Results{% else %}Publish Results{% endif %}
</button>
</div>
{% endpartialdef publish-results %}
{% partialdef exam-active %}
<div id="exam-active-status">
Exam active: <span>{{collection.active}}</span>
<button
hx-post="{% url 'atlas:exam_toggle_active' collection.pk %}"
hx-swap="outerHTML"
hx-target="#exam-active-status"
class="btn btn-sm btn-outline-primary reduce-opacity"
>
{% if collection.active %}Deactivate Exam{% else %}Activate Exam{% endif %}
</button>
</div>
{% endpartialdef exam-active %}
+52
View File
@@ -692,6 +692,58 @@ class ExamViews(View, LoginRequiredMixin):
data = {"status": "error"}
return JsonResponse(data, status=400)
@method_decorator(login_required)
def exam_toggle_results_published_htmx(self, request, pk):
if request.method == "POST":
if not self.check_user_edit_access(request.user, exam_id=pk):
return HttpResponse(
format_html(
'<div class="alert alert-danger" role="alert">Error toggling results published.</div>'
)
)
exam = get_object_or_404(self.Exam, pk=pk)
exam.publish_results = not exam.publish_results
exam.save()
return render(
request, "generic/partials/exams/exam_status.html#publish-results", context={
"exam": exam,
"collection": exam
})
else:
HttpResponse(
format_html(
'<div class="alert alert-danger" role="alert">Error toggling results published.</div>'
)
)
@method_decorator(login_required)
def exam_toggle_active_htmx(self, request, pk):
if request.method == "POST":
if not self.check_user_edit_access(request.user, exam_id=pk):
return HttpResponse(
format_html(
'<div class="alert alert-danger" role="alert">Error toggling exam active.</div>'
)
)
exam = get_object_or_404(self.Exam, pk=pk)
exam.active = not exam.active
exam.save()
return render(
request, "generic/partials/exams/exam_status.html#exam-active", context={
"exam": exam,
"collection": exam
})
else:
HttpResponse(
format_html(
'<div class="alert alert-danger" role="alert">Error toggling exam active.</div>'
)
)
@method_decorator(login_required)
def exam_toggle_results_published(self, request, pk):
if request.method == "POST":
+8
View File
@@ -1387,4 +1387,12 @@ span#user-id {
width: auto;
margin-left: auto;
margin-right: auto;
}
.btn.reduce-opacity {
opacity: 0.3;
transition: opacity 0.2s;
}
.btn.reduce-opacity:hover, .btn.reduce-opacity:focus {
opacity: 1;
}