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 }}

- - {% for question, value in question_stats.items %} + + {% for question, data in question_stats.items %} - + + + {% endfor %}
QuestionTypeTotalAnswered Correctly
QuestionTypeTotalAnswered Correctly
@@ -61,12 +62,14 @@

    {% for tc in question.testcase_set.all %} -
  1. - {{ tc.mcqtestcase.options|safe }} - {% if tc.mcqtestcase.correct %} - Correct - {% endif %} -
  2. +
  3. + {{ tc.mcqtestcase.options }} + {% if tc.mcqtestcase.correct %} + Correct + {% endif %} + {% get_dict_value data.per_answer tc.id|stringformat:"i" as num %} + Answered: {{ num }} +
  4. {% endfor %}

@@ -76,7 +79,9 @@
{{ 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 %}%)
diff --git a/yaksh/templatetags/custom_filters.py b/yaksh/templatetags/custom_filters.py index 7eba939..81572a7 100644 --- a/yaksh/templatetags/custom_filters.py +++ b/yaksh/templatetags/custom_filters.py @@ -211,3 +211,10 @@ def get_lesson_views(course_id, lesson_id): return TrackLesson.objects.filter( course_id=course_id, lesson_id=lesson_id, watched=True ).count(), course.students.count() + + +@register.simple_tag +def get_dict_value(dictionary, key): + return dictionary.get(key, None) + + -- cgit