Browse Source

ref(workflow): Changing adoption stage keywords (#27588)

* Changing adoption stage not_adopted to low_adoption

* Changing adoption stage not_adopted to low_adoption
Chris Fuller 3 years ago
parent
commit
67ca94f4e7

+ 4 - 4
src/sentry/models/release.py

@@ -214,13 +214,13 @@ class ReleaseQuerySet(models.QuerySet):
         value,
         project_ids: Sequence[int] = None,
     ) -> models.QuerySet:
-        from sentry.models import ReleaseProjectEnvironment
+        from sentry.models import ReleaseProjectEnvironment, ReleaseStages
         from sentry.search.events.filter import to_list
 
         filters = {
-            "adopted": Q(adopted__isnull=False, unadopted__isnull=True),
-            "replaced": Q(adopted__isnull=False, unadopted__isnull=False),
-            "not_adopted": Q(adopted__isnull=True, unadopted__isnull=True),
+            ReleaseStages.ADOPTED: Q(adopted__isnull=False, unadopted__isnull=True),
+            ReleaseStages.REPLACED: Q(adopted__isnull=False, unadopted__isnull=False),
+            ReleaseStages.LOW_ADOPTION: Q(adopted__isnull=True, unadopted__isnull=True),
         }
         value = to_list(value)
         operator_conversions = {"=": "IN", "!=": "NOT IN"}

+ 10 - 3
src/sentry/models/releaseprojectenvironment.py

@@ -1,4 +1,5 @@
 from datetime import timedelta
+from enum import Enum
 
 from django.db import models
 from django.utils import timezone
@@ -8,6 +9,12 @@ from sentry.utils import metrics
 from sentry.utils.cache import cache
 
 
+class ReleaseStages(str, Enum):
+    ADOPTED = "adopted"
+    LOW_ADOPTION = "low_adoption"
+    REPLACED = "replaced"
+
+
 class ReleaseProjectEnvironment(Model):
     __include_in_export__ = False
 
@@ -80,10 +87,10 @@ class ReleaseProjectEnvironment(Model):
     @property
     def adoption_stages(self):
         if self.adopted is not None and self.unadopted is None:
-            stage = "adopted"
+            stage = ReleaseStages.ADOPTED
         elif self.adopted is not None and self.unadopted is not None:
-            stage = "replaced"
+            stage = ReleaseStages.REPLACED
         else:
-            stage = "not_adopted"
+            stage = ReleaseStages.LOW_ADOPTION
 
         return {"stage": stage, "adopted": self.adopted, "unadopted": self.unadopted}

+ 1 - 1
static/app/views/releases/list/releaseHealth/content.tsx

@@ -30,7 +30,7 @@ import Header from './header';
 import ProjectLink from './projectLink';
 
 const ADOPTION_STAGE_LABELS = {
-  not_adopted: {
+  low_adoption: {
     name: t('Low Adoption'),
     type: 'warning',
   },

+ 13 - 10
tests/sentry/api/endpoints/test_organization_releases.py

@@ -25,6 +25,7 @@ from sentry.models import (
     ReleaseHeadCommit,
     ReleaseProject,
     ReleaseProjectEnvironment,
+    ReleaseStages,
     Repository,
 )
 from sentry.plugins.providers.dummy.repository import DummyRepositoryProvider
@@ -390,22 +391,23 @@ class OrganizationReleaseListTest(APITestCase):
         )
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:adopted"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}"
         )
         assert [r["version"] for r in response.data] == [adopted_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:not_adopted"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}"
         )
         assert [r["version"] for r in response.data] == [not_adopted_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:replaced"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.REPLACED}"
         )
         assert [r["version"] for r in response.data] == [replaced_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[adopted,replaced]"
+            self.organization.slug,
+            query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED},{ReleaseStages.REPLACED}]",
         )
         assert [r["version"] for r in response.data] == [
             adopted_release.version,
@@ -413,7 +415,7 @@ class OrganizationReleaseListTest(APITestCase):
         ]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[not_adopted]"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.LOW_ADOPTION}]"
         )
         assert [r["version"] for r in response.data] == [not_adopted_release.version]
 
@@ -760,22 +762,23 @@ class OrganizationReleasesStatsTest(APITestCase):
         )
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:adopted"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}"
         )
         assert [r["version"] for r in response.data] == [adopted_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:not_adopted"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}"
         )
         assert [r["version"] for r in response.data] == [not_adopted_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:replaced"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.REPLACED}"
         )
         assert [r["version"] for r in response.data] == [replaced_release.version]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[adopted,replaced]"
