You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[DEPR]: Add FEATURES = FeaturesProxy(...) to your django settings #37345
In Django settings, the FEATURES dictionary has traditionally been used as a mutable container for feature flags. This often leads to confusion between top-level settings and dictionary keys, and makes it difficult to manage operator configurations properly.
To improve clarity and long-term maintainability, we are moving toward treating all feature flags as top-level Django settings, and deprecating the use of FEATURES for this purpose.
Description
Breaking change:
Operators who maintain custom settings modules that write to FEATURES must add the following snippet at the top of their settings file(s) to ensure backwards compatibility:
changed the title [-][DEPR]: Deprecate direct writes to FEATURES in Open edX settings[/-][+][DEPR]: Deprecate writes to FEATURES in Open edX settings[/+]on Sep 10, 2025
changed the title [-][DEPR]: Deprecate writes to FEATURES in Open edX settings[/-][+][DEPR]: Transitioning FEATURES writes to FeaturesProxy[/+]on Sep 10, 2025
I'm not clear on the plan. Since we already duplicated the settings to the top-level (expand phase), can you confirm that we'd be ready to contract (i.e. remove the FEATURES dict) as soon as the proxy PR lands?
[inform] I think from @Akanshu-2u's latest test, the FEATURES dict continues to be the source of truth when both sets of settings exist. From our end, I think the settings need to match, so it really shouldn't matter. But just ensuring that that is what you want.
Sorry @robrap , we have been trying to generalize the guidance to work for all operators, but it's been challenging to write instructions that are coherent across the possibility matrix of (Master vs. NamedRelease) X (production.py+yaml vs custom module).
Let me try again. Here is what master-based operators should know:
Thanks for clarifying @kdmccormick. We're mostly ready for the change, and @Akanshu-2u will hopefully should have a fix in devstack for Monday. We can discuss Monday if it makes sense to merge more quickly, to benefit you and us. I'm not sure if MIT needs any additional time? Thanks again.
changed the title [-][DEPR]: Transitioning FEATURES writes to FeaturesProxy[/-][+][DEPR]: Add `FEATURES = FeaturesProxy(...)` to your django settings[/+]on Sep 16, 2025
Activity
[-][DEPR]: Deprecate direct writes to FEATURES in Open edX settings[/-][+][DEPR]: Deprecate writes to FEATURES in Open edX settings[/+][-][DEPR]: Deprecate writes to FEATURES in Open edX settings[/-][+][DEPR]: Transitioning FEATURES writes to FeaturesProxy[/+]robrap commentedon Sep 12, 2025
@wgu-ram-chandra @kdmccormick:
FEATURESdict) as soon as the proxy PR lands?FEATURESdict continues to be the source of truth when both sets of settings exist. From our end, I think the settings need to match, so it really shouldn't matter. But just ensuring that that is what you want.kdmccormick commentedon Sep 12, 2025
Sorry @robrap , we have been trying to generalize the guidance to work for all operators, but it's been challenging to write instructions that are coherent across the possibility matrix of (Master vs. NamedRelease) X (production.py+yaml vs custom module).
Let me try again. Here is what master-based operators should know:
Does that make sense?
robrap commentedon Sep 12, 2025
Thanks for clarifying @kdmccormick. We're mostly ready for the change, and @Akanshu-2u will hopefully should have a fix in devstack for Monday. We can discuss Monday if it makes sense to merge more quickly, to benefit you and us. I'm not sure if MIT needs any additional time? Thanks again.
kdmccormick commentedon Sep 12, 2025
Great. Let us know if you're ready early, and I'll check with MIT ODL separately.
feat: add FeaturesProxy integration for feature flag management in CM…
[-][DEPR]: Transitioning FEATURES writes to FeaturesProxy[/-][+][DEPR]: Add `FEATURES = FeaturesProxy(...)` to your django settings[/+]feanil commentedon Sep 18, 2025
The relevant PR has now merged.
kdmccormick commentedon Sep 29, 2025
The follow-up work will be tracked here: