Start waffle namespace deprecation

By explicitly importing the legacy namespace classes, we make it clear
that we are using soon-to-be-deprecated classes. We will then be able to
start removing the legacy classes, one module at a time.
This commit is contained in:
Régis Behmo
2020-11-05 09:10:37 +01:00
parent 4344da80a1
commit a16cd71046
45 changed files with 150 additions and 144 deletions

View File

@@ -4,7 +4,7 @@ waffle switches for the Certificates app.
"""
from edx_toggles.toggles import WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitchNamespace
# Namespace
WAFFLE_NAMESPACE = u'certificates'
@@ -17,4 +17,4 @@ def waffle():
"""
Returns the namespaced, cached, audited Waffle class for Certificates.
"""
return WaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'Certificates: ')
return LegacyWaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'Certificates: ')

View File

@@ -8,7 +8,7 @@ import ddt
import pytz
import waffle
from django.test import TestCase
from edx_toggles.toggles import WaffleSwitch
from edx_toggles.toggles import LegacyWaffleSwitch
from edx_toggles.toggles.testutils import override_waffle_switch
from common.djangoapps.course_modes.models import CourseMode
@@ -68,7 +68,7 @@ class MockGeneratedCertificate(object):
@contextmanager
def configure_waffle_namespace(feature_enabled):
namespace = certs_waffle.waffle()
auto_certificate_generation_switch = WaffleSwitch(namespace, certs_waffle.AUTO_CERTIFICATE_GENERATION)
auto_certificate_generation_switch = LegacyWaffleSwitch(namespace, certs_waffle.AUTO_CERTIFICATE_GENERATION)
with override_waffle_switch(auto_certificate_generation_switch, active=feature_enabled):
yield

View File

@@ -4,7 +4,7 @@ waffle switches for the Block Structure framework.
"""
from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitch, LegacyWaffleSwitchNamespace
from openedx.core.lib.cache_utils import request_cached
from .models import BlockStructureConfiguration
@@ -22,7 +22,7 @@ def waffle():
"""
Returns the namespaced and cached Waffle class for BlockStructures.
"""
return WaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'BlockStructure: ')
return LegacyWaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'BlockStructure: ')
def waffle_switch(name):
@@ -30,9 +30,9 @@ def waffle_switch(name):
Return the waffle switch associated to this namespace.
WARNING: do not replicate this pattern. Instead of declaring waffle switch names as strings, you should create
WaffleSwitch objects as top-level constants.
LegacyWaffleSwitch objects as top-level constants.
"""
return WaffleSwitch(waffle(), name, module_name=__name__)
return LegacyWaffleSwitch(waffle(), name, module_name=__name__)
@request_cached()

View File

@@ -4,12 +4,12 @@ waffle switches for the course_details view.
"""
from edx_toggles.toggles import WaffleFlagNamespace, WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleFlagNamespace, LegacyWaffleSwitchNamespace
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
COURSE_DETAIL_WAFFLE_NAMESPACE = 'course_detail'
COURSE_DETAIL_WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name=COURSE_DETAIL_WAFFLE_NAMESPACE)
WAFFLE_SWITCHES = WaffleSwitchNamespace(name=COURSE_DETAIL_WAFFLE_NAMESPACE)
COURSE_DETAIL_WAFFLE_FLAG_NAMESPACE = LegacyWaffleFlagNamespace(name=COURSE_DETAIL_WAFFLE_NAMESPACE)
WAFFLE_SWITCHES = LegacyWaffleSwitchNamespace(name=COURSE_DETAIL_WAFFLE_NAMESPACE)
# Course Override Flag
COURSE_DETAIL_UPDATE_CERTIFICATE_DATE = u'course_detail_update_certificate_date'

View File

