From 66c881ff2769560258b3d72a12aedd0df17b9d27 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Wed, 6 May 2020 21:24:37 +0530 Subject: Add Reject button to reject selected students - A reject button to reject selected students in Enroll Students page on a Requested Students tab. - Improve the views and urls for enrolling and rejecting students in the course. --- yaksh/templates/yaksh/course_students.html | 154 ++++++++++++++--------------- yaksh/urls.py | 34 ++++--- yaksh/views.py | 115 ++++++++++++--------- 3 files changed, 165 insertions(+), 138 deletions(-) diff --git a/yaksh/templates/yaksh/course_students.html b/yaksh/templates/yaksh/course_students.html index 2052a69..e8ca800 100644 --- a/yaksh/templates/yaksh/course_students.html +++ b/yaksh/templates/yaksh/course_students.html @@ -3,7 +3,7 @@
- Upload Users  + Upload Users
@@ -48,60 +48,59 @@
- Requested Students  + Requested Students
- {% if requested %} + {% if requested_users %}
-   - Select all + Select all
-
+ {% csrf_token %} - - - - - + + + + + - {% for request in requested %} + {% for user in requested_users %} - - - {% with request.profile as request_profile %} - - - + + + {% with user.profile as user_profile %} + + + {% endwith %} {% endfor %}
Full Name Email Roll Number Institute Department Full Name Email Roll Number Institute Department Enroll/Reject
{{ forloop.counter }}. - + {{request.get_full_name}} {{request.email}} {{request_profile.roll_number}} {{request_profile.institute}} {{request_profile.department}}{{user.get_full_name}} {{user.email}} {{user_profile.roll_number}} {{user_profile.institute}} {{user_profile.department}} - - - Enroll - - - Reject + + + Enroll + + + + Reject +
-
+ + + +
{% else %} @@ -116,45 +115,43 @@
- {% if enrolled %} + {% if enrolled_users %}
-   - Select all + Select all
-
+ {% csrf_token %} - - - - - + + + + + - {% for enroll in enrolled %} + {% for user in enrolled_users %} - - - {% with enroll.profile as enroll_profile %} - - - + + + {% with user.profile as user_profile %} + + + {% endwith %}
Full Name Email Roll Number Institute Department Full Name Email Roll Number Institute Department Reject
{{ forloop.counter }}. - + {{ enroll.get_full_name|title }} {{enroll.email}} {{enroll_profile.roll_number}} {{enroll_profile.institute}} {{enroll_profile.department}} {{ user.get_full_name|title }} {{user.email}} {{user_profile.roll_number}} {{user_profile.institute}} {{user_profile.department}} - + Reject @@ -163,10 +160,8 @@ {% endfor %}
-
+ +
{% else %} @@ -182,56 +177,53 @@
- {% if rejected %} + {% if rejected_users %}
-   - Select all + Select all
-
+ {% csrf_token %} - - - - - + + + + + - {% for reject in rejected %} + {% for user in rejected_users %} - - - {% with reject.profile as reject_profile %} - - - + + + {% with user.profile as user_profile %} + + + {% endwith %} {% endfor %}
Full Name Email Roll Number Institute Department Full Name Email Roll Number Institute Department Enroll
{{ forloop.counter }}. - + {{reject.get_full_name|title}} {{reject.email}} {{reject_profile.roll_number}} {{reject_profile.institute}} {{reject_profile.department}}{{user.get_full_name|title}} {{user.email}} {{user_profile.roll_number}} {{user_profile.institute}} {{user_profile.department}} - - - Enroll + + + Enroll +

