This commit is contained in:
Ross
2022-03-30 19:36:48 +01:00
parent bef9118293
commit cc96136e8c
4 changed files with 54 additions and 20 deletions
+1 -1
View File
@@ -1054,7 +1054,7 @@ def collection_detail_view(request, pk):
def collection_case_view(request, pk, case_number):
collection = get_object_or_404(CaseCollection, pk=pk)
cases = collection.cases.all().prefetch_related()
cases = collection.cases.all().order_by("casedetail__sort_order").prefetch_related()
case = cases[case_number]
series_list = case.series.all().prefetch_related("images", "examination", "plane")
+4
View File
@@ -128,6 +128,10 @@ class ExamBase(models.Model):
class Meta:
abstract = True
def save(self, *args, recreate_json=True, **kwargs):
self.recreate_json = recreate_json
super().save(*args, **kwargs)
def get_exam_stats(self):
text = f"""{self.name}
{"-"*len(self.name)}
@@ -10,6 +10,14 @@
{% include 'exam_notes.html' %}
{% if exam.recreate_json %}
<div class="alert alert-warning" role="alert">
Exam JSON is out of date.
<a href="{% url app_name|add:':exam_json_recreate' pk=exam.pk %}">Click here to force refresh</a>
</div>
{% endif %}
This exam has {{question_number}} questions. Time limit: {{exam.time_limit}} seconds.
Exam mode: {{ exam.exam_mode }}<br />
+41 -19
View File
@@ -1,5 +1,6 @@
from collections import defaultdict
import statistics
import threading
from dal import autocomplete
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
@@ -425,7 +426,13 @@ class ExamViews(View, LoginRequiredMixin):
exam.recreate_json = True
exam.save()
exam.get_exam_json()
# exam.get_exam_json()
# TODO: check if mememory leak?
t = threading.Thread(target=self.exam_json,
args=(request, pk))
t.setDaemon(True)
t.start()
return redirect("{}:exam_overview".format(self.app_name), pk=pk)
@@ -559,8 +566,11 @@ class ExamViews(View, LoginRequiredMixin):
request,
f"{self.app_name}/base.html",
{
"simple_content": format_html("""Answer scores updated <br/>
<a href='{}'>Return</a>""", reverse(f"{self.app_name}:exam_scores_cid", kwargs={"pk": exam.pk}))
"simple_content": format_html(
"""Answer scores updated <br/>
<a href='{}'>Return</a>""",
reverse(f"{self.app_name}:exam_scores_cid", kwargs={"pk": exam.pk}),
)
},
)
@@ -746,9 +756,7 @@ class ExamViews(View, LoginRequiredMixin):
question_unmarked_map = []
for q in questions:
count = int(q.get_unmarked_user_answer_count(exam_pk=exam.pk))
question_unmarked_map.append(
(q, count, count)
)
question_unmarked_map.append((q, count, count))
return render(
request,
@@ -955,7 +963,7 @@ class ExamViews(View, LoginRequiredMixin):
exam.recreate_json = False
exam.json_creation_time = time
exam.save()
exam.save(recreate_json=False)
# We also try to clear the cache of any associated questions (longs)
# see exam_question_json
@@ -1304,6 +1312,7 @@ class ExaminationAutocomplete(autocomplete.Select2QuerySetView):
return qs
class CidUserExamView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
model = CidUser
table_class = CidUserExamTable
@@ -1336,6 +1345,7 @@ class CidUserExamView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
context["exams"] = True
return context
class CidUserView(CidManagerRequiredMixin, SingleTableMixin, FilterView):
model = CidUser
table_class = CidUserTable
@@ -1385,6 +1395,7 @@ def group_view(request):
{"groups": groups},
)
@user_is_cid_user_manager
def group_view(request):
groups = CidUserGroup.objects.filter(archive=False)
@@ -1395,6 +1406,7 @@ def group_view(request):
{"groups": groups, "view_all": False},
)
@user_is_cid_user_manager
def group_view_all(request):
groups = CidUserGroup.objects.filter()
@@ -1411,6 +1423,7 @@ def group_view_all(request):
def group_email_resend(request, pk):
return group_email(request, pk, resend=True)
@login_required
@user_is_cid_user_manager
def group_email_results_resend(request, pk):
@@ -1430,24 +1443,24 @@ def group_email(request, pk, resend=False):
return render(
request,
"generic/group_emailed.html",
#{"sent": sent, "not_sent": not_sent, "users_count": users.count()},
# {"sent": sent, "not_sent": not_sent, "users_count": users.count()},
{"users": users, "users_count": users.count()},
)
#sent = []
#not_sent = []
#for u in users:
# sent = []
# not_sent = []
# for u in users:
# success, msg = u.email_details(resend=resend)
# if success:
# sent.append(u)
# else:
# not_sent.append((u, msg))
#return render(
# return render(
# request,
# "generic/group_emailed.html",
# {"sent": sent, "not_sent": not_sent, "users_count": users.count()},
#)
# )
@user_is_cid_user_manager
@@ -1457,11 +1470,13 @@ def group_email_results(request, pk, resend=False):
if resend:
users = group.ciduser_set.filter(active=True, internal_candidate=True)
else:
users = group.ciduser_set.filter(active=True, internal_candidate=True, results_email_sent=False)
users = group.ciduser_set.filter(
active=True, internal_candidate=True, results_email_sent=False
)
#sent = []
#not_sent = []
#for u in users:
# sent = []
# not_sent = []
# for u in users:
# success, msg = u.email_results(resend=resend)
# if success:
# sent.append(u)
@@ -1471,18 +1486,22 @@ def group_email_results(request, pk, resend=False):
return render(
request,
"generic/group_emailed.html",
#{"sent": sent, "not_sent": not_sent, "users_count": users.count()},
# {"sent": sent, "not_sent": not_sent, "users_count": users.count()},
{"users": users, "users_count": users.count()},
)
@user_is_cid_user_manager
def candidate_email_results(request, cid, resend=False):
user = CidUser.objects.get(cid=cid)
email_sent, comment = user.email_results(additional_emails=["priya.suresh@nhs.net"], resend=True)
email_sent, comment = user.email_results(
additional_emails=["priya.suresh@nhs.net"], resend=True
)
return JsonResponse({"sent": email_sent, "comment": comment})
@user_is_cid_user_manager
def candidate_email_results_resend(request, cid, resend=True):
return candidate_email_results(request, cid, resend=True)
@@ -1637,14 +1656,17 @@ class CidUserCreate(RevisionMixin, CidManagerRequiredMixin, CreateView):
model = CidUser
form_class = CidUserForm
class CidUserUpdate(RevisionMixin, CidManagerRequiredMixin, UpdateView):
model = CidUser
form_class = CidUserForm
class CidUserGroupCreate(RevisionMixin, CidManagerRequiredMixin, CreateView):
model = CidUserGroup
form_class = CidUserGroupForm
class CidUserGroupUpdate(RevisionMixin, CidManagerRequiredMixin, UpdateView):
model = CidUserGroup
form_class = CidUserGroupForm