diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c02b3436c..23c1bdf58 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,10 @@ Unreleased ---------- * nothing unreleased +[4.21.6] +--------- +* feat: add waffle flag for enterprise customer support tool + [4.21.5] --------- * feat: allow PAs to access all enterprise customers diff --git a/enterprise/__init__.py b/enterprise/__init__.py index 6eb5bd61f..9309dfdb9 100644 --- a/enterprise/__init__.py +++ b/enterprise/__init__.py @@ -2,4 +2,4 @@ Your project description goes here. """ -__version__ = "4.21.5" +__version__ = "4.21.6" diff --git a/enterprise/toggles.py b/enterprise/toggles.py index ecf8de54e..865eb3a0e 100644 --- a/enterprise/toggles.py +++ b/enterprise/toggles.py @@ -43,6 +43,18 @@ ENTERPRISE_LOG_PREFIX, ) +# .. toggle_name: enterprise.enterprise_customer_support_tool +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: Enables the enterprise customer support tool +# .. toggle_use_cases: open_edx +# .. toggle_creation_date: 2024-07-17 +ENTERPRISE_CUSTOMER_SUPPORT_TOOL = WaffleFlag( + f'{ENTERPRISE_NAMESPACE}.enterprise_customer_support_tool', + __name__, + ENTERPRISE_LOG_PREFIX, +) + def top_down_assignment_real_time_lcm(): """ @@ -65,6 +77,13 @@ def enterprise_groups_v1(): return ENTERPRISE_GROUPS_V1.is_enabled() +def enterprise_customer_support_tool(): + """ + Returns whether the enterprise customer support tool is enabled. + """ + return ENTERPRISE_CUSTOMER_SUPPORT_TOOL.is_enabled() + + def enterprise_features(): """ Returns a dict of enterprise Waffle-based feature flags. @@ -73,4 +92,5 @@ def enterprise_features(): 'top_down_assignment_real_time_lcm': top_down_assignment_real_time_lcm(), 'feature_prequery_search_suggestions': feature_prequery_search_suggestions(), 'enterprise_groups_v1': enterprise_groups_v1(), + 'enterprise_customer_support_tool': enterprise_customer_support_tool(), } diff --git a/tests/test_enterprise/api/test_filters.py b/tests/test_enterprise/api/test_filters.py index 6d6eb439e..1e8efcc32 100644 --- a/tests/test_enterprise/api/test_filters.py +++ b/tests/test_enterprise/api/test_filters.py @@ -302,7 +302,8 @@ def test_filter(self, is_staff, is_linked_to_enterprise, has_access): 'enterprise_features': { 'top_down_assignment_real_time_lcm': False, 'feature_prequery_search_suggestions': False, - 'enterprise_groups_v1': False + 'enterprise_groups_v1': False, + 'enterprise_customer_support_tool': 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 9a77e239c..2303780a0 100644 --- a/tests/test_enterprise/api/test_views.py +++ b/tests/test_enterprise/api/test_views.py @@ -69,6 +69,7 @@ ) from enterprise.roles_api import admin_role from enterprise.toggles import ( + ENTERPRISE_CUSTOMER_SUPPORT_TOOL, ENTERPRISE_GROUPS_V1, FEATURE_PREQUERY_SEARCH_SUGGESTIONS, TOP_DOWN_ASSIGNMENT_REAL_TIME_LCM, @@ -1844,61 +1845,62 @@ def test_enterprise_customer_basic_list(self): @ddt.data( # Request missing required permissions query param. - (True, False, [], {}, False, {'detail': 'User is not allowed to access the view.'}, False, False, False), + (True, False, [], {}, False, {'detail': 'User is not allowed to access the view.'}, 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), + {'detail': 'User is not allowed to access the view.'}, 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), + True, None, 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), + {'detail': 'User is not allowed to access the view.'}, 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, None, 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), + {'detail': 'User is not allowed to access the view.'}, 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), + True, None, 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), # 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), + None, 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), + None, 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), + None, 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), + None, 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), + None, 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), + None, 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 customer support tool enabled (True, False, ['enterprise_enrollment_api_access'], {'permissions': ['enterprise_enrollment_api_access'], 'slug': TEST_SLUG}, True, - None, True, True, True), + None, True, True, True, True), ) @ddt.unpack @mock.patch('enterprise.utils.get_logo_url') @@ -1913,6 +1915,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_customer_support_tool, mock_get_logo_url, ): """ @@ -1979,6 +1982,14 @@ 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_CUSTOMER_SUPPORT_TOOL, + active=enterprise_customer_support_tool + ): + response = client.get( f"{settings.TEST_SERVER}{ENTERPRISE_CUSTOMER_WITH_ACCESS_TO_ENDPOINT}?{urlencode(query_params, True)}" ) @@ -2050,6 +2061,7 @@ def test_enterprise_customer_with_access_to( 'top_down_assignment_real_time_lcm': is_top_down_assignment_real_time_lcm_enabled, 'feature_prequery_search_suggestions': feature_prequery_search_suggestions_enabled, 'enterprise_groups_v1': enterprise_groups_v1_enabled, + 'enterprise_customer_support_tool': enterprise_customer_support_tool, } } assert response in (expected_error, mock_empty_200_success_response)