From 455be3792281594316def4215df081d10ed7d388 Mon Sep 17 00:00:00 2001 From: Ross Date: Sun, 26 Jun 2022 19:59:01 +0100 Subject: [PATCH] . --- generic/models.py | 8 ++------ generic/views.py | 17 ++++++++++++++++- rapids/templates/rapids/exam_scores_new.html | 11 ++++++++++- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/generic/models.py b/generic/models.py index 17e2d38b..28c261db 100644 --- a/generic/models.py +++ b/generic/models.py @@ -157,7 +157,7 @@ class ExamBase(models.Model): def get_exam_stats(self, name=True): if self.stats_candidates < int(4): - return f"- Candidates: {self.stats_candidates} (too few to generate stats)" + return f"- Candidates: {int(self.stats_candidates)} (too few to generate stats)" text = f"""- Candidates: {int(self.stats_candidates)} - Mean: {self.stats_mean:.2f} Median: {self.stats_median} Mode: {self.stats_mode} [Min: {self.stats_min} / Max: {self.stats_max}] @@ -324,17 +324,13 @@ class ExamBase(models.Model): return msg - def email_user_results(self, user, resend=False, additional_emails=[]): - print("email_user_reuslts:", user) - + def email_user_results(self, user, resend=False, additional_emails=list): #if self.results_email_sent and not resend: # return False, "Already sent." # Get a list of taken exams msg = self.generate_user_report(user) - print(msg) - if not user.email: return False, "User has no email" diff --git a/generic/views.py b/generic/views.py index cdd10599..3e7883fa 100644 --- a/generic/views.py +++ b/generic/views.py @@ -20,6 +20,9 @@ from django.http import HttpResponseRedirect, HttpResponse from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from django.core.exceptions import ValidationError +from django.core.validators import validate_email + from django.utils.decorators import method_decorator @@ -585,6 +588,15 @@ class ExamViews(View, LoginRequiredMixin): raise PermissionDenied + additional_email = request.GET.get("additional_email", "") + + # check addition email is valid + if additional_email: + try: + validate_email(additional_email) + except ValidationError: + return JsonResponse("Invalid additional email") + # 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/")] @@ -594,7 +606,10 @@ class ExamViews(View, LoginRequiredMixin): email_results = {} for u in users: user = User.objects.get(pk=u) - email_results[user.username] = exam.email_user_results(user) + if additional_email: + email_results[user.username] = exam.email_user_results(user, additional_emails=[additional_email]) + else: + email_results[user.username] = exam.email_user_results(user) user_exam = exam.get_or_create_cid_user_exam(user_user=user) user_exam.results_emailed_status = json.dumps(email_results[user.username]) + f" {time}" diff --git a/rapids/templates/rapids/exam_scores_new.html b/rapids/templates/rapids/exam_scores_new.html index 56a562ad..5aff081d 100644 --- a/rapids/templates/rapids/exam_scores_new.html +++ b/rapids/templates/rapids/exam_scores_new.html @@ -104,7 +104,16 @@ $(document).ready(() => { $("#email-results-button").click((evt) => { if (confirm("This will email results, please make sure scores have been refreshed before continuing")) { - window.location = "{% url 'rapids:exam_report_email' exam_id=exam.pk %}"; + + let additional_email = prompt("Please enter an additional email to send to (user and supervisor will automatically be used if available) if required"); + + let url = "{% url 'rapids:exam_report_email' exam_id=exam.pk %}"; + + if ( additional_email != null ) { + url = url + "?additional_email="+encodeURI(additional_email) + } + + window.location = url; } evt.preventDefault();