diff --git a/src/sentry/api/endpoints/team_projects.py b/src/sentry/api/endpoints/team_projects.py index 888941255d51fa..7b81b0336f18b8 100644 --- a/src/sentry/api/endpoints/team_projects.py +++ b/src/sentry/api/endpoints/team_projects.py @@ -6,12 +6,13 @@ from rest_framework.request import Request from rest_framework.response import Response -from sentry import audit_log +from sentry import audit_log, features from sentry.api.api_owners import ApiOwner from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import EnvironmentMixin, region_silo_endpoint from sentry.api.bases.team import TeamEndpoint, TeamPermission from sentry.api.fields.sentry_slug import SentrySerializerSlugField +from sentry.api.helpers.default_inbound_filters import set_default_inbound_filters from sentry.api.paginator import OffsetPaginator from sentry.api.serializers import ProjectSummarySerializer, serialize from sentry.api.serializers.models.project import OrganizationProjectResponse, ProjectSerializer @@ -182,6 +183,14 @@ def post(self, request: Request, team) -> Response: # XXX: create sample event? + # Turns on some inbound filters by default for new Javascript platform projects + if ( + features.has("organizations:default-inbound-filters", team.organization) + and project.platform + and project.platform.startswith("javascript") + ): + set_default_inbound_filters(project) + self.create_audit_entry( request=request, organization=team.organization, diff --git a/src/sentry/api/helpers/default_inbound_filters.py b/src/sentry/api/helpers/default_inbound_filters.py new file mode 100644 index 00000000000000..e7d99473e108a0 --- /dev/null +++ b/src/sentry/api/helpers/default_inbound_filters.py @@ -0,0 +1,32 @@ +from typing import Dict, List, Union + +from sentry.ingest import inbound_filters + + +# Turns on certain inbound filters by default for project. +def set_default_inbound_filters(project): + state: Dict[str, Union[bool, List[str]]] = {} + filters = [ + "browser-extensions", + "legacy-browsers", + "web-crawlers", + "filtered-transaction", + ] + + for filter_id in filters: + if filter_id == "legacy-browsers": + state["subfilters"] = [ + "ie_pre_9", + "ie9", + "ie10", + "ie11", + "safari_pre_6", + "opera_pre_15", + "opera_mini_pre_8", + "android_pre_4", + "edge_pre_79", + ] + else: + state["active"] = True + + inbound_filters.set_filter_state(filter_id, project, state) diff --git a/tests/sentry/api/endpoints/test_team_projects.py b/tests/sentry/api/endpoints/test_team_projects.py index a509a6d5c083af..fbce4233ee6e41 100644 --- a/tests/sentry/api/endpoints/test_team_projects.py +++ b/tests/sentry/api/endpoints/test_team_projects.py @@ -1,3 +1,4 @@ +from sentry.ingest import inbound_filters from sentry.models.project import Project from sentry.models.rule import Rule from sentry.notifications.types import FallthroughChoiceType @@ -143,3 +144,45 @@ def test_without_default_rules(self): ) project = Project.objects.get(id=response.data["id"]) assert not Rule.objects.filter(project=project).exists() + + @with_feature("organizations:default-inbound-filters") + def test_default_inbound_filters(self): + filters = ["browser-extensions", "legacy-browsers", "web-crawlers", "filtered-transaction"] + python_response = self.get_success_response( + self.organization.slug, + self.team.slug, + **self.data, + status_code=201, + ) + + python_project = Project.objects.get(id=python_response.data["id"]) + + python_filter_states = { + filter_id: inbound_filters.get_filter_state(filter_id, python_project) + for filter_id in filters + } + + assert not python_filter_states["browser-extensions"] + assert not python_filter_states["legacy-browsers"] + assert not python_filter_states["web-crawlers"] + assert python_filter_states["filtered-transaction"] + + project_data = {"name": "foo", "slug": "baz", "platform": "javascript-react"} + javascript_response = self.get_success_response( + self.organization.slug, + self.team.slug, + **project_data, + status_code=201, + ) + + javascript_project = Project.objects.get(id=javascript_response.data["id"]) + + javascript_filter_states = { + filter_id: inbound_filters.get_filter_state(filter_id, javascript_project) + for filter_id in filters + } + + assert javascript_filter_states["browser-extensions"] + assert javascript_filter_states["legacy-browsers"] + assert javascript_filter_states["web-crawlers"] + assert javascript_filter_states["filtered-transaction"]