Browse Source

fix(workflow): Skip ProjectTeams for external projects (#41037)

Scott Cooper 2 years ago
parent
commit
3f981d8828

+ 4 - 3
src/sentry/models/projectteam.py

@@ -31,9 +31,10 @@ class ProjectTeamManager(BaseManager):
         orgs = {i.organization_id: i.organization for i in teams}
 
         for project_team in project_teams:
-            project_team.project.set_cached_field_value(
-                "organization", orgs[project_team.project.organization_id]
-            )
+            if project_team.project.organization_id in orgs:
+                project_team.project.set_cached_field_value(
+                    "organization", orgs[project_team.project.organization_id]
+                )
 
         return project_teams
 

+ 17 - 1
tests/sentry/api/endpoints/test_organization_teams.py

@@ -1,7 +1,7 @@
 from django.urls import reverse
 from exam import fixture
 
-from sentry.models import OrganizationMember, OrganizationMemberTeam, Team
+from sentry.models import OrganizationMember, OrganizationMemberTeam, ProjectTeam, Team
 from sentry.testutils import APITestCase
 from sentry.testutils.silo import region_silo_test
 from sentry.types.integrations import get_provider_string
@@ -142,6 +142,22 @@ class OrganizationTeamsListTest(APITestCase):
         assert response.status_code == 200, response.content
         assert len(response.data) == 2
 
+    def test_hanging_project_team(self):
+        user = self.create_user()
+        org = self.create_organization(owner=self.user)
+        external_org = self.create_organization()
+        team1 = self.create_team(organization=org, name="foo")
+        external_team = self.create_team(organization=external_org, name="bar")
+        self.create_member(organization=org, user=user, has_global_access=False, teams=[team1])
+
+        ProjectTeam.objects.create(project=self.project, team=team1)
+        ProjectTeam.objects.create(project=self.project, team=external_team)
+
+        self.login_as(user=user)
+        path = f"/api/0/organizations/{org.slug}/teams/"
+        response = self.client.get(path)
+        assert response.status_code == 200, response.content
+
 
 @region_silo_test
 class OrganizationTeamsCreateTest(APITestCase):

+ 16 - 0
tests/sentry/manager/test_projectteam_manager.py

@@ -0,0 +1,16 @@
+from sentry.models import ProjectTeam, Team, User
+from sentry.testutils import TestCase
+from sentry.testutils.silo import region_silo_test
+
+
+@region_silo_test
+class TeamManagerTest(TestCase):
+    def test_simple(self):
+        user = User.objects.create(username="foo")
+        org = self.create_organization()
+        team = self.create_team(organization=org, name="Test")
+        self.create_member(organization=org, user=user, teams=[team])
+        ProjectTeam.objects.create(team=team, project=self.project)
+
+        teams = Team.objects.get_for_user(organization=org, user=user)
+        ProjectTeam.objects.get_for_teams_with_org_cache(teams)