Merge pull request #25440 from regisb/regisb/deprecate-defaulttrue-toggles
Deprecate COURSE_OUTLINE_PAGE_FLAG and UNIFIED_COURSE_TAB_FLAG
This commit is contained in:
@@ -3,8 +3,8 @@
|
||||
"pk": 1,
|
||||
"model": "waffle.flag",
|
||||
"fields": {
|
||||
"name": "course_experience.course_outline_page",
|
||||
"everyone": false
|
||||
"name": "course_experience.disable_course_outline_page",
|
||||
"everyone": true
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ from lms.djangoapps.courseware.entrance_exams import user_can_skip_entrance_exam
|
||||
from lms.djangoapps.course_home_api.toggles import course_home_mfe_dates_tab_is_active, course_home_mfe_outline_tab_is_active
|
||||
from lms.djangoapps.course_home_api.utils import get_microfrontend_url
|
||||
from openedx.core.lib.course_tabs import CourseTabPluginManager
|
||||
from openedx.features.course_experience import RELATIVE_DATES_FLAG, UNIFIED_COURSE_TAB_FLAG, default_course_url_name
|
||||
from openedx.features.course_experience import RELATIVE_DATES_FLAG, DISABLE_UNIFIED_COURSE_TAB_FLAG, default_course_url_name
|
||||
from student.models import CourseEnrollment
|
||||
from xmodule.tabs import CourseTab, CourseTabList, course_reverse_func_from_name_func, key_checker
|
||||
|
||||
@@ -58,10 +58,10 @@ class CoursewareTab(EnrolledTab):
|
||||
"""
|
||||
Returns true if this tab is enabled.
|
||||
"""
|
||||
if DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id):
|
||||
return super(CoursewareTab, cls).is_enabled(course, user)
|
||||
# If this is the unified course tab then it is always enabled
|
||||
if UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id):
|
||||
return True
|
||||
return super(CoursewareTab, cls).is_enabled(course, user)
|
||||
return True
|
||||
|
||||
|
||||
class CourseInfoTab(CourseTab):
|
||||
@@ -360,7 +360,7 @@ def get_course_tab_list(user, course):
|
||||
continue
|
||||
tab.name = _("Entrance Exam")
|
||||
# TODO: LEARNER-611 - once the course_info tab is removed, remove this code
|
||||
if UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id) and tab.type == 'course_info':
|
||||
if not DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id) and tab.type == 'course_info':
|
||||
continue
|
||||
if tab.type == 'static_tab' and tab.course_staff_only and \
|
||||
not bool(user and has_access(user, 'staff', course, course.id)):
|
||||
|
||||
@@ -22,7 +22,7 @@ from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
|
||||
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration_context
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES, override_waffle_flag
|
||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||
from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG
|
||||
from openedx.features.course_experience import DISABLE_UNIFIED_COURSE_TAB_FLAG
|
||||
from openedx.features.enterprise_support.tests.mixins.enterprise import EnterpriseTestConsentRequired
|
||||
from student.models import CourseEnrollment
|
||||
from student.tests.factories import AdminFactory
|
||||
@@ -42,7 +42,7 @@ from .helpers import LoginEnrollmentTestCase
|
||||
QUERY_COUNT_TABLE_BLACKLIST = WAFFLE_TABLES
|
||||
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
"""
|
||||
Tests for the Course Info page
|
||||
@@ -154,7 +154,7 @@ class CourseInfoTestCase(EnterpriseTestConsentRequired, LoginEnrollmentTestCase,
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
class CourseInfoLastAccessedTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
"""
|
||||
Tests of the CourseInfo last accessed link.
|
||||
@@ -222,7 +222,7 @@ class CourseInfoLastAccessedTestCase(LoginEnrollmentTestCase, ModuleStoreTestCas
|
||||
self.assertEqual(resume_course_url, section_url)
|
||||
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@ddt.ddt
|
||||
class CourseInfoTitleTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
"""
|
||||
@@ -314,7 +314,7 @@ class CourseInfoTitleTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
)
|
||||
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
class CourseInfoTestCaseCCX(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
"""
|
||||
Test for unenrolled student tries to access ccx.
|
||||
@@ -351,7 +351,7 @@ class CourseInfoTestCaseCCX(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
self.assertRedirects(response, expected, status_code=302, target_status_code=200)
|
||||
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
class CourseInfoTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
"""
|
||||
Tests for the Course Info page for an XML course
|
||||
@@ -398,7 +398,7 @@ class CourseInfoTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase):
|
||||
|
||||
|
||||
@override_settings(FEATURES=dict(settings.FEATURES, EMBARGO=False))
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
class SelfPacedCourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
|
||||
"""
|
||||
Tests for the info page of self-paced courses.
|
||||
|
||||
@@ -44,7 +44,7 @@ from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
|
||||
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
|
||||
from openedx.features.course_experience import (
|
||||
RELATIVE_DATES_FLAG, UNIFIED_COURSE_TAB_FLAG, UPGRADE_DEADLINE_MESSAGE, CourseHomeMessages
|
||||
RELATIVE_DATES_FLAG, DISABLE_UNIFIED_COURSE_TAB_FLAG, UPGRADE_DEADLINE_MESSAGE, CourseHomeMessages
|
||||
)
|
||||
from student.tests.factories import TEST_PASSWORD, CourseEnrollmentFactory, UserFactory
|
||||
from xmodule.modulestore import ModuleStoreEnum
|
||||
@@ -420,7 +420,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
'info',
|
||||
'openedx.course_experience.course_home',
|
||||
)
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_todays_date_no_timezone(self, url_name):
|
||||
with freeze_time('2015-01-02'):
|
||||
course = create_course_run()
|
||||
@@ -442,7 +442,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
'info',
|
||||
'openedx.course_experience.course_home',
|
||||
)
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_todays_date_timezone(self, url_name):
|
||||
with freeze_time('2015-01-02'):
|
||||
course = create_course_run()
|
||||
@@ -472,7 +472,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
'info',
|
||||
'openedx.course_experience.course_home',
|
||||
)
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_start_date_render(self, url_name):
|
||||
with freeze_time('2015-01-02'):
|
||||
course = create_course_run()
|
||||
@@ -490,7 +490,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
'info',
|
||||
'openedx.course_experience.course_home',
|
||||
)
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_start_date_render_time_zone(self, url_name):
|
||||
with freeze_time('2015-01-02'):
|
||||
course = create_course_run()
|
||||
@@ -732,7 +732,7 @@ class CourseDateSummaryTest(SharedModuleStoreTestCase):
|
||||
('openedx.course_experience.course_home', False),
|
||||
)
|
||||
@ddt.unpack
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@RELATIVE_DATES_FLAG.override(active=True)
|
||||
def test_dates_tab_link_render(self, url_name, mfe_active):
|
||||
""" The dates tab link should only show for enrolled or staff users """
|
||||
|
||||
@@ -22,7 +22,7 @@ from lms.djangoapps.courseware.tests.factories import InstructorFactory, Request
|
||||
from lms.djangoapps.courseware.tests.helpers import LoginEnrollmentTestCase
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
|
||||
from openedx.core.djangolib.testing.utils import get_mock_request
|
||||
from openedx.features.course_experience import COURSE_OUTLINE_PAGE_FLAG, UNIFIED_COURSE_TAB_FLAG
|
||||
from openedx.features.course_experience import DISABLE_COURSE_OUTLINE_PAGE_FLAG, DISABLE_UNIFIED_COURSE_TAB_FLAG
|
||||
from student.models import CourseEnrollment
|
||||
from student.tests.factories import AnonymousUserFactory, CourseEnrollmentFactory
|
||||
from util.milestones_helpers import (
|
||||
@@ -357,7 +357,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
self.assertNotContains(resp, 'You have passed the entrance exam.')
|
||||
|
||||
# TODO: LEARNER-71: Do we need to adjust or remove this test?
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_entrance_exam_passed_message_and_course_content(self):
|
||||
"""
|
||||
Unit Test: exam passing message and rest of the course section should be present
|
||||
@@ -456,7 +456,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
|
||||
})
|
||||
self.assertRedirects(response, expected_url, status_code=302, target_status_code=200)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
def test_courseinfo_page_access_without_passing_entrance_exam(self):
|
||||
"""
|
||||
Test courseware access page without passing entrance exam
|
||||
|
||||
@@ -28,7 +28,7 @@ from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
|
||||
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
|
||||
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, set_user_preference
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
|
||||
from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG
|
||||
from openedx.features.course_experience import DISABLE_UNIFIED_COURSE_TAB_FLAG
|
||||
from student.models import CourseEnrollment
|
||||
from student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.django import modulestore
|
||||
@@ -299,7 +299,7 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
self.client.cookies[settings.LANGUAGE_COOKIE].value, expected_language_code
|
||||
)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_masquerade_as_specific_user_on_self_paced(self):
|
||||
"""
|
||||
@@ -390,7 +390,7 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
|
||||
self.get_courseware_page()
|
||||
self.assertExpectedLanguageInPreference(self.test_user, english_language_code)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_masquerade_as_specific_student_course_info(self):
|
||||
"""
|
||||
|
||||
@@ -15,7 +15,7 @@ from six.moves import range
|
||||
from lms.djangoapps.courseware.tests.factories import GlobalStaffFactory
|
||||
from lms.djangoapps.courseware.tests.helpers import LoginEnrollmentTestCase
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
|
||||
from openedx.features.course_experience import COURSE_OUTLINE_PAGE_FLAG
|
||||
from openedx.features.course_experience import DISABLE_COURSE_OUTLINE_PAGE_FLAG
|
||||
from student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||
@@ -99,7 +99,7 @@ class TestNavigation(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
return
|
||||
|
||||
# TODO: LEARNER-71: Do we need to adjust or remove this test?
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_chrome_settings(self):
|
||||
'''
|
||||
Test settings for disabling and modifying navigation chrome in the courseware:
|
||||
@@ -228,7 +228,7 @@ class TestNavigation(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
|
||||
self.assertRedirects(resp, section_url)
|
||||
|
||||
# TODO: LEARNER-71: Do we need to adjust or remove this test?
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_incomplete_course(self):
|
||||
email = self.staff_user.email
|
||||
password = "test"
|
||||
|
||||
@@ -28,7 +28,7 @@ from lms.djangoapps.courseware.tests.helpers import LoginEnrollmentTestCase
|
||||
from lms.djangoapps.courseware.views.views import StaticCourseTabView, get_static_tab_fragment
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag
|
||||
from openedx.core.djangolib.testing.utils import get_mock_request
|
||||
from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG
|
||||
from openedx.features.course_experience import DISABLE_UNIFIED_COURSE_TAB_FLAG
|
||||
from student.models import CourseEnrollment
|
||||
from student.tests.factories import UserFactory
|
||||
from util.milestones_helpers import (
|
||||
@@ -774,7 +774,7 @@ class CourseInfoTabTestCase(TabTestCase):
|
||||
self.user = self.create_mock_user()
|
||||
self.addCleanup(set_current_request, None)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
def test_default_tab(self):
|
||||
# Verify that the course info tab is the first tab
|
||||
tabs = get_course_tab_list(self.user, self.course)
|
||||
@@ -785,14 +785,14 @@ class CourseInfoTabTestCase(TabTestCase):
|
||||
# as part of the linked ticket
|
||||
self.assertEqual(tabs[1].type, 'course_info')
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_default_tab_for_new_course_experience(self):
|
||||
# Verify that the unified course experience hides the course info tab
|
||||
tabs = get_course_tab_list(self.user, self.course)
|
||||
self.assertEqual(tabs[0].type, 'courseware')
|
||||
|
||||
# TODO: LEARNER-611 - remove once course_info is removed.
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
def test_default_tab_for_displayable(self):
|
||||
tabs = xmodule_tabs.CourseTabList.iterate_displayable(self.course, self.user)
|
||||
for i, tab in enumerate(tabs):
|
||||
|
||||
@@ -81,9 +81,9 @@ from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
|
||||
from openedx.features.course_experience import (
|
||||
COURSE_ENABLE_UNENROLLED_ACCESS_FLAG,
|
||||
COURSE_OUTLINE_PAGE_FLAG,
|
||||
RELATIVE_DATES_FLAG,
|
||||
UNIFIED_COURSE_TAB_FLAG
|
||||
DISABLE_COURSE_OUTLINE_PAGE_FLAG,
|
||||
DISABLE_UNIFIED_COURSE_TAB_FLAG,
|
||||
RELATIVE_DATES_FLAG
|
||||
)
|
||||
from openedx.features.course_experience.tests.views.helpers import add_course_mode
|
||||
from openedx.features.enterprise_support.tests.mixins.enterprise import EnterpriseTestConsentRequired
|
||||
@@ -903,7 +903,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
response = self.client.get(url)
|
||||
self.assertRedirects(response, reverse('signin_user') + '?next=' + url)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
def test_bypass_course_info(self):
|
||||
course_id = six.text_type(self.course_key)
|
||||
|
||||
@@ -917,7 +917,7 @@ class ViewsTestCase(BaseViewsTestCase):
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
# TODO: TNL-6387: Remove test
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_accordion(self):
|
||||
"""
|
||||
This needs a response_context, which is not included in the render_accordion's main method
|
||||
@@ -1083,27 +1083,27 @@ class TestAccordionDueDate(BaseDueDateTests):
|
||||
)
|
||||
|
||||
# TODO: LEARNER-71: Delete entire TestAccordionDueDate class
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_backwards_compatibility(self):
|
||||
super(TestAccordionDueDate, self).test_backwards_compatibility()
|
||||
|
||||
# TODO: LEARNER-71: Delete entire TestAccordionDueDate class
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_defaults(self):
|
||||
super(TestAccordionDueDate, self).test_defaults()
|
||||
|
||||
# TODO: LEARNER-71: Delete entire TestAccordionDueDate class
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_format_date(self):
|
||||
super(TestAccordionDueDate, self).test_format_date()
|
||||
|
||||
# TODO: LEARNER-71: Delete entire TestAccordionDueDate class
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_format_invalid(self):
|
||||
super(TestAccordionDueDate, self).test_format_invalid()
|
||||
|
||||
# TODO: LEARNER-71: Delete entire TestAccordionDueDate class
|
||||
@override_waffle_flag(COURSE_OUTLINE_PAGE_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_COURSE_OUTLINE_PAGE_FLAG, active=True)
|
||||
def test_format_none(self):
|
||||
super(TestAccordionDueDate, self).test_format_none()
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace
|
||||
from openedx.core.djangolib.markup import HTML, Text
|
||||
from openedx.features.course_experience import (
|
||||
COURSE_ENABLE_UNENROLLED_ACCESS_FLAG,
|
||||
COURSE_OUTLINE_PAGE_FLAG,
|
||||
DISABLE_COURSE_OUTLINE_PAGE_FLAG,
|
||||
default_course_url_name,
|
||||
RELATIVE_DATES_FLAG,
|
||||
)
|
||||
@@ -454,7 +454,7 @@ class CoursewareIndex(View):
|
||||
'disable_optimizely': not WaffleSwitchNamespace('RET').is_enabled('enable_optimizely_in_courseware'),
|
||||
'section_title': None,
|
||||
'sequence_title': None,
|
||||
'disable_accordion': COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id),
|
||||
'disable_accordion': not DISABLE_COURSE_OUTLINE_PAGE_FLAG.is_enabled(self.course.id),
|
||||
'show_search': show_search,
|
||||
}
|
||||
courseware_context.update(
|
||||
|
||||
@@ -111,7 +111,7 @@ from openedx.core.djangolib.markup import HTML, Text
|
||||
from openedx.core.lib.mobile_utils import is_request_from_mobile_app
|
||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||
from openedx.features.course_duration_limits.access import generate_course_expired_fragment
|
||||
from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG, course_home_url_name
|
||||
from openedx.features.course_experience import DISABLE_UNIFIED_COURSE_TAB_FLAG, course_home_url_name
|
||||
from openedx.features.course_experience.course_tools import CourseToolsPluginManager
|
||||
from openedx.features.course_experience.utils import dates_banner_should_display
|
||||
from openedx.features.course_experience.views.course_dates import CourseDatesFragmentView
|
||||
@@ -443,7 +443,7 @@ def course_info(request, course_id):
|
||||
course_key = CourseKey.from_string(course_id)
|
||||
|
||||
# If the unified course experience is enabled, redirect to the "Course" tab
|
||||
if UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
if not DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
return redirect(reverse(course_home_url_name(course_key), args=[course_id]))
|
||||
|
||||
with modulestore().bulk_operations(course_key):
|
||||
|
||||
@@ -369,7 +369,7 @@ FEATURES = {
|
||||
# .. toggle_default: True
|
||||
# .. toggle_description: When enabled, along with the ENABLE_MKTG_SITE feature toggle, users who attempt to access a
|
||||
# course "about" page will be redirected to the course home url. This url might be the course "info" page or the
|
||||
# unified course tab (when the UNIFIED_COURSE_TAB_FLAG waffle is enabled).
|
||||
# unified course tab (when the DISABLE_UNIFIED_COURSE_TAB_FLAG waffle is not enabled).
|
||||
# .. toggle_use_cases: open_edx
|
||||
# .. toggle_creation_date: 2019-01-15
|
||||
# .. toggle_tickets: https://github.com/edx/edx-platform/pull/19604
|
||||
|
||||
@@ -13,7 +13,7 @@ from django.utils.translation import ugettext as _
|
||||
from lms.djangoapps.edxnotes.helpers import is_feature_enabled as is_edxnotes_enabled
|
||||
from openedx.core.djangolib.js_utils import js_escaped_string
|
||||
from openedx.core.djangolib.markup import HTML
|
||||
from openedx.features.course_experience import course_home_page_title, COURSE_OUTLINE_PAGE_FLAG
|
||||
from openedx.features.course_experience import course_home_page_title, DISABLE_COURSE_OUTLINE_PAGE_FLAG
|
||||
%>
|
||||
<%
|
||||
include_special_exams = (
|
||||
@@ -177,7 +177,7 @@ ${HTML(fragment.foot_html())}
|
||||
<nav aria-label="${_('Course')}" class="sr-is-focusable" tabindex="-1">
|
||||
<div class="has-breadcrumbs">
|
||||
<div class="breadcrumbs">
|
||||
% if COURSE_OUTLINE_PAGE_FLAG.is_enabled(course.id):
|
||||
% if not DISABLE_COURSE_OUTLINE_PAGE_FLAG.is_enabled(course.id):
|
||||
<span class="nav-item nav-item-course">
|
||||
<a href="${course_url}">${course_home_page_title(course)}</a>
|
||||
</span>
|
||||
|
||||
@@ -13,71 +13,17 @@ from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlag, W
|
||||
# Namespace for course experience waffle flags.
|
||||
WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='course_experience')
|
||||
|
||||
COURSE_EXPERIENCE_WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='course_experience')
|
||||
|
||||
class DefaultTrueWaffleFlagNamespace(WaffleFlagNamespace):
|
||||
"""
|
||||
This is a temporary class to help deprecate/remove ``flag_undefined_default``.
|
||||
|
||||
TODO: TNL-7061: Perform the actual clean-up required to remove these flags
|
||||
and refactor/fix any tests that shouldn't be removed.
|
||||
|
||||
"""
|
||||
def is_flag_active(self, flag_name, check_before_waffle_callback=None):
|
||||
"""
|
||||
Overrides is_flag_active, and returns and caches whether the provided flag is active.
|
||||
|
||||
If the flag value is already cached in the request, it is returned.
|
||||
If the flag doesn't exist, always returns default of True.
|
||||
|
||||
Note: This is a similified version of the method it overrides, that
|
||||
hard codes the default to True, and skips the call back used for
|
||||
course overrides:
|
||||
https://github.com/edx/edx-platform/blob/df9be8c678f8266e2e5710513c74deca14c4527c/openedx/core/djangoapps/waffle_utils/__init__.py#L229-L305
|
||||
|
||||
"""
|
||||
# Import is placed here to avoid model import at project startup.
|
||||
from waffle.models import Flag
|
||||
|
||||
# validate arguments
|
||||
namespaced_flag_name = self._namespaced_name(flag_name)
|
||||
value = self._cached_flags.get(namespaced_flag_name)
|
||||
if value is None:
|
||||
|
||||
# determine if the flag is undefined in waffle
|
||||
try:
|
||||
Flag.objects.get(name=namespaced_flag_name)
|
||||
except Flag.DoesNotExist:
|
||||
# default to True if not defined
|
||||
value = True
|
||||
|
||||
if value is None:
|
||||
request = crum.get_current_request()
|
||||
if request:
|
||||
value = flag_is_active(request, namespaced_flag_name)
|
||||
else:
|
||||
set_custom_attribute('warn_flag_no_request', True)
|
||||
# Return the default value if not in a request context.
|
||||
# Same as the original implementation
|
||||
self._set_waffle_flag_attribute(namespaced_flag_name, value)
|
||||
return True
|
||||
|
||||
self._cached_flags[namespaced_flag_name] = value
|
||||
|
||||
self._set_waffle_flag_attribute(namespaced_flag_name, value)
|
||||
return value
|
||||
|
||||
|
||||
DEFAULT_TRUE_WAFFLE_FLAG_NAMESPACE = DefaultTrueWaffleFlagNamespace(name='course_experience')
|
||||
|
||||
# Waffle flag to enable the separate course outline page and full width content.
|
||||
# NOTE: The special namespace makes the default True and skips checking course overrides.
|
||||
# TODO: TNL-7061: Perform the actual clean-up required to remove this flag.
|
||||
COURSE_OUTLINE_PAGE_FLAG = CourseWaffleFlag(DEFAULT_TRUE_WAFFLE_FLAG_NAMESPACE, 'course_outline_page', __name__)
|
||||
# Waffle flag to disable the separate course outline page and full width content.
|
||||
DISABLE_COURSE_OUTLINE_PAGE_FLAG = CourseWaffleFlag(
|
||||
COURSE_EXPERIENCE_WAFFLE_FLAG_NAMESPACE, 'disable_course_outline_page', __name__
|
||||
)
|
||||
|
||||
# Waffle flag to enable a single unified "Course" tab.
|
||||
# NOTE: The special namespace makes the default True and skips checking course overrides.
|
||||
# TODO: TNL-7061: Perform the actual clean-up required to remove this flag.
|
||||
UNIFIED_COURSE_TAB_FLAG = CourseWaffleFlag(DEFAULT_TRUE_WAFFLE_FLAG_NAMESPACE, 'unified_course_tab', __name__)
|
||||
DISABLE_UNIFIED_COURSE_TAB_FLAG = CourseWaffleFlag(
|
||||
COURSE_EXPERIENCE_WAFFLE_FLAG_NAMESPACE, 'disable_unified_course_tab', __name__
|
||||
)
|
||||
|
||||
# Waffle flag to enable the sock on the footer of the home and courseware pages.
|
||||
DISPLAY_COURSE_SOCK_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'display_course_sock', __name__)
|
||||
@@ -155,10 +101,9 @@ def default_course_url_name(course_id):
|
||||
Arguments:
|
||||
course_id (CourseKey): The course id of the current course.
|
||||
"""
|
||||
if COURSE_OUTLINE_PAGE_FLAG.is_enabled(course_id):
|
||||
return 'openedx.course_experience.course_home'
|
||||
else:
|
||||
if DISABLE_COURSE_OUTLINE_PAGE_FLAG.is_enabled(course_id):
|
||||
return 'courseware'
|
||||
return 'openedx.course_experience.course_home'
|
||||
|
||||
|
||||
def course_home_url_name(course_key):
|
||||
@@ -170,10 +115,9 @@ def course_home_url_name(course_key):
|
||||
requested.
|
||||
|
||||
"""
|
||||
if UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
return 'openedx.course_experience.course_home'
|
||||
else:
|
||||
if DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
return 'info'
|
||||
return 'openedx.course_experience.course_home'
|
||||
|
||||
|
||||
class CourseHomeMessages(UserMessageCollection):
|
||||
|
||||
@@ -11,7 +11,7 @@ from django.utils.translation import ugettext as _
|
||||
from lms.djangoapps.courseware.courses import get_course_by_id
|
||||
from student.models import CourseEnrollment
|
||||
|
||||
from . import SHOW_REVIEWS_TOOL_FLAG, UNIFIED_COURSE_TAB_FLAG
|
||||
from . import DISABLE_UNIFIED_COURSE_TAB_FLAG, SHOW_REVIEWS_TOOL_FLAG
|
||||
from .course_tools import CourseTool
|
||||
from .views.course_reviews import CourseReviewsModuleFragmentView
|
||||
from .views.course_updates import CourseUpdatesFragmentView
|
||||
@@ -47,7 +47,7 @@ class CourseUpdatesTool(CourseTool):
|
||||
"""
|
||||
Returns True if the user should be shown course updates for this course.
|
||||
"""
|
||||
if not UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
if DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course_key):
|
||||
return False
|
||||
if not CourseEnrollment.is_enrolled(request.user, course_key):
|
||||
return False
|
||||
|
||||
@@ -14,7 +14,7 @@ from django.urls import reverse
|
||||
from lms.djangoapps.discussion.django_comment_client.permissions import has_permission
|
||||
from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_string
|
||||
from openedx.core.djangolib.markup import Text, HTML
|
||||
from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG, SHOW_REVIEWS_TOOL_FLAG
|
||||
from openedx.features.course_experience import DISABLE_UNIFIED_COURSE_TAB_FLAG, SHOW_REVIEWS_TOOL_FLAG
|
||||
from openedx.features.course_experience.course_tools import HttpMethod
|
||||
%>
|
||||
|
||||
@@ -73,7 +73,7 @@ from openedx.features.course_experience.course_tools import HttpMethod
|
||||
${HTML(course_home_message_fragment.body_html())}
|
||||
% endif
|
||||
|
||||
% if update_message_fragment and UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id):
|
||||
% if update_message_fragment and not DISABLE_UNIFIED_COURSE_TAB_FLAG.is_enabled(course.id):
|
||||
<div class="section section-update-message">
|
||||
${HTML(update_message_fragment.body_html())}
|
||||
</div>
|
||||
|
||||
@@ -51,10 +51,9 @@ from openedx.core.djangolib.markup import HTML
|
||||
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
|
||||
from openedx.features.course_experience import (
|
||||
COURSE_ENABLE_UNENROLLED_ACCESS_FLAG,
|
||||
RELATIVE_DATES_FLAG,
|
||||
DISABLE_UNIFIED_COURSE_TAB_FLAG,
|
||||
SHOW_REVIEWS_TOOL_FLAG,
|
||||
SHOW_UPGRADE_MSG_ON_COURSE_HOME,
|
||||
UNIFIED_COURSE_TAB_FLAG
|
||||
SHOW_UPGRADE_MSG_ON_COURSE_HOME
|
||||
)
|
||||
from student.models import CourseEnrollment, FBEEnrollmentExclusion
|
||||
from student.tests.factories import UserFactory
|
||||
@@ -186,7 +185,7 @@ class TestCourseHomePage(CourseHomePageTestCase):
|
||||
response = self.client.get(url)
|
||||
self.assertContains(response, TEST_WELCOME_MESSAGE, status_code=200)
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
def test_welcome_message_when_not_unified(self):
|
||||
# Create a welcome message
|
||||
create_course_update(self.course, self.user, TEST_WELCOME_MESSAGE)
|
||||
@@ -344,7 +343,7 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
|
||||
self.assertContains(private_response,
|
||||
'You must be enrolled in the course to see course content.')
|
||||
|
||||
@override_waffle_flag(UNIFIED_COURSE_TAB_FLAG, active=False)
|
||||
@override_waffle_flag(DISABLE_UNIFIED_COURSE_TAB_FLAG, active=True)
|
||||
@override_waffle_flag(SHOW_REVIEWS_TOOL_FLAG, active=True)
|
||||
@ddt.data(
|
||||
[CourseUserType.ANONYMOUS, 'To see course content'],
|
||||
|
||||
Reference in New Issue
Block a user