Skip to content

Commit 589bc31

Browse files
feat(dashboards): Add edit and delete guard for prebuilt dashboards to backend dashboard details endpoint (#104098)
Prevents users from deleting or editing prebuilt insights dashboards
1 parent 4a8bf41 commit 589bc31

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/sentry/dashboards/endpoints/organization_dashboard_details.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ def delete(
127127
num_dashboards = Dashboard.objects.filter(organization=organization).count()
128128
num_tombstones = DashboardTombstone.objects.filter(organization=organization).count()
129129

130+
if isinstance(dashboard, Dashboard) and dashboard.prebuilt_id is not None:
131+
return self.respond({"Cannot delete prebuilt Dashboards."}, status=409)
132+
130133
if isinstance(dashboard, dict):
131134
if num_dashboards > 0:
132135
DashboardTombstone.objects.get_or_create(
@@ -170,6 +173,9 @@ def put(
170173

171174
self.check_object_permissions(request, dashboard)
172175

176+
if isinstance(dashboard, Dashboard) and dashboard.prebuilt_id is not None:
177+
return self.respond({"Cannot edit prebuilt Dashboards."}, status=409)
178+
173179
tombstone = None
174180
if isinstance(dashboard, dict):
175181
tombstone = dashboard["id"]

tests/sentry/dashboards/endpoints/test_organization_dashboard_details.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.urls import reverse
1010
from django.utils import timezone
1111

12+
from sentry.dashboards.endpoints.organization_dashboards import PrebuiltDashboardId
1213
from sentry.discover.models import DatasetSourcesTypes
1314
from sentry.explore.translation.dashboards_translation import translate_dashboard_widget
1415
from sentry.models.dashboard import (
@@ -3410,6 +3411,28 @@ def test_does_not_update_if_linked_dashboard_does_not_appear_in_fields(self) ->
34103411
assert response.status_code == 400, response.data
34113412
assert b"Linked dashboard does not appear in the fields of the query" in response.content
34123413

3414+
def test_cannot_delete_prebuilt_insights_dashboard(self) -> None:
3415+
dashboard = Dashboard.objects.create(
3416+
title="Frontend Session Health",
3417+
organization=self.organization,
3418+
prebuilt_id=PrebuiltDashboardId.FRONTEND_SESSION_HEALTH,
3419+
)
3420+
response = self.do_request("delete", self.url(dashboard.id))
3421+
assert response.status_code == 409
3422+
assert "Cannot delete prebuilt Dashboards." in response.content.decode()
3423+
3424+
def test_cannot_edit_prebuilt_insights_dashboard(self) -> None:
3425+
dashboard = Dashboard.objects.create(
3426+
title="Frontend Session Health",
3427+
organization=self.organization,
3428+
prebuilt_id=PrebuiltDashboardId.FRONTEND_SESSION_HEALTH,
3429+
)
3430+
response = self.do_request(
3431+
"put", self.url(dashboard.id), data={"title": "Frontend Session Health Edited"}
3432+
)
3433+
assert response.status_code == 409
3434+
assert "Cannot edit prebuilt Dashboards." in response.content.decode()
3435+
34133436

34143437
class OrganizationDashboardDetailsOnDemandTest(OrganizationDashboardDetailsTestCase):
34153438
widget_type = DashboardWidgetTypes.TRANSACTION_LIKE

0 commit comments

Comments
 (0)