This commit is contained in:
Ross
2022-06-26 19:01:48 +01:00
parent 695a07f2e2
commit f454d5a08d
16 changed files with 544 additions and 94 deletions
+95 -7
View File
@@ -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)