diff --git a/atlas/templates/atlas/collection_candidates.html b/atlas/templates/atlas/collection_candidates.html
new file mode 100644
index 00000000..6a404318
--- /dev/null
+++ b/atlas/templates/atlas/collection_candidates.html
@@ -0,0 +1,27 @@
+{% extends 'atlas/base.html' %}
+
+{% block content %}
+{% include 'atlas:collection_headers.html' %}
+
+
{{cid_user_count}} candidates.
+
+
+
+ {% for cid in cid_users %}
+
+ - {{cid.cid}} [{{cid.passcode}}] {{cid.name}} /
+ Email: {{cid.email}}
+ {% if cid.supervisor_email %} / Supervisor email: {{cid.supervisor_email}}{% endif %}
+ Internal candidate: {{cid.internal_candidate}}
+ {% if cid.login_email_sent %} / Login email sent{% endif %}
+ {% if cid.results_email_sent %} / Results email sent{% endif %}
+
+
+ {% endfor %}
+
+
+
+
+ Manage CIDs here
+
+{% endblock %}
\ No newline at end of file
diff --git a/atlas/templates/atlas/collection_detail.html b/atlas/templates/atlas/collection_detail.html
index 1403b33c..cb68985b 100644
--- a/atlas/templates/atlas/collection_detail.html
+++ b/atlas/templates/atlas/collection_detail.html
@@ -1,25 +1,7 @@
{% extends 'atlas/base.html' %}
{% block content %}
-{% if request.user.is_authenticated %}
-Collection: {{collection.name}}-> Overview /
-Mark /
-Scores /
-Candidates
-
-{% endif %}
-
-
-{{collection.name}}
-
-{% include 'exam_notes.html' %}
+{% include 'atlas:collection_headers.html' %}
{% for case in collection.cases.all %}
- Case {{forloop.counter}}
diff --git a/atlas/templates/atlas/collection_heades.html b/atlas/templates/atlas/collection_heades.html
new file mode 100644
index 00000000..24f076c3
--- /dev/null
+++ b/atlas/templates/atlas/collection_heades.html
@@ -0,0 +1,20 @@
+
+{% if request.user.is_authenticated %}
+Collection: {{collection.name}}-> Overview /
+Mark /
+Scores /
+Candidates
+
+{% endif %}
+
+
+
{{collection.name}}
+
+{% include 'exam_notes.html' %}
\ No newline at end of file
diff --git a/atlas/views.py b/atlas/views.py
index c326e676..f1c391d3 100755
--- a/atlas/views.py
+++ b/atlas/views.py
@@ -308,11 +308,13 @@ class SeriesDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
template_name = "confirm_delete.html"
success_url = reverse_lazy("atlas:series_view")
+
class CaseCollectionDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
model = CaseCollection
template_name = "confirm_delete.html"
success_url = reverse_lazy("atlas:collection_view")
+
class ConditionDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
model = Condition
template_name = "confirm_delete.html"
@@ -1044,7 +1046,7 @@ def categories_list(request):
)
-#def collection_view(request):
+# def collection_view(request):
# collections = CaseCollection.objects.all()
#
# return render(
@@ -1062,40 +1064,52 @@ class CollectionView(LoginRequiredMixin, SingleTableMixin, FilterView):
def collection_detail(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
- return render(
- request, "atlas/collection_detail.html", {"collection": collection}
- )
+ return render(request, "atlas/collection_detail.html", {"collection": collection})
+
def collection_take(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
- return render(
- request, "atlas/collection_take.html", {"collection": collection}
- )
+ return render(request, "atlas/collection_take.html", {"collection": collection})
+
@user_is_collection_author_or_atlas_editor
def collection_mark_cid(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
- return render(
- request, "atlas/collection_take.html", {"collection": collection}
- )
+ return render(request, "atlas/collection_take.html", {"collection": collection})
+
@user_is_collection_author_or_atlas_editor
def collection_scores_cid(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
- return render(
- request, "atlas/collection_take.html", {"collection": collection}
- )
+ return render(request, "atlas/collection_take.html", {"collection": collection})
+
@user_is_collection_author_or_atlas_editor
def collection_candidates(request, pk):
collection = get_object_or_404(CaseCollection, pk=pk)
- return render(
- request, "atlas/collection_take.html", {"collection": collection}
- )
+ if (
+ request.user in collection.author.all()
+ or request.user.groups.filter(name="cid_user_manager").exists()
+ ):
+ cid_users = collection.valid_users.all()
+
+ cid_user_count = cid_users.count()
+ return render(
+ request,
+ "atlas/collection_candidates.html",
+ {
+ "collection": collection,
+ "cid_users": cid_users,
+ "cid_user_count": cid_user_count,
+ },
+ )
+
+ raise PermissionDenied
+
def collection_take_overview(request, pk, cid, passcode):
collection = get_object_or_404(CaseCollection, pk=pk)
@@ -1141,12 +1155,14 @@ def collection_take_overview(request, pk, cid, passcode):
},
)
+
def collection_case_view_take(request, pk, case_number, cid, passcode):
return collection_case_view(request, pk, case_number, True, cid, passcode)
+
def collection_case_view(request, pk, case_number, take=False, cid=None, passcode=None):
collection = get_object_or_404(CaseCollection, pk=pk)
-
+
form = None
if collection.collection_type != collection.COLLECTION_TYPE_CHOICES.REVIEW:
@@ -1183,14 +1199,24 @@ def collection_case_view(request, pk, case_number, take=False, cid=None, passcod
kwargs = {"pk": pk, "cid": cid, "passcode": passcode}
if "next" in request.POST:
- return redirect("atlas:collection_case_view_take", case_number=case_number + 1, **kwargs)
+ return redirect(
+ "atlas:collection_case_view_take",
+ case_number=case_number + 1,
+ **kwargs
+ )
elif "previous" in request.POST:
- return redirect("atlas:collection_case_view_take", case_number=case_number - 1, **kwargs)
+ return redirect(
+ "atlas:collection_case_view_take",
+ case_number=case_number - 1,
+ **kwargs
+ )
elif "finish" in request.POST:
return redirect("atlas:collection_take_overview", **kwargs)
elif "goto" in request.POST:
return redirect(
- "atlas:collection_case_view_take", case_number=int(request.POST.get("goto")), **kwargs
+ "atlas:collection_case_view_take",
+ case_number=int(request.POST.get("goto")),
+ **kwargs
)
else:
form = CidReportAnswerForm(instance=answer)