@@ -128,6 +128,37 @@ def update_repositories(self, *, organization_id: int, updates: list[RpcReposito
128128
129129 Repository .objects .bulk_update (repositories , fields = list (fields_to_update ))
130130
131+ def _cleanup_seer_project_repositories (
132+ self ,
133+ organization_id : int ,
134+ repo_tuples : list [tuple [int , str , str ]],
135+ ) -> None :
136+ """Delete SeerProjectRepository rows and call Seer API cleanup.
137+
138+ repo_tuples: list of (repo_id, external_id, provider).
139+ """
140+ try :
141+ organization = Organization .objects .get_from_cache (id = organization_id )
142+ if features .has ("organizations:seer-project-settings-dual-write" , organization ):
143+ SeerProjectRepository .objects .filter (
144+ repository_id__in = [repo_id for repo_id , _ , _ in repo_tuples ]
145+ ).delete ()
146+ except Organization .DoesNotExist :
147+ pass
148+
149+ repos_to_clean = [
150+ {"repo_external_id" : external_id , "repo_provider" : repo_provider }
151+ for _ , external_id , repo_provider in repo_tuples
152+ if external_id and repo_provider
153+ ]
154+ if repos_to_clean :
155+ bulk_cleanup_seer_repository_preferences .apply_async (
156+ kwargs = {
157+ "organization_id" : organization_id ,
158+ "repos" : repos_to_clean ,
159+ }
160+ )
161+
131162 def disable_repositories_for_integration (
132163 self , * , organization_id : int , integration_id : int , provider : str
133164 ) -> None :
@@ -143,26 +174,7 @@ def disable_repositories_for_integration(
143174
144175 if repo_ids :
145176 Repository .objects .filter (id__in = repo_ids ).update (status = ObjectStatus .DISABLED )
146-
147- try :
148- organization = Organization .objects .get_from_cache (id = organization_id )
149- if features .has ("organizations:seer-project-settings-dual-write" , organization ):
150- SeerProjectRepository .objects .filter (repository_id__in = repo_ids ).delete ()
151- except Organization .DoesNotExist :
152- pass
153-
154- repos_to_clean = [
155- {"repo_external_id" : external_id , "repo_provider" : repo_provider }
156- for _ , external_id , repo_provider in repos
157- if external_id and repo_provider
158- ]
159- if repos_to_clean :
160- bulk_cleanup_seer_repository_preferences .apply_async (
161- kwargs = {
162- "organization_id" : organization_id ,
163- "repos" : repos_to_clean ,
164- }
165- )
177+ self ._cleanup_seer_project_repositories (organization_id , repos )
166178
167179 def disable_repositories_by_external_ids (
168180 self ,
@@ -186,26 +198,7 @@ def disable_repositories_by_external_ids(
186198
187199 if repo_ids :
188200 Repository .objects .filter (id__in = repo_ids ).update (status = ObjectStatus .DISABLED )
189-
190- try :
191- organization = Organization .objects .get_from_cache (id = organization_id )
192- if features .has ("organizations:seer-project-settings-dual-write" , organization ):
193- SeerProjectRepository .objects .filter (repository_id__in = repo_ids ).delete ()
194- except Organization .DoesNotExist :
195- pass
196-
197- repos_to_clean = [
198- {"repo_external_id" : external_id , "repo_provider" : repo_provider }
199- for _ , external_id , repo_provider in repos
200- if external_id and repo_provider
201- ]
202- if repos_to_clean :
203- bulk_cleanup_seer_repository_preferences .apply_async (
204- kwargs = {
205- "organization_id" : organization_id ,
206- "repos" : repos_to_clean ,
207- }
208- )
201+ self ._cleanup_seer_project_repositories (organization_id , repos )
209202
210203 def disassociate_organization_integration (
211204 self ,
@@ -223,19 +216,8 @@ def disassociate_organization_integration(
223216 repo_ids = [repo_id for repo_id , _ , _ in repos ]
224217
225218 if repo_ids :
226- # Disassociate repos from the organization integration being deleted
227219 Repository .objects .filter (id__in = repo_ids ).update (integration_id = None )
228-
229- # Delete Seer project preferences for the affected repos.
230- # Organization may already be deleted if org deletion and integration
231- # uninstall overlap; skip SeerProjectRepository cleanup in that case
232- # since cascades will handle it.
233- try :
234- organization = Organization .objects .get_from_cache (id = organization_id )
235- if features .has ("organizations:seer-project-settings-dual-write" , organization ):
236- SeerProjectRepository .objects .filter (repository_id__in = repo_ids ).delete ()
237- except Organization .DoesNotExist :
238- pass
220+ self ._cleanup_seer_project_repositories (organization_id , repos )
239221
240222 # Delete Code Owners with a Code Mapping using the OrganizationIntegration
241223 ProjectCodeOwners .objects .filter (
@@ -248,17 +230,3 @@ def disassociate_organization_integration(
248230 RepositoryProjectPathConfig .objects .filter (
249231 organization_integration_id = organization_integration_id
250232 ).delete ()
251-
252- # Delete Seer project preferences for the affected repos via Seer API
253- repos_to_clean = [
254- {"repo_external_id" : external_id , "repo_provider" : provider }
255- for _ , external_id , provider in repos
256- if external_id and provider
257- ]
258- if repos_to_clean :
259- bulk_cleanup_seer_repository_preferences .apply_async (
260- kwargs = {
261- "organization_id" : organization_id ,
262- "repos" : repos_to_clean ,
263- }
264- )
0 commit comments