Skip to content

ref(py): Import models directly in project deletions #69033

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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
93 changes: 61 additions & 32 deletions src/sentry/deletions/defaults/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,60 +5,89 @@

class ProjectDeletionTask(ModelDeletionTask):
def get_child_relations(self, instance):
from sentry import models
from sentry.discover.models import DiscoverSavedQueryProject
from sentry.incidents.models.alert_rule import AlertRule
from sentry.incidents.models.incident import IncidentProject
from sentry.models.activity import Activity
from sentry.models.appconnectbuilds import AppConnectBuild
from sentry.models.artifactbundle import ProjectArtifactBundle
from sentry.models.debugfile import ProguardArtifactRelease, ProjectDebugFile
from sentry.models.environment import EnvironmentProject
from sentry.models.eventattachment import EventAttachment
from sentry.models.group import Group
from sentry.models.groupassignee import GroupAssignee
from sentry.models.groupbookmark import GroupBookmark
from sentry.models.groupemailthread import GroupEmailThread
from sentry.models.grouphash import GroupHash
from sentry.models.grouprelease import GroupRelease
from sentry.models.grouprulestatus import GroupRuleStatus
from sentry.models.groupseen import GroupSeen
from sentry.models.groupshare import GroupShare
from sentry.models.groupsubscription import GroupSubscription
from sentry.models.integrations.repository_project_path_config import (
RepositoryProjectPathConfig,
)
from sentry.models.latestappconnectbuildscheck import LatestAppConnectBuildsCheck
from sentry.models.projectbookmark import ProjectBookmark
from sentry.models.projectcodeowners import ProjectCodeOwners
from sentry.models.projectkey import ProjectKey
from sentry.models.projectteam import ProjectTeam
from sentry.models.promptsactivity import PromptsActivity
from sentry.models.release_threshold import ReleaseThreshold
from sentry.models.releaseprojectenvironment import ReleaseProjectEnvironment
from sentry.models.releases.release_project import ReleaseProject
from sentry.models.servicehook import ServiceHook, ServiceHookProject
from sentry.models.transaction_threshold import ProjectTransactionThreshold
from sentry.models.userreport import UserReport
from sentry.monitors.models import Monitor
from sentry.replays.models import ReplayRecordingSegment
from sentry.snuba.models import QuerySubscription

relations = [
# ProjectKey gets revoked immediately, in bulk
ModelRelation(models.ProjectKey, {"project_id": instance.id})
ModelRelation(ProjectKey, {"project_id": instance.id})
]

# in bulk
for m in (
models.Activity,
models.AppConnectBuild,
models.EnvironmentProject,
models.GroupAssignee,
models.GroupBookmark,
models.GroupEmailThread,
models.GroupHash,
models.GroupRelease,
models.GroupRuleStatus,
models.GroupSeen,
models.GroupShare,
models.GroupSubscription,
models.LatestAppConnectBuildsCheck,
models.ProjectBookmark,
models.ProjectKey,
models.ReleaseThreshold,
Activity,
AppConnectBuild,
EnvironmentProject,
GroupAssignee,
GroupBookmark,
GroupEmailThread,
GroupHash,
GroupRelease,
GroupRuleStatus,
GroupSeen,
GroupShare,
GroupSubscription,
LatestAppConnectBuildsCheck,
ProjectBookmark,
ProjectKey,
ReleaseThreshold,
ProjectTeam,
models.PromptsActivity,
PromptsActivity,
# order matters, ProjectCodeOwners to be deleted before RepositoryProjectPathConfig
models.ProjectCodeOwners,
ProjectCodeOwners,
ReplayRecordingSegment,
models.RepositoryProjectPathConfig,
models.ServiceHookProject,
models.ServiceHook,
models.UserReport,
models.ProjectTransactionThreshold,
RepositoryProjectPathConfig,
ServiceHookProject,
ServiceHook,
UserReport,
ProjectTransactionThreshold,
# NOTE: Removing the project relation from `ProjectArtifactBundle` may
# leave behind orphaned `ArtifactBundle`s. Though thats not a big problem
# as those are being automatically cleaned up on their own.
models.ProjectArtifactBundle,
models.ProguardArtifactRelease,
ProjectArtifactBundle,
ProguardArtifactRelease,
DiscoverSavedQueryProject,
IncidentProject,
QuerySubscription,
):
relations.append(ModelRelation(m, {"project_id": instance.id}, BulkModelDeletionTask))
relations.append(ModelRelation(Monitor, {"project_id": instance.id}))
relations.append(ModelRelation(models.Group, {"project_id": instance.id}))
relations.append(ModelRelation(Group, {"project_id": instance.id}))
relations.append(
ModelRelation(
AlertRule,
Expand All @@ -69,10 +98,10 @@ def get_child_relations(self, instance):
# Release needs to handle deletes after Group is cleaned up as the foreign
# key is protected
for m in (
models.ReleaseProject,
models.ReleaseProjectEnvironment,
models.EventAttachment,
models.ProjectDebugFile,
ReleaseProject,
ReleaseProjectEnvironment,
EventAttachment,
ProjectDebugFile,
):
relations.append(ModelRelation(m, {"project_id": instance.id}, ModelDeletionTask))
return relations
Loading