Skip to content

Commit 9cc5466

Browse files
authored
Merge pull request #5695 from rtibblesbot/issue-5691-941b2f
Remove ai_feature feature flag and ungate search recommendations
2 parents 2506bf5 + 4c5e587 commit 9cc5466

8 files changed

Lines changed: 16 additions & 73 deletions

File tree

contentcuration/contentcuration/frontend/channelEdit/views/ImportFromChannels/SearchOrBrowseWindow.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,6 @@
400400
...mapGetters('contentNode', ['getContentNodeAncestors']),
401401
...mapGetters('currentChannel', ['currentChannel']),
402402
...mapGetters('importFromChannels', ['savedSearchesExist']),
403-
...mapGetters(['isAIFeatureEnabled']),
404403
...mapState('importFromChannels', ['selected']),
405404
isBrowsing() {
406405
return this.$route.name === RouteNames.IMPORT_FROM_CHANNELS_BROWSE;
@@ -432,10 +431,6 @@
432431
};
433432
},
434433
shouldShowRecommendations() {
435-
if (!this.isAIFeatureEnabled) {
436-
return false;
437-
}
438-
439434
if (this.embedTopicRequest === null) {
440435
return false;
441436
}

contentcuration/contentcuration/frontend/channelEdit/views/ImportFromChannels/__tests__/SearchOrBrowseWindow.spec.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ describe('SearchOrBrowseWindow', () => {
7777
getters = {
7878
'currentChannel/currentChannel': () => ({ language: 'en' }),
7979
'importFromChannels/savedSearchesExist': () => true,
80-
isAIFeatureEnabled: () => true,
8180
'contentNode/getContentNodeAncestors': () => () => [{ id: 'node-1', title: 'Test folder' }],
8281
};
8382

@@ -132,9 +131,7 @@ describe('SearchOrBrowseWindow', () => {
132131
actions: {
133132
showSnackbar: actions.showSnackbar,
134133
},
135-
getters: {
136-
isAIFeatureEnabled: getters.isAIFeatureEnabled,
137-
},
134+
getters: {},
138135
});
139136

140137
const routes = [

contentcuration/contentcuration/frontend/shared/vuex/session/index.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { Session, User } from 'shared/data/resources';
66
import { forceServerSync } from 'shared/data/serverSync';
77
import translator from 'shared/translator';
88
import { applyMods } from 'shared/data/applyRemoteChanges';
9-
import { FeatureFlagKeys } from 'shared/constants';
109

1110
function langCode(language) {
1211
// Turns a Django language name (en-gb) into an ISO language code (en-GB)
@@ -95,12 +94,6 @@ export default {
9594
return getters.isAdmin || Boolean(getters.featureFlags[flag]);
9695
};
9796
},
98-
isAIFeatureEnabled(state, getters) {
99-
if (getters.loggedIn) {
100-
return getters.hasFeatureEnabled(FeatureFlagKeys.ai_feature);
101-
}
102-
return false;
103-
},
10497
},
10598
actions: {
10699
saveSession(context, currentUser) {

contentcuration/contentcuration/frontend/shared/vuex/session/index.spec.js

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import vuexSessionModule from './index.js';
2-
import { FeatureFlagKeys } from 'shared/constants';
32

43
describe('session module feature flag related getters', () => {
54
let state;
@@ -12,7 +11,6 @@ describe('session module feature flag related getters', () => {
1211
},
1312
},
1413
};
15-
state.currentUser.feature_flags[FeatureFlagKeys.ai_feature] = true;
1614
});
1715

1816
describe('featureFlags', () => {
@@ -54,31 +52,4 @@ describe('session module feature flag related getters', () => {
5452
expect(getters.hasFeatureEnabled(state, getters)('false_flag')).toBe(false);
5553
});
5654
});
57-
58-
describe('isAIFeatureEnabled', () => {
59-
let getters;
60-
beforeEach(() => {
61-
getters = {
62-
loggedIn: true,
63-
hasFeatureEnabled: vuexSessionModule.getters.hasFeatureEnabled(state, {
64-
featureFlags: vuexSessionModule.getters.featureFlags(state),
65-
isAdmin: false,
66-
}),
67-
isAIFeatureEnabled: vuexSessionModule.getters.isAIFeatureEnabled,
68-
};
69-
});
70-
it('should return false if not logged in', () => {
71-
getters.loggedIn = false;
72-
expect(getters.isAIFeatureEnabled(state, getters)).toBe(false);
73-
});
74-
75-
it('should return true if logged in and ai feature flag is true', () => {
76-
expect(getters.isAIFeatureEnabled(state, getters)).toBe(true);
77-
});
78-
79-
it('should return false if logged in and ai feature flag is false', () => {
80-
state.currentUser.feature_flags[FeatureFlagKeys.ai_feature] = false;
81-
expect(getters.isAIFeatureEnabled(state, getters)).toBe(false);
82-
});
83-
});
8455
});

contentcuration/contentcuration/static/feature_flags.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99
"description": "This no-op feature flag is excluded from non-dev environments",
1010
"$env": "development"
1111
},
12-
"ai_feature":{
13-
"type": "boolean",
14-
"title":"Test AI feature",
15-
"description": "Allow user access to AI features"
16-
},
1712
"survey":{
1813
"type": "boolean",
1914
"title":"Test Survey feature",

contentcuration/contentcuration/tests/viewsets/test_recommendations.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,21 @@ def test_recommendation_generic_error(self, mock_load_recommendations):
150150
self.assertEqual(response.content.decode(), error_message)
151151
mock_load_recommendations.assert_called_once()
152152

153+
@patch(
154+
"contentcuration.utils.automation_manager.AutomationManager.load_recommendations"
155+
)
156+
def test_recommend_success_nonadmin_user(self, mock_load_recommendations):
157+
user = testdata.user()
158+
self.client.force_authenticate(user=user)
159+
mock_load_recommendations.return_value = self.recommendations_list
160+
161+
response = self.client.post(
162+
reverse("recommendations"), data=self.topics, format="json"
163+
)
164+
165+
self.assertEqual(response.status_code, 200, response.content)
166+
self.assertEqual(response.json(), self.recommendations_list)
167+
153168

154169
class RecommendationsEventViewSetTestCase(StudioAPITestCase):
155170
@property

contentcuration/contentcuration/viewsets/recommendation.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from rest_framework.views import APIView
1111

1212
from contentcuration.utils.automation_manager import AutomationManager
13-
from contentcuration.viewsets.user import IsAIFeatureEnabledForUser
1413

1514
logger = logging.getLogger(__name__)
1615

@@ -23,7 +22,6 @@ class RecommendationView(APIView):
2322

2423
permission_classes = [
2524
IsAuthenticated,
26-
IsAIFeatureEnabledForUser,
2725
]
2826
manager = AutomationManager()
2927

contentcuration/contentcuration/viewsets/user.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,6 @@ def has_permission(self, request, view):
5656
return False
5757

5858

59-
class IsAIFeatureEnabledForUser(BasePermission):
60-
"""
61-
Permission to check if the AI feature is enabled for a user.
62-
"""
63-
64-
def _can_user_access_feature(self, request):
65-
try:
66-
if request.user.is_admin:
67-
return True
68-
else:
69-
return request.user.check_feature_flag("ai_feature")
70-
except AttributeError:
71-
return False
72-
73-
def has_permission(self, request, view):
74-
return self._can_user_access_feature(request)
75-
76-
def has_object_permission(self, request, view, obj):
77-
return self._can_user_access_feature(request)
78-
79-
8059
class UserListPagination(ValuesViewsetPageNumberPagination):
8160
page_size = None
8261
page_size_query_param = "page_size"

0 commit comments

Comments
 (0)