From f30b65e85cba5d3f25b11787530afbee957ce599 Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 5 Oct 2017 16:24:38 +0530 Subject: Change Answerpaper model method to get shuffled questions --- yaksh/models.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'yaksh/models.py') diff --git a/yaksh/models.py b/yaksh/models.py index 4859d3e..1cc0634 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from datetime import datetime, timedelta import json +import random import ruamel.yaml from ruamel.yaml.scalarstring import PreservedScalarString from ruamel.yaml.comments import CommentedMap @@ -851,6 +852,8 @@ class QuestionPaper(models.Model): questions = self.get_ordered_questions() for question_set in self.random_questions.all(): questions += question_set.get_random_questions() + if self.shuffle_questions: + return self.get_shuffled_questions(questions) return questions def make_answerpaper(self, user, ip, attempt_num): @@ -941,9 +944,14 @@ class QuestionPaper(models.Model): for que_id in que_order: ques.append(self.fixed_questions.get(id=que_id)) else: - ques = self.fixed_questions.all() + ques = list(self.fixed_questions.all()) return ques + def get_shuffled_questions(self, questions): + """Get shuffled questions if auto suffle is enabled""" + random.shuffle(questions) + return questions + def __str__(self): return "Question Paper for " + self.quiz.description -- cgit From 474fc2c54eda0e8c890ea17b791b2fe74d07c611 Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 5 Oct 2017 17:07:41 +0530 Subject: Change models.py and test_models.py - Add else condition in make_answerpaper instead of direct return - Remove while loop in shuffle questions testcase --- yaksh/models.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'yaksh/models.py') diff --git a/yaksh/models.py b/yaksh/models.py index 1cc0634..78669e7 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -853,8 +853,11 @@ class QuestionPaper(models.Model): for question_set in self.random_questions.all(): questions += question_set.get_random_questions() if self.shuffle_questions: - return self.get_shuffled_questions(questions) - return questions + all_questions = self.get_shuffled_questions(questions) + print("in _get_questions_for_answerpaper", all_questions, "\n") + else: + all_questions = questions + return all_questions def make_answerpaper(self, user, ip, attempt_num): """Creates an answer paper for the user to attempt the quiz""" @@ -950,6 +953,7 @@ class QuestionPaper(models.Model): def get_shuffled_questions(self, questions): """Get shuffled questions if auto suffle is enabled""" random.shuffle(questions) + print("in get_shuffled_questions", questions, "\n") return questions def __str__(self): -- cgit From 30f4b893d4a36e0e1408ef2a07c92521fc4074bc Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 6 Oct 2017 17:54:09 +0530 Subject: Add new field in AnswerPaper model and fetch questions as per order --- yaksh/models.py | 63 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 16 deletions(-) (limited to 'yaksh/models.py') diff --git a/yaksh/models.py b/yaksh/models.py index 78669e7..9ac629c 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -854,7 +854,6 @@ class QuestionPaper(models.Model): questions += question_set.get_random_questions() if self.shuffle_questions: all_questions = self.get_shuffled_questions(questions) - print("in _get_questions_for_answerpaper", all_questions, "\n") else: all_questions = questions return all_questions @@ -878,10 +877,11 @@ class QuestionPaper(models.Model): ans_paper.question_paper = self ans_paper.save() questions = self._get_questions_for_answerpaper() - for question in questions: - ans_paper.questions.add(question) - for question in questions: - ans_paper.questions_unanswered.add(question) + ans_paper.questions.add(*questions) + question_ids = [str(que.id) for que in questions] + ans_paper.questions_order = ",".join(question_ids) + ans_paper.save() + ans_paper.questions_unanswered.add(*questions) except AnswerPaper.MultipleObjectsReturned: ans_paper = AnswerPaper.objects.get(user=user, attempt_number=attempt_num, @@ -953,9 +953,13 @@ class QuestionPaper(models.Model): def get_shuffled_questions(self, questions): """Get shuffled questions if auto suffle is enabled""" random.shuffle(questions) - print("in get_shuffled_questions", questions, "\n") return questions + def has_questions(self): + questions = self.get_ordered_questions() + \ + list(self.random_questions.all()) + return False if len(questions) == 0 else True + def __str__(self): return "Question Paper for " + self.quiz.description @@ -1176,13 +1180,27 @@ class AnswerPaper(models.Model): default='inprogress' ) + # set question order + questions_order = models.CharField(max_length=255, blank=True, default='') + objects = AnswerPaperManager() def current_question(self): """Returns the current active question to display.""" if self.questions_unanswered.all(): - return self.questions_unanswered.all()[0] - return self.questions.all()[0] + cur_question = self.get_current_question( + self.questions_unanswered.all()) + else: + cur_question = self.get_current_question(self.questions.all()) + return cur_question + + def get_current_question(self, questions): + if self.questions_order: + question_id = int(self.questions_order.split(',')[0]) + question = self.questions_unanswered.get(id=question_id) + else: + question = questions.first() + return question def questions_left(self): """Returns the number of questions left.""" @@ -1207,17 +1225,30 @@ class AnswerPaper(models.Model): Skips the current question and returns the next sequentially available question. """ - all_questions = self.questions.all() - unanswered_questions = self.questions_unanswered.all() - questions = list(all_questions.values_list('id', flat=True)) - if len(questions) == 0: + if self.questions_order: + all_questions = [int(q_id) + for q_id in self.questions_order.split(',')] + else: + all_questions = list(self.questions.all().values_list( + 'id', flat=True)) + if len(all_questions) == 0: return None try: - index = questions.index(int(question_id)) - next_id = questions[index+1] + index = all_questions.index(int(question_id)) + next_id = all_questions[index+1] except (ValueError, IndexError): - next_id = questions[0] - return all_questions.get(id=next_id) + next_id = all_questions[0] + return self.questions.get(id=next_id) + + def get_all_ordered_questions(self): + """Get all questions in a specific""" + if self.questions_order: + que_ids = [int(q_id) for q_id in self.questions_order.split(',')] + questions = [self.questions.get(id=que_id) + for que_id in que_ids] + else: + questions = list(self.questions.all()) + return questions def time_left(self): """Return the time remaining for the user in seconds.""" -- cgit From f4fd03fd09c53a655eedaaa7b9804591ca434966 Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 6 Oct 2017 18:11:37 +0530 Subject: Disable shuffle questions for demo quiz --- yaksh/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'yaksh/models.py') diff --git a/yaksh/models.py b/yaksh/models.py index 9ac629c..c6f6a6b 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -924,7 +924,7 @@ class QuestionPaper(models.Model): def create_demo_quiz_ppr(self, demo_quiz, user): question_paper = QuestionPaper.objects.create(quiz=demo_quiz, total_marks=6.0, - shuffle_questions=True + shuffle_questions=False ) summaries = ['Roots of quadratic equation', 'Print Output', 'Adding decimals', 'For Loop over String', @@ -1241,7 +1241,7 @@ class AnswerPaper(models.Model): return self.questions.get(id=next_id) def get_all_ordered_questions(self): - """Get all questions in a specific""" + """Get all questions in a specific order for answerpaper""" if self.questions_order: que_ids = [int(q_id) for q_id in self.questions_order.split(',')] questions = [self.questions.get(id=que_id) -- cgit From 2eb511847777e4e941ed5fc40783086d5e0bdfcc Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 6 Oct 2017 23:24:38 +0530 Subject: Change models.py - Change question_order field from charfield to textfield - Refactor has_questions and current_question functions --- yaksh/models.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'yaksh/models.py') diff --git a/yaksh/models.py b/yaksh/models.py index c6f6a6b..eb14e06 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -958,7 +958,7 @@ class QuestionPaper(models.Model): def has_questions(self): questions = self.get_ordered_questions() + \ list(self.random_questions.all()) - return False if len(questions) == 0 else True + return len(questions) > 0 def __str__(self): return "Question Paper for " + self.quiz.description @@ -1181,15 +1181,15 @@ class AnswerPaper(models.Model): ) # set question order - questions_order = models.CharField(max_length=255, blank=True, default='') + questions_order = models.TextField(blank=True, default='') objects = AnswerPaperManager() def current_question(self): """Returns the current active question to display.""" - if self.questions_unanswered.all(): - cur_question = self.get_current_question( - self.questions_unanswered.all()) + questions = self.questions_unanswered.all() + if questions.exists(): + cur_question = self.get_current_question(questions) else: cur_question = self.get_current_question(self.questions.all()) return cur_question -- cgit