Skip to content

Commit 6d7b11c

Browse files
authored
chore(dashboards): Remove backend feature flag for favorites (#92998)
Remove the favorites feature flag from the backend code
1 parent 9308187 commit 6d7b11c

File tree

4 files changed

+100
-129
lines changed

4 files changed

+100
-129
lines changed

src/sentry/api/endpoints/organization_dashboard_details.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,6 @@ def put(self, request: Request, organization, dashboard) -> Response:
214214
Toggle favorite status for current user by adding or removing
215215
current user from dashboard favorites
216216
"""
217-
if not features.has("organizations:dashboards-favourite", organization, actor=request.user):
218-
return Response(status=404)
219-
220217
if not features.has(EDIT_FEATURE, organization, actor=request.user):
221218
return Response(status=404)
222219

src/sentry/api/endpoints/organization_dashboards.py

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,15 @@ def get(self, request: Request, organization) -> Response:
102102
if not features.has("organizations:dashboards-basic", organization, actor=request.user):
103103
return Response(status=404)
104104

105-
if features.has("organizations:dashboards-favourite", organization, actor=request.user):
106-
filter_by = request.query_params.get("filter")
107-
if filter_by == "onlyFavorites":
108-
dashboards = Dashboard.objects.filter(
109-
organization_id=organization.id, dashboardfavoriteuser__user_id=request.user.id
110-
)
111-
elif filter_by == "excludeFavorites":
112-
dashboards = Dashboard.objects.exclude(
113-
organization_id=organization.id, dashboardfavoriteuser__user_id=request.user.id
114-
)
115-
else:
116-
dashboards = Dashboard.objects.filter(organization_id=organization.id)
105+
filter_by = request.query_params.get("filter")
106+
if filter_by == "onlyFavorites":
107+
dashboards = Dashboard.objects.filter(
108+
organization_id=organization.id, dashboardfavoriteuser__user_id=request.user.id
109+
)
110+
elif filter_by == "excludeFavorites":
111+
dashboards = Dashboard.objects.exclude(
112+
organization_id=organization.id, dashboardfavoriteuser__user_id=request.user.id
113+
)
117114
else:
118115
dashboards = Dashboard.objects.filter(organization_id=organization.id)
119116

@@ -195,23 +192,20 @@ def get(self, request: Request, organization) -> Response:
195192
else:
196193
order_by = ["title"]
197194

198-
if features.has("organizations:dashboards-favourite", organization, actor=request.user):
199-
pin_by = request.query_params.get("pin")
200-
if pin_by == "favorites":
201-
favorited_by_subquery = DashboardFavoriteUser.objects.filter(
202-
dashboard=OuterRef("pk"), user_id=request.user.id
195+
pin_by = request.query_params.get("pin")
196+
if pin_by == "favorites":
197+
favorited_by_subquery = DashboardFavoriteUser.objects.filter(
198+
dashboard=OuterRef("pk"), user_id=request.user.id
199+
)
200+
201+
order_by_favorites = [
202+
Case(
203+
When(Exists(favorited_by_subquery), then=-1),
204+
default=1,
205+
output_field=IntegerField(),
203206
)
204-
205-
order_by_favorites = [
206-
Case(
207-
When(Exists(favorited_by_subquery), then=-1),
208-
default=1,
209-
output_field=IntegerField(),
210-
)
211-
]
212-
dashboards = dashboards.order_by(*order_by_favorites, *order_by)
213-
else:
214-
dashboards = dashboards.order_by(*order_by)
207+
]
208+
dashboards = dashboards.order_by(*order_by_favorites, *order_by)
215209
else:
216210
dashboards = dashboards.order_by(*order_by)
217211

@@ -236,9 +230,8 @@ def handle_results(results):
236230
return serialized
237231

238232
render_pre_built_dashboard = True
239-
if features.has("organizations:dashboards-favourite", organization, actor=request.user):
240-
if filter_by and filter_by == "onlyFavorites" or pin_by and pin_by == "favorites":
241-
render_pre_built_dashboard = False
233+
if filter_by and filter_by == "onlyFavorites" or pin_by and pin_by == "favorites":
234+
render_pre_built_dashboard = False
242235

243236
return self.paginate(
244237
request=request,

tests/sentry/api/endpoints/test_organization_dashboard_details.py

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,9 @@ def test_get_favorited_user_status(self):
413413
self.dashboard.favorited_by = [self.user_1.id, self.user_2.id]
414414

415415
self.login_as(user=self.user_1)
416-
with self.feature({"organizations:dashboards-favourite": True}):
417-
response = self.do_request("get", self.url(self.dashboard.id))
418-
assert response.status_code == 200
419-
assert response.data["isFavorited"] is True
416+
response = self.do_request("get", self.url(self.dashboard.id))
417+
assert response.status_code == 200
418+
assert response.data["isFavorited"] is True
420419

421420
def test_get_not_favorited_user_status(self):
422421
self.user_1 = self.create_user(email="[email protected]")
@@ -426,10 +425,9 @@ def test_get_not_favorited_user_status(self):
426425
user_3 = self.create_user()
427426
self.create_member(user=user_3, organization=self.organization)
428427
self.login_as(user=user_3)
429-
with self.feature({"organizations:dashboards-favourite": True}):
430-
response = self.do_request("get", self.url(self.dashboard.id))
431-
assert response.status_code == 200
432-
assert response.data["isFavorited"] is False
428+
response = self.do_request("get", self.url(self.dashboard.id))
429+
assert response.status_code == 200
430+
assert response.data["isFavorited"] is False
433431

434432
def test_get_favorite_status_no_dashboard_edit_access(self):
435433
self.user_1 = self.create_user(email="[email protected]")
@@ -455,10 +453,9 @@ def test_get_favorite_status_no_dashboard_edit_access(self):
455453
assert response.status_code == 403
456454

457455
# assert user can see if they favorited the dashboard
458-
with self.feature({"organizations:dashboards-favourite": True}):
459-
response = self.do_request("get", self.url(self.dashboard.id))
460-
assert response.status_code == 200
461-
assert response.data["isFavorited"] is True
456+
response = self.do_request("get", self.url(self.dashboard.id))
457+
assert response.status_code == 200
458+
assert response.data["isFavorited"] is True
462459

463460

464461
class OrganizationDashboardDetailsDeleteTest(OrganizationDashboardDetailsTestCase):
@@ -3255,22 +3252,16 @@ def url(self, dashboard_id):
32553252
def test_favorite_dashboard(self):
32563253
assert self.user.id not in self.dashboard.favorited_by
32573254
self.login_as(user=self.user)
3258-
with self.feature({"organizations:dashboards-favourite": True}):
3259-
response = self.do_request(
3260-
"put", self.url(self.dashboard.id), data={"isFavorited": "true"}
3261-
)
3262-
assert response.status_code == 204
3263-
assert self.user.id in self.dashboard.favorited_by
3255+
response = self.do_request("put", self.url(self.dashboard.id), data={"isFavorited": "true"})
3256+
assert response.status_code == 204
3257+
assert self.user.id in self.dashboard.favorited_by
32643258

32653259
def test_unfavorite_dashboard(self):
32663260
assert self.user_1.id in self.dashboard.favorited_by
32673261
self.login_as(user=self.user_1)
3268-
with self.feature({"organizations:dashboards-favourite": True}):
3269-
response = self.do_request(
3270-
"put", self.url(self.dashboard.id), data={"isFavorited": False}
3271-
)
3272-
assert response.status_code == 204
3273-
assert self.user_1.id not in self.dashboard.favorited_by
3262+
response = self.do_request("put", self.url(self.dashboard.id), data={"isFavorited": False})
3263+
assert response.status_code == 204
3264+
assert self.user_1.id not in self.dashboard.favorited_by
32743265

32753266
def test_favorite_dashboard_no_dashboard_edit_access(self):
32763267
DashboardPermissions.objects.create(is_editable_by_everyone=False, dashboard=self.dashboard)
@@ -3288,9 +3279,6 @@ def test_favorite_dashboard_no_dashboard_edit_access(self):
32883279

32893280
# assert if user can edit the favorite status of the dashboard
32903281
assert self.user_2.id in self.dashboard.favorited_by
3291-
with self.feature({"organizations:dashboards-favourite": True}):
3292-
response = self.do_request(
3293-
"put", self.url(self.dashboard.id), data={"isFavorited": False}
3294-
)
3295-
assert response.status_code == 204
3296-
assert self.user_2.id not in self.dashboard.favorited_by
3282+
response = self.do_request("put", self.url(self.dashboard.id), data={"isFavorited": False})
3283+
assert response.status_code == 204
3284+
assert self.user_2.id not in self.dashboard.favorited_by

tests/sentry/api/endpoints/test_organization_dashboards.py

Lines changed: 58 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,12 @@ def test_get_only_favorites_no_sort(self):
315315
dashboard_6.favorited_by = [user_2.id]
316316

317317
self.login_as(user_1)
318-
with self.feature("organizations:dashboards-favourite"):
319-
response = self.client.get(self.url, data={"filter": "onlyFavorites"})
320-
assert response.status_code == 200, response.content
318+
response = self.client.get(self.url, data={"filter": "onlyFavorites"})
319+
assert response.status_code == 200, response.content
321320

322-
values = [row["title"] for row in response.data]
323-
# sorted by title by default
324-
assert values == ["Dashboard 3", "Dashboard 4", "Dashboard 5"]
321+
values = [row["title"] for row in response.data]
322+
# sorted by title by default
323+
assert values == ["Dashboard 3", "Dashboard 4", "Dashboard 5"]
325324

326325
def test_get_only_favorites_with_sort(self):
327326
user_1 = self.create_user(username="user_1")
@@ -366,14 +365,13 @@ def test_get_only_favorites_with_sort(self):
366365
dashboard_7.favorited_by = [user_2.id]
367366

368367
self.login_as(user_1)
369-
with self.feature("organizations:dashboards-favourite"):
370-
response = self.client.get(
371-
self.url, data={"filter": "onlyFavorites", "sort": "dateCreated"}
372-
)
373-
assert response.status_code == 200, response.content
368+
response = self.client.get(
369+
self.url, data={"filter": "onlyFavorites", "sort": "dateCreated"}
370+
)
371+
assert response.status_code == 200, response.content
374372

375-
values = [row["title"] for row in response.data]
376-
assert values == ["Dashboard 4", "Dashboard 3", "Dashboard 5"]
373+
values = [row["title"] for row in response.data]
374+
assert values == ["Dashboard 4", "Dashboard 3", "Dashboard 5"]
377375

378376
def test_get_exclude_favorites_with_no_sort(self):
379377
user_1 = self.create_user(username="user_1")
@@ -418,13 +416,12 @@ def test_get_exclude_favorites_with_no_sort(self):
418416
dashboard_6.favorited_by = [user_2.id]
419417

420418
self.login_as(user_1)
421-
with self.feature("organizations:dashboards-favourite"):
422-
response = self.client.get(self.url, data={"filter": "excludeFavorites"})
423-
assert response.status_code == 200, response.content
419+
response = self.client.get(self.url, data={"filter": "excludeFavorites"})
420+
assert response.status_code == 200, response.content
424421

425-
values = [row["title"] for row in response.data]
426-
# sorted by title by default
427-
assert values == ["General", "Dashboard 1", "Dashboard 2", "Dashboard 6", "Dashboard 7"]
422+
values = [row["title"] for row in response.data]
423+
# sorted by title by default
424+
assert values == ["General", "Dashboard 1", "Dashboard 2", "Dashboard 6", "Dashboard 7"]
428425

429426
def test_get_exclude_favorites_with_sort(self):
430427
user_1 = self.create_user(username="user_1")
@@ -469,14 +466,13 @@ def test_get_exclude_favorites_with_sort(self):
469466
dashboard_6.favorited_by = [user_2.id]
470467

471468
self.login_as(user_1)
472-
with self.feature("organizations:dashboards-favourite"):
473-
response = self.client.get(
474-
self.url, data={"filter": "excludeFavorites", "sort": "dateCreated"}
475-
)
476-
assert response.status_code == 200, response.content
469+
response = self.client.get(
470+
self.url, data={"filter": "excludeFavorites", "sort": "dateCreated"}
471+
)
472+
assert response.status_code == 200, response.content
477473

478-
values = [row["title"] for row in response.data]
479-
assert values == ["General", "Dashboard 1", "Dashboard 2", "Dashboard 7", "Dashboard 6"]
474+
values = [row["title"] for row in response.data]
475+
assert values == ["General", "Dashboard 1", "Dashboard 2", "Dashboard 7", "Dashboard 6"]
480476

481477
def test_pin_favorites_with_my_dashboards_sort(self):
482478
user_1 = self.create_user(username="user_1")
@@ -513,21 +509,20 @@ def test_pin_favorites_with_my_dashboards_sort(self):
513509
dashboard_E.favorited_by = [self.user.id]
514510
dashboard_C.favorited_by = [user_1.id]
515511

516-
with self.feature("organizations:dashboards-favourite"):
517-
response = self.client.get(self.url, data={"sort": "mydashboards", "pin": "favorites"})
518-
assert response.status_code == 200, response.content
519-
values = [row["title"] for row in response.data]
520-
assert values == [
521-
# favorites
522-
"Dashboard D", # self.user's favorite
523-
"Dashboard E", # user_1's dashboard
524-
"Dashboard B", # user_1's dashboard
525-
# other dashboards
526-
"Dashboard A", # self.user's dashboard
527-
"Dashboard 2", # self.user's dashboard
528-
"Dashboard 1", # self.user's dashboard
529-
"Dashboard C", # user_1's dashbaord
530-
]
512+
response = self.client.get(self.url, data={"sort": "mydashboards", "pin": "favorites"})
513+
assert response.status_code == 200, response.content
514+
values = [row["title"] for row in response.data]
515+
assert values == [
516+
# favorites
517+
"Dashboard D", # self.user's favorite
518+
"Dashboard E", # user_1's dashboard
519+
"Dashboard B", # user_1's dashboard
520+
# other dashboards
521+
"Dashboard A", # self.user's dashboard
522+
"Dashboard 2", # self.user's dashboard
523+
"Dashboard 1", # self.user's dashboard
524+
"Dashboard C", # user_1's dashbaord
525+
]
531526

532527
def test_pin_favorites_with_my_date_created_sort(self):
533528
user_1 = self.create_user(username="user_1")
@@ -564,21 +559,20 @@ def test_pin_favorites_with_my_date_created_sort(self):
564559
dashboard_E.favorited_by = [self.user.id]
565560
dashboard_C.favorited_by = [user_1.id]
566561

567-
with self.feature("organizations:dashboards-favourite"):
568-
response = self.client.get(self.url, data={"sort": "dateCreated", "pin": "favorites"})
569-
assert response.status_code == 200, response.content
570-
values = [row["title"] for row in response.data]
571-
assert values == [
572-
# favorites
573-
"Dashboard B",
574-
"Dashboard D",
575-
"Dashboard E",
576-
# other dashboards
577-
"Dashboard 1",
578-
"Dashboard 2",
579-
"Dashboard A",
580-
"Dashboard C",
581-
]
562+
response = self.client.get(self.url, data={"sort": "dateCreated", "pin": "favorites"})
563+
assert response.status_code == 200, response.content
564+
values = [row["title"] for row in response.data]
565+
assert values == [
566+
# favorites
567+
"Dashboard B",
568+
"Dashboard D",
569+
"Dashboard E",
570+
# other dashboards
571+
"Dashboard 1",
572+
"Dashboard 2",
573+
"Dashboard A",
574+
"Dashboard C",
575+
]
582576

583577
def test_post(self):
584578
response = self.do_request("post", self.url, data={"title": "Dashboard from Post"})
@@ -1445,16 +1439,15 @@ def test_dasboard_list_permissions_is_valid(self):
14451439
def test_gets_dashboard_favorited_with_dashboard_list(self):
14461440
self.dashboard.favorited_by = [self.user.id]
14471441

1448-
with self.feature({"organizations:dashboards-favourite": True}):
1449-
response = self.do_request("get", self.url)
1450-
assert response.status_code == 200, response.content
1442+
response = self.do_request("get", self.url)
1443+
assert response.status_code == 200, response.content
14511444

1452-
for dashboard in response.data:
1453-
assert "isFavorited" in dashboard
1454-
self.assert_equal_dashboards(self.dashboard, response.data[1])
1455-
assert response.data[1]["isFavorited"] is True
1456-
assert response.data[0]["isFavorited"] is False # general template
1457-
assert response.data[2]["isFavorited"] is False # dashboard_2 w/ no favorites set
1445+
for dashboard in response.data:
1446+
assert "isFavorited" in dashboard
1447+
self.assert_equal_dashboards(self.dashboard, response.data[1])
1448+
assert response.data[1]["isFavorited"] is True
1449+
assert response.data[0]["isFavorited"] is False # general template
1450+
assert response.data[2]["isFavorited"] is False # dashboard_2 w/ no favorites set
14581451

14591452
def test_post_errors_widget_with_is_filter(self):
14601453
data: dict[str, Any] = {

0 commit comments

Comments
 (0)