+            self.organization.slug,
+            query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED},{ReleaseStages.REPLACED}]",
         )
         assert [r["version"] for r in response.data] == [
             adopted_release.version,
@@ -783,7 +786,7 @@ class OrganizationReleasesStatsTest(APITestCase):
         ]
 
         response = self.get_valid_response(
-            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[not_adopted]"
+            self.organization.slug, query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.LOW_ADOPTION}]"
         )
         assert [r["version"] for r in response.data] == [not_adopted_release.version]
 

+ 9 - 8
tests/sentry/api/serializers/test_release.py

@@ -16,6 +16,7 @@ from sentry.models import (
     ReleaseCommit,
     ReleaseProject,
     ReleaseProjectEnvironment,
+    ReleaseStages,
     User,
     UserEmail,
 )
@@ -515,7 +516,7 @@ class ReleaseSerializerTest(TestCase, SnubaTestCase):
             assert "adoptionStages" not in result
 
             result = serialize(release, user, with_adoption_stages=True)
-            assert result["adoptionStages"][project.slug]["stage"] == "not_adopted"
+            assert result["adoptionStages"][project.slug]["stage"] == ReleaseStages.LOW_ADOPTION
             assert result["adoptionStages"][project.slug]["unadopted"] is None
             assert result["adoptionStages"][project.slug]["adopted"] is None
 
@@ -531,7 +532,7 @@ class ReleaseSerializerTest(TestCase, SnubaTestCase):
             )
 
             result = serialize(release, user, with_adoption_stages=True)
-            assert result["adoptionStages"][project.slug]["stage"] == "adopted"
+            assert result["adoptionStages"][project.slug]["stage"] == ReleaseStages.ADOPTED
             assert result["adoptionStages"][project.slug]["unadopted"] is None
             assert result["adoptionStages"][project.slug]["adopted"] is not None
 
@@ -543,8 +544,8 @@ class ReleaseSerializerTest(TestCase, SnubaTestCase):
                 new_issues_count=1,
             )
             result = serialize(release, user, with_adoption_stages=True)
-            assert result["adoptionStages"][project.slug]["stage"] == "adopted"
-            assert result["adoptionStages"][project2.slug]["stage"] == "not_adopted"
+            assert result["adoptionStages"][project.slug]["stage"] == ReleaseStages.ADOPTED
+            assert result["adoptionStages"][project2.slug]["stage"] == ReleaseStages.LOW_ADOPTION
 
             ReleaseProjectEnvironment.objects.create(
                 project_id=project2.id,
@@ -554,13 +555,13 @@ class ReleaseSerializerTest(TestCase, SnubaTestCase):
                 adopted=datetime.utcnow(),
             )
             result = serialize(release, user, with_adoption_stages=True)
-            assert result["adoptionStages"][project.slug]["stage"] == "adopted"
-            assert result["adoptionStages"][project2.slug]["stage"] == "adopted"
+            assert result["adoptionStages"][project.slug]["stage"] == ReleaseStages.ADOPTED
+            assert result["adoptionStages"][project2.slug]["stage"] == ReleaseStages.ADOPTED
 
             rpe.update(unadopted=datetime.utcnow())
             result = serialize(release, user, with_adoption_stages=True)
-            assert result["adoptionStages"][project.slug]["stage"] == "replaced"
-            assert result["adoptionStages"][project2.slug]["stage"] == "adopted"
+            assert result["adoptionStages"][project.slug]["stage"] == ReleaseStages.REPLACED
+            assert result["adoptionStages"][project2.slug]["stage"] == ReleaseStages.ADOPTED
 
 
 class ReleaseRefsSerializerTest(TestCase):

+ 16 - 8
tests/sentry/api/test_release_search.py

@@ -5,6 +5,7 @@ import pytest
 from sentry.api.event_search import SearchFilter, SearchKey, SearchValue
 from sentry.api.release_search import RELEASE_FREE_TEXT_KEY, parse_search_query
 from sentry.exceptions import InvalidSearchQuery
+from sentry.models import ReleaseStages
 from sentry.search.events.constants import RELEASE_ALIAS, RELEASE_STAGE_ALIAS, SEMVER_ALIAS
 
 
@@ -35,29 +36,36 @@ class ParseSearchQueryTest(TestCase):
         ]
 
     def test_release_stage(self):
-        assert parse_search_query(f"{RELEASE_STAGE_ALIAS}:adopted") == [
+
+        assert parse_search_query(f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}") == [
             SearchFilter(
-                key=SearchKey(name=RELEASE_STAGE_ALIAS), operator="=", value=SearchValue("adopted")
+                key=SearchKey(name=RELEASE_STAGE_ALIAS),
+                operator="=",
+                value=SearchValue(ReleaseStages.ADOPTED),
             )
         ]
-        assert parse_search_query(f"!{RELEASE_STAGE_ALIAS}:replaced") == [
+        assert parse_search_query(f"!{RELEASE_STAGE_ALIAS}:{ReleaseStages.REPLACED}") == [
             SearchFilter(
                 key=SearchKey(name=RELEASE_STAGE_ALIAS),
                 operator="!=",
-                value=SearchValue("replaced"),
+                value=SearchValue(ReleaseStages.REPLACED),
             )
         ]
-        assert parse_search_query(f"{RELEASE_STAGE_ALIAS}:[adopted, not_adopted]") == [
+        assert parse_search_query(
+            f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED}, {ReleaseStages.LOW_ADOPTION}]"
+        ) == [
             SearchFilter(
                 key=SearchKey(name=RELEASE_STAGE_ALIAS),
                 operator="IN",
-                value=SearchValue(["adopted", "not_adopted"]),
+                value=SearchValue([ReleaseStages.ADOPTED, ReleaseStages.LOW_ADOPTION]),
             ),
         ]
-        assert parse_search_query(f"!{RELEASE_STAGE_ALIAS}:[replaced, adopted]") == [
+        assert parse_search_query(
+            f"!{RELEASE_STAGE_ALIAS}:[{ReleaseStages.REPLACED}, {ReleaseStages.ADOPTED}]"
+        ) == [
             SearchFilter(
                 key=SearchKey(name=RELEASE_STAGE_ALIAS),
                 operator="NOT IN",
-                value=SearchValue(["replaced", "adopted"]),
+                value=SearchValue([ReleaseStages.REPLACED, ReleaseStages.ADOPTED]),
             ),
         ]

+ 3 - 3
tests/sentry/search/events/test_filter.py

@@ -8,7 +8,7 @@ from django.utils import timezone
 from sentry_relay.consts import SPAN_STATUS_CODE_TO_NAME
 
 from sentry.api.event_search import SearchFilter, SearchKey, SearchValue
-from sentry.models import ReleaseProjectEnvironment
+from sentry.models import ReleaseProjectEnvironment, ReleaseStages
 from sentry.models.release import SemverFilter
 from sentry.search.events.constants import (
     RELEASE_STAGE_ALIAS,
@@ -1355,7 +1355,7 @@ class GetSnubaQueryArgsTest(TestCase):
         assert _filter.filter_keys == {}
 
         _filter = get_filter(
-            f"{RELEASE_STAGE_ALIAS}:[replaced, not_adopted]",
+            f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.REPLACED}, {ReleaseStages.LOW_ADOPTION}]",
             {"organization_id": self.organization.id},
         )
         assert _filter.conditions == [
@@ -1364,7 +1364,7 @@ class GetSnubaQueryArgsTest(TestCase):
         assert _filter.filter_keys == {}
 
         _filter = get_filter(
-            f"!{RELEASE_STAGE_ALIAS}:[adopted, not_adopted]",
+            f"!{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED}, {ReleaseStages.LOW_ADOPTION}]",
             {"organization_id": self.organization.id},
         )
         assert _filter.conditions == [["release", "IN", [replaced_release.version]]]

+ 4 - 4
tests/sentry/snuba/test_discover.py

@@ -5,7 +5,7 @@ from django.utils import timezone
 
 from sentry.discover.arithmetic import ArithmeticValidationError
 from sentry.exceptions import InvalidSearchQuery
-from sentry.models import ProjectTransactionThreshold, ReleaseProjectEnvironment
+from sentry.models import ProjectTransactionThreshold, ReleaseProjectEnvironment, ReleaseStages
 from sentry.models.transaction_threshold import (
     ProjectTransactionThresholdOverride,
     TransactionMetric,
@@ -916,7 +916,7 @@ class QueryIntegrationTest(SnubaTestCase, TestCase):
 
         result = discover.query(
             selected_columns=["id"],
-            query=f"{RELEASE_STAGE_ALIAS}:adopted",
+            query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}",
             params={"project_id": [self.project.id], "organization_id": self.organization.id},
         )
         assert {r["id"] for r in result["data"]} == {
@@ -926,7 +926,7 @@ class QueryIntegrationTest(SnubaTestCase, TestCase):
 
         result = discover.query(
             selected_columns=["id"],
-            query=f"!{RELEASE_STAGE_ALIAS}:not_adopted",
+            query=f"!{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}",
             params={"project_id": [self.project.id], "organization_id": self.organization.id},
         )
         assert {r["id"] for r in result["data"]} == {
@@ -937,7 +937,7 @@ class QueryIntegrationTest(SnubaTestCase, TestCase):
         }
         result = discover.query(
             selected_columns=["id"],
-            query=f"{RELEASE_STAGE_ALIAS}:[adopted, replaced]",
+            query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED}, {ReleaseStages.REPLACED}]",
             params={"project_id": [self.project.id], "organization_id": self.organization.id},
         )
         assert {r["id"] for r in result["data"]} == {

+ 7 - 3
tests/snuba/api/endpoints/test_organization_events_v2.py

@@ -11,6 +11,7 @@ from sentry.models import (
     ProjectTeam,
     ProjectTransactionThreshold,
     ReleaseProjectEnvironment,
+    ReleaseStages,
 )
 from sentry.models.transaction_threshold import (
     ProjectTransactionThresholdOverride,
@@ -868,7 +869,7 @@ class OrganizationEventsV2EndpointTest(APITestCase, SnubaTestCase):
             project_id=self.project.id,
         ).event_id
 
-        query = {"field": ["id"], "query": f"{RELEASE_STAGE_ALIAS}:adopted"}
+        query = {"field": ["id"], "query": f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}"}
         response = self.do_request(query)
         assert response.status_code == 200, response.content
         assert {r["id"] for r in response.data["data"]} == {
@@ -876,7 +877,7 @@ class OrganizationEventsV2EndpointTest(APITestCase, SnubaTestCase):
             adopted_release_e_2,
         }
 
-        query = {"field": ["id"], "query": f"!{RELEASE_STAGE_ALIAS}:not_adopted"}
+        query = {"field": ["id"], "query": f"!{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}"}
         response = self.do_request(query)
         assert response.status_code == 200, response.content
         assert {r["id"] for r in response.data["data"]} == {
@@ -886,7 +887,10 @@ class OrganizationEventsV2EndpointTest(APITestCase, SnubaTestCase):
             replaced_release_e_2,
         }
 
-        query = {"field": ["id"], "query": f"{RELEASE_STAGE_ALIAS}:[adopted, replaced]"}
+        query = {
+            "field": ["id"],
+            "query": f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED}, {ReleaseStages.REPLACED}]",
+        }
         response = self.do_request(query)
         assert response.status_code == 200, response.content
         assert {r["id"] for r in response.data["data"]} == {

+ 9 - 4
tests/snuba/api/endpoints/test_organization_group_index.py

@@ -31,6 +31,7 @@ from sentry.models import (
     OrganizationIntegration,
     Release,
     ReleaseProjectEnvironment,
+    ReleaseStages,
     UserOption,
     add_group_to_inbox,
     remove_group_from_inbox,
@@ -1264,7 +1265,7 @@ class GroupListTest(APITestCase, SnubaTestCase):
 
         self.login_as(user=self.user)
         response = self.get_response(
-            sort_by="date", limit=10, query=f"{RELEASE_STAGE_ALIAS}:adopted"
+            sort_by="date", limit=10, query=f"{RELEASE_STAGE_ALIAS}:{ReleaseStages.ADOPTED}"
         )
         assert response.status_code == 200, response.content
         assert [int(r["id"]) for r in response.json()] == [
@@ -1273,7 +1274,7 @@ class GroupListTest(APITestCase, SnubaTestCase):
         ]
 
         response = self.get_response(
-            sort_by="date", limit=10, query=f"!{RELEASE_STAGE_ALIAS}:not_adopted"
+            sort_by="date", limit=10, query=f"!{RELEASE_STAGE_ALIAS}:{ReleaseStages.LOW_ADOPTION}"
         )
         assert response.status_code == 200, response.content
         assert [int(r["id"]) for r in response.json()] == [
@@ -1284,7 +1285,9 @@ class GroupListTest(APITestCase, SnubaTestCase):
         ]
 
         response = self.get_response(
-            sort_by="date", limit=10, query=f"{RELEASE_STAGE_ALIAS}:[adopted, replaced]"
+            sort_by="date",
+            limit=10,
+            query=f"{RELEASE_STAGE_ALIAS}:[{ReleaseStages.ADOPTED}, {ReleaseStages.REPLACED}]",
         )
         assert response.status_code == 200, response.content
         assert [int(r["id"]) for r in response.json()] == [
@@ -1295,7 +1298,9 @@ class GroupListTest(APITestCase, SnubaTestCase):
         ]
 
         response = self.get_response(
-            sort_by="date", limit=10, query=f"!{RELEASE_STAGE_ALIAS}:[not_adopted, replaced]"
+            sort_by="date",
+            limit=10,
+            query=f"!{RELEASE_STAGE_ALIAS}:[{ReleaseStages.LOW_ADOPTION}, {ReleaseStages.REPLACED}]",
         )
         assert response.status_code == 200, response.content
         assert [int(r["id"]) for r in response.json()] == [

Some files were not shown because too many files changed in this diff