.
This commit is contained in:
+33
-6
@@ -130,9 +130,9 @@ class ExamBase(models.Model):
|
|||||||
def get_exam_stats(self):
|
def get_exam_stats(self):
|
||||||
text = f"""{self.name}
|
text = f"""{self.name}
|
||||||
-----
|
-----
|
||||||
Candidate number: {self.stats_candidates}
|
- Candidate number: {self.stats_candidates}
|
||||||
Max (possible) score: {self.stats_max_possible}
|
- Max (possible) score: {self.stats_max_possible}
|
||||||
Mean: {self.stats_mean} Median: {self.stats_median} Mode: {self.stats_mode} [Min: {self.stats_min} / Max: {self.stats_max}]
|
- Mean: {self.stats_mean} Median: {self.stats_median} Mode: {self.stats_mode} [Min: {self.stats_min} / Max: {self.stats_max}]
|
||||||
"""
|
"""
|
||||||
return text
|
return text
|
||||||
|
|
||||||
@@ -209,6 +209,13 @@ class ExamBase(models.Model):
|
|||||||
content_type=content_type, object_id=self.pk, cid_user=cid_user
|
content_type=content_type, object_id=self.pk, cid_user=cid_user
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_cid_user_score(self, cid_user):
|
||||||
|
c = str(cid_user)
|
||||||
|
if c in self.user_scores:
|
||||||
|
return self.user_scores[c]
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class NoteType(models.Model):
|
class NoteType(models.Model):
|
||||||
note_type = models.CharField(max_length=200)
|
note_type = models.CharField(max_length=200)
|
||||||
@@ -305,7 +312,7 @@ class CidUser(models.Model):
|
|||||||
for n, t in self.EXAM_TYPES:
|
for n, t in self.EXAM_TYPES:
|
||||||
exam_rel = getattr(self, t)
|
exam_rel = getattr(self, t)
|
||||||
if exam_rel.exists():
|
if exam_rel.exists():
|
||||||
exams = exam_rel.filter(exam_mode=True)
|
exams = exam_rel.filter(exam_mode=True).order("name")
|
||||||
available_exams.append((n, exams))
|
available_exams.append((n, exams))
|
||||||
|
|
||||||
return available_exams
|
return available_exams
|
||||||
@@ -315,10 +322,30 @@ class CidUser(models.Model):
|
|||||||
return False, "Already sent."
|
return False, "Already sent."
|
||||||
|
|
||||||
# Get a list of taken exams
|
# Get a list of taken exams
|
||||||
exams = self.get_cid_exams()
|
exam_list = self.get_cid_exams()
|
||||||
|
|
||||||
msg = f"""
|
exam_text = []
|
||||||
|
|
||||||
|
for exam_type, exams in exam_list:
|
||||||
|
exam_text.append(f"{exam_type}\n====")
|
||||||
|
|
||||||
|
for exam in exams:
|
||||||
|
print(exam)
|
||||||
|
try:
|
||||||
|
user_score = exam.user_scores[str(self.cid)]
|
||||||
|
except KeyError:
|
||||||
|
user_score = "Score not generated"
|
||||||
|
t = exam.get_exam_stats()
|
||||||
|
|
||||||
|
exam_text.append(
|
||||||
|
f"""{t}
|
||||||
|
== Score: {user_score}
|
||||||
"""
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
msg = "\n\n".join(exam_text)
|
||||||
|
|
||||||
|
print(msg)
|
||||||
|
|
||||||
html_msg = f""""""
|
html_msg = f""""""
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ urlpatterns = [
|
|||||||
path("", TemplateView.as_view(template_name="index.html"), name="home"),
|
path("", TemplateView.as_view(template_name="index.html"), name="home"),
|
||||||
path("cid/<int:pk>/<str:passcode>", views.cid_scores, name="cid_scores"),
|
path("cid/<int:pk>/<str:passcode>", views.cid_scores, name="cid_scores"),
|
||||||
path("cid/<int:cid>/", views.cid_scores_admin, name="cid_scores_admin"),
|
path("cid/<int:cid>/", views.cid_scores_admin, name="cid_scores_admin"),
|
||||||
|
path("cid/<int:cid>/results", views.cid_results, name="cid_results"),
|
||||||
path("cid/", views.cid_selector, name="cid_selector"),
|
path("cid/", views.cid_selector, name="cid_selector"),
|
||||||
# Global url that registers RTS compatible exams
|
# Global url that registers RTS compatible exams
|
||||||
path("exam/json/", views.active_exams, name="active_exams"),
|
path("exam/json/", views.active_exams, name="active_exams"),
|
||||||
|
|||||||
@@ -84,6 +84,49 @@ def cid_scores_admin(request, cid):
|
|||||||
return cid_scores(request, cid_user.cid, cid_user.passcode)
|
return cid_scores(request, cid_user.cid, cid_user.passcode)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@user_passes_test(lambda u: u.is_superuser)
|
||||||
|
def cid_results(request, cid):
|
||||||
|
cid_user = CidUser.objects.filter(cid=cid).first()
|
||||||
|
|
||||||
|
if not cid_user:
|
||||||
|
raise Http404("CID not found")
|
||||||
|
|
||||||
|
EXAM_ANSWER_MAP = {
|
||||||
|
"physics": (PhysicsCidUserAnswer, PhysicsExam),
|
||||||
|
"anatomy": (AnatomyCidUserAnswer, AnatomyExam),
|
||||||
|
"rapids": (RapidsCidUserAnswer, RapidsExam),
|
||||||
|
"longs": (LongsCidUserAnswer, LongsExam),
|
||||||
|
"sbas": (SbasCidUserAnswer, SbasExam),
|
||||||
|
}
|
||||||
|
kwargs = {"exam_mode": True}
|
||||||
|
|
||||||
|
exams = []
|
||||||
|
for exam_type in EXAM_ANSWER_MAP:
|
||||||
|
CidUserAnswer, Exam = EXAM_ANSWER_MAP[exam_type]
|
||||||
|
exam_answers = CidUserAnswer.objects.filter(cid=cid)
|
||||||
|
exam_ids = exam_answers.values_list("exam").distinct()
|
||||||
|
exams.append((exam_type, Exam.objects.filter(id__in=exam_ids, **kwargs)))
|
||||||
|
|
||||||
|
available_exams = cid_user.get_cid_exams()
|
||||||
|
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"cid_results.html",
|
||||||
|
{
|
||||||
|
# "physics_exams": physics_exams,
|
||||||
|
# "anatomy_exams": anatomy_exams,
|
||||||
|
# "rapid_exams": rapid_exams,
|
||||||
|
# "longs_exams": longs_exams,
|
||||||
|
# "sba_exams": sba_exams,
|
||||||
|
"all_exams": exams,
|
||||||
|
"cid": cid,
|
||||||
|
"cid_user": cid_user,
|
||||||
|
"available_exams": available_exams,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def cid_scores(request, pk, passcode):
|
def cid_scores(request, pk, passcode):
|
||||||
# exam = get_object_or_404(Exam, pk=pk)
|
# exam = get_object_or_404(Exam, pk=pk)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="">
|
||||||
|
<h2>CID: {{ cid }}</h2>
|
||||||
|
<p>The following exams will be available to take when active.
|
||||||
|
{% for t, exams in available_exams %}
|
||||||
|
<h4>{{t}}</h4>
|
||||||
|
<ul>
|
||||||
|
{% for e in exams %}
|
||||||
|
<li><a href="{{e.get_take_url}}?cid={{cid}}&passcode={{passcode}}" target="_blank">{{e.name}} {% if e.active %}[Active]{% endif %}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<h3>Exam results</h3>
|
||||||
|
The following exam results been found. Click to view answers (and scores when the results are published):
|
||||||
|
{% for exam_type, exams in all_exams %}
|
||||||
|
{% if exams %}
|
||||||
|
<h4>{{exam_type|title}}</h4>
|
||||||
|
<ul>
|
||||||
|
{% for exam in exams %}
|
||||||
|
<li><a href="{% url exam_type|add:':exam_scores_cid_user' pk=exam.pk cid=cid passcode=passcode %}">{{exam.name}}</a> {% if exam.active %}[Active]{% endif %} {% if exam.publish_results %}[Results Published]{% endif %}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
<h2>CID: {{ cid }}</h2>
|
<h2>CID: {{ cid }}</h2>
|
||||||
<h3>Assigned exams</h3>
|
<h3>Assigned exams</h3>
|
||||||
<p>The following exams will be available to take when active.
|
<p>The following exams will be available to take when active.
|
||||||
{% for t, exams in available_exams %}
|
{% for exam_type, exams in available_exams %}
|
||||||
<h4>{{t}}</h4>
|
<h4>{{exam_type}}</h4>
|
||||||
<ul>
|
<ul>
|
||||||
{% for e in exams %}
|
{% for eexam in exams %}
|
||||||
<li><a href="{{e.get_take_url}}?cid={{cid}}&passcode={{passcode}}" target="_blank">{{e.name}} {% if e.active %}[Active]{% endif %}</a></li>
|
<li><a href="{{exam.get_take_url}}?cid={{cid}}&passcode={{passcode}}" target="_blank">{{exam.name}} {% if exam.active %}[Active]{% endif %}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
Reference in New Issue
Block a user