From ef3d55ff980195239eba124ee2816882d9b59041 Mon Sep 17 00:00:00 2001 From: Johannes Degn Date: Wed, 10 Nov 2021 12:01:29 +0530 Subject: [PATCH 1/3] Fix typos --- .../contentstore/views/tests/test_item.py | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index ac3a43a9b9ec..6e4702f11f17 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -3371,11 +3371,11 @@ def test_self_paced_item_visibility_state(self, store_type): xblock_info = self._get_xblock_info(chapter.location) self._verify_visibility_state(xblock_info, VisibilityState.live) - def test_staff_show_delte_button(self): + def test_staff_show_delete_button(self): """ Test delete button is *not visible* to user with CourseStaffRole """ - # add user as course staff + # Add user as course staff CourseStaffRole(self.course_key).add_users(self.user) # Get xblock outline @@ -3386,13 +3386,66 @@ def test_staff_show_delte_button(self): include_children_predicate=lambda xblock: not xblock.category == 'vertical', user=self.user ) + self.assertTrue(xblock_info['show_delete_button']) + + def test_staff_show_delete_button_with_waffle(self): + """ + Test delete button is *not visible* to user with CourseStaffRole and + PREVENT_STAFF_STRUCTURE_DELETION waffle set + """ + # Add user as course staff + CourseStaffRole(self.course_key).add_users(self.user) + + with override_waffle_flag(PREVENT_STAFF_STRUCTURE_DELETION, active=True): + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=self.user + ) + + self.assertFalse(xblock_info['show_delete_button']) + + def test_no_user_show_delete_button(self): + """ + Test delete button is *visible* when user attribute is not set on + xblock. This happens with ajax requests. + """ + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=None + ) + self.assertTrue(xblock_info['show_delete_button']) + + def test_no_user_show_delete_button_with_waffle(self): + """ + Test delete button is *visible* when user attribute is not set on + xblock (this happens with ajax requests) and PREVENT_STAFF_STRUCTURE_DELETION waffle set. + """ + + with override_waffle_flag(PREVENT_STAFF_STRUCTURE_DELETION, active=True): + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=None + ) + self.assertFalse(xblock_info['show_delete_button']) def test_instructor_show_delete_button(self): """ - Test delete button is *visible* to user with CourseCreatorRole only + Test delete button is *visible* to user with CourseInstructorRole only """ - # add user as course instructor + # Add user as course instructor CourseInstructorRole(self.course_key).add_users(self.user) # Get xblock outline From bc90119142f2e1cfa0a31e6fd3f13d3cff96fef5 Mon Sep 17 00:00:00 2001 From: Johannes Degn Date: Wed, 10 Nov 2021 12:03:08 +0530 Subject: [PATCH 2/3] Fix PREVENT_STAFF_STRUCTURE_DELETION flag for ajax requests --- cms/djangoapps/contentstore/views/item.py | 4 ++-- .../contentstore/views/tests/test_item.py | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index fd73d8ab330b..4cec858a0a6a 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -1339,8 +1339,8 @@ def create_xblock_info(xblock, data=None, metadata=None, include_ancestor_info=F xblock_info['staff_only_message'] = False xblock_info['show_delete_button'] = True - if user is not None and PREVENT_STAFF_STRUCTURE_DELETION.is_enabled(): - xblock_info['show_delete_button'] = user.has_perm(DELETE_COURSE_CONTENT, xblock) + if PREVENT_STAFF_STRUCTURE_DELETION.is_enabled(): + xblock_info['show_delete_button'] = user.has_perm(DELETE_COURSE_CONTENT, xblock) if user is not None else False xblock_info['has_partition_group_components'] = has_children_visible_to_specific_partition_groups( xblock diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index 6e4702f11f17..67db1abba9c1 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -13,7 +13,7 @@ from django.test.client import RequestFactory from django.urls import reverse from edx_proctoring.exceptions import ProctoredExamNotFoundException -from edx_toggles.toggles.testutils import override_waffle_switch +from edx_toggles.toggles.testutils import override_waffle_switch, override_waffle_flag from mock import Mock, PropertyMock, patch from opaque_keys import InvalidKeyError from opaque_keys.edx.asides import AsideUsageKeyV2 @@ -32,6 +32,7 @@ from xblock.test.tools import TestRuntime from xblock.validation import ValidationMessage +from cms.djangoapps.contentstore.config.waffle import PREVENT_STAFF_STRUCTURE_DELETION from cms.djangoapps.contentstore.tests.utils import CourseTestCase from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url from cms.djangoapps.contentstore.views import item as item_module @@ -3457,3 +3458,24 @@ def test_instructor_show_delete_button(self): user=self.user ) self.assertTrue(xblock_info['show_delete_button']) + + def test_instructor_show_delete_button_with_waffle(self): + """ + Test delete button is *visible* to user with CourseInstructorRole only + and PREVENT_STAFF_STRUCTURE_DELETION waffle set + """ + # Add user as course instructor + CourseInstructorRole(self.course_key).add_users(self.user) + + with override_waffle_flag(PREVENT_STAFF_STRUCTURE_DELETION, active=True): + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=self.user + ) + + self.assertTrue(xblock_info['show_delete_button']) + From 4f51baa38cb0e89fa73469d0a6945ec85d99e0a7 Mon Sep 17 00:00:00 2001 From: Johannes Degn Date: Wed, 10 Nov 2021 12:06:59 +0530 Subject: [PATCH 3/3] Add testcase for CourseCreatorRole --- .../contentstore/views/tests/test_item.py | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index 67db1abba9c1..270064ca58c9 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -37,7 +37,7 @@ from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url from cms.djangoapps.contentstore.views import item as item_module from lms.djangoapps.lms_xblock.mixin import NONSENSICAL_ACCESS_RESTRICTION -from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole +from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole, CourseCreatorRole from common.djangoapps.student.tests.factories import UserFactory from common.djangoapps.xblock_django.models import ( XBlockConfiguration, XBlockStudioConfiguration, XBlockStudioConfigurationFlag @@ -3479,3 +3479,39 @@ def test_instructor_show_delete_button_with_waffle(self): self.assertTrue(xblock_info['show_delete_button']) + def test_creator_show_delete_button(self): + """ + Test delete button is *visible* to user with CourseInstructorRole only + """ + # Add user as course creator + CourseCreatorRole(self.course_key).add_users(self.user) + + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=self.user + ) + self.assertTrue(xblock_info['show_delete_button']) + + def test_creator_show_delete_button_with_waffle(self): + """ + Test delete button is *visible* to user with CourseInstructorRole only + and PREVENT_STAFF_STRUCTURE_DELETION waffle set + """ + # Add user as course creator + CourseCreatorRole(self.course_key).add_users(self.user) + + with override_waffle_flag(PREVENT_STAFF_STRUCTURE_DELETION, active=True): + # Get xblock outline + xblock_info = create_xblock_info( + self.course, + include_child_info=True, + course_outline=True, + include_children_predicate=lambda xblock: not xblock.category == 'vertical', + user=self.user + ) + + self.assertFalse(xblock_info['show_delete_button'])