@@ -10,12 +10,12 @@ this package should be kept small, thin, and stateless.
"""
default_app_config = 'openedx.core.djangoapps.programs.apps.ProgramsConfig'
from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitch, LegacyWaffleSwitchNamespace
PROGRAMS_WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name='programs')
PROGRAMS_WAFFLE_SWITCH_NAMESPACE = LegacyWaffleSwitchNamespace(name='programs')
# This is meant to be enabled until https://openedx.atlassian.net/browse/LEARNER-5573 needs to be resolved
ALWAYS_CALCULATE_PROGRAM_PRICE_AS_ANONYMOUS_USER = WaffleSwitch(
ALWAYS_CALCULATE_PROGRAM_PRICE_AS_ANONYMOUS_USER = LegacyWaffleSwitch(
PROGRAMS_WAFFLE_SWITCH_NAMESPACE,
'always_calculate_program_price_as_anonymous_user',
__name__

View File

@@ -3,11 +3,11 @@ Contains configuration for schedules app
"""
from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace, WaffleSwitch, WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleFlag, LegacyWaffleFlagNamespace, LegacyWaffleSwitch, LegacyWaffleSwitchNamespace
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='schedules')
WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name='schedules')
WAFFLE_FLAG_NAMESPACE = LegacyWaffleFlagNamespace(name='schedules')
WAFFLE_SWITCH_NAMESPACE = LegacyWaffleSwitchNamespace(name='schedules')
CREATE_SCHEDULE_WAFFLE_FLAG = CourseWaffleFlag(
waffle_namespace=WAFFLE_FLAG_NAMESPACE,
@@ -21,9 +21,9 @@ COURSE_UPDATE_WAFFLE_FLAG = CourseWaffleFlag(
module_name=__name__,
)
DEBUG_MESSAGE_WAFFLE_FLAG = WaffleFlag(WAFFLE_FLAG_NAMESPACE, 'enable_debugging', __name__)
DEBUG_MESSAGE_WAFFLE_FLAG = LegacyWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'enable_debugging', __name__)
COURSE_UPDATE_SHOW_UNSUBSCRIBE_WAFFLE_SWITCH = WaffleSwitch(
COURSE_UPDATE_SHOW_UNSUBSCRIBE_WAFFLE_SWITCH = LegacyWaffleSwitch(
WAFFLE_SWITCH_NAMESPACE,
'course_update_show_unsubscribe',
__name__

View File

@@ -2,7 +2,7 @@
Toggles for accounts related code.
"""
from edx_toggles.toggles import WaffleFlag
from edx_toggles.toggles import LegacyWaffleFlag
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
# .. toggle_name: order_history.redirect_to_microfrontend
@@ -15,7 +15,7 @@ from openedx.core.djangoapps.site_configuration import helpers as configuration_
# .. toggle_warnings: Also set settings.ORDER_HISTORY_MICROFRONTEND_URL and site's
# ENABLE_ORDER_HISTORY_MICROFRONTEND.
# .. toggle_tickets: DEPR-17
REDIRECT_TO_ORDER_HISTORY_MICROFRONTEND = WaffleFlag('order_history', 'redirect_to_microfrontend', __name__)
REDIRECT_TO_ORDER_HISTORY_MICROFRONTEND = LegacyWaffleFlag('order_history', 'redirect_to_microfrontend', __name__)
def should_redirect_to_order_history_microfrontend():
@@ -34,7 +34,7 @@ def should_redirect_to_order_history_microfrontend():
# .. toggle_target_removal_date: 2020-12-31
# .. toggle_warnings: Also set settings.ACCOUNT_MICROFRONTEND_URL and site's ENABLE_ACCOUNT_MICROFRONTEND.
# .. toggle_tickets: DEPR-17
REDIRECT_TO_ACCOUNT_MICROFRONTEND = WaffleFlag('account', 'redirect_to_microfrontend', __name__)
REDIRECT_TO_ACCOUNT_MICROFRONTEND = LegacyWaffleFlag('account', 'redirect_to_microfrontend', __name__)
def should_redirect_to_account_microfrontend():

View File

@@ -5,7 +5,7 @@ Waffle flags and switches to change user API functionality.
from django.utils.translation import ugettext_lazy as _
from edx_toggles.toggles import WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitchNamespace
SYSTEM_MAINTENANCE_MSG = _(u'System maintenance in progress. Please try again later.')
WAFFLE_NAMESPACE = u'user_api'
@@ -18,4 +18,4 @@ def waffle():
"""
Returns the namespaced, cached, audited Waffle class for user_api.
"""
return WaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'UserAPI: ')
return LegacyWaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'UserAPI: ')

View File

@@ -3,10 +3,10 @@ Waffle flags and switches for user authn.
"""
from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitch, LegacyWaffleSwitchNamespace
_WAFFLE_NAMESPACE = u'user_authn'
_WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name=_WAFFLE_NAMESPACE, log_prefix=u'UserAuthN: ')
_WAFFLE_SWITCH_NAMESPACE = LegacyWaffleSwitchNamespace(name=_WAFFLE_NAMESPACE, log_prefix=u'UserAuthN: ')
# .. toggle_name: user_authn.enable_login_using_thirdparty_auth_only
# .. toggle_implementation: WaffleSwitch
@@ -18,7 +18,7 @@ _WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name=_WAFFLE_NAMESPACE, log_pre
# .. toggle_target_removal_date: 2020-01-31
# .. toggle_warnings: Requires THIRD_PARTY_AUTH_ONLY_DOMAIN to also be set.
# .. toggle_tickets: ENT-2461
ENABLE_LOGIN_USING_THIRDPARTY_AUTH_ONLY = WaffleSwitch(
ENABLE_LOGIN_USING_THIRDPARTY_AUTH_ONLY = LegacyWaffleSwitch(
_WAFFLE_SWITCH_NAMESPACE,
'enable_login_using_thirdparty_auth_only',
__name__

View File

@@ -21,7 +21,7 @@ from django.utils.translation import get_language
from django.utils.translation import ugettext as _
from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie
from django.views.decorators.debug import sensitive_post_parameters
from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace
from edx_toggles.toggles import LegacyWaffleFlag, LegacyWaffleFlagNamespace
from pytz import UTC
from ratelimit.decorators import ratelimit
from requests import HTTPError
@@ -104,8 +104,8 @@ REGISTER_USER = Signal(providing_args=["user", "registration"])
# .. toggle_target_removal_date: 2020-06-01
# .. toggle_warnings: This temporary feature toggle does not have a target removal date.
# .. toggle_tickets: None
REGISTRATION_FAILURE_LOGGING_FLAG = WaffleFlag(
waffle_namespace=WaffleFlagNamespace(name=u'registration'),
REGISTRATION_FAILURE_LOGGING_FLAG = LegacyWaffleFlag(
waffle_namespace=LegacyWaffleFlagNamespace(name=u'registration'),
flag_name=u'enable_failure_logging',
module_name=__name__,
)

View File

@@ -3,7 +3,7 @@ Waffle flags and switches
"""
from edx_toggles.toggles import WaffleSwitchNamespace
from edx_toggles.toggles import LegacyWaffleSwitchNamespace
WAFFLE_NAMESPACE = u'open_edx_util'
@@ -15,4 +15,4 @@ def waffle():
"""
Returns the namespaced, cached, audited Waffle class for open_edx_util.
"""
return WaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'OpenEdX Util: ')
return LegacyWaffleSwitchNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'OpenEdX Util: ')

View File

@@ -3,7 +3,7 @@ This module contains configuration settings via waffle flags
for the Video Pipeline app.
"""
from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace
from edx_toggles.toggles import LegacyWaffleFlag, LegacyWaffleFlagNamespace
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag
# Videos Namespace
@@ -40,14 +40,14 @@ def waffle_flags():
"""
Returns the namespaced, cached, audited Waffle flags dictionary for Videos.
"""
namespace = WaffleFlagNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'Videos: ')
namespace = LegacyWaffleFlagNamespace(name=WAFFLE_NAMESPACE, log_prefix=u'Videos: ')
return {
DEPRECATE_YOUTUBE: CourseWaffleFlag(
waffle_namespace=namespace,
flag_name=DEPRECATE_YOUTUBE,
module_name=__name__,
),
ENABLE_DEVSTACK_VIDEO_UPLOADS: WaffleFlag(
ENABLE_DEVSTACK_VIDEO_UPLOADS: LegacyWaffleFlag(
waffle_namespace=namespace,
flag_name=ENABLE_DEVSTACK_VIDEO_UPLOADS,
module_name=__name__,

View File

@@ -7,16 +7,18 @@ import warnings
from contextlib import contextmanager
from edx_django_utils.monitoring import set_custom_attribute
from edx_toggles.toggles import WaffleFlag as BaseWaffleFlag
from edx_toggles.toggles import WaffleFlagNamespace as BaseWaffleFlagNamespace
from edx_toggles.toggles import WaffleSwitch as BaseWaffleSwitch
from edx_toggles.toggles import WaffleSwitchNamespace as BaseWaffleSwitchNamespace
from edx_toggles.toggles import (
LegacyWaffleFlag,
LegacyWaffleFlagNamespace,
LegacyWaffleSwitch,
LegacyWaffleSwitchNamespace,
)
from opaque_keys.edx.keys import CourseKey
log = logging.getLogger(__name__)
class WaffleSwitchNamespace(BaseWaffleSwitchNamespace):
class WaffleSwitchNamespace(LegacyWaffleSwitchNamespace):
"""
Deprecated class: instead, use edx_toggles.toggles.WaffleSwitchNamespace.
"""
@@ -31,7 +33,9 @@ class WaffleSwitchNamespace(BaseWaffleSwitchNamespace):
DeprecationWarning,
stacklevel=2,
)
set_custom_attribute("deprecated_waffle_utils", "WaffleSwitchNamespace[{}]".format(name))
set_custom_attribute(
"deprecated_waffle_utils", "WaffleSwitchNamespace[{}]".format(name)
)
@contextmanager
def override(self, switch_name, active=True):
@@ -52,12 +56,12 @@ class WaffleSwitchNamespace(BaseWaffleSwitchNamespace):
from edx_toggles.toggles.testutils import override_waffle_switch
with override_waffle_switch(
BaseWaffleSwitch(self, switch_name, module_name=__name__), active
LegacyWaffleSwitch(self, switch_name, module_name=__name__), active
):
yield
class WaffleSwitch(BaseWaffleSwitch):
class WaffleSwitch(LegacyWaffleSwitch):
"""
Deprecated class: instead, use edx_toggles.toggles.WaffleSwitch.
"""
@@ -69,10 +73,12 @@ class WaffleSwitch(BaseWaffleSwitch):
DeprecationWarning,
stacklevel=2,
)
set_custom_attribute("deprecated_waffle_utils", "WaffleSwitch[{}]".format(self.name))
set_custom_attribute(
"deprecated_waffle_utils", "WaffleSwitch[{}]".format(self.name)
)
class WaffleFlagNamespace(BaseWaffleFlagNamespace):
class WaffleFlagNamespace(LegacyWaffleFlagNamespace):
"""
Deprecated class: instead, use edx_toggles.toggles.WaffleFlagNamespace.
"""
@@ -84,10 +90,12 @@ class WaffleFlagNamespace(BaseWaffleFlagNamespace):
DeprecationWarning,
stacklevel=2,
)
set_custom_attribute("deprecated_waffle_utils", "WaffleFlagNamespace[{}]".format(name))
set_custom_attribute(
"deprecated_waffle_utils", "WaffleFlagNamespace[{}]".format(name)
)
class WaffleFlag(BaseWaffleFlag):
class WaffleFlag(LegacyWaffleFlag):
"""
Deprecated class: instead, use edx_toggles.toggles.WaffleFlag.
"""
@@ -99,7 +107,9 @@ class WaffleFlag(BaseWaffleFlag):
DeprecationWarning,
stacklevel=2,
)
set_custom_attribute("deprecated_waffle_utils", "WaffleFlag[{}]".format(self.name))
set_custom_attribute(
"deprecated_waffle_utils", "WaffleFlag[{}]".format(self.name)
)
@contextmanager
def override(self, active=True):
@@ -155,15 +165,13 @@ class CourseWaffleFlag(BaseWaffleFlag):
from .models import WaffleFlagCourseOverrideModel
cache_key = "{}.{}".format(self.namespaced_flag_name, str(course_key))
# pylint: disable=protected-access
course_override = self.waffle_namespace._cached_flags.get(cache_key)
course_override = self._cached_flags.get(cache_key)
if course_override is None:
course_override = WaffleFlagCourseOverrideModel.override_value(
self.namespaced_flag_name, course_key
)
# pylint: disable=protected-access
self.waffle_namespace._cached_flags[cache_key] = course_override
self._cached_flags[cache_key] = course_override
if course_override == WaffleFlagCourseOverrideModel.ALL_CHOICES.on:
return True
@@ -189,8 +197,6 @@ class CourseWaffleFlag(BaseWaffleFlag):
is_enabled_for_course = self._get_course_override_value(course_key)
if is_enabled_for_course is not None:
# pylint: disable=protected-access
self.waffle_namespace._monitor_value(
self.flag_name, is_enabled_for_course
)
self.waffle_namespace._monitor_value(self.flag_name, is_enabled_for_course)
return is_enabled_for_course
return super().is_enabled()

View File

@@ -12,14 +12,14 @@ from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
from six.moves.urllib.parse import urlparse
from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace
from edx_toggles.toggles import LegacyWaffleFlag, LegacyWaffleFlagNamespace
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
# accommodates course api urls, excluding any course api routes that do not fall under v*/courses, such as v1/blocks.
COURSE_REGEX = re.compile(r'^(.*?/courses/)(?!v[0-9]+/[^/]+){}'.format(settings.COURSE_ID_PATTERN))
WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='request_utils')
CAPTURE_COOKIE_SIZES = WaffleFlag(WAFFLE_FLAG_NAMESPACE, 'capture_cookie_sizes', __name__)
WAFFLE_FLAG_NAMESPACE = LegacyWaffleFlagNamespace(name='request_utils')
CAPTURE_COOKIE_SIZES = LegacyWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'capture_cookie_sizes', __name__)
log = logging.getLogger(__name__)