From 554ffa616bc482047eba59717116f2f4aca13ec1 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Thu, 2 Apr 2026 12:06:06 -0700 Subject: [PATCH 1/4] ref(cells): Organization invites go the correct org scoped routes Updates get_invite_link to generate org-scoped invite URLs (/accept////) instead of the legacy no-org format (/accept///). This is a prerequisite for removing the legacy no-org invite route and ensuring this works even when multiple cells are configured. --- src/sentry/models/organizationmember.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sentry/models/organizationmember.py b/src/sentry/models/organizationmember.py index 7a97a26dd0567b..df124d84eb6bde 100644 --- a/src/sentry/models/organizationmember.py +++ b/src/sentry/models/organizationmember.py @@ -334,8 +334,9 @@ def get_invite_link(self, referrer: str | None = None): if not self.is_pending or not self.invite_approved: return None path = reverse( - "sentry-accept-invite", + "sentry-organization-accept-invite", kwargs={ + "organization_slug": self.organization.slug, "member_id": self.id, "token": self.token or self.legacy_token, }, From 8a57c3c35c54be30a06a9b5da6bfb98755d12128 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Tue, 7 Apr 2026 14:16:11 -0700 Subject: [PATCH 2/4] update url format in 2fa test --- tests/sentry/core/endpoints/test_organization_details.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sentry/core/endpoints/test_organization_details.py b/tests/sentry/core/endpoints/test_organization_details.py index 97c44bce787745..bdbc5b7a1262f4 100644 --- a/tests/sentry/core/endpoints/test_organization_details.py +++ b/tests/sentry/core/endpoints/test_organization_details.py @@ -2234,7 +2234,7 @@ def setUp(self) -> None: assert self.has_2fa.has_2fa() def assert_2fa_email_equal(self, outbox, expected): - invite_url_regex = re.compile(r"http://.*/accept/[0-9]+/[a-f0-9]+/") + invite_url_regex = re.compile(r"http://.*/accept/[^/]+/[0-9]+/[a-f0-9]+/") assert len(outbox) == len(expected) assert sorted(email.to[0] for email in outbox) == sorted(expected) for email in outbox: From 10117d9a01861212439b650c43fb7e8697ea8f26 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Tue, 7 Apr 2026 14:35:53 -0700 Subject: [PATCH 3/4] update a couple more places --- src/sentry/api/endpoints/accept_organization_invite.py | 9 ++++++++- src/sentry/web/frontend/debug/mail.py | 8 ++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/sentry/api/endpoints/accept_organization_invite.py b/src/sentry/api/endpoints/accept_organization_invite.py index 69c73cef14714e..7b984c4b378488 100644 --- a/src/sentry/api/endpoints/accept_organization_invite.py +++ b/src/sentry/api/endpoints/accept_organization_invite.py @@ -204,7 +204,14 @@ def get( # When SSO is required do *not* set a next_url to return to accept # invite. The invite will be accepted after SSO is completed. url = ( - reverse("sentry-accept-invite", args=[member_id, token]) + reverse( + "sentry-organization-accept-invite", + kwargs={ + "organization_slug": invite_context.organization.slug, + "member_id": member_id, + "token": token, + }, + ) if not auth_provider else "/" ) diff --git a/src/sentry/web/frontend/debug/mail.py b/src/sentry/web/frontend/debug/mail.py index 3999551f33f8ec..14358d3c46af67 100644 --- a/src/sentry/web/frontend/debug/mail.py +++ b/src/sentry/web/frontend/debug/mail.py @@ -672,8 +672,12 @@ def invitation(request): "organization": org, "url": absolute_uri( reverse( - "sentry-accept-invite", - kwargs={"member_id": om.id, "token": om.token}, + "sentry-organization-accept-invite", + kwargs={ + "organization_slug": org.slug, + "member_id": om.id, + "token": om.token, + }, ) ), }, From 4bc9e7178b9df452b0505c7408d16414a452c8e4 Mon Sep 17 00:00:00 2001 From: Lyn Nagara Date: Tue, 7 Apr 2026 15:11:24 -0700 Subject: [PATCH 4/4] fix email fixture --- fixtures/emails/invitation.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fixtures/emails/invitation.txt b/fixtures/emails/invitation.txt index 0715e647cd6668..6e57df12629070 100644 --- a/fixtures/emails/invitation.txt +++ b/fixtures/emails/invitation.txt @@ -4,7 +4,7 @@ Your teammates at Example are using Sentry to catch errors, crush latency issues Looks like they need your help. You've been invited to join them: -http://testserver/accept/1/None/ +http://testserver/accept/example/1/None/ Heads up: this invite link is just for you. Don't share it unless you want random strangers fixing your bugs.