From 0df9abf2dce51ed0b1f8247f91f0fe4c039bc14b Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Mon, 18 Feb 2019 11:45:07 +0530 Subject: Add functionality to restrict access to next module based on passing previous module --- yaksh/models.py | 47 +++++++++++++++++++++++- yaksh/templates/yaksh/design_course_session.html | 25 ++++++++++++- yaksh/views.py | 36 +++++++++++++++--- 3 files changed, 98 insertions(+), 10 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index cce90e7..5f72ecf 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -539,6 +539,18 @@ class Quiz(models.Model): status = "not attempted" return status + def get_answerpaper_passing_status(self, user, course): + try: + qp = self.questionpaper_set.get().id + except QuestionPaper.DoesNotExist: + qp = None + ans_ppr = AnswerPaper.objects.filter( + user=user, course=course, question_paper=qp + ).order_by("-attempt_number") + if ans_ppr.exists(): + return ans_ppr.first().passed + return False + def _create_quiz_copy(self, user): question_papers = self.questionpaper_set.all() new_quiz = self @@ -586,7 +598,7 @@ class LearningUnit(models.Model): def has_prerequisite(self): return self.check_prerequisite - def is_prerequisite_passed(self, user, learning_module, course): + def is_prerequisite_complete(self, user, learning_module, course): ordered_units = learning_module.learning_unit.order_by("order") ordered_units_ids = list(ordered_units.values_list("id", flat=True)) current_unit_index = ordered_units_ids.index(self.id) @@ -624,6 +636,7 @@ class LearningModule(models.Model): order = models.IntegerField(default=0) creator = models.ForeignKey(User, related_name="module_creator") check_prerequisite = models.BooleanField(default=True) + check_prerequisite_passes = models.BooleanField(default=False) html_data = models.TextField(null=True, blank=True) active = models.BooleanField(default=True) is_trial = models.BooleanField(default=False) @@ -653,6 +666,9 @@ class LearningModule(models.Model): def toggle_check_prerequisite(self): self.check_prerequisite = not self.check_prerequisite + def toggle_check_prerequisite_passes(self): + self.check_prerequisite_passes = not self.check_prerequisite_passes + def get_next_unit(self, current_unit_id): ordered_units = self.learning_unit.order_by("order") ordered_units_ids = list(ordered_units.values_list("id", flat=True)) @@ -680,7 +696,7 @@ class LearningModule(models.Model): default_status = "inprogress" return default_status - def is_prerequisite_passed(self, user, course): + def is_prerequisite_complete(self, user, course): """ Check if prerequisite module is completed """ ordered_modules = course.learning_module.order_by("order") ordered_modules_ids = list(ordered_modules.values_list( @@ -698,6 +714,33 @@ class LearningModule(models.Model): success = False return success + def get_passing_status(self, user, course): + course_status = CourseStatus.objects.filter(user=user, course=course) + state = "failed" + if course_status.exists(): + ordered_units = self.learning_unit.filter(type='quiz').order_by("order") + + status_list = [unit.quiz.get_answerpaper_passing_status(user, course) + for unit in ordered_units] + + if not status_list: + status = False + else: + status = all(status_list) + return status + + def is_prerequisite_passed(self, user, course): + """ Check if prerequisite module is passed """ + ordered_modules = course.learning_module.order_by("order") + if ordered_modules.first() == self: + return True + else: + if self.order == 0: + return True + prev_module = ordered_modules.get(order=self.order-1) + status = prev_module.get_passing_status(user, course) + return status + def has_prerequisite(self): return self.check_prerequisite diff --git a/yaksh/templates/yaksh/design_course_session.html b/yaksh/templates/yaksh/design_course_session.html index 2deb95f..700d71c 100644 --- a/yaksh/templates/yaksh/design_course_session.html +++ b/yaksh/templates/yaksh/design_course_session.html @@ -74,13 +74,20 @@ Select Module Order - Check Prerequisite + Check Prerequisite Completion
What's This + Check Prerequisite Passing +
+ + + What's This + +   @@ -88,6 +95,8 @@   Currently Change + Currently + Change {% for module in added_learning_modules %} @@ -109,6 +118,16 @@ + + {% if module.check_prerequisite_passes %} + Yes + {% else %} + No + {% endif %} + + + + {% endfor %} @@ -119,7 +138,9 @@
- + + +
diff --git a/yaksh/views.py b/yaksh/views.py index 6c7a12e..5009cb6 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -471,11 +471,17 @@ def start(request, questionpaper_id=None, attempt_num=None, course_id=None, # unit module prerequiste check if learning_module.has_prerequisite(): - if not learning_module.is_prerequisite_passed(user, course): + if not learning_module.is_prerequisite_complete(user, course): msg = "You have not completed the module previous to {0}".format( learning_module.name) return course_modules(request, course_id, msg) + if learning_module.check_prerequisite_passes: + if not learning_module.is_prerequisite_passed(user, course): + msg = "You have not successfully passed the module previous to {0}".format( + learning_module.name) + return course_modules(request, course_id, msg) + # is user enrolled in the course if not course.is_enrolled(user): msg = 'You are not enrolled in {0} course'.format(course.name) @@ -501,7 +507,7 @@ def start(request, questionpaper_id=None, attempt_num=None, course_id=None, # prerequisite check and passing criteria for quiz if learning_unit.has_prerequisite(): - if not learning_unit.is_prerequisite_passed( + if not learning_unit.is_prerequisite_complete( user, learning_module, course): msg = "You have not completed the previous Lesson/Quiz/Exercise" if is_moderator(user): @@ -2424,17 +2430,22 @@ def show_lesson(request, lesson_id, module_id, course_id): msg = "{0} is not active".format(learn_unit.lesson.name) return view_module(request, module_id, course_id, msg) if learn_module.has_prerequisite(): - if not learn_module.is_prerequisite_passed(user, course): + if not learn_module.is_prerequisite_complete(user, course): msg = "You have not completed the module previous to {0}".format( learn_module.name) return view_module(request, module_id, course_id, msg) + if learn_module.check_prerequisite_passes: + if not learn_module.is_prerequisite_passed(user, course): + msg = "You have not successfully passed the module previous to {0}".format( + learn_module.name) + return view_module(request, module_id, course_id, msg) # update course status with current unit _update_unit_status(course_id, user, learn_unit) all_modules = course.get_learning_modules() if learn_unit.has_prerequisite(): - if not learn_unit.is_prerequisite_passed(user, learn_module, course): + if not learn_unit.is_prerequisite_complete(user, learn_module, course): msg = "You have not completed previous Lesson/Quiz/Exercise" return view_module(request, learn_module.id, course_id, msg=msg) context = {'lesson': learn_unit.lesson, 'user': user, @@ -2696,13 +2707,20 @@ def design_course(request, course_id): if remove_values: course.learning_module.remove(*remove_values) - if "Change_prerequisite" in request.POST: + if "change_prerequisite_completion" in request.POST: unit_list = request.POST.getlist("check_prereq") for unit in unit_list: learning_module = course.learning_module.get(id=unit) learning_module.toggle_check_prerequisite() learning_module.save() + if "change_prerequisite_passing" in request.POST: + unit_list = request.POST.getlist("check_prereq_passes") + for unit in unit_list: + learning_module = course.learning_module.get(id=unit) + learning_module.toggle_check_prerequisite_passes() + learning_module.save() + added_learning_modules = course.get_learning_modules() all_learning_modules = LearningModule.objects.filter( creator=user, is_trial=False) @@ -2734,11 +2752,17 @@ def view_module(request, module_id, course_id, msg=None): return course_modules(request, course_id, msg) all_modules = course.get_learning_modules() if learning_module.has_prerequisite(): - if not learning_module.is_prerequisite_passed(user, course): + if not learning_module.is_prerequisite_complete(user, course): msg = "You have not completed the module previous to {0}".format( learning_module.name) return course_modules(request, course_id, msg) + if learning_module.check_prerequisite_passes: + if not learning_module.is_prerequisite_passed(user, course): + msg = "You have not successfully passed the module previous to {0}".format( + learning_module.name) + return course_modules(request, course_id, msg) + learning_units = learning_module.get_learning_units() context['learning_units'] = learning_units context['learning_module'] = learning_module -- cgit From a69d5f58b70206124a202ca4366bd9c0e6d4f1b6 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Wed, 13 Mar 2019 12:40:09 +0530 Subject: Fix failing Test Case --- yaksh/test_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 274bcda..255d614 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -1925,7 +1925,7 @@ class TestCourses(TestCase): # Create a learning module to add to course self.learning_module = LearningModule.objects.create( order=0, name="test module", description="module", - check_prerequisite=False, creator=self.teacher) + check_prerequisite=True, creator=self.teacher) self.user1_course = Course.objects.create( name="Python Course", -- cgit From ef42d19a8884155da24398e7c27aade115a79ade Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Mon, 25 Mar 2019 11:53:26 +0530 Subject: Fix PEP8 issues and variable names --- yaksh/models.py | 10 +++++----- yaksh/views.py | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index 5f72ecf..7a40fae 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -716,17 +716,17 @@ class LearningModule(models.Model): def get_passing_status(self, user, course): course_status = CourseStatus.objects.filter(user=user, course=course) - state = "failed" if course_status.exists(): - ordered_units = self.learning_unit.filter(type='quiz').order_by("order") + learning_units_with_quiz = self.learning_unit.filter(type='quiz') + ordered_units = learning_units_with_quiz.order_by("order") - status_list = [unit.quiz.get_answerpaper_passing_status(user, course) + statuses = [unit.quiz.get_answerpaper_passing_status(user, course) for unit in ordered_units] - if not status_list: + if not statuses: status = False else: - status = all(status_list) + status = all(statuses) return status def is_prerequisite_passed(self, user, course): diff --git a/yaksh/views.py b/yaksh/views.py index 5009cb6..79fb537 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -478,8 +478,11 @@ def start(request, questionpaper_id=None, attempt_num=None, course_id=None, if learning_module.check_prerequisite_passes: if not learning_module.is_prerequisite_passed(user, course): - msg = "You have not successfully passed the module previous to {0}".format( + msg = ( + "You have not successfully passed the module" + " previous to {0}".format( learning_module.name) + ) return course_modules(request, course_id, msg) # is user enrolled in the course @@ -2436,8 +2439,11 @@ def show_lesson(request, lesson_id, module_id, course_id): return view_module(request, module_id, course_id, msg) if learn_module.check_prerequisite_passes: if not learn_module.is_prerequisite_passed(user, course): - msg = "You have not successfully passed the module previous to {0}".format( + msg = ( + "You have not successfully passed the module" + " previous to {0}".format( learn_module.name) + ) return view_module(request, module_id, course_id, msg) # update course status with current unit @@ -2759,8 +2765,11 @@ def view_module(request, module_id, course_id, msg=None): if learning_module.check_prerequisite_passes: if not learning_module.is_prerequisite_passed(user, course): - msg = "You have not successfully passed the module previous to {0}".format( + msg = ( + "You have not successfully passed the module" + " previous to {0}".format( learning_module.name) + ) return course_modules(request, course_id, msg) learning_units = learning_module.get_learning_units() -- cgit From 7f02a678b6bb4b5ad99022168109b0bb44e0e9d1 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Tue, 2 Apr 2019 15:22:58 +0530 Subject: Change AnswerPaper passing condition check --- yaksh/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yaksh/models.py b/yaksh/models.py index 7a40fae..f9dda45 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -548,7 +548,7 @@ class Quiz(models.Model): user=user, course=course, question_paper=qp ).order_by("-attempt_number") if ans_ppr.exists(): - return ans_ppr.first().passed + return any([paper.passed for paper in ans_ppr]) return False def _create_quiz_copy(self, user): -- cgit From e1eedca03401223e51ef26ae166a2319c5c89eee Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Mon, 8 Apr 2019 15:40:29 +0530 Subject: Add Test Case --- yaksh/test_models.py | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/yaksh/test_models.py b/yaksh/test_models.py index 1f38d03..d4e0141 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -145,14 +145,42 @@ class LearningModuleTestCases(unittest.TestCase): self.learning_module_two = LearningModule.objects.get(name='LM2') self.creator = User.objects.get(username='creator') self.student = User.objects.get(username='course_user') - self.learning_unit_one = LearningUnit.objects.get(order=1) - self.learning_unit_two = LearningUnit.objects.get(order=2) + self.learning_unit_one = LearningUnit.objects.get(id=1) + self.learning_unit_two = LearningUnit.objects.get(id=2) self.quiz = Quiz.objects.get(description='demo quiz 1') self.lesson = Lesson.objects.get(name='L1') self.course = Course.objects.get(name='Python Course') self.course_status = CourseStatus.objects.get( course=self.course, user=self.student) + self.prereq_course = Course.objects.create(name="Prerequisite Course", + enrollment="Enroll Request", creator=self.creator) + + + self.prereq_learning_module = LearningModule.objects.create( + name='LM3', description='module one', creator=self.creator + ) + self.test_learning_module = LearningModule.objects.create( + name='LM4', description='module two', creator=self.creator, order=1 + ) + course_status = CourseStatus.objects.create( + course=self.prereq_course, user=self.student + ) + lesson = Lesson.objects.create(name='P1', description='Video Lesson', + creator=self.creator) + learning_unit_lesson = LearningUnit.objects.create(order=2, lesson=lesson, + type='lesson') + learning_unit_quiz = LearningUnit.objects.create(order=1, quiz=self.quiz, + type='quiz') + self.prereq_learning_module.learning_unit.add(learning_unit_quiz) + self.prereq_learning_module.learning_unit.add(learning_unit_lesson) + self.prereq_learning_module.save() + self.prereq_course.learning_module.add(self.prereq_learning_module) + self.prereq_course.learning_module.add(self.test_learning_module) + self.prereq_course.students.add(self.student) + self.prereq_course.save() + + def tearDown(self): # Remove unit from course status completed units self.course_status.completed_units.remove(self.learning_unit_one) @@ -164,6 +192,13 @@ class LearningModuleTestCases(unittest.TestCase): self.assertTrue(self.learning_module.check_prerequisite) self.assertEqual(self.learning_module.order, 0) + def test_prerequisite_passes(self): + self.assertFalse( + self.test_learning_module.is_prerequisite_passed( + self.student, self.prereq_course + ) + ) + def test_get_quiz_units(self): # Given quizzes = [self.quiz] -- cgit From 54e674c12704013377b9dd6b6c82df526f4e1cdb Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Mon, 8 Apr 2019 16:12:50 +0530 Subject: Fix PEP8 issues --- yaksh/models.py | 6 ++++-- yaksh/test_models.py | 34 ++++++++++++++++++++++------------ yaksh/views.py | 9 +++------ 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/yaksh/models.py b/yaksh/models.py index f9dda45..1e96ae1 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -720,8 +720,10 @@ class LearningModule(models.Model): learning_units_with_quiz = self.learning_unit.filter(type='quiz') ordered_units = learning_units_with_quiz.order_by("order") - statuses = [unit.quiz.get_answerpaper_passing_status(user, course) - for unit in ordered_units] + statuses = [ + unit.quiz.get_answerpaper_passing_status(user, course) + for unit in ordered_units + ] if not statuses: status = False diff --git a/yaksh/test_models.py b/yaksh/test_models.py index d4e0141..1adf64a 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -153,25 +153,35 @@ class LearningModuleTestCases(unittest.TestCase): self.course_status = CourseStatus.objects.get( course=self.course, user=self.student) - self.prereq_course = Course.objects.create(name="Prerequisite Course", - enrollment="Enroll Request", creator=self.creator) - + self.prereq_course = Course.objects.create( + name="Prerequisite Course", + enrollment="Enroll Request", creator=self.creator + ) self.prereq_learning_module = LearningModule.objects.create( name='LM3', description='module one', creator=self.creator - ) + ) self.test_learning_module = LearningModule.objects.create( - name='LM4', description='module two', creator=self.creator, order=1 - ) + name='LM4', description='module two', + creator=self.creator, order=1 + ) course_status = CourseStatus.objects.create( course=self.prereq_course, user=self.student ) - lesson = Lesson.objects.create(name='P1', description='Video Lesson', - creator=self.creator) - learning_unit_lesson = LearningUnit.objects.create(order=2, lesson=lesson, - type='lesson') - learning_unit_quiz = LearningUnit.objects.create(order=1, quiz=self.quiz, - type='quiz') + lesson = Lesson.objects.create( + name='P1', description='Video Lesson', + creator=self.creator + ) + learning_unit_lesson = LearningUnit.objects.create( + order=2, + lesson=lesson, + type='lesson' + ) + learning_unit_quiz = LearningUnit.objects.create( + order=1, + quiz=self.quiz, + type='quiz' + ) self.prereq_learning_module.learning_unit.add(learning_unit_quiz) self.prereq_learning_module.learning_unit.add(learning_unit_lesson) self.prereq_learning_module.save() diff --git a/yaksh/views.py b/yaksh/views.py index 79fb537..526c774 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -480,8 +480,7 @@ def start(request, questionpaper_id=None, attempt_num=None, course_id=None, if not learning_module.is_prerequisite_passed(user, course): msg = ( "You have not successfully passed the module" - " previous to {0}".format( - learning_module.name) + " previous to {0}".format(learning_module.name) ) return course_modules(request, course_id, msg) @@ -2441,8 +2440,7 @@ def show_lesson(request, lesson_id, module_id, course_id): if not learn_module.is_prerequisite_passed(user, course): msg = ( "You have not successfully passed the module" - " previous to {0}".format( - learn_module.name) + " previous to {0}".format(learn_module.name) ) return view_module(request, module_id, course_id, msg) @@ -2767,8 +2765,7 @@ def view_module(request, module_id, course_id, msg=None): if not learning_module.is_prerequisite_passed(user, course): msg = ( "You have not successfully passed the module" - " previous to {0}".format( - learning_module.name) + " previous to {0}".format(learning_module.name) ) return course_modules(request, course_id, msg) -- cgit