Enhance ExamCollectionDetail queryset to prefetch related exams and annotate candidate counts for improved performance in templates
This commit is contained in:
@@ -5876,6 +5876,68 @@ class ExamCollectionList(LoginRequiredMixin, ListView):
|
|||||||
class ExamCollectionDetail(AuthorRequiredMixin, DetailView):
|
class ExamCollectionDetail(AuthorRequiredMixin, DetailView):
|
||||||
model = ExamCollection
|
model = ExamCollection
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
# Prefetch related exam sets and annotate candidate counts to avoid per-exam DB hits in templates
|
||||||
|
qs = super().get_queryset()
|
||||||
|
try:
|
||||||
|
from anatomy.models import Exam as AnatomyExam
|
||||||
|
from longs.models import Exam as LongsExam
|
||||||
|
from rapids.models import Exam as RapidsExam
|
||||||
|
from shorts.models import Exam as ShortsExam
|
||||||
|
from physics.models import Exam as PhysicsExam
|
||||||
|
from sbas.models import Exam as SbasExam
|
||||||
|
|
||||||
|
qs = qs.prefetch_related(
|
||||||
|
Prefetch(
|
||||||
|
'anatomy_exams',
|
||||||
|
queryset=AnatomyExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
Prefetch(
|
||||||
|
'longs_exams',
|
||||||
|
queryset=LongsExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
Prefetch(
|
||||||
|
'rapids_exams',
|
||||||
|
queryset=RapidsExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
Prefetch(
|
||||||
|
'shorts_exams',
|
||||||
|
queryset=ShortsExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
Prefetch(
|
||||||
|
'physics_exams',
|
||||||
|
queryset=PhysicsExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
Prefetch(
|
||||||
|
'sbas_exams',
|
||||||
|
queryset=SbasExam.objects.annotate(
|
||||||
|
valid_cid_users_count=Count('valid_cid_users'),
|
||||||
|
valid_user_users_count=Count('valid_user_users'),
|
||||||
|
).prefetch_related('author'),
|
||||||
|
),
|
||||||
|
'author',
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
# If any app is missing or import fails, fall back to default queryset
|
||||||
|
pass
|
||||||
|
|
||||||
|
return qs
|
||||||
|
|
||||||
|
|
||||||
class ExamCollectionEdit(AuthorRequiredMixin, UpdateView):
|
class ExamCollectionEdit(AuthorRequiredMixin, UpdateView):
|
||||||
model = ExamCollection
|
model = ExamCollection
|
||||||
|
|||||||
@@ -17,9 +17,24 @@
|
|||||||
{% if app_name == 'anatomy' %}<a href="{% url 'anatomy:mark2_overview' pk=exam.pk %}" class="flex-col-half">Mark2</a>{% endif %}
|
{% if app_name == 'anatomy' %}<a href="{% url 'anatomy:mark2_overview' pk=exam.pk %}" class="flex-col-half">Mark2</a>{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="flex-col">
|
<span class="flex-col">
|
||||||
<a href="{% url app_name|add:':exam_cids' exam_id=exam.pk %}">Candidates</a> <span class="candidate-counts">[<span title="Number of active CID users">
|
<a href="{% url app_name|add:':exam_cids' exam_id=exam.pk %}">Candidates</a>
|
||||||
{{exam.valid_cid_users.count}}
|
<span class="candidate-counts">[
|
||||||
</span> / <span title="Number of active User users">{{exam.valid_user_users.count}}]</span></span>
|
<span title="Number of active CID users">
|
||||||
|
{% if exam.valid_cid_users_count is not None %}
|
||||||
|
{{ exam.valid_cid_users_count }}
|
||||||
|
{% else %}
|
||||||
|
{{ exam.valid_cid_users.count }}
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
/
|
||||||
|
<span title="Number of active User users">
|
||||||
|
{% if exam.valid_user_users_count is not None %}
|
||||||
|
{{ exam.valid_user_users_count }}
|
||||||
|
{% else %}
|
||||||
|
{{ exam.valid_user_users.count }}
|
||||||
|
{% endif %}
|
||||||
|
]</span>
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<a href="{% url app_name|add:':exam_scores_all' pk=exam.pk %}" class="flex-col-half">Scores</a>
|
<a href="{% url app_name|add:':exam_scores_all' pk=exam.pk %}" class="flex-col-half">Scores</a>
|
||||||
<input type="checkbox" id="active-{{exam.pk}}" class="exam-active-switch" data-posturl="{% url app_name|add:':exam_toggle_active' pk=exam.pk %}" {% if exam.active %}checked{% endif %}>
|
<input type="checkbox" id="active-{{exam.pk}}" class="exam-active-switch" data-posturl="{% url app_name|add:':exam_toggle_active' pk=exam.pk %}" {% if exam.active %}checked{% endif %}>
|
||||||
|
|||||||
Reference in New Issue
Block a user