- + +
diff --git a/yaksh/urls.py b/yaksh/urls.py index 149e4d6..97bd42e 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -122,30 +122,38 @@ urlpatterns = [ name='edit_course'), url(r'manage/course_detail/(?P\d+)/$', views.course_detail, name='course_detail'), - url(r'manage/enroll/(?P\d+)/(?P\d+)/$', views.enroll, - name="enroll_user"), + + url(r'manage/enroll/(?P\d+)/$', views.enroll_reject_user, + name="enroll_reject_user"), + url(r'manage/enroll/(?P\d+)/(?P\d+)/$', + views.enroll_user, name="enroll_user"), + url(r'manage/reject/(?P\d+)/(?P\d+)/$', + views.reject_user, name="reject_user"), + url(r'manage/enrolled/reject/(?P\d+)/(?P\d+)/$', + views.reject_user, {'was_enrolled': True}, + name="reject_enrolled_user"), + url(r'manage/enrolled/reject/(?P\d+)/$', + views.enroll_reject_user, {'was_enrolled': True}, + name="reject_enrolled_users"), url(r'manage/enroll/rejected/(?P\d+)/(?P\d+)/$', - views.enroll, {'was_rejected': True}, name="enroll_rejected"), + views.enroll_user, {'was_rejected': True}, + name="enroll_rejected_user"), + url(r'manage/enroll/rejected/(?P\d+)/$', + views.enroll_reject_user, {'was_rejected': True}, + name="enroll_rejected_users"), + url(r'manage/upload_users/(?P\d+)/$', views.upload_users, name="upload_users"), url(r'manage/send_mail/(?P\d+)/$', views.send_mail, name="send_mail"), - url(r'manage/reject/(?P\d+)/(?P\d+)/$', views.reject, - name="reject_user"), - url(r'manage/enrolled/reject/(?P\d+)/(?P\d+)/$', - views.reject, {'was_enrolled': True}, name="reject_user"), + url(r'manage/toggle_status/(?P\d+)/$', views.toggle_course_status, name="toggle_course_status"), url(r'^questions/filter$', views.questions_filter, name="questions_filter"), url(r'^editprofile/$', views.edit_profile, name='edit_profile'), url(r'^viewprofile/$', views.view_profile, name='view_profile'), - url(r'^manage/enroll/(?P\d+)/$', views.enroll, - name="enroll_users"), - url(r'manage/enroll/rejected/(?P\d+)/$', - views.enroll, {'was_rejected': True}, name="enroll_rejected"), - url(r'manage/enrolled/reject/(?P\d+)/$', - views.reject, {'was_enrolled': True}, name="reject_users"), + url(r'^manage/searchteacher/(?P\d+)/$', views.search_teacher, name="search_teacher"), url(r'^manage/addteacher/(?P\d+)/$', views.add_teacher, diff --git a/yaksh/views.py b/yaksh/views.py index 397e7c8..c716be4 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1113,12 +1113,55 @@ def course_detail(request, course_id): @login_required @email_verified -def enroll(request, course_id, user_id=None, was_rejected=False): +def enroll_user(request, course_id, user_id=None, was_rejected=False): user = request.user if not is_moderator(user): raise Http404('You are not allowed to view this page') - course = get_object_or_404(Course, pk=course_id) + course = get_object_or_404(Course, id=course_id) + if not course.is_active_enrollment(): + msg = ( + 'Enrollment for this course has been closed,' + ' please contact your ' + 'instructor/administrator.' + ) + messages.warning(request, msg) + return redirect('yaksh:course_students', course_id=course_id) + + if not course.is_creator(user) and not course.is_teacher(user): + raise Http404('This course does not belong to you') + + user = User.objects.get(id=user_id) + course.enroll(was_rejected, user) + messages.success(request, 'Enrolled student successfully') + return redirect('yaksh:course_students', course_id=course_id) + + +@login_required +@email_verified +def reject_user(request, course_id, user_id=None, was_enrolled=False): + user = request.user + print(was_enrolled) + if not is_moderator(user): + raise Http404('You are not allowed to view this page') + course = get_object_or_404(Course, id=course_id) + if not course.is_creator(user) and not course.is_teacher(user): + raise Http404('This course does not belong to you') + user = User.objects.get(id=user_id) + course.reject(was_enrolled, user) + messages.success(request, "Rejected students successfully") + return redirect('yaksh:course_students', course_id=course_id) + + +@login_required +@email_verified +def enroll_reject_user(request, + course_id, was_enrolled=False, was_rejected=False): + user = request.user + if not is_moderator(user): + raise Http404('You are not allowed to view this page') + course = get_object_or_404(Course, id=course_id) + if not course.is_active_enrollment(): msg = ( 'Enrollment for this course has been closed,' @@ -1126,23 +1169,32 @@ def enroll(request, course_id, user_id=None, was_rejected=False): 'instructor/administrator.' ) messages.warning(request, msg) - return my_redirect(reverse('yaksh:course_students', args=[course_id])) + return redirect('yaksh:course_students', course_id=course_id) if not course.is_creator(user) and not course.is_teacher(user): raise Http404('This course does not belong to you') if request.method == 'POST': - enroll_ids = request.POST.getlist('check') - else: - enroll_ids = [user_id] - if not enroll_ids: - messages.warning(request, "Please select atleast one student") - return my_redirect(reverse('yaksh:course_students', args=[course_id])) - - users = User.objects.filter(id__in=enroll_ids) - course.enroll(was_rejected, *users) - messages.success(request, "Enrolled student(s) successfully") - return my_redirect(reverse('yaksh:course_students', args=[course_id])) + if 'enroll' in request.POST: + enroll_ids = request.POST.getlist('check') + if not enroll_ids: + messages.warning(request, "Please select atleast one student") + return redirect('yaksh:course_students', course_id=course_id) + users = User.objects.filter(id__in=enroll_ids) + course.enroll(was_rejected, *users) + messages.success(request, "Enrolled student(s) successfully") + return redirect('yaksh:course_students', course_id=course_id) + if 'reject' in request.POST: + reject_ids = request.POST.getlist('check') + if not reject_ids: + messages.warning(request, "Please select atleast one student") + return redirect('yaksh:course_students', course_id=course_id) + users = User.objects.filter(id__in=reject_ids) + course.reject(was_enrolled, *users) + messages.success(request, "Rejected students successfully") + return redirect('yaksh:course_students', course_id=course_id) + + return redirect('yaksh:course_students', course_id=course_id) @login_required @@ -1176,31 +1228,6 @@ def send_mail(request, course_id, user_id=None): return my_render_to_response(request, 'yaksh/course_detail.html', context) -@login_required -@email_verified -def reject(request, course_id, user_id=None, was_enrolled=False): - user = request.user - if not is_moderator(user): - raise Http404('You are not allowed to view this page') - - course = get_object_or_404(Course, pk=course_id) - if not course.is_creator(user) and not course.is_teacher(user): - raise Http404('This course does not belong to you') - - if request.method == 'POST': - reject_ids = request.POST.getlist('check') - else: - reject_ids = [user_id] - if not reject_ids: - messages.warning(request, "Please select atleast one student") - return my_redirect(reverse('yaksh:course_students', args=[course_id])) - - users = User.objects.filter(id__in=reject_ids) - course.reject(was_enrolled, *users) - messages.success(request, "Rejected students successfully") - return my_redirect(reverse('yaksh:course_students', args=[course_id])) - - @login_required @email_verified def toggle_course_status(request, course_id): @@ -3215,11 +3242,11 @@ def course_students(request, course_id): if not course.is_creator(user) and not course.is_teacher(user): raise Http404("You are not allowed to view {0}".format( course.name)) - enrolled = course.get_enrolled() - requested = course.get_requests() - rejected = course.get_rejected() - context = {"enrolled": enrolled, "requested": requested, "course": course, - "rejected": rejected, "is_students": True} + enrolled_users = course.get_enrolled() + requested_users = course.get_requests() + rejected_users = course.get_rejected() + context = {"enrolled_users": enrolled_users, "requested_users": requested_users, "course": course, + "rejected_users": rejected_users, "is_students": True} return my_render_to_response(request, 'yaksh/course_detail.html', context) -- cgit From 23c238315aacb7736a97c35040846b7c7104bb43 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Wed, 6 May 2020 22:31:56 +0530 Subject: Fix tests --- yaksh/test_views.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 94b81ad..af0193e 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -2974,11 +2974,14 @@ class TestCourseDetail(TestCase): username=self.user1.username, password=self.user1_plaintext_pass ) - response = self.client.post( - reverse('yaksh:enroll_users', - kwargs={'course_id': self.user1_course.id}), - data={'check': self.student1.id} - ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'check': self.student1.id, + 'enroll': 'enroll' + } + response = self.client.post(url, data) enrolled_student = self.user1_course.students.all() self.assertEqual(response.status_code, 302) self.assertSequenceEqual([self.student1], enrolled_student) @@ -3008,11 +3011,14 @@ class TestCourseDetail(TestCase): username=self.user1.username, password=self.user1_plaintext_pass ) - response = self.client.post( - reverse('yaksh:reject_users', - kwargs={'course_id': self.user1_course.id}), - data={'check': self.student1.id} - ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'check': self.student1.id, + 'reject': 'reject' + } + response = self.client.post(url, data) enrolled_student = self.user1_course.rejected.all() self.assertEqual(response.status_code, 302) self.assertSequenceEqual([self.student1], enrolled_student) -- cgit From 624a0971830b1fd30fe5d1f389b5a143a210d235 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Fri, 8 May 2020 22:08:24 +0530 Subject: More tests to test course detail page --- yaksh/test_views.py | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yaksh/views.py | 1 - 2 files changed, 240 insertions(+), 1 deletion(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index af0193e..5b873b5 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -2636,6 +2636,12 @@ class TestCourseDetail(TestCase): name="Python Course II", enrollment="Enroll Request", creator=self.user1 ) + self.user1_deactive_course = Course.objects.create( + name="Python Course II", + enrollment="Enroll Request", + creator=self.user1, + active=False + ) self.learning_module = LearningModule.objects.create( name="test module", description="test description module", html_data="test html description module", creator=self.user1, @@ -2986,6 +2992,64 @@ class TestCourseDetail(TestCase): self.assertEqual(response.status_code, 302) self.assertSequenceEqual([self.student1], enrolled_student) + def test_student_course_enroll_post_without_enroll_in_request(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'check': self.student1.id, + 'enroll': '' + } + response = self.client.post(url, data) + self.assertEqual(response.status_code, 302) + + def test_student_course_enroll_post_without_enroll_ids(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'enroll': 'enroll' + } + response = self.client.post(url, data) + self.assertEqual(response.status_code, 302) + + def test_student_course_reject_post_without_reject_in_request(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'check': self.student1.id, + 'reject': '' + } + response = self.client.post(url, data) + self.assertEqual(response.status_code, 302) + + def test_student_course_reject_post_without_reject_ids(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id + }) + data = { + 'reject': 'reject' + } + response = self.client.post(url, data) + self.assertEqual(response.status_code, 302) + def test_student_course_reject_get(self): """ Reject student in a course using get request @@ -3023,6 +3087,64 @@ class TestCourseDetail(TestCase): self.assertEqual(response.status_code, 302) self.assertSequenceEqual([self.student1], enrolled_student) + def test_enroll_user_not_moderator(self): + self.client.login( + username=self.student.username, + password=self.student_plaintext_pass + ) + url = reverse('yaksh:enroll_user', kwargs={ + 'course_id': self.user1_course.id, + 'user_id': self.user1.id + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + + def test_enroll_user_in_deactivated_course(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_user', kwargs={ + 'course_id': self.user1_deactive_course.id, + 'user_id': self.student.id + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 302) + + def test_reject_user_not_moderator(self): + self.client.login( + username=self.student.username, + password=self.student_plaintext_pass + ) + url = reverse('yaksh:reject_user', kwargs={ + 'course_id': self.user1_course.id, + 'user_id': self.user1.id + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + + def test_enroll_reject_user_not_moderator(self): + self.client.login( + username=self.student.username, + password=self.student_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id, + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + + def test_enroll_reject_user_in_deactivated_course(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_deactive_course.id, + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 302) + def test_toggle_course_status_get(self): self.client.login( username=self.user1.username, @@ -3216,6 +3338,124 @@ class TestCourseDetail(TestCase): self.assertIn("Per Module Progress", data) +class TestCourseStudents(TestCase): + def setUp(self): + self.client = Client() + self.mod_group = Group.objects.create(name='moderator') + + # Create Moderator with profile + self.user1_plaintext_pass = 'demo1' + self.user1 = User.objects.create_user( + username='demo_user1', + password=self.user1_plaintext_pass, + first_name='user1_first_name', + last_name='user1_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 + ) + + 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' + ) + self.student1_plaintext_pass = 'demo_student' + self.student1 = User.objects.create_user( + username='demo_student1', + password=self.student1_plaintext_pass, + first_name='student1_first_name', + last_name='student1_last_name', + email='demo_student1@test.com' + ) + + self.student2_plaintext_pass = 'demo_student' + self.student2 = User.objects.create_user( + username='demo_student2', + password=self.student2_plaintext_pass, + first_name='student2_first_name', + last_name='student2_last_name', + email='demo_student2@test.com' + ) + + # Add to moderator group + self.mod_group.user_set.add(self.user1) + + self.user1_course = Course.objects.create( + name="Python Course", + enrollment="Enroll Request", creator=self.user1 + ) + + # self.course.students.add(self.student) + self.user1_course.enroll(False, self.student) + self.user1_course.reject(False, self.student1) + self.user1_course.request(self.student2) + + def test_enrolled_users(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id + }) + response = self.client.get(url) + enrolled_users = self.user1_course.get_enrolled() + self.assertTrue(enrolled_users.exists()) + + def test_requested_users(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id + }) + response = self.client.get(url) + requested_users = self.user1_course.get_requests() + self.assertTrue(requested_users.exists()) + + def test_rejected_users(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id + }) + response = self.client.get(url) + rejected_users = self.user1_course.get_rejected() + self.assertTrue(rejected_users.exists()) + + def test_course_students_context(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id + }) + response = self.client.get(url) + self.assertTrue('enrolled_users' in response.context) + self.assertTrue('requested_users' in response.context) + self.assertTrue('rejected_users' in response.context) + + + def tearDown(self): + pass + + class TestEnrollRequest(TestCase): def setUp(self): self.client = Client() diff --git a/yaksh/views.py b/yaksh/views.py index c716be4..91ddbae 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1141,7 +1141,6 @@ def enroll_user(request, course_id, user_id=None, was_rejected=False): @email_verified def reject_user(request, course_id, user_id=None, was_enrolled=False): user = request.user - print(was_enrolled) if not is_moderator(user): raise Http404('You are not allowed to view this page') course = get_object_or_404(Course, id=course_id) -- cgit From b36ea2af46cbf50aa7a046aa35d0c5c1543e6623 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Sat, 9 May 2020 16:42:14 +0530 Subject: Add missing tests. --- yaksh/test_views.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++--- yaksh/views.py | 2 -- 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 5b873b5..555f933 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -2632,16 +2632,19 @@ class TestCourseDetail(TestCase): name="Python Course", enrollment="Enroll Request", creator=self.user1 ) + self.user1_othercourse = Course.objects.create( name="Python Course II", enrollment="Enroll Request", creator=self.user1 ) + self.user1_deactive_course = Course.objects.create( name="Python Course II", enrollment="Enroll Request", creator=self.user1, - active=False + end_enroll_time=timezone.now() ) + self.learning_module = LearningModule.objects.create( name="test module", description="test description module", html_data="test html description module", creator=self.user1, @@ -3099,7 +3102,7 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 404) - def test_enroll_user_in_deactivated_course(self): + def test_enroll_user_in_expired_course(self): self.client.login( username=self.user1.username, password=self.user1_plaintext_pass @@ -3111,6 +3114,18 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 302) + def test_enroll_user_where_moderator_is_neither_creator_nor_teacher(self): + self.client.login( + username=self.user2.username, + password=self.user2_plaintext_pass + ) + url = reverse('yaksh:enroll_user', kwargs={ + 'course_id': self.user1_course.id, + 'user_id': self.user1.id + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + def test_reject_user_not_moderator(self): self.client.login( username=self.student.username, @@ -3123,6 +3138,18 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 404) + def test_reject_user_where_moderator_is_neither_creator_nor_teacher(self): + self.client.login( + username=self.user2.username, + password=self.user2_plaintext_pass + ) + url = reverse('yaksh:reject_user', kwargs={ + 'course_id': self.user1_course.id, + 'user_id': self.user1.id + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + def test_enroll_reject_user_not_moderator(self): self.client.login( username=self.student.username, @@ -3145,6 +3172,17 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 302) + def test_enroll_reject_user_where_moderator_is_neither_creator_nor_teacher(self): + self.client.login( + username=self.user2.username, + password=self.user2_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id, + }) + response = self.client.post(url) + self.assertEqual(response.status_code, 404) + def test_toggle_course_status_get(self): self.client.login( username=self.user1.username, @@ -3363,6 +3401,25 @@ class TestCourseStudents(TestCase): is_moderator=True ) + self.user2_plaintext_pass = 'demo2' + self.user2 = User.objects.create_user( + username='demo_user2', + password=self.user2_plaintext_pass, + first_name='user2_first_name', + last_name='user2_last_name', + email='demo2@test.com' + ) + + Profile.objects.create( + user=self.user2, + roll_number=10, + institute='IIT', + department='Aeronautical', + position='Moderator', + timezone='UTC', + is_moderator=True + ) + self.student_plaintext_pass = 'demo_student' self.student = User.objects.create_user( username='demo_student', @@ -3391,13 +3448,13 @@ class TestCourseStudents(TestCase): # Add to moderator group self.mod_group.user_set.add(self.user1) + self.mod_group.user_set.add(self.user2) self.user1_course = Course.objects.create( name="Python Course", enrollment="Enroll Request", creator=self.user1 ) - # self.course.students.add(self.student) self.user1_course.enroll(False, self.student) self.user1_course.reject(False, self.student1) self.user1_course.request(self.student2) @@ -3451,9 +3508,25 @@ class TestCourseStudents(TestCase): self.assertTrue('requested_users' in response.context) self.assertTrue('rejected_users' in response.context) + def test_course_students_where_moderator_is_neither_creator_nor_teacher( + self): + self.client.login( + username=self.user2.username, + password=self.user2_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id, + }) + response = self.client.get(url) + self.assertEqual(response.status_code, 404) def tearDown(self): - pass + self.user1.delete() + self.user2.delete() + self.student.delete() + self.student1.delete() + self.student2.delete() + self.user1_course.delete() class TestEnrollRequest(TestCase): diff --git a/yaksh/views.py b/yaksh/views.py index 91ddbae..cde169f 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1193,8 +1193,6 @@ def enroll_reject_user(request, messages.success(request, "Rejected students successfully") return redirect('yaksh:course_students', course_id=course_id) - return redirect('yaksh:course_students', course_id=course_id) - @login_required @email_verified -- cgit From 9a8330b74c9ee0ddf8720a7326a699ba32922575 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Sat, 9 May 2020 17:42:01 +0530 Subject: Fix pep8 - cover missing tests. --- yaksh/test_views.py | 14 +++++++++++++- yaksh/urls.py | 8 ++++---- yaksh/views.py | 12 +++++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 555f933..583aaa9 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -3172,7 +3172,8 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 302) - def test_enroll_reject_user_where_moderator_is_neither_creator_nor_teacher(self): + def test_enroll_reject_user_where_moderator_is_neither_creator_nor_teacher( + self): self.client.login( username=self.user2.username, password=self.user2_plaintext_pass @@ -3183,6 +3184,17 @@ class TestCourseDetail(TestCase): response = self.client.post(url) self.assertEqual(response.status_code, 404) + def test_get_enroll_reject_user_view(self): + self.client.login( + username=self.user1.username, + password=self.user1_plaintext_pass + ) + url = reverse('yaksh:enroll_reject_user', kwargs={ + 'course_id': self.user1_course.id, + }) + response = self.client.get(url) + self.assertEqual(response.status_code, 302) + def test_toggle_course_status_get(self): self.client.login( username=self.user1.username, diff --git a/yaksh/urls.py b/yaksh/urls.py index 97bd42e..88f34b3 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -122,9 +122,9 @@ urlpatterns = [ name='edit_course'), url(r'manage/course_detail/(?P\d+)/$', views.course_detail, name='course_detail'), - + url(r'manage/enroll/(?P\d+)/$', views.enroll_reject_user, - name="enroll_reject_user"), + name="enroll_reject_user"), url(r'manage/enroll/(?P\d+)/(?P\d+)/$', views.enroll_user, name="enroll_user"), url(r'manage/reject/(?P\d+)/(?P\d+)/$', @@ -146,14 +146,14 @@ urlpatterns = [ name="upload_users"), url(r'manage/send_mail/(?P\d+)/$', views.send_mail, name="send_mail"), - + url(r'manage/toggle_status/(?P\d+)/$', views.toggle_course_status, name="toggle_course_status"), url(r'^questions/filter$', views.questions_filter, name="questions_filter"), url(r'^editprofile/$', views.edit_profile, name='edit_profile'), url(r'^viewprofile/$', views.view_profile, name='view_profile'), - + url(r'^manage/searchteacher/(?P\d+)/$', views.search_teacher, name="search_teacher"), url(r'^manage/addteacher/(?P\d+)/$', views.add_teacher, diff --git a/yaksh/views.py b/yaksh/views.py index cde169f..44abcff 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -1190,8 +1190,9 @@ def enroll_reject_user(request, return redirect('yaksh:course_students', course_id=course_id) users = User.objects.filter(id__in=reject_ids) course.reject(was_enrolled, *users) - messages.success(request, "Rejected students successfully") + messages.success(request, "Rejected students successfully") return redirect('yaksh:course_students', course_id=course_id) + return redirect('yaksh:course_students', course_id=course_id) @login_required @@ -3242,8 +3243,13 @@ def course_students(request, course_id): enrolled_users = course.get_enrolled() requested_users = course.get_requests() rejected_users = course.get_rejected() - context = {"enrolled_users": enrolled_users, "requested_users": requested_users, "course": course, - "rejected_users": rejected_users, "is_students": True} + context = { + "enrolled_users": enrolled_users, + "requested_users": requested_users, + "course": course, + "rejected_users": rejected_users, + "is_students": True + } return my_render_to_response(request, 'yaksh/course_detail.html', context) -- cgit From 99980a9523c6c8403328e68e78566e315bbf4c5e Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Sat, 9 May 2020 18:09:59 +0530 Subject: Fix tests --- yaksh/test_views.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 583aaa9..b2e62af 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -3005,7 +3005,6 @@ class TestCourseDetail(TestCase): }) data = { 'check': self.student1.id, - 'enroll': '' } response = self.client.post(url, data) self.assertEqual(response.status_code, 302) @@ -3034,7 +3033,6 @@ class TestCourseDetail(TestCase): }) data = { 'check': self.student1.id, - 'reject': '' } response = self.client.post(url, data) self.assertEqual(response.status_code, 302) -- cgit From bb21bbe9a38a9d3fc129716525514189ffc4bb7f Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Sat, 9 May 2020 18:21:54 +0530 Subject: Add more tests for course_students view --- yaksh/test_views.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/yaksh/test_views.py b/yaksh/test_views.py index b2e62af..be0f7a3 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -3530,6 +3530,17 @@ class TestCourseStudents(TestCase): response = self.client.get(url) self.assertEqual(response.status_code, 404) + def test_course_students_where_user_is_not_moderator(self): + self.client.login( + username=self.student1, + password=self.student1_plaintext_pass + ) + url = reverse('yaksh:course_students', kwargs={ + 'course_id': self.user1_course.id, + }) + response = self.client.get(url) + self.assertEqual(response.status_code, 404) + def tearDown(self): self.user1.delete() self.user2.delete() -- cgit