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:
Robert Raposa
2020-10-27 09:05:33 -04:00
committed by GitHub
17 changed files with 70 additions and 127 deletions

View File

@@ -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
}
},
{

View File

@@ -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)):

View File

@@ -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.

View File

@@ -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 """

View File

@@ -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

View File

@@ -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):
"""

View File

@@ -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"

View File

@@ -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):

View File

@@ -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()

View File

@@ -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(

View File

@@ -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):

View File

@@ -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

View File

@@ -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>

View File

@@ -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):

View File

@@ -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

View File

@@ -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>

View File

@@ -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'],