summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py16
-rw-r--r--yaksh/static/yaksh/css/custom.css10
-rw-r--r--yaksh/templates/yaksh/course_forum.html52
-rw-r--r--yaksh/templates/yaksh/grade_user.html54
-rw-r--r--yaksh/templates/yaksh/paginator.html6
-rw-r--r--yaksh/templates/yaksh/post_comments.html7
-rw-r--r--yaksh/test_views.py588
-rw-r--r--yaksh/views.py13
8 files changed, 700 insertions, 46 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 64489b8..b64ac77 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -773,14 +773,20 @@ class LearningModule(models.Model):
def get_passing_status(self, user, course):
course_status = CourseStatus.objects.filter(user=user, course=course)
+ ordered_units = []
if course_status.exists():
- learning_units_with_quiz = self.learning_unit.filter(type='quiz')
+ learning_units_with_quiz = self.learning_unit.filter(
+ type='quiz'
+ ).order_by("order")
ordered_units = learning_units_with_quiz.order_by("order")
- statuses = [
- unit.quiz.get_answerpaper_passing_status(user, course)
- for unit in ordered_units
- ]
+ if ordered_units:
+ statuses = [
+ unit.quiz.get_answerpaper_passing_status(user, course)
+ for unit in ordered_units
+ ]
+ else:
+ statuses = []
if not statuses:
status = False
diff --git a/yaksh/static/yaksh/css/custom.css b/yaksh/static/yaksh/css/custom.css
index 3979e3e..697361d 100644
--- a/yaksh/static/yaksh/css/custom.css
+++ b/yaksh/static/yaksh/css/custom.css
@@ -98,6 +98,13 @@ body, .dropdown-menu {
transition: all 0.3s;
}
+@media (min-width: 1024px) {
+
+ .students-list {
+ position: fixed !important;
+ }
+}
+
/* ---------------------------------------------------
FORUM STYLE
----------------------------------------------------- */
@@ -117,4 +124,5 @@ body, .dropdown-menu {
.description {
font-size: 16px;
-} \ No newline at end of file
+}
+>>>>>>> 53a0c4ad3e733f3960000527f83565f2fd8fc412
diff --git a/yaksh/templates/yaksh/course_forum.html b/yaksh/templates/yaksh/course_forum.html
index e6b6a90..4724981 100644
--- a/yaksh/templates/yaksh/course_forum.html
+++ b/yaksh/templates/yaksh/course_forum.html
@@ -12,23 +12,19 @@
<div class="d-flex p-2 bd-highlight">
<div class="col-md-4">
{% if moderator %}
- <a href="{% url 'yaksh:course_detail' course.id %}" class="btn btn-primary">Back to Course</a>
+ <a href="{% url 'yaksh:course_detail' course.id %}" class="btn btn-primary">
+ <i class="fa fa-arrow-left"></i>&nbsp;Back
+ </a>
{% else %}
- <a href="{% url 'yaksh:course_modules' course.id %}" class="btn btn-primary">Back to Course</a>
+ <a href="{% url 'yaksh:course_modules' course.id %}" class="btn btn-primary">
+ <i class="fa fa-arrow-left"></i>&nbsp;Back
+ </a>
{% endif %}
</div>
- <div class="col-md-4">
- <form class="my-2 my-lg-0" action="" method="GET">
- <div class="input-group">
- <input type="search" placeholder="Search" name="search" class="form-control">
- <span class="input-group-append">
- <button class="btn btn-outline-info" type="submit"><i class="fa fa-search"></i>&nbsp;Search</button>
- </span>
- </div>
- </form>
- </div>
- <div class="col-md-4">
- <button type="button" class="btn btn-primary pull-right" data-toggle="modal" data-target="#newPostModal">New Post</button>
+ <div class="col-md">
+ <button type="button" class="btn btn-success pull-right" data-toggle="modal" data-target="#newPostModal">
+ <i class="fa fa-plus-circle"></i>&nbsp;New Post
+ </button>
</div>
</div>
<!-- Modal -->
@@ -58,12 +54,34 @@
</div>
</div>
<br>
+ <div class="row justify-content-center">
+ <div class="col-md-6">
+ <form class="my-2 my-lg-0" action="" method="GET">
+ <div class="input-group">
+ <input type="search" placeholder="Search Post" name="search_post" class="form-control">
+ <span class="input-group-append">
+ <button class="btn btn-outline-info">
+ <i class="fa fa-search"></i>&nbsp;Search
+ </button>
+ </span>
+ </div>
+ </form>
+ </div>
+ <div class="col-md-4">
+ <a class="btn btn-outline-danger" href="{% url 'yaksh:course_forum' course.id %}">
+ <i class="fa fa-times"></i>&nbsp;Clear Search
+ </a>
+ </div>
+ </div>
<br>
+ {% with objects as posts %}
{% if posts %}
+ {% include "yaksh/paginator.html" %}
+ <br>
<table id="posts_table" class="tablesorter table">
<thead class="thread-inverse">
<tr>
- <th width="700">Questions</th>
+ <th width="700">Posts</th>
<th>Created by</th>
<th>Replies</th>
<th>Last reply</th>
@@ -98,10 +116,12 @@
{% endfor %}
</tbody>
</table>
+ <br>
+ {% include "yaksh/paginator.html" %}
{% else %}
No discussion posts are there yet. Create one to start discussing.
{% endif %}
- {% include "yaksh/paginator.html" %}
+ {% endwith %}
</div>
{% endblock content %}
{% block script %}
diff --git a/yaksh/templates/yaksh/grade_user.html b/yaksh/templates/yaksh/grade_user.html
index fdfcc4e..a9ab53e 100644
--- a/yaksh/templates/yaksh/grade_user.html
+++ b/yaksh/templates/yaksh/grade_user.html
@@ -15,7 +15,24 @@ $(document).ready(function()
{
$("#marks_table").tablesorter({sortList: [[2,1]]});
});
+function searchNames() {
+ var input, filter, ul, li, a, i, txtValue;
+ input = document.getElementById('myInput');
+ filter = input.value.toUpperCase();
+ $("#myUL").toggle();
+ ul = document.getElementById("myUL");
+ li = ul.getElementsByTagName('li');
+ for (i = 0; i < li.length; i++) {
+ a = li[i].getElementsByTagName("a")[0];
+ txtValue = a.textContent || a.innerText;
+ if (txtValue.toUpperCase().indexOf(filter) > -1) {
+ li[i].style.display = "";
+ } else {
+ li[i].style.display = "none";
+ }
+ }
+}
</script>
{% endblock script %}
@@ -92,16 +109,17 @@ $(document).ready(function()
<div class="row">
{% if status == "grade" %}
{% if users %}
- <div id="student" class="col-md-3">
- <ul class="nav nav-pills list-group">
- {% for user in users %}
- <li class="nav-item">
- <a href="{% url 'yaksh:grade_user' quiz_id user.user__id course_id %}" class="list-group-item{% if user.user__id == data.user.id %} active {% endif %}">
- {{user.user__first_name}} {{user.user__last_name}}
- </a>
- </li>
- {% endfor %}
- </ul>
+ <div id="student" class="col-lg-3">
+ <div class="students-list">
+ <select onchange="window.location.href=this.value" class="custom-select">
+ <option value="">Select student</option>
+ {% for user in users %}
+ <option value="{% url 'yaksh:grade_user' quiz_id user.user__id course_id %}" {% if user.user__id == data.user.id %} selected {% endif %} title="{{user.user__first_name|upper}} {{user.user__last_name|upper}}">
+ {{user.user__first_name|upper}} {{user.user__last_name|truncatechars:5|upper}}
+ </option>
+ {% endfor %}
+ </select>
+ </div>
</div>
{% else %}
<div class="col-md-1"></div>
@@ -115,7 +133,7 @@ $(document).ready(function()
{% endif %}
{% endif %}
- <div id="paper" class="col-md-9">
+ <div id="paper" class="col-lg-9">
{% if has_quiz_assignments %}
<a href="{% url 'yaksh:download_quiz_assignment' quiz_id course_id %}" class="btn btn-outline-info">
<i class="fa fa-download"></i>&nbsp;Download All Assignments
@@ -173,8 +191,22 @@ $(document).ready(function()
</div>
{% endfor %}
{% endif %}
+ {% if status == "grade" and users %}
+ <input type="text" id="myInput" onkeyup="searchNames()" placeholder="Type to search for names" class="form-control">
+ <ul class="nav nav-pills list-group" style="display: none;" id="myUL">
+ {% for user in users %}
+ <li class="nav-item">
+ <a href="{% url 'yaksh:grade_user' quiz_id user.user__id course_id %}" class="list-group-item">
+ {{user.user__first_name|upper}} {{user.user__last_name|upper}}
+ </a>
+ </li>
+ {% endfor %}
+ <br>
+ </ul>
+ {% endif %}
{% if data %}
+ <hr>
<div class="card">
<div class="card-header">
Student Details
diff --git a/yaksh/templates/yaksh/paginator.html b/yaksh/templates/yaksh/paginator.html
index e958519..e18cbce 100644
--- a/yaksh/templates/yaksh/paginator.html
+++ b/yaksh/templates/yaksh/paginator.html
@@ -2,7 +2,7 @@
{% if objects.has_previous %}
<li class="page-item">
<a class="page-link" href="?page=1{% if request.GET.question_type %}&question_type={{ request.GET.question_type }}{% endif %}{% if request.GET.language %}&language={{ request.GET.language }}{% endif %}{% if request.GET.marks %}&marks={{ request.GET.marks }}{% endif %}{% if request.GET.question_tags %}&question_tags={{ request.GET.question_tags }}{% endif %}
- {% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}" aria-label="Previous">
+ {% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}{% if request.GET.search_post %}&search_post={{ request.GET.search_post }}{% endif %}" aria-label="Previous">
<span aria-hidden="true">
<i class="fa fa-angle-double-left"></i>
</span>
@@ -17,13 +17,13 @@
<span class="page-link">{{ n }}<span class="sr-only">(current)</span></span>
</li>
{% elif n > objects.number|add:'-5' and n < objects.number|add:'5' %}
- <li class="page-item"><a class="page-link" href="?page={{ n }}{% if request.GET.question_type %}&question_type={{ request.GET.question_type }}{% endif %}{% if request.GET.language %}&language={{ request.GET.language }}{% endif %}{% if request.GET.marks %}&marks={{ request.GET.marks }}{% endif %}{% if request.GET.question_tags %}&question_tags={{ request.GET.question_tags }}{% endif %}{% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}">{{ n }}</a></li>
+ <li class="page-item"><a class="page-link" href="?page={{ n }}{% if request.GET.question_type %}&question_type={{ request.GET.question_type }}{% endif %}{% if request.GET.language %}&language={{ request.GET.language }}{% endif %}{% if request.GET.marks %}&marks={{ request.GET.marks }}{% endif %}{% if request.GET.question_tags %}&question_tags={{ request.GET.question_tags }}{% endif %}{% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}{% if request.GET.search_post %}&search_post={{ request.GET.search_post }}{% endif %}">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if objects.has_next %}
<li class="page-item">
- <a class="page-link" href="?page={{ objects.paginator.num_pages }}{% if request.GET.question_type %}&question_type={{ request.GET.question_type }}{% endif %}{% if request.GET.language %}&language={{ request.GET.language }}{% endif %}{% if request.GET.marks %}&marks={{ request.GET.marks }}{% endif %}{% if request.GET.question_tags %}&question_tags={{ request.GET.question_tags }}{% endif %}{% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}" aria-label="Next">
+ <a class="page-link" href="?page={{ objects.paginator.num_pages }}{% if request.GET.question_type %}&question_type={{ request.GET.question_type }}{% endif %}{% if request.GET.language %}&language={{ request.GET.language }}{% endif %}{% if request.GET.marks %}&marks={{ request.GET.marks }}{% endif %}{% if request.GET.question_tags %}&question_tags={{ request.GET.question_tags }}{% endif %}{% if request.GET.search_tags %}&search_tags={{ request.GET.search_tags }}{% endif %}{% if request.GET.search_status %}&search_status={{ request.GET.search_status }}{% endif %}{% if request.GET.search_post %}&search_post={{ request.GET.search_post }}{% endif %}" aria-label="Next">
<span aria-hidden="true">
<i class="fa fa-angle-double-right"></i>
</span>
diff --git a/yaksh/templates/yaksh/post_comments.html b/yaksh/templates/yaksh/post_comments.html
index 463103e..b16b80c 100644
--- a/yaksh/templates/yaksh/post_comments.html
+++ b/yaksh/templates/yaksh/post_comments.html
@@ -6,7 +6,9 @@
{% block content %}
<div class="container">
- <a class="btn btn-primary" href="{% url 'yaksh:course_forum' post.course.id %}">Back to Posts</a>
+ <a class="btn btn-primary" href="{% url 'yaksh:course_forum' post.course.id %}">
+ <i class="fa fa-arrow-left"></i>&nbsp;Back to Posts
+ </a>
<br>
<br>
<div class="card mb-2 border-dark">
@@ -56,12 +58,13 @@
{% endif %}
<br>
<div>
+ <b><u>Add comment:</u></b>
<form action="{% url 'yaksh:post_comments' post.course.id post.uid %}" method="POST" enctype='multipart/form-data'>
<div class="form-group">
{% csrf_token %}
{{form}}
</div>
- <input type="submit" value="Submit" class="btn btn-primary">
+ <input type="submit" value="Submit" class="btn btn-success">
</form>
</div>
</div>
diff --git a/yaksh/test_views.py b/yaksh/test_views.py
index 70b090a..8a5a03a 100644
--- a/yaksh/test_views.py
+++ b/yaksh/test_views.py
@@ -6379,7 +6379,7 @@ class TestPost(TestCase):
self.assertContains(response, 'csrfmiddlewaretoken')
def test_view_course_forum_denies_anonymous_user(self):
- url = reverse('yaksh:course_forum', kwargs= {
+ url = reverse('yaksh:course_forum', kwargs={
'course_id': self.course.id
})
response = self.client.get(url, follow=True)
@@ -6441,7 +6441,6 @@ class TestPost(TestCase):
})
self.assertContains(response, 'href="{0}'.format(post_comments_url))
-
def test_new_post_valid_post_data(self):
self.client.login(
username=self.student.username,
@@ -6789,3 +6788,588 @@ class TestPostComment(TestCase):
self.user.delete()
self.course.delete()
self.mod_group.delete()
+
+
+class TestStartExam(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.mod_group = Group.objects.create(name='moderator')
+ tzone = pytz.timezone('UTC')
+
+ # Create Moderator with profile
+ self.user1_plaintext_pass = 'demo'
+ self.user1 = User.objects.create_user(
+ username='demo_user',
+ password=self.user1_plaintext_pass,
+ first_name='first_name',
+ last_name='last_name',
+ email='demo@test.com',
+ )
+ Profile.objects.create(
+ user=self.user1,
+ roll_number=10,
+ institute='IIT',
+ department='Chemical',
+ position='Moderator',
+ timezone='UTC',
+ is_moderator=True
+ )
+
+ # Add to moderator group
+ self.mod_group.user_set.add(self.user1)
+
+ # Create Student
+ self.student_plaintext_pass = 'demo_student'
+ self.student = User.objects.create_user(
+ username='demo_student',
+ password=self.student_plaintext_pass,
+ first_name='student_first_name',
+ last_name='student_last_name',
+ email='demo_student@test.com'
+ )
+ Profile.objects.create(
+ user=self.student,
+ roll_number=10,
+ institute='IIT',
+ department='Chemical',
+ position='Moderator',
+ timezone='UTC'
+ )
+
+ # Create courses for user1
+ self.user1_course1 = Course.objects.create(
+ name="Demo Course",
+ enrollment="Enroll Request", creator=self.user1
+ )
+ # course1 status
+ self.course1_status = CourseStatus.objects.create(
+ course=self.user1_course1, user=self.user1
+ )
+
+ # Create learning modules for user1
+ self.learning_module1 = LearningModule.objects.create(
+ order=1, name="Demo Module", description="Demo Module",
+ check_prerequisite=False, creator=self.user1
+ )
+ self.learning_module2 = LearningModule.objects.create(
+ order=2, name="Demo Module 2", description="Demo Module 2",
+ check_prerequisite=False, creator=self.user1
+ )
+
+ self.quiz1 = Quiz.objects.create(
+ time_between_attempts=0, description='Demo Quiz',
+ creator=self.user1
+ )
+
+ self.quiz2 = Quiz.objects.create(
+ time_between_attempts=0, description='Demo Quiz 2',
+ creator=self.user1
+ )
+
+ self.question_paper1 = QuestionPaper.objects.create(
+ quiz=self.quiz1, total_marks=1.0
+ )
+
+ self.question_paper2 = QuestionPaper.objects.create(
+ quiz=self.quiz2, total_marks=1.0
+ )
+
+ self.question1 = Question.objects.create(
+ summary="Test_question 1", description="Add two numbers",
+ points=1.0, language="python", type="code", user=self.user1
+ )
+
+ user_answer = "def add(a, b)\n\treturn a+b"
+ self.new_answer = Answer.objects.create(
+ question=self.question1, answer=user_answer,
+ correct=True, error=json.dumps([])
+ )
+
+ self.answerpaper = AnswerPaper.objects.create(
+ user=self.student, question_paper=self.question_paper1,
+ attempt_number=1,
+ start_time=datetime(2014, 10, 9, 10, 8, 15, 0, tzone),
+ end_time=datetime(2020, 10, 9, 10, 15, 15, 0, tzone),
+ user_ip="127.0.0.1", status="inprogress", passed=True,
+ percent=1, marks_obtained=1, course=self.user1_course1
+ )
+
+ self.answerpaper.answers.add(self.new_answer)
+ self.answerpaper.questions_answered.add(self.question1)
+
+ # Create lessons for user1
+ self.lesson1 = Lesson.objects.create(
+ name="Demo Lesson", description="Demo Lession",
+ creator=self.user1
+ )
+
+ self.lesson2 = Lesson.objects.create(
+ name="Test Lesson", description="Test Lession",
+ creator=self.user1
+ )
+
+ # Create units for lesson and quiz
+ self.lesson_unit1 = LearningUnit.objects.create(
+ order=1, type="lesson", lesson=self.lesson1
+ )
+ self.quiz_unit1 = LearningUnit.objects.create(
+ order=2, type="quiz", quiz=self.quiz1
+ )
+ self.lesson_unit2 = LearningUnit.objects.create(
+ order=1, type="lesson", lesson=self.lesson2
+ )
+ self.quiz_unit2 = LearningUnit.objects.create(
+ order=2, type="quiz", quiz=self.quiz2
+ )
+
+ # Add units to module
+ self.learning_module1.learning_unit.add(self.lesson_unit1)
+ self.learning_module1.learning_unit.add(self.quiz_unit1)
+
+ self.learning_module2.learning_unit.add(self.lesson_unit2)
+ self.learning_module2.learning_unit.add(self.quiz_unit2)
+
+ # Add module to course
+ self.user1_course1.learning_module.add(self.learning_module1)
+ self.user1_course1.learning_module.add(self.learning_module2)
+
+ def test_start_question_paper_does_not_exists_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': 99,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 404)
+
+ def test_start_question_paper_does_not_exists_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': 99,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_question_paper_has_no_question_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 404)
+
+ def test_start_question_paper_has_no_question_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_has_no_active_learning_module_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = False
+ self.learning_module1.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 404)
+
+ def test_start_learning_module_has_prerequisite_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = True
+ self.learning_module2.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_learning_module_prerequisite_passes_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = True
+ self.learning_module2.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_user_enrolled_in_the_course_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_user_enrolled_in_the_course_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_course_is_active_and_not_expired_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.active = False
+ self.user1_course1.end_enroll_time = timezone.now()
+ self.user1_course1.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_course_is_active_and_not_expired_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.user1)
+ self.user1_course1.active = False
+ self.user1_course1.end_enroll_time = timezone.now()
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_quiz_is_active_and_is_not_expired_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.save()
+
+ self.question_paper1.quiz.end_date_time = timezone.now()
+ self.question_paper1.quiz.active = False
+ self.question_paper1.quiz.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_quiz_is_active_and_is_not_expired_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.user1)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ self.question_paper1.quiz.end_date_time = timezone.now()
+ self.question_paper1.quiz.active = False
+ self.question_paper1.quiz.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_prereq_check_and_pass_criteria_for_quiz_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = False
+ self.learning_module2.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_prereq_check_and_pass_criteria_for_quiz_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = False
+ self.learning_module2.save()
+
+ self.user1_course1.students.add(self.user1)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_not_allowed_to_start_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ learning_unit = self.learning_module1.learning_unit.get(
+ quiz=self.question_paper1.quiz.id
+ )
+ learning_unit.check_prerequisite = False
+ learning_unit.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper1.id,
+ 'module_id': self.learning_module1.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_not_allowed_to_start_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper1.fixed_questions.add(self.question1)
+
+ self.learning_module1.active = True
+ self.learning_module1.check_prerequisite = False
+ self.learning_module1.check_prerequisite_passes = False
+ self.learning_module1.save()
+
+ self.user1_course1.students.add(self.user1)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ learning_unit = self.learning_module1.learning_unit.get(
+ quiz=self.question_paper1.quiz.id
+ )
+ learning_unit.check_prerequisite = False
+ learning_unit.save()
+
+ def test_start_allowed_to_start_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = False
+ self.learning_module2.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ learning_unit = self.learning_module2.learning_unit.get(
+ quiz=self.question_paper2.quiz.id
+ )
+ learning_unit.check_prerequisite = False
+ learning_unit.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_allowed_to_start_for_moderator(self):
+ self.client.login(
+ username=self.user1.username,
+ password=self.user1_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = False
+ self.learning_module2.save()
+
+ self.user1_course1.students.add(self.user1)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ learning_unit = self.learning_module2.learning_unit.get(
+ quiz=self.question_paper2.quiz.id
+ )
+ learning_unit.check_prerequisite = False
+ learning_unit.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def test_start_allowed_to_start_when_quiz_is_exercise_for_user(self):
+ self.client.login(
+ username=self.student.username,
+ password=self.student_plaintext_pass
+ )
+ self.question_paper2.fixed_questions.add(self.question1)
+
+ self.learning_module2.active = True
+ self.learning_module2.check_prerequisite = False
+ self.learning_module2.check_prerequisite_passes = False
+ self.learning_module2.save()
+
+ self.user1_course1.students.add(self.student)
+ self.user1_course1.is_trial = True
+ self.user1_course1.save()
+
+ learning_unit = self.learning_module2.learning_unit.get(
+ quiz=self.question_paper2.quiz.id
+ )
+ learning_unit.check_prerequisite = False
+ learning_unit.save()
+
+ self.question_paper2.quiz.is_exercise = True
+ self.question_paper2.quiz.save()
+
+ url = reverse('yaksh:start_quiz', kwargs={
+ 'questionpaper_id': self.question_paper2.id,
+ 'module_id': self.learning_module2.id,
+ 'course_id': self.user1_course1.id
+ })
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+
+ def tearDown(self):
+ self.client.logout()
+ self.user1.delete()
+ self.student.delete()
+ self.quiz1.delete()
+ self.user1_course1.delete()
diff --git a/yaksh/views.py b/yaksh/views.py
index 7ed799f..277196d 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -3294,12 +3294,14 @@ def course_forum(request, course_id):
if (not course.is_creator(user) and not course.is_teacher(user)
and not course.is_student(user)):
raise Http404('You are not enrolled in {0} course'.format(course.name))
- if 'search' in request.GET:
- search_term = request.GET['search']
- posts = course.post.filter(active=True, title__icontains=search_term)
+ search_term = request.GET.get('search_post')
+ if search_term:
+ posts = course.post.get_queryset().filter(
+ active=True, title__icontains=search_term)
else:
- posts = course.post.filter(active=True).order_by('-modified_at')
- paginator = Paginator(posts, 10)
+ posts = course.post.get_queryset().filter(
+ active=True).order_by('-modified_at')
+ paginator = Paginator(posts, 1)
page = request.GET.get('page')
posts = paginator.get_page(page)
if request.method == "POST":
@@ -3317,7 +3319,6 @@ def course_forum(request, course_id):
'user': user,
'course': course,
'base_template': base_template,
- 'posts': posts,
'moderator': moderator,
'objects': posts,
'form': form,