Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Schema Changes
- Added ``IdentityProvider`` model.
- Added ``Identity`` model.
- Added ``UserIdentity`` model.
- Added ``ProjectTeam`` model

Version 8.20
------------
Expand Down
1 change: 1 addition & 0 deletions bin/load-mocks
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ def main(num_events=1, extra_events=False):
'flags': Project.flags.has_releases,
}
)
project.add_team(team)
if not project.first_event:
project.update(
first_event=project.date_added,
Expand Down
2 changes: 2 additions & 0 deletions src/sentry/api/endpoints/team_project_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ def post(self, request, team):
},
status=409,
)
else:
project.add_team(team)

# XXX: create sample event?

Expand Down
24 changes: 24 additions & 0 deletions src/sentry/models/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@
ProjectStatus = ObjectStatus


class ProjectTeam(Model):
__core__ = True

project = FlexibleForeignKey('sentry.Project')
team = FlexibleForeignKey('sentry.Team')

class Meta:
app_label = 'sentry'
db_table = 'sentry_projectteam'
unique_together = (('project', 'team'), )


class ProjectManager(BaseManager):
# TODO(dcramer): we might want to cache this per user
def get_for_user(self, team, user, scope=None, _skip_team_check=False):
Expand Down Expand Up @@ -79,6 +91,9 @@ class Project(Model):
forced_color = models.CharField(max_length=6, null=True, blank=True)
organization = FlexibleForeignKey('sentry.Organization')
team = FlexibleForeignKey('sentry.Team')
teams = models.ManyToManyField(
'sentry.Team', related_name='teams', through=ProjectTeam
)
public = models.BooleanField(default=False)
date_added = models.DateTimeField(default=timezone.now)
status = BoundedPositiveIntegerField(
Expand Down Expand Up @@ -351,3 +366,12 @@ def transfer_to(self, team):
organization=organization,
team=team,
)

def add_team(self, team):
try:
with transaction.atomic():
ProjectTeam.objects.create(project=self, team=team)
except IntegrityError:
return False
else:
return True
8 changes: 7 additions & 1 deletion src/sentry/models/team.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ def transfer_to(self, organization):
"""
from sentry.models import (
OrganizationAccessRequest, OrganizationMember, OrganizationMemberTeam, Project,
ReleaseProject
ProjectTeam, ReleaseProject
)

try:
Expand Down Expand Up @@ -211,6 +211,12 @@ def transfer_to(self, organization):
organization=organization,
)

ProjectTeam.objects.filter(
project_id__in=project_ids,
).update(
team=new_team,
)

# remove any pending access requests from the old organization
if self != new_team:
OrganizationAccessRequest.objects.filter(
Expand Down
1 change: 1 addition & 0 deletions src/sentry/receivers/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ def create_default_project(id, name, slug, verbosity=2, **kwargs):
organization=team.organization,
**kwargs
)
project.add_team(team)

# HACK: manually update the ID after insert due to Postgres
# sequence issues. Seriously, fuck everything about this.
Expand Down

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion src/sentry/testutils/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,9 @@ def create_project(self, **kwargs):
if not kwargs.get('organization'):
kwargs['organization'] = kwargs['team'].organization

return Project.objects.create(**kwargs)
project = Project.objects.create(**kwargs)
project.add_team(kwargs['team'])
return project

def create_project_key(self, project):
return project.key_set.get_or_create()[0]
Expand Down
4 changes: 3 additions & 1 deletion src/sentry/utils/apidocs.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,11 +286,13 @@ def create_team(self, name, org):

def create_project(self, name, team, org):
from sentry.models import Project
return Project.objects.get_or_create(
project = Project.objects.get_or_create(
team=team, name=name, defaults={
'organization': org,
}
)[0]
project.add_team(team)
return project

def create_release(self, project, user, version=None):
from sentry.models import Release, Activity
Expand Down
1 change: 1 addition & 0 deletions tests/sentry/api/endpoints/test_team_project_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def test_simple(self):
assert project.name == 'hello world'
assert project.slug == 'foobar'
assert project.team == team
assert project.teams.first() == team

resp = self.client.post(
url, data={
Expand Down
1 change: 1 addition & 0 deletions tests/sentry/buffer/base/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ def test_increments_when_null(self):
org = Organization.objects.create(slug='test-org')
team = Team.objects.create(organization=org, slug='test-team')
project = Project.objects.create(organization=org, slug='test-project', team=team)
project.add_team(team)
release = Release.objects.create(organization=org, version='abcdefg')
release_project = ReleaseProject.objects.create(project=project, release=release)
assert release_project.new_groups == 0
Expand Down
11 changes: 8 additions & 3 deletions tests/sentry/deletions/test_team.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import absolute_import

from sentry.models import ScheduledDeletion, Team
from sentry.models import Project, ProjectTeam, ScheduledDeletion, Team
from sentry.tasks.deletion import run_deletion
from sentry.testutils import TestCase

Expand All @@ -10,8 +10,10 @@ def test_simple(self):
team = self.create_team(
name='test',
)
self.create_project(team=team, name='test1')
self.create_project(team=team, name='test2')
project1 = self.create_project(team=team, name='test1')
project2 = self.create_project(team=team, name='test2')
assert project1.teams.first() == team
assert project2.teams.first() == team

deletion = ScheduledDeletion.schedule(team, days=0)
deletion.update(in_progress=True)
Expand All @@ -20,3 +22,6 @@ def test_simple(self):
run_deletion(deletion.id)

assert not Team.objects.filter(id=team.id).exists()
assert not Project.objects.filter(id=project1.id).exists()
assert not Project.objects.filter(id=project2.id).exists()
assert not ProjectTeam.objects.filter(team_id=team.id).exists()
4 changes: 3 additions & 1 deletion tests/sentry/models/test_team.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
from __future__ import absolute_import

from sentry.models import (
OrganizationMember, OrganizationMemberTeam, Project, Release, ReleaseProject, Team
OrganizationMember, OrganizationMemberTeam, Project, ProjectTeam,
Release, ReleaseProject, Team
)
from sentry.testutils import TestCase

Expand Down Expand Up @@ -129,6 +130,7 @@ def test_existing_team(self):

project = Project.objects.get(id=project.id)
assert project.team == team2
assert ProjectTeam.objects.filter(project=project, team=team2).exists()

assert not Team.objects.filter(id=team.id).exists()

Expand Down