.
This commit is contained in:
+1
-1
@@ -138,7 +138,7 @@ class ExamBase(models.Model):
|
||||
|
||||
stats_max_possible = models.FloatField(default=0)
|
||||
|
||||
stats_graph = models.TextField(default=0)
|
||||
#stats_graph = models.TextField(default=0)
|
||||
|
||||
user_scores = models.JSONField(default=dict)
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<ul>
|
||||
{% for user, status in status.items %}
|
||||
<li class='{% if status.0 %}text-success{% else %}text-warning{% endif %}'>
|
||||
{{user.username}} {% if status.0 %}success{% else %}failed [{{status.1}}]{% endif %} ({{status.2}})
|
||||
<button hx-get="{% url exam.app_name|add:':exam_user_report_email' exam_id=exam.pk user_id=user.pk %}"
|
||||
hx-prompt="Enter any additional emails"
|
||||
hx-confirm="Are you sure you wish to delete your account?"
|
||||
hx-trigger="click, click from:#test"
|
||||
>Resend</button>
|
||||
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<button id="test">Test</button>
|
||||
@@ -92,8 +92,11 @@
|
||||
User results emailed: {{exam.exam_results_emailed|default:"Never"}}<br/>
|
||||
<button id="email-results-button" title="Email results to users and their supervisors">Email user results</button>
|
||||
<button id="email-unsent-results-button" title="Email results to users and their supervisors">Email unsent user results</button>
|
||||
<button id="email-results-check-button" title="Check the status of emailed results">Check email status</button>
|
||||
<button id="email-results-check-button" title="Check the status of emailed results"
|
||||
hx-get="{% url exam.app_name|add:':exam_report_email_status' exam_id=exam.pk %}"
|
||||
hx-target="#user-details">Check email status</button>
|
||||
<p>Note: currently only works with registered users</p>
|
||||
<div id="user-details"></div>
|
||||
</details>
|
||||
|
||||
</div>
|
||||
@@ -135,9 +138,9 @@
|
||||
evt.preventDefault();
|
||||
|
||||
})
|
||||
$("#email-results-check-button").click((evt) => {
|
||||
window.location = "{% url exam.app_name|add:':exam_report_email_status' exam_id=exam.pk %}";
|
||||
})
|
||||
//$("#email-results-check-button").click((evt) => {
|
||||
// window.location = "{% url exam.app_name|add:':exam_report_email_status' exam_id=exam.pk %}";
|
||||
//})
|
||||
|
||||
})
|
||||
|
||||
|
||||
+26
-15
@@ -588,8 +588,17 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
for u in users:
|
||||
user = User.objects.get(pk=u)
|
||||
user_exam = exam.get_or_create_cid_user_exam(user_user=user)
|
||||
status[user.username] = user_exam.results_emailed_status
|
||||
status[user] = json.loads(user_exam.results_emailed_status)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"generic/exam_report_email_status.html",
|
||||
{
|
||||
"exam": exam,
|
||||
"status": status,
|
||||
"app_name": self.app_name,
|
||||
},
|
||||
)
|
||||
return JsonResponse(status)
|
||||
|
||||
@method_decorator(login_required)
|
||||
@@ -597,7 +606,7 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
return self.exam_report_email(request, exam_id, unsent_only=True)
|
||||
|
||||
@method_decorator(login_required)
|
||||
def exam_report_email(self, request, exam_id, unsent_only=False):
|
||||
def exam_report_email(self, request, exam_id, unsent_only=False, users=None):
|
||||
exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id)
|
||||
|
||||
if request.user not in exam.author.all():
|
||||
@@ -616,7 +625,8 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
|
||||
# We only need to send emails to those who have scores
|
||||
# (who should be in exam.user_scores)
|
||||
users = [i[2:] for i in exam.user_scores if i.startswith("u/")]
|
||||
if users is None:
|
||||
users = [i[2:] for i in exam.user_scores if i.startswith("u/")]
|
||||
|
||||
time = timezone.now()
|
||||
|
||||
@@ -631,11 +641,11 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
|
||||
|
||||
if additional_email:
|
||||
email_results[user.username] = exam.email_user_results(user, additional_emails=[additional_email])
|
||||
email_results[user.pk] = exam.email_user_results(user, additional_emails=[additional_email])
|
||||
else:
|
||||
email_results[user.username] = exam.email_user_results(user)
|
||||
email_results[user.username].append(f" {time}")
|
||||
user_exam.results_emailed_status = json.dumps(email_results[user.username])
|
||||
email_results[user.pk] = exam.email_user_results(user)
|
||||
email_results[user.pk].append(f"{time}")
|
||||
user_exam.results_emailed_status = json.dumps(email_results[user.pk])
|
||||
|
||||
user_exam.save()
|
||||
|
||||
@@ -646,20 +656,21 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
|
||||
@method_decorator(login_required)
|
||||
def exam_user_report_email(self, request, exam_id, user_id):
|
||||
return self.exam_report_email(request, exam_id, users=[user_id])
|
||||
# print(Exam.objects.all())
|
||||
# exams = Exam.objects.all()
|
||||
# print("test", Exam.objects.all().get(id=pk))
|
||||
exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id)
|
||||
#exam = get_object_or_404(self.Exam.objects.prefetch_related("author"), pk=exam_id)
|
||||
|
||||
u = get_object_or_404(User, pk=user_id)
|
||||
#u = get_object_or_404(User, pk=user_id)
|
||||
|
||||
if request.user not in exam.author.all():
|
||||
if not self.check_user_access(request.user, exam_id):
|
||||
raise PermissionDenied
|
||||
#if request.user not in exam.author.all():
|
||||
# if not self.check_user_access(request.user, exam_id):
|
||||
# raise PermissionDenied
|
||||
|
||||
res = exam.email_user_results(u)
|
||||
#res = exam.email_user_results(u)
|
||||
|
||||
return HttpResponse(res)
|
||||
#return HttpResponse(res)
|
||||
|
||||
@method_decorator(login_required)
|
||||
def exam_user_report(self, request, exam_id, user_id):
|
||||
@@ -1654,7 +1665,7 @@ class ExamViews(View, LoginRequiredMixin):
|
||||
exam.stats_min = min(user_scores_list)
|
||||
exam.stats_max = max(user_scores_list)
|
||||
|
||||
exam.stats_graph = fig_html
|
||||
#exam.stats_graph = fig_html
|
||||
|
||||
user_data = {}
|
||||
for u in cids:
|
||||
|
||||
Reference in New Issue
Block a user