From e50673216aaea50d9e14cc10d8e7fc03b2a8ea42 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Wed, 23 Sep 2020 22:49:27 +0530 Subject: Add feature to count number of times MCQ option has been selected --- yaksh/models.py | 43 ++++++++++++++++++++++++-- yaksh/templates/yaksh/statistics_question.html | 23 ++++++++------ yaksh/templatetags/custom_filters.py | 7 +++++ 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index a29e910..abff541 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1993,6 +1993,32 @@ class AnswerPaperManager(models.Manager): questions.append(question.id) return Counter(questions) + def get_per_answer_stats(self, questionpaper_id, attempt_number, + course_id, status='completed'): + papers = self.filter(question_paper_id=questionpaper_id, + course_id=course_id, + attempt_number=attempt_number, status=status) + questions = Question.objects.filter( + questions__id__in=papers, + ).distinct() + + stats = {} + for question in questions: + answers = Answer.objects.filter( + answerpaper__id__in=papers, question=question.id + ).values('answer', 'question__id', 'answerpaper__id') + question_ans_count = {} + answerpaper_count = [] + for ans in answers: + if ans.get('answerpaper__id'): + if ans.get('answer') not in question_ans_count: + question_ans_count[ans.get('answer')] = 1 + else: + question_ans_count[ans.get('answer')] += 1 + answerpaper_count.append(ans.get('answerpaper__id')) + stats[question] = question_ans_count + return stats + def get_all_questions_answered(self, questionpaper_id, attempt_number, course_id, status='completed'): ''' Return a dict of answered question id as key and count as value''' @@ -2046,16 +2072,27 @@ class AnswerPaperManager(models.Manager): course_id) questions = self.get_all_questions(questionpaper_id, attempt_number, course_id) + per_answer_stats = self.get_per_answer_stats( + questionpaper_id, attempt_number, course_id + ) all_questions = Question.objects.filter( id__in=set(questions), active=True ).order_by('type') for question in all_questions: if question.id in questions_answered: - question_stats[question] = [questions_answered[question.id], - questions[question.id]] + question_stats[question] = { + 'answered': [questions_answered[question.id], + questions[question.id]], + 'per_answer': per_answer_stats[question], + } + else: - question_stats[question] = [0, questions[question.id]] + question_stats[question] = { + 'answered': [0, questions[question.id]], + 'per_answer': per_answer_stats[question], + } + return question_stats def _get_answerpapers_for_quiz(self, questionpaper_id, course_id, diff --git a/yaksh/templates/yaksh/statistics_question.html b/yaksh/templates/yaksh/statistics_question.html index 5983835..d70256b 100644 --- a/yaksh/templates/yaksh/statistics_question.html +++ b/yaksh/templates/yaksh/statistics_question.html @@ -1,4 +1,5 @@ {% extends "manage.html" %} +{% load custom_filters %} {% block title %} Question Statistics {% endblock %} {% block pagetitle %} Statistics for {{ quiz.description }}{% endblock pagetitle %} @@ -20,8 +21,8 @@ {% if question_stats %}
Total number of participants: {{ total }}
Question | Type | Total | Answered Correctly | ||
---|---|---|---|---|---|
Question | Type | Total | Answered Correctly | ||
@@ -61,12 +62,14 @@
|
{{ question.type }} | -{{value.1}} | {{ value.0 }} ({% widthratio value.0 value.1 100 %}%) | +{{data.answered.1}} | {{ data.answered.0 }} ({% widthratio data.answered.0 data.answered.1 100 %}%) | + +