From 3c487ad8bb5091f950a54a6fc5f954f634e9276f Mon Sep 17 00:00:00 2001 From: Ali Hassan Date: Mon, 13 Feb 2023 14:35:57 +0500 Subject: [PATCH 1/5] Adds suvey questions in quizes --- .../0030_quizformfield_survey_question.py | 18 ++++++ questionnaires/models.py | 59 +++++++++++-------- .../templates/quizzes/quiz_landing.html | 2 + 3 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 questionnaires/migrations/0030_quizformfield_survey_question.py diff --git a/questionnaires/migrations/0030_quizformfield_survey_question.py b/questionnaires/migrations/0030_quizformfield_survey_question.py new file mode 100644 index 000000000..31af377a5 --- /dev/null +++ b/questionnaires/migrations/0030_quizformfield_survey_question.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.14 on 2023-02-13 06:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('questionnaires', '0029_auto_20220512_1350'), + ] + + operations = [ + migrations.AddField( + model_name='quizformfield', + name='survey_question', + field=models.BooleanField(default=False, help_text='Do not show this question on the results page, or include in quiz scoring', verbose_name='Survey Question'), + ), + ] diff --git a/questionnaires/models.py b/questionnaires/models.py index d64c2e0b9..c077b0cf3 100644 --- a/questionnaires/models.py +++ b/questionnaires/models.py @@ -731,12 +731,20 @@ class QuizFormField(AbstractFormField): blank=True, help_text=_('Feedback message for user answer.') ) + survey_question = models.BooleanField( + verbose_name=_('Survey Question'), + default=False, + help_text=_( + 'Do not show this question on the results page, or include in quiz scoring' + ) + ) panels = [ FieldPanel('label'), FieldPanel('clean_name', classname='disabled-clean-name'), FieldPanel('help_text'), FieldPanel('required'), + FieldPanel('survey_question'), FieldPanel('field_type', classname="formbuilder-type"), FieldPanel('choices', classname="formbuilder-choices"), FieldPanel('default_value', classname="formbuilder-default"), @@ -875,30 +883,33 @@ def get_context(self, request, *args, **kwargs): total_correct = 0 form_data = dict(form.data) for field in self.get_form_fields(): - correct_answer = field.correct_answer.split('|') - - if field.field_type == 'checkbox': - answer = 'true' if form_data.get(field.clean_name) else 'false' - else: - answer = form_data.get(field.clean_name) - - if type(answer) != list: - answer = [str(answer)] - - if field.field_type in ['radio', 'dropdown']: - is_correct = set(answer).issubset(set(correct_answer)) - else: - is_correct = set(answer) == set(correct_answer) - - if is_correct: - total_correct += 1 - total += 1 - fields_info[field.clean_name] = { - 'feedback': field.feedback, - 'correct_answer': field.correct_answer, - 'correct_answer_list': correct_answer, - 'is_correct': is_correct, - } + if not field.survey_question: + correct_answer = field.correct_answer.split('|') + + if field.field_type == 'checkbox': + answer = 'true' if form_data.get(field.clean_name) else 'false' + else: + answer = form_data.get(field.clean_name) + + if type(answer) != list: + answer = [str(answer)] + + if field.field_type in ['radio', 'dropdown']: + is_correct = set(answer).issubset(set(correct_answer)) + else: + is_correct = set(answer) == set(correct_answer) + + if not field.survey_question: + if is_correct: + total_correct += 1 + total += 1 + fields_info[field.clean_name] = { + 'feedback': field.feedback, + 'correct_answer': field.correct_answer, + 'correct_answer_list': correct_answer, + 'is_correct': is_correct, + 'survey_question': field.survey_question, + } context['form'] = form context['fields_info'] = fields_info diff --git a/questionnaires/templates/quizzes/quiz_landing.html b/questionnaires/templates/quizzes/quiz_landing.html index 6fa2c5fa3..67c198af2 100644 --- a/questionnaires/templates/quizzes/quiz_landing.html +++ b/questionnaires/templates/quizzes/quiz_landing.html @@ -30,6 +30,7 @@

{{ page.title }}

{% for field in form.visible_fields %} + {% if not fields_info|get_item:field.name|get_item:'survey_question' %}

@@ -107,6 +108,7 @@

{{ page.title }}

{% endif %}
+ {% endif %} {% endfor %} {% include 'questionnaires/tags/quiz_buttons.html' %}
From 07b51f0dceca167e4b1f672f13ba98958f5afe43 Mon Sep 17 00:00:00 2001 From: Ali Hassan Date: Mon, 13 Feb 2023 15:04:28 +0500 Subject: [PATCH 2/5] Adds test cases --- .../quiz_specific/test_quiz_functionality.py | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/selenium_tests/quiz_specific/test_quiz_functionality.py b/selenium_tests/quiz_specific/test_quiz_functionality.py index 3d3147c44..b280f1674 100644 --- a/selenium_tests/quiz_specific/test_quiz_functionality.py +++ b/selenium_tests/quiz_specific/test_quiz_functionality.py @@ -10,24 +10,24 @@ class QuizSeleniumTests(BaseSeleniumTests): def setUp(self): Site.objects.all().delete() self.setup_blank_site() - self.user = AdminUserFactory() - self.section01 = SectionFactory(parent=self.home, owner=self.user) + user = AdminUserFactory() + section01 = SectionFactory(parent=self.home, owner=user) + self.quiz01 = QuizFactory( + parent=section01, + owner=self.user, + ) def test_correct_quiz(self): - quiz01 = QuizFactory( - parent=self.section01, - owner=self.user, - ) QuizFormFieldFactory( - page=quiz01, - required = True, - choices = "A|B|C", + page=self.quiz01, + required=True, + choices="A|B|C", default_value='', - correct_answer = "B", + correct_answer="B", field_type='checkboxes', ) - self.visit_page(quiz01) + self.visit_page(self.quiz01) quiz_page = QuestionnairePage(self.selenium) quiz_page.select_checkboxes("B") quiz_page.submit_response() @@ -36,20 +36,16 @@ def test_correct_quiz(self): self.assertIn("1 Correct", quiz_result) def test_incorrect_quiz(self): - quiz01 = QuizFactory( - parent=self.section01, - owner=self.user, - ) QuizFormFieldFactory( - page=quiz01, - required = True, - choices = "A|B|C", + page=self.quiz01, + required=True, + choices="A|B|C", default_value='', - correct_answer = "B", + correct_answer="B", field_type='checkboxes', ) - self.visit_page(quiz01) + self.visit_page(self.quiz01) quiz_page = QuestionnairePage(self.selenium) quiz_page.select_checkboxes("A") quiz_page.submit_response() @@ -57,7 +53,22 @@ def test_incorrect_quiz(self): quiz_result = results_page.get_quiz_results_text() self.assertIn("1 Incorrect", quiz_result) - + def test_survey_question_quiz(self): + QuizFormFieldFactory( + page=self.quiz01, + required=True, + survey_question=True, + choices="A|B|C", + default_value='', + correct_answer="A", + field_type='checkboxes', + ) - - + self.visit_page(self.quiz01) + quiz_page = QuestionnairePage(self.selenium) + quiz_page.select_checkboxes("A") + quiz_page.submit_response() + results_page = QuestionnaireResultsPage(self.selenium) + quiz_result = results_page.get_quiz_results_text() + self.assertIn("0 Correct", quiz_result) + self.assertIn("0 Incorrect", quiz_result) From 0654bb7f5597c742b3b4f636adb2128d6a6e612c Mon Sep 17 00:00:00 2001 From: Ali Hassan Date: Mon, 13 Feb 2023 15:05:30 +0500 Subject: [PATCH 3/5] minor change --- selenium_tests/quiz_specific/test_quiz_functionality.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selenium_tests/quiz_specific/test_quiz_functionality.py b/selenium_tests/quiz_specific/test_quiz_functionality.py index b280f1674..90644cadd 100644 --- a/selenium_tests/quiz_specific/test_quiz_functionality.py +++ b/selenium_tests/quiz_specific/test_quiz_functionality.py @@ -14,7 +14,7 @@ def setUp(self): section01 = SectionFactory(parent=self.home, owner=user) self.quiz01 = QuizFactory( parent=section01, - owner=self.user, + owner=user, ) def test_correct_quiz(self): From e7378d61864eccb1c3cc288f08f5bb479df55746 Mon Sep 17 00:00:00 2001 From: Ali Hassan Date: Mon, 13 Feb 2023 16:42:54 +0500 Subject: [PATCH 4/5] refactor code --- .../0030_quizformfield_survey_question.py | 4 +- questionnaires/models.py | 53 +++++++++---------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/questionnaires/migrations/0030_quizformfield_survey_question.py b/questionnaires/migrations/0030_quizformfield_survey_question.py index 31af377a5..87707b160 100644 --- a/questionnaires/migrations/0030_quizformfield_survey_question.py +++ b/questionnaires/migrations/0030_quizformfield_survey_question.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1.14 on 2023-02-13 06:01 +# Generated by Django 3.1.14 on 2023-02-13 11:42 from django.db import migrations, models @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='quizformfield', name='survey_question', - field=models.BooleanField(default=False, help_text='Do not show this question on the results page, or include in quiz scoring', verbose_name='Survey Question'), + field=models.BooleanField(default=False, help_text='Do not show this question on the results page, or include in quiz scoring.', verbose_name='Survey Question'), ), ] diff --git a/questionnaires/models.py b/questionnaires/models.py index c077b0cf3..ee43d374a 100644 --- a/questionnaires/models.py +++ b/questionnaires/models.py @@ -735,7 +735,7 @@ class QuizFormField(AbstractFormField): verbose_name=_('Survey Question'), default=False, help_text=_( - 'Do not show this question on the results page, or include in quiz scoring' + 'Do not show this question on the results page, or include in quiz scoring.' ) ) @@ -883,33 +883,32 @@ def get_context(self, request, *args, **kwargs): total_correct = 0 form_data = dict(form.data) for field in self.get_form_fields(): + correct_answer = field.correct_answer.split('|') + + if field.field_type == 'checkbox': + answer = 'true' if form_data.get(field.clean_name) else 'false' + else: + answer = form_data.get(field.clean_name) + + if type(answer) != list: + answer = [str(answer)] + + if field.field_type in ['radio', 'dropdown']: + is_correct = set(answer).issubset(set(correct_answer)) + else: + is_correct = set(answer) == set(correct_answer) + if not field.survey_question: - correct_answer = field.correct_answer.split('|') - - if field.field_type == 'checkbox': - answer = 'true' if form_data.get(field.clean_name) else 'false' - else: - answer = form_data.get(field.clean_name) - - if type(answer) != list: - answer = [str(answer)] - - if field.field_type in ['radio', 'dropdown']: - is_correct = set(answer).issubset(set(correct_answer)) - else: - is_correct = set(answer) == set(correct_answer) - - if not field.survey_question: - if is_correct: - total_correct += 1 - total += 1 - fields_info[field.clean_name] = { - 'feedback': field.feedback, - 'correct_answer': field.correct_answer, - 'correct_answer_list': correct_answer, - 'is_correct': is_correct, - 'survey_question': field.survey_question, - } + if is_correct: + total_correct += 1 + total += 1 + fields_info[field.clean_name] = { + 'feedback': field.feedback, + 'correct_answer': field.correct_answer, + 'correct_answer_list': correct_answer, + 'is_correct': is_correct, + 'survey_question': field.survey_question, + } context['form'] = form context['fields_info'] = fields_info From 7b153a9a80ce81ef654f32ff3e0de34d453d185e Mon Sep 17 00:00:00 2001 From: Ali Hassan Date: Mon, 13 Feb 2023 12:52:07 +0000 Subject: [PATCH 5/5] Update field --- .../migrations/0030_quizformfield_survey_question.py | 4 ++-- questionnaires/models.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/questionnaires/migrations/0030_quizformfield_survey_question.py b/questionnaires/migrations/0030_quizformfield_survey_question.py index 87707b160..0a48fca77 100644 --- a/questionnaires/migrations/0030_quizformfield_survey_question.py +++ b/questionnaires/migrations/0030_quizformfield_survey_question.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1.14 on 2023-02-13 11:42 +# Generated by Django 3.1.14 on 2023-02-13 12:49 from django.db import migrations, models @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='quizformfield', name='survey_question', - field=models.BooleanField(default=False, help_text='Do not show this question on the results page, or include in quiz scoring.', verbose_name='Survey Question'), + field=models.BooleanField(default=False, help_text='Check this to do not show this question on the results page, or include in quiz scoring.', verbose_name='Survey Question'), ), ] diff --git a/questionnaires/models.py b/questionnaires/models.py index ee43d374a..fa7de0176 100644 --- a/questionnaires/models.py +++ b/questionnaires/models.py @@ -735,7 +735,7 @@ class QuizFormField(AbstractFormField): verbose_name=_('Survey Question'), default=False, help_text=_( - 'Do not show this question on the results page, or include in quiz scoring.' + 'Check this to do not show this question on the results page, or include in quiz scoring.' ) )