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