From 344b6441017f72225a0d89f41c6cde38f4bbe187 Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 22 Feb 2017 14:58:12 +0530 Subject: Allow moderator to select questions in any order required --- yaksh/static/yaksh/js/question_paper_creation.js | 14 ++++++++++++++ yaksh/templates/yaksh/design_questionpaper.html | 8 +++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/yaksh/static/yaksh/js/question_paper_creation.js b/yaksh/static/yaksh/js/question_paper_creation.js index 898e491..430ec4b 100644 --- a/yaksh/static/yaksh/js/question_paper_creation.js +++ b/yaksh/static/yaksh/js/question_paper_creation.js @@ -46,4 +46,18 @@ $(document).ready(function(){ $("#random").click(); }); + var checked_vals = []; + $('input:checkbox[name="questions"]').click(function() { + if($(this).prop("checked") == true){ + checked_vals.push(parseInt($(this).val())); + } + else{ + checked_vals.pop(parseInt($(this).val())); + } + }); + $('#design_q').submit(function(eventObj) { + $(this).append(''); + return true; +}); + });//document diff --git a/yaksh/templates/yaksh/design_questionpaper.html b/yaksh/templates/yaksh/design_questionpaper.html index 4418c27..829e27f 100644 --- a/yaksh/templates/yaksh/design_questionpaper.html +++ b/yaksh/templates/yaksh/design_questionpaper.html @@ -23,7 +23,7 @@ select {% block content %} -
+ {% csrf_token %} @@ -95,8 +95,10 @@ select {% for question in fixed_questions %}
  • {% endfor %} -- cgit From c2ffb981b81410006a04b43997a2441a99dbff3d Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 22 Feb 2017 15:00:11 +0530 Subject: Remove manytomany relationship for fixed_questions in question paper --- yaksh/models.py | 58 ++++++++++++++++++++++++++++++++++++++++++--------------- yaksh/views.py | 23 ++++++++++++++--------- 2 files changed, 57 insertions(+), 24 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index 398f508..f4a3a7a 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -616,11 +616,11 @@ class Quiz(models.Model): ############################################################################### class QuestionPaperManager(models.Manager): - def _create_trial_from_questionpaper(self, original_quiz_id): + def _create_trial_from_questionpaper(self, original_quiz_id, fixed_que): """Creates a copy of the original questionpaper""" trial_questionpaper = self.get(quiz_id=original_quiz_id) - trial_questions = {"fixed_questions": trial_questionpaper - .fixed_questions.all(), + trial_questions = {"fixed_questions": fixed_que.get_fixed_questions( + trial_questionpaper), "random_questions": trial_questionpaper .random_questions.all() } @@ -635,7 +635,10 @@ class QuestionPaperManager(models.Manager): trial_questionpaper = self.create(quiz=trial_quiz, total_marks=10, ) - trial_questionpaper.fixed_questions.add(*questions_list) + fixed_que = FixedQuestions() + for q_id in questions_list: + que = Question.objects.get(id=q_id) + fixed_que.add_fixed_questions(trial_questionpaper, que) return trial_questionpaper def create_trial_paper_to_test_quiz(self, trial_quiz, original_quiz_id): @@ -643,11 +646,16 @@ class QuestionPaperManager(models.Manager): if self.filter(quiz=trial_quiz).exists(): trial_questionpaper = self.get(quiz=trial_quiz) else: + fixed_que = FixedQuestions() trial_questionpaper, trial_questions = \ - self._create_trial_from_questionpaper(original_quiz_id) + self._create_trial_from_questionpaper(original_quiz_id, + fixed_que + ) trial_questionpaper.quiz = trial_quiz - trial_questionpaper.fixed_questions\ - .add(*trial_questions["fixed_questions"]) + for question in trial_questions["fixed_questions"]: + fixed_que.add_fixed_questions(trial_questionpaper, + question + ) trial_questionpaper.random_questions\ .add(*trial_questions["random_questions"]) trial_questionpaper.save() @@ -661,9 +669,6 @@ class QuestionPaper(models.Model): # Question paper belongs to a particular quiz. quiz = models.ForeignKey(Quiz) - # Questions that will be mandatory in the quiz. - fixed_questions = models.ManyToManyField(Question) - # Questions that will be fetched randomly from the Question Set. random_questions = models.ManyToManyField("QuestionSet") @@ -678,7 +683,8 @@ class QuestionPaper(models.Model): def update_total_marks(self): """ Updates the total marks for the Question Paper""" marks = 0.0 - questions = self.fixed_questions.all() + fixed_ques = FixedQuestions() + questions = fixed_ques.get_fixed_questions(self) for question in questions: marks += question.points for question_set in self.random_questions.all(): @@ -687,7 +693,8 @@ class QuestionPaper(models.Model): def _get_questions_for_answerpaper(self): """ Returns fixed and random questions for the answer paper""" - questions = list(self.fixed_questions.filter(active=True)) + fixed_ques = FixedQuestions() + questions = fixed_ques.get_fixed_questions(self) for question_set in self.random_questions.all(): questions += question_set.get_random_questions() return questions @@ -705,8 +712,10 @@ class QuestionPaper(models.Model): ans_paper.question_paper = self ans_paper.save() questions = self._get_questions_for_answerpaper() - ans_paper.questions.add(*questions) - ans_paper.questions_unanswered.add(*questions) + for question in questions: + ans_paper.questions.add(question) + for question in questions: + ans_paper.questions_unanswered.add(question) return ans_paper def _is_questionpaper_passed(self, user): @@ -748,13 +757,32 @@ class QuestionPaper(models.Model): summary="Yaksh Demo Question", user=user) # add fixed set of questions to the question paper + fixed_que = FixedQuestions() for question in questions: - question_paper.fixed_questions.add(question) + fixed_que.add_fixed_questions(questionpaper, question) def __str__(self): return "Question Paper for " + self.quiz.description +############################################################################### +class FixedQuestions(models.Model): + questionpaper = models.ForeignKey(QuestionPaper) + question = models.ForeignKey(Question) + + def get_fixed_questions(self, qp): + fixed_q = FixedQuestions.objects.filter(questionpaper=qp).order_by('pk') + questions = [que.question for que in fixed_q + if que.question.active == True] + return questions + + def add_fixed_questions(self, qp, que): + FixedQuestions.objects.create(questionpaper=qp, question=que) + + def remove_fixed_questions(self, que_ids): + FixedQuestions.objects.filter(question_id__in=que_ids).delete() + + ############################################################################### class QuestionSet(models.Model): """Question set contains a set of questions from which random questions diff --git a/yaksh/views.py b/yaksh/views.py index 63653e6..9b6fc4e 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -25,7 +25,8 @@ import six # Local imports. from yaksh.models import get_model_class, Quiz, Question, QuestionPaper, QuestionSet, Course from yaksh.models import Profile, Answer, AnswerPaper, User, TestCase, FileUpload,\ - has_profile, StandardTestCase, McqTestCase, StdIOBasedTestCase, HookTestCase + has_profile, StandardTestCase, McqTestCase, StdIOBasedTestCase, HookTestCase,\ + FixedQuestions from yaksh.forms import UserRegisterForm, UserLoginForm, QuizForm,\ QuestionForm, RandomQuestionForm,\ QuestionFilterForm, CourseForm, ProfileForm, UploadFileForm,\ @@ -265,7 +266,8 @@ def show_all_questionpapers(request, questionpaper_id=None): else: qu_papers = QuestionPaper.objects.get(id=questionpaper_id) quiz = qu_papers.quiz - fixed_questions = qu_papers.fixed_questions.all() + fixed_ques = FixedQuestions() + fixed_questions = fixed_ques.get_fixed_questions(qu_papers) random_questions = qu_papers.random_questions.all() context = {'quiz': quiz, 'fixed_questions': fixed_questions, 'random_questions': random_questions} @@ -805,8 +807,9 @@ def _remove_already_present(questionpaper_id, questions): if questionpaper_id is None: return questions questionpaper = QuestionPaper.objects.get(pk=questionpaper_id) - questions = questions.exclude( - id__in=questionpaper.fixed_questions.values_list('id', flat=True)) + fixed_questions = FixedQuestions.objects.filter( + questionpaper=questionpaper).values_list('question_id', flat=True) + questions = questions.exclude(id__in=fixed_questions) for random_set in questionpaper.random_questions.all(): questions = questions.exclude( id__in=random_set.questions.values_list('id', flat=True)) @@ -824,6 +827,7 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): questions = None marks = None state = None + fixed_que = FixedQuestions() if questionpaper_id is None: question_paper = QuestionPaper.objects.get_or_create(quiz_id=quiz_id)[0] else: @@ -839,13 +843,14 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): state = request.POST.get('is_active', None) if 'add-fixed' in request.POST: - question_ids = request.POST.getlist('questions', None) - for question in Question.objects.filter(id__in=question_ids): - question_paper.fixed_questions.add(question) + question_ids = request.POST.get('checked_ques', None).split(',') + for q_id in question_ids: + que = Question.objects.get(id=q_id) + fixed_que.add_fixed_questions(question_paper, que) if 'remove-fixed' in request.POST: question_ids = request.POST.getlist('added-questions', None) - question_paper.fixed_questions.remove(*question_ids) + fixed_que.remove_fixed_questions(question_ids) if 'add-random' in request.POST: question_ids = request.POST.getlist('random_questions', None) @@ -872,7 +877,7 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): question_paper.update_total_marks() question_paper.save() random_sets = question_paper.random_questions.all() - fixed_questions = question_paper.fixed_questions.all() + fixed_questions = fixed_que.get_fixed_questions(question_paper) context = {'qpaper_form': qpaper_form, 'filter_form': filter_form, 'qpaper': question_paper, 'questions': questions, 'fixed_questions': fixed_questions, 'state': state, 'random_sets': random_sets} -- cgit From b8d6116cd59f68888aca8f2acceecc9b85ebf7de Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 22 Feb 2017 15:01:24 +0530 Subject: Change models and views test to get fixed questions --- yaksh/test_models.py | 28 ++++++++++++++++------------ yaksh/test_views.py | 10 +++++----- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/yaksh/test_models.py b/yaksh/test_models.py index cd66aed..efd5fd3 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -1,7 +1,7 @@ import unittest from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - StdIOBasedTestCase, FileUpload, McqTestCase + StdIOBasedTestCase, FileUpload, McqTestCase, FixedQuestions import json from datetime import datetime, timedelta from django.utils import timezone @@ -325,8 +325,10 @@ class QuestionPaperTestCases(unittest.TestCase): ) # add fixed set of questions to the question paper - self.question_paper.fixed_questions.add(self.questions[3], - self.questions[5]) + fixed_ques = FixedQuestions() + fixed_ques.add_fixed_questions(self.question_paper, self.questions[3]) + fixed_ques.add_fixed_questions(self.question_paper, self.questions[5]) + # create two QuestionSet for random questions # QuestionSet 1 self.question_set_1 = QuestionSet.objects.create(marks=2, @@ -374,8 +376,9 @@ class QuestionPaperTestCases(unittest.TestCase): def test_questionpaper(self): """ Test question paper""" self.assertEqual(self.question_paper.quiz.description, 'demo quiz') - self.assertSequenceEqual(self.question_paper.fixed_questions.all(), - [self.questions[3], self.questions[5]]) + fixed_ques = FixedQuestions() + ques = fixed_ques.get_fixed_questions(self.question_paper) + self.assertSequenceEqual(ques, [self.questions[3], self.questions[5]]) self.assertTrue(self.question_paper.shuffle_questions) def test_update_total_marks(self): @@ -415,7 +418,8 @@ class QuestionPaperTestCases(unittest.TestCase): self.assertIsInstance(answerpaper, AnswerPaper) paper_questions = answerpaper.questions.all() self.assertEqual(len(paper_questions), 7) - fixed_questions = set(self.question_paper.fixed_questions.all()) + fixed_ques = FixedQuestions() + fixed_questions = set(fixed_ques.get_fixed_questions(self.question_paper)) self.assertTrue(fixed_questions.issubset(set(paper_questions))) answerpaper.passed = True answerpaper.save() @@ -429,8 +433,8 @@ class QuestionPaperTestCases(unittest.TestCase): self.question_paper.id ) self.assertEqual(trial_paper.quiz, trial_quiz) - self.assertEqual(trial_paper.fixed_questions.all(), - self.question_paper.fixed_questions.all() + self.assertEqual(fixed_ques.get_fixed_questions(trial_paper), + fixed_ques.get_fixed_questions(self.question_paper) ) self.assertEqual(trial_paper.random_questions.all(), self.question_paper.random_questions.all() @@ -442,10 +446,10 @@ class QuestionPaperTestCases(unittest.TestCase): trial_quiz, self.questions_list ) self.assertEqual(trial_paper.quiz, trial_quiz) - self.assertEqual(self.questions_list, - self.question_paper.fixed_questions - .values_list("id", flat=True) - ) + fixed_q = FixedQuestions.objects.filter( + questionpaper=self.question_paper).values_list( + 'question_id', flat=True) + self.assertEqual(self.questions_list, fixed_q) ############################################################################### diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 7757f70..9d74697 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -10,7 +10,7 @@ from django.utils import timezone from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - StdIOBasedTestCase, has_profile + StdIOBasedTestCase, has_profile, FixedQuestions class TestProfile(TestCase): @@ -1161,8 +1161,8 @@ class TestViewAnswerPaper(TestCase): self.question_paper = QuestionPaper.objects.create(quiz=self.quiz, total_marks=1.0) - - self.question_paper.fixed_questions.add(self.question) + fixed_ques = FixedQuestions() + fixed_ques.add_fixed_questions(self.question_paper, self.question) self.question_paper.save() AnswerPaper.objects.create(user_id=3, @@ -1446,8 +1446,8 @@ class TestGrader(TestCase): self.question_paper = QuestionPaper.objects.create(quiz=self.quiz, total_marks=1.0) - - self.question_paper.fixed_questions.add(self.question) + fixed_ques = FixedQuestions() + fixed_ques.add_fixed_questions(self.question_paper, self.question) self.question_paper.save() self.answerpaper = AnswerPaper.objects.create(user_id=3, -- cgit From ca3c488193a7321b0ed0986856c4e74feadc199c Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 8 Mar 2017 15:31:03 +0530 Subject: Change views and models - Remove Fixed Question Model - Create a fixed question order attribute in models --- yaksh/models.py | 60 +++++++++++++++++++++------------------------------- yaksh/test_models.py | 27 ++++++++++++----------- yaksh/test_views.py | 8 +++---- yaksh/views.py | 43 ++++++++++++++++++++++++------------- 4 files changed, 68 insertions(+), 70 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index f4a3a7a..068bd66 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -616,11 +616,11 @@ class Quiz(models.Model): ############################################################################### class QuestionPaperManager(models.Manager): - def _create_trial_from_questionpaper(self, original_quiz_id, fixed_que): + def _create_trial_from_questionpaper(self, original_quiz_id): """Creates a copy of the original questionpaper""" trial_questionpaper = self.get(quiz_id=original_quiz_id) - trial_questions = {"fixed_questions": fixed_que.get_fixed_questions( - trial_questionpaper), + fixed_ques = trial_questionpaper.get_ordered_questions() + trial_questions = {"fixed_questions": fixed_ques, "random_questions": trial_questionpaper .random_questions.all() } @@ -635,10 +635,10 @@ class QuestionPaperManager(models.Manager): trial_questionpaper = self.create(quiz=trial_quiz, total_marks=10, ) - fixed_que = FixedQuestions() for q_id in questions_list: que = Question.objects.get(id=q_id) - fixed_que.add_fixed_questions(trial_questionpaper, que) + FixedQuestions.objects.add_fixed_questions( + trial_questionpaper, que) return trial_questionpaper def create_trial_paper_to_test_quiz(self, trial_quiz, original_quiz_id): @@ -646,16 +646,12 @@ class QuestionPaperManager(models.Manager): if self.filter(quiz=trial_quiz).exists(): trial_questionpaper = self.get(quiz=trial_quiz) else: - fixed_que = FixedQuestions() trial_questionpaper, trial_questions = \ self._create_trial_from_questionpaper(original_quiz_id, - fixed_que ) trial_questionpaper.quiz = trial_quiz - for question in trial_questions["fixed_questions"]: - fixed_que.add_fixed_questions(trial_questionpaper, - question - ) + trial_questionpaper.fixed_questions\ + .add(*trial_questions["fixed_questions"]) trial_questionpaper.random_questions\ .add(*trial_questions["random_questions"]) trial_questionpaper.save() @@ -669,6 +665,9 @@ class QuestionPaper(models.Model): # Question paper belongs to a particular quiz. quiz = models.ForeignKey(Quiz) + # Questions that will be mandatory in the quiz. + fixed_questions = models.ManyToManyField(Question) + # Questions that will be fetched randomly from the Question Set. random_questions = models.ManyToManyField("QuestionSet") @@ -678,13 +677,15 @@ class QuestionPaper(models.Model): # Total marks for the question paper. total_marks = models.FloatField(default=0.0, blank=True) + # Sequence or Order of fixed questions + fixed_question_order = models.CharField(max_length=255, blank=True) + objects = QuestionPaperManager() def update_total_marks(self): """ Updates the total marks for the Question Paper""" marks = 0.0 - fixed_ques = FixedQuestions() - questions = fixed_ques.get_fixed_questions(self) + questions = self.fixed_questions.all() for question in questions: marks += question.points for question_set in self.random_questions.all(): @@ -693,8 +694,7 @@ class QuestionPaper(models.Model): def _get_questions_for_answerpaper(self): """ Returns fixed and random questions for the answer paper""" - fixed_ques = FixedQuestions() - questions = fixed_ques.get_fixed_questions(self) + questions = self.get_ordered_questions() for question_set in self.random_questions.all(): questions += question_set.get_random_questions() return questions @@ -757,32 +757,20 @@ class QuestionPaper(models.Model): summary="Yaksh Demo Question", user=user) # add fixed set of questions to the question paper - fixed_que = FixedQuestions() - for question in questions: - fixed_que.add_fixed_questions(questionpaper, question) + question_paper.fixed_questions.add(*questions) + + def get_ordered_questions(self): + ques = [] + if self.fixed_question_order: + que_order = self.fixed_question_order.split(',') + for que_id in que_order: + ques.append(self.fixed_questions.get(id=que_id)) + return ques def __str__(self): return "Question Paper for " + self.quiz.description -############################################################################### -class FixedQuestions(models.Model): - questionpaper = models.ForeignKey(QuestionPaper) - question = models.ForeignKey(Question) - - def get_fixed_questions(self, qp): - fixed_q = FixedQuestions.objects.filter(questionpaper=qp).order_by('pk') - questions = [que.question for que in fixed_q - if que.question.active == True] - return questions - - def add_fixed_questions(self, qp, que): - FixedQuestions.objects.create(questionpaper=qp, question=que) - - def remove_fixed_questions(self, que_ids): - FixedQuestions.objects.filter(question_id__in=que_ids).delete() - - ############################################################################### class QuestionSet(models.Model): """Question set contains a set of questions from which random questions diff --git a/yaksh/test_models.py b/yaksh/test_models.py index efd5fd3..80a385f 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -1,7 +1,7 @@ import unittest from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - StdIOBasedTestCase, FileUpload, McqTestCase, FixedQuestions + StdIOBasedTestCase, FileUpload, McqTestCases import json from datetime import datetime, timedelta from django.utils import timezone @@ -325,9 +325,9 @@ class QuestionPaperTestCases(unittest.TestCase): ) # add fixed set of questions to the question paper - fixed_ques = FixedQuestions() - fixed_ques.add_fixed_questions(self.question_paper, self.questions[3]) - fixed_ques.add_fixed_questions(self.question_paper, self.questions[5]) + self.question_paper.fixed_questions.add(self.questions[3], + self.questions[5] + ) # create two QuestionSet for random questions # QuestionSet 1 @@ -376,9 +376,9 @@ class QuestionPaperTestCases(unittest.TestCase): def test_questionpaper(self): """ Test question paper""" self.assertEqual(self.question_paper.quiz.description, 'demo quiz') - fixed_ques = FixedQuestions() - ques = fixed_ques.get_fixed_questions(self.question_paper) - self.assertSequenceEqual(ques, [self.questions[3], self.questions[5]]) + self.assertSequenceEqual(self.question_paper.fixed_questions.all(), + [self.questions[3], self.questions[5]] + ) self.assertTrue(self.question_paper.shuffle_questions) def test_update_total_marks(self): @@ -417,9 +417,9 @@ class QuestionPaperTestCases(unittest.TestCase): attempt_num) self.assertIsInstance(answerpaper, AnswerPaper) paper_questions = answerpaper.questions.all() + print (paper_questions) self.assertEqual(len(paper_questions), 7) - fixed_ques = FixedQuestions() - fixed_questions = set(fixed_ques.get_fixed_questions(self.question_paper)) + fixed_questions = set(self.question_paper.fixed_questions.all()) self.assertTrue(fixed_questions.issubset(set(paper_questions))) answerpaper.passed = True answerpaper.save() @@ -433,8 +433,8 @@ class QuestionPaperTestCases(unittest.TestCase): self.question_paper.id ) self.assertEqual(trial_paper.quiz, trial_quiz) - self.assertEqual(fixed_ques.get_fixed_questions(trial_paper), - fixed_ques.get_fixed_questions(self.question_paper) + self.assertEqual(trial_paper.fixed_questions.all(), + self.question_paper.fixed_questions.all() ) self.assertEqual(trial_paper.random_questions.all(), self.question_paper.random_questions.all() @@ -446,9 +446,8 @@ class QuestionPaperTestCases(unittest.TestCase): trial_quiz, self.questions_list ) self.assertEqual(trial_paper.quiz, trial_quiz) - fixed_q = FixedQuestions.objects.filter( - questionpaper=self.question_paper).values_list( - 'question_id', flat=True) + fixed_q = self.question_paper.fixed_questions.values_list( + 'id', flat=True) self.assertEqual(self.questions_list, fixed_q) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 9d74697..aa6561a 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -10,7 +10,7 @@ from django.utils import timezone from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - StdIOBasedTestCase, has_profile, FixedQuestions + StdIOBasedTestCase, has_profile class TestProfile(TestCase): @@ -1161,8 +1161,7 @@ class TestViewAnswerPaper(TestCase): self.question_paper = QuestionPaper.objects.create(quiz=self.quiz, total_marks=1.0) - fixed_ques = FixedQuestions() - fixed_ques.add_fixed_questions(self.question_paper, self.question) + self.question_paper.fixed_questions.add(self.question) self.question_paper.save() AnswerPaper.objects.create(user_id=3, @@ -1446,8 +1445,7 @@ class TestGrader(TestCase): self.question_paper = QuestionPaper.objects.create(quiz=self.quiz, total_marks=1.0) - fixed_ques = FixedQuestions() - fixed_ques.add_fixed_questions(self.question_paper, self.question) + self.question_paper.fixed_questions.add(self.question) self.question_paper.save() self.answerpaper = AnswerPaper.objects.create(user_id=3, diff --git a/yaksh/views.py b/yaksh/views.py index 9b6fc4e..2a93aff 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -25,8 +25,8 @@ import six # Local imports. from yaksh.models import get_model_class, Quiz, Question, QuestionPaper, QuestionSet, Course from yaksh.models import Profile, Answer, AnswerPaper, User, TestCase, FileUpload,\ - has_profile, StandardTestCase, McqTestCase, StdIOBasedTestCase, HookTestCase,\ - FixedQuestions + has_profile, StandardTestCase, McqTestCase, StdIOBasedTestCase, HookTestCase + from yaksh.forms import UserRegisterForm, UserLoginForm, QuizForm,\ QuestionForm, RandomQuestionForm,\ QuestionFilterForm, CourseForm, ProfileForm, UploadFileForm,\ @@ -266,8 +266,7 @@ def show_all_questionpapers(request, questionpaper_id=None): else: qu_papers = QuestionPaper.objects.get(id=questionpaper_id) quiz = qu_papers.quiz - fixed_ques = FixedQuestions() - fixed_questions = fixed_ques.get_fixed_questions(qu_papers) + fixed_questions = qu_papers.get_ordered_questions() random_questions = qu_papers.random_questions.all() context = {'quiz': quiz, 'fixed_questions': fixed_questions, 'random_questions': random_questions} @@ -359,7 +358,8 @@ def start(request, questionpaper_id=None, attempt_num=None): msg = 'Quiz not found, please contact your '\ 'instructor/administrator.' return complete(request, msg, attempt_num, questionpaper_id=None) - if not quest_paper.fixed_questions.all() and not quest_paper.random_questions.all(): + if not quest_paper.get_ordered_questions() and not \ + quest_paper.random_questions.all(): msg = 'Quiz does not have Questions, please contact your '\ 'instructor/administrator.' return complete(request, msg, attempt_num, questionpaper_id=None) @@ -807,9 +807,8 @@ def _remove_already_present(questionpaper_id, questions): if questionpaper_id is None: return questions questionpaper = QuestionPaper.objects.get(pk=questionpaper_id) - fixed_questions = FixedQuestions.objects.filter( - questionpaper=questionpaper).values_list('question_id', flat=True) - questions = questions.exclude(id__in=fixed_questions) + questions = questions.exclude( + id__in=questionpaper.fixed_questions.values_list('id', flat=True)) for random_set in questionpaper.random_questions.all(): questions = questions.exclude( id__in=random_set.questions.values_list('id', flat=True)) @@ -827,7 +826,6 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): questions = None marks = None state = None - fixed_que = FixedQuestions() if questionpaper_id is None: question_paper = QuestionPaper.objects.get_or_create(quiz_id=quiz_id)[0] else: @@ -843,14 +841,29 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): state = request.POST.get('is_active', None) if 'add-fixed' in request.POST: - question_ids = request.POST.get('checked_ques', None).split(',') - for q_id in question_ids: - que = Question.objects.get(id=q_id) - fixed_que.add_fixed_questions(question_paper, que) + question_ids = request.POST.get('checked_ques', None) + if question_paper.fixed_question_order: + ques_order = question_paper.fixed_question_order.split(",") +\ + question_ids.split(",") + questions_order = ",".join(ques_order) + else: + questions_order = question_ids + questions = Question.objects.filter(id__in=question_ids.split(',')) + question_paper.fixed_question_order = questions_order + question_paper.save() + question_paper.fixed_questions.add(*questions) if 'remove-fixed' in request.POST: question_ids = request.POST.getlist('added-questions', None) - fixed_que.remove_fixed_questions(question_ids) + que_order = question_paper.fixed_question_order.split(",") + for qid in question_ids: + que_order.remove(qid) + if que_order: + question_paper.fixed_question_order = ",".join(que_order) + else: + question_paper.fixed_question_order = "" + question_paper.save() + question_paper.fixed_questions.remove(*question_ids) if 'add-random' in request.POST: question_ids = request.POST.getlist('random_questions', None) @@ -877,7 +890,7 @@ def design_questionpaper(request, quiz_id, questionpaper_id=None): question_paper.update_total_marks() question_paper.save() random_sets = question_paper.random_questions.all() - fixed_questions = fixed_que.get_fixed_questions(question_paper) + fixed_questions = question_paper.get_ordered_questions() context = {'qpaper_form': qpaper_form, 'filter_form': filter_form, 'qpaper': question_paper, 'questions': questions, 'fixed_questions': fixed_questions, 'state': state, 'random_sets': random_sets} -- cgit From 97abdf46bad713e1ddab31175fbb7030e0257acb Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 9 Mar 2017 18:38:16 +0530 Subject: Add test for ordering of questions --- yaksh/test_models.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/yaksh/test_models.py b/yaksh/test_models.py index 80a385f..5e39ab9 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -1,7 +1,7 @@ import unittest from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - StdIOBasedTestCase, FileUpload, McqTestCases + StdIOBasedTestCase, FileUpload, McqTestCase import json from datetime import datetime, timedelta from django.utils import timezone @@ -324,6 +324,9 @@ class QuestionPaperTestCases(unittest.TestCase): shuffle_questions=True ) + self.question_paper.fixed_question_order = "{0}, {1}".format( + self.questions[3].id, self.questions[5].id + ) # add fixed set of questions to the question paper self.question_paper.fixed_questions.add(self.questions[3], self.questions[5] @@ -417,7 +420,6 @@ class QuestionPaperTestCases(unittest.TestCase): attempt_num) self.assertIsInstance(answerpaper, AnswerPaper) paper_questions = answerpaper.questions.all() - print (paper_questions) self.assertEqual(len(paper_questions), 7) fixed_questions = set(self.question_paper.fixed_questions.all()) self.assertTrue(fixed_questions.issubset(set(paper_questions))) @@ -450,6 +452,11 @@ class QuestionPaperTestCases(unittest.TestCase): 'id', flat=True) self.assertEqual(self.questions_list, fixed_q) + def test_fixed_order_questions(self): + fixed_ques = self.question_paper.get_ordered_questions() + actual_ques = [self.questions[3], self.questions[5]] + self.assertSequenceEqual(fixed_ques, actual_ques) + ############################################################################### class AnswerPaperTestCases(unittest.TestCase): -- cgit From ec507b9a977811cfb9909e50133120476eaa9c6c Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 10 Mar 2017 14:52:12 +0530 Subject: Fix demo course creation for selenium tests --- yaksh/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yaksh/models.py b/yaksh/models.py index 068bd66..c5e73f6 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -756,6 +756,9 @@ class QuestionPaper(models.Model): questions = Question.objects.filter(active=True, summary="Yaksh Demo Question", user=user) + q_order = [str(que.id) for que in questions] + question_paper.fixed_questions_order = ",".join(q_order) + question_paper.save() # add fixed set of questions to the question paper question_paper.fixed_questions.add(*questions) -- cgit From f568762320caa8f57b83f34d02e3b3f5db3b1e45 Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 10 Mar 2017 17:44:16 +0530 Subject: Fix test questions method in QuestionPaper model --- yaksh/models.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index c5e73f6..2569892 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -635,10 +635,8 @@ class QuestionPaperManager(models.Manager): trial_questionpaper = self.create(quiz=trial_quiz, total_marks=10, ) - for q_id in questions_list: - que = Question.objects.get(id=q_id) - FixedQuestions.objects.add_fixed_questions( - trial_questionpaper, que) + trial_questionpaper.fixed_question_order = ",".join(questions_list) + trial_questionpaper.fixed_questions.add(*questions_list) return trial_questionpaper def create_trial_paper_to_test_quiz(self, trial_quiz, original_quiz_id): @@ -647,8 +645,7 @@ class QuestionPaperManager(models.Manager): trial_questionpaper = self.get(quiz=trial_quiz) else: trial_questionpaper, trial_questions = \ - self._create_trial_from_questionpaper(original_quiz_id, - ) + self._create_trial_from_questionpaper(original_quiz_id) trial_questionpaper.quiz = trial_quiz trial_questionpaper.fixed_questions\ .add(*trial_questions["fixed_questions"]) @@ -757,7 +754,7 @@ class QuestionPaper(models.Model): summary="Yaksh Demo Question", user=user) q_order = [str(que.id) for que in questions] - question_paper.fixed_questions_order = ",".join(q_order) + question_paper.fixed_question_order = ",".join(q_order) question_paper.save() # add fixed set of questions to the question paper question_paper.fixed_questions.add(*questions) -- cgit From 17c9dd17449adb19ce7734e3572ac0bc376ca5c5 Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 10 Mar 2017 19:02:40 +0530 Subject: Fix test cases for trial quiz --- yaksh/test_models.py | 57 +++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/yaksh/test_models.py b/yaksh/test_models.py index 5e39ab9..6812212 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -331,7 +331,6 @@ class QuestionPaperTestCases(unittest.TestCase): self.question_paper.fixed_questions.add(self.questions[3], self.questions[5] ) - # create two QuestionSet for random questions # QuestionSet 1 self.question_set_1 = QuestionSet.objects.create(marks=2, @@ -373,8 +372,8 @@ class QuestionPaperTestCases(unittest.TestCase): # For Trial case self.questions_list = [self.questions[3].id, self.questions[5].id] - trial_course = Course.objects.create_trial_course(self.user) - trial_quiz = Quiz.objects.create_trial_quiz(trial_course, self.user) + self.trial_course = Course.objects.create_trial_course(self.user) + self.trial_quiz = Quiz.objects.create_trial_quiz(self.trial_course, self.user) def test_questionpaper(self): """ Test question paper""" @@ -429,28 +428,36 @@ class QuestionPaperTestCases(unittest.TestCase): # test can_attempt_now(self): self.assertFalse(self.question_paper.can_attempt_now(self.user)) - def test_create_trial_paper_to_test_quiz(self): - trial_paper = QuestionPaper.objects.create_trial_paper_to_test_quiz\ - (trial_quiz, - self.question_paper.id - ) - self.assertEqual(trial_paper.quiz, trial_quiz) - self.assertEqual(trial_paper.fixed_questions.all(), - self.question_paper.fixed_questions.all() - ) - self.assertEqual(trial_paper.random_questions.all(), - self.question_paper.random_questions.all() - ) - - def test_create_trial_paper_to_test_questions(self): - trial_paper = QuestionPaper.objects.\ - create_trial_paper_to_test_questions( - trial_quiz, self.questions_list - ) - self.assertEqual(trial_paper.quiz, trial_quiz) - fixed_q = self.question_paper.fixed_questions.values_list( - 'id', flat=True) - self.assertEqual(self.questions_list, fixed_q) + def test_create_trial_paper_to_test_quiz(self): + qu_list = [str(self.questions_list[0]), str(self.questions_list[1])] + trial_paper = QuestionPaper.objects.create_trial_paper_to_test_quiz\ + (self.trial_quiz, + self.quiz.id + ) + trial_paper.random_questions.add(self.question_set_1) + trial_paper.random_questions.add(self.question_set_2) + trial_paper.fixed_question_order = ",".join(qu_list) + self.assertEqual(trial_paper.quiz, self.trial_quiz) + self.assertSequenceEqual(trial_paper.get_ordered_questions(), + self.question_paper.get_ordered_questions() + ) + trial_paper_ran = [q_set.id for q_set in + trial_paper.random_questions.all()] + qp_ran = [q_set.id for q_set in + self.question_paper.random_questions.all()] + + self.assertSequenceEqual(trial_paper_ran, qp_ran) + + def test_create_trial_paper_to_test_questions(self): + qu_list = [str(self.questions_list[0]), str(self.questions_list[1])] + trial_paper = QuestionPaper.objects.\ + create_trial_paper_to_test_questions( + self.trial_quiz, qu_list + ) + self.assertEqual(trial_paper.quiz, self.trial_quiz) + fixed_q = self.question_paper.fixed_questions.values_list( + 'id', flat=True) + self.assertSequenceEqual(self.questions_list, fixed_q) def test_fixed_order_questions(self): fixed_ques = self.question_paper.get_ordered_questions() -- cgit From 81a70c486823149b009627eb0194618ceeeb2369 Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 16 Mar 2017 11:28:01 +0530 Subject: Change in models get_ordered_questions function - Add else condition to return fixed questions if order are not available --- yaksh/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yaksh/models.py b/yaksh/models.py index 2569892..28af8f6 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -765,6 +765,8 @@ class QuestionPaper(models.Model): que_order = self.fixed_question_order.split(',') for que_id in que_order: ques.append(self.fixed_questions.get(id=que_id)) + else: + ques = self.fixed_questions.all() return ques def __str__(self): -- cgit