.
This commit is contained in:
+95
-7
@@ -145,6 +145,8 @@ class ExamBase(models.Model):
|
||||
# Is this actually used?
|
||||
cid_users = GenericRelation("generic.CidUserExam")
|
||||
|
||||
exam_results_emailed = models.DateTimeField(default=None, null=True)
|
||||
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
@@ -153,11 +155,14 @@ class ExamBase(models.Model):
|
||||
self.recreate_json = recreate_json
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def get_exam_stats(self):
|
||||
text = f"""{self.name}
|
||||
{"-"*len(self.name)}
|
||||
- Candidates: {int(self.stats_candidates)}
|
||||
def get_exam_stats(self, name=True):
|
||||
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}]
|
||||
"""
|
||||
if name:
|
||||
text = f"""{self.name}
|
||||
{"-"*len(self.name)}
|
||||
{text}
|
||||
"""
|
||||
return text
|
||||
|
||||
@@ -223,7 +228,7 @@ class ExamBase(models.Model):
|
||||
|
||||
if user_user is not None:
|
||||
c = CidUserExam.objects.filter(
|
||||
content_type=content_type, object_id=self.pk, user_user=cid_user
|
||||
content_type=content_type, object_id=self.pk, user_user=user_user
|
||||
).first()
|
||||
if c:
|
||||
return c
|
||||
@@ -270,12 +275,93 @@ class ExamBase(models.Model):
|
||||
)
|
||||
|
||||
def get_cid_user_score(self, cid_user):
|
||||
c = str(cid_user)
|
||||
c = "c/"+str(cid_user)
|
||||
if c in self.user_scores:
|
||||
return self.user_scores[c]
|
||||
else:
|
||||
return False
|
||||
|
||||
def generate_user_report(self, user):
|
||||
exam_text = [f"Candidate {user.first_name} [{user.email}]"]
|
||||
|
||||
exam_name = self.name
|
||||
|
||||
exam_text.append(f"{'='*len(exam_name)}\n{exam_name}\n{'='*len(exam_name)}")
|
||||
|
||||
try:
|
||||
user_score = self.user_scores["u/"+str(user.pk)]["score"]
|
||||
|
||||
if self.app_name == "rapids":
|
||||
callstate = self.user_scores["u/"+str(user.pk)]["callstates"]
|
||||
except KeyError:
|
||||
user_score = "Score not generated"
|
||||
|
||||
try:
|
||||
percentage = (
|
||||
f" ({user_score / int(self.stats_max_possible) * 100:.2f}%)"
|
||||
)
|
||||
except TypeError:
|
||||
percentage = ""
|
||||
|
||||
|
||||
exam_text.append(
|
||||
f"""Results\n{'-'*len('Results')}
|
||||
# Score: {user_score} / {int(self.stats_max_possible)}{percentage}
|
||||
"""
|
||||
)
|
||||
stats = self.get_exam_stats(name=False)
|
||||
exam_text.append(f"Stats\n{'-'*len('Stats')}\n{stats}")
|
||||
|
||||
|
||||
exam_text.append(
|
||||
f"Answers breakdown: {callstate}"
|
||||
)
|
||||
|
||||
msg = "\n\n".join(exam_text)
|
||||
|
||||
return msg
|
||||
|
||||
def email_user_results(self, user, resend=False, additional_emails=[]):
|
||||
print("email_user_reuslts:", user)
|
||||
|
||||
#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"
|
||||
|
||||
emails = [user.email]
|
||||
|
||||
supervisor_email = user.userprofile.supervisor_email
|
||||
|
||||
if supervisor_email:
|
||||
emails.append(supervisor_email)
|
||||
|
||||
|
||||
if additional_emails:
|
||||
emails.extend(additional_emails)
|
||||
|
||||
try:
|
||||
send_mail(
|
||||
f"{self.name} results",
|
||||
msg,
|
||||
"no-reply@penracourses.org.uk",
|
||||
emails,
|
||||
fail_silently=False,
|
||||
# html_message=html_msg,
|
||||
)
|
||||
except SMTPException as e:
|
||||
return False, e
|
||||
|
||||
#self.results_email_sent = True
|
||||
#self.save()
|
||||
return True, ""
|
||||
|
||||
|
||||
class NoteType(models.Model):
|
||||
note_type = models.CharField(max_length=200)
|
||||
@@ -396,7 +482,7 @@ class CidUser(models.Model):
|
||||
|
||||
for exam in exams:
|
||||
try:
|
||||
user_score = exam.user_scores[str(self.cid)]
|
||||
user_score = exam.user_scores["c/"+str(self.cid)]
|
||||
except KeyError:
|
||||
user_score = "Score not generated"
|
||||
t = exam.get_exam_stats()
|
||||
@@ -523,6 +609,8 @@ class CidUserExam(models.Model):
|
||||
|
||||
manual_submission = models.BooleanField(default=False)
|
||||
|
||||
results_emailed_status = models.CharField(max_length=255, blank=True)
|
||||
|
||||
|
||||
class CidUserGroup(models.Model):
|
||||
name = models.CharField(blank=True, max_length=50)
|
||||
|
||||
Reference in New Issue
Block a user