diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bfd2a29e5..4bddf28a4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,10 @@ Unreleased ---------- * nothing unreleased +[4.25.16] +--------- +* feat: add a waffle flag for enterprise groups v2 feature + [4.25.15] --------- * fix: Don't import HttpClientError from edx-rest-api-client diff --git a/enterprise/__init__.py b/enterprise/__init__.py index 67a8ac2c4..6eb243c9f 100644 --- a/enterprise/__init__.py +++ b/enterprise/__init__.py @@ -2,4 +2,4 @@ Your project description goes here. """ -__version__ = "4.25.15" +__version__ = "4.25.16" diff --git a/enterprise/toggles.py b/enterprise/toggles.py index 865eb3a0e..003e5618b 100644 --- a/enterprise/toggles.py +++ b/enterprise/toggles.py @@ -55,6 +55,18 @@ ENTERPRISE_LOG_PREFIX, ) +# .. toggle_name: enterprise.enterprise_groups_v2 +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: Enables enterprise groups feature +# .. toggle_use_cases: open_edx +# .. toggle_creation_date: 2024-09-24 +ENTERPRISE_GROUPS_V2 = WaffleFlag( + f'{ENTERPRISE_NAMESPACE}.enterprise_groups_v2', + __name__, + ENTERPRISE_LOG_PREFIX, +) + def top_down_assignment_real_time_lcm(): """ @@ -77,6 +89,13 @@ def enterprise_groups_v1(): return ENTERPRISE_GROUPS_V1.is_enabled() +def enterprise_groups_v2(): + """ + Returns whether the enterprise groups v2 feature flag is enabled. + """ + return ENTERPRISE_GROUPS_V2.is_enabled() + + def enterprise_customer_support_tool(): """ Returns whether the enterprise customer support tool is enabled. @@ -93,4 +112,5 @@ def enterprise_features(): 'feature_prequery_search_suggestions': feature_prequery_search_suggestions(), 'enterprise_groups_v1': enterprise_groups_v1(), 'enterprise_customer_support_tool': enterprise_customer_support_tool(), + 'enterprise_groups_v2': enterprise_groups_v2(), } diff --git a/tests/test_enterprise/api/test_filters.py b/tests/test_enterprise/api/test_filters.py index 1e8efcc32..f4b68efe3 100644 --- a/tests/test_enterprise/api/test_filters.py +++ b/tests/test_enterprise/api/test_filters.py @@ -304,6 +304,7 @@ def test_filter(self, is_staff, is_linked_to_enterprise, has_access): 'feature_prequery_search_suggestions': False, 'enterprise_groups_v1': False, 'enterprise_customer_support_tool': False, + 'enterprise_groups_v2': False, } } assert response == mock_empty_200_success_response diff --git a/tests/test_enterprise/api/test_views.py b/tests/test_enterprise/api/test_views.py index aa45b85f7..d01490120 100644 --- a/tests/test_enterprise/api/test_views.py +++ b/tests/test_enterprise/api/test_views.py @@ -72,6 +72,7 @@ from enterprise.toggles import ( ENTERPRISE_CUSTOMER_SUPPORT_TOOL, ENTERPRISE_GROUPS_V1, + ENTERPRISE_GROUPS_V2, FEATURE_PREQUERY_SEARCH_SUGGESTIONS, TOP_DOWN_ASSIGNMENT_REAL_TIME_LCM, ) @@ -1949,62 +1950,64 @@ def test_enterprise_customer_support_tool( @ddt.data( # Request missing required permissions query param. - (True, False, [], {}, False, {'detail': 'User is not allowed to access the view.'}, False, False, False, False), + (True, False, [], {}, False, {'detail': 'User is not allowed to access the view.'}, + False, False, False, False, False), # Staff user that does not have the specified group permission. (True, False, [], {'permissions': ['enterprise_enrollment_api_access']}, False, - {'detail': 'User is not allowed to access the view.'}, False, False, False, False), + {'detail': 'User is not allowed to access the view.'}, False, False, False, False, False), # Staff user that does have the specified group permission. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access']}, - True, None, False, False, False, False), + True, None, False, False, False, False, False), # Non staff user that is not linked to the enterprise, nor do they have the group permission. (False, False, [], {'permissions': ['enterprise_enrollment_api_access']}, False, - {'detail': 'User is not allowed to access the view.'}, False, False, False, False), + {'detail': 'User is not allowed to access the view.'}, False, False, False, False, False), # Non staff user that is not linked to the enterprise, but does have the group permission. (False, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access']}, - False, None, False, False, False, False), + False, None, False, False, False, False, False), # Non staff user that is linked to the enterprise, but does not have the group permission. (False, True, [], {'permissions': ['enterprise_enrollment_api_access']}, False, - {'detail': 'User is not allowed to access the view.'}, False, False, False, False), + {'detail': 'User is not allowed to access the view.'}, False, False, False, False, False), # Non staff user that is linked to the enterprise and does have the group permission (False, True, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access']}, - True, None, False, False, False, False), + True, None, False, False, False, False, False), # Non staff user that is linked to the enterprise and has group permission and the request has passed # multiple groups to check. (False, True, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access', 'enterprise_data_api_access']}, True, None, False, - False, False, False), + False, False, False, False), # Staff user with group permission filtering on non existent enterprise id. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'enterprise_id': FAKE_UUIDS[1]}, False, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permission filtering on enterprise id successfully. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'enterprise_id': FAKE_UUIDS[0]}, True, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permission filtering on search param with no results. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'search': 'blah'}, False, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permission filtering on search param with results. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'search': 'test'}, True, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permission filtering on slug with results. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'slug': TEST_SLUG}, True, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permissions filtering on slug with no results. (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'slug': 'blah'}, False, - None, False, False, False, False), + None, False, False, False, False, False), # Staff user with group permission filtering on slug with results, with # top down assignment & real-time LCM feature enabled, # prequery search results enabled and # enterprise groups v1 feature enabled + # enterprise groups v2 feature enabled # enterprise customer support tool enabled (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'slug': TEST_SLUG}, True, - None, True, True, True, True), + None, True, True, True, True, True), ) @ddt.unpack @mock.patch('enterprise.utils.get_logo_url') @@ -2019,6 +2022,7 @@ def test_enterprise_customer_with_access_to( is_top_down_assignment_real_time_lcm_enabled, feature_prequery_search_suggestions_enabled, enterprise_groups_v1_enabled, + enterprise_groups_v2_enabled, enterprise_customer_support_tool, mock_get_logo_url, ): @@ -2086,6 +2090,13 @@ def test_enterprise_customer_with_access_to( active=enterprise_groups_v1_enabled ): + response = client.get( + f"{settings.TEST_SERVER}{ENTERPRISE_CUSTOMER_WITH_ACCESS_TO_ENDPOINT}?{urlencode(query_params, True)}" + ) + with override_waffle_flag( + ENTERPRISE_GROUPS_V2, + active=enterprise_groups_v2_enabled + ): response = client.get( f"{settings.TEST_SERVER}{ENTERPRISE_CUSTOMER_WITH_ACCESS_TO_ENDPOINT}?{urlencode(query_params, True)}" ) @@ -2166,6 +2177,7 @@ def test_enterprise_customer_with_access_to( 'feature_prequery_search_suggestions': feature_prequery_search_suggestions_enabled, 'enterprise_groups_v1': enterprise_groups_v1_enabled, 'enterprise_customer_support_tool': enterprise_customer_support_tool, + 'enterprise_groups_v2': enterprise_groups_v2_enabled, } } assert response in (expected_error, mock_empty_200_success_response)