Coverage for backend/django/core/auxiliary/signals.py: 100%

11 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-07-22 05:22 +0000

1from functools import partial 

2 

3from django.db import transaction 

4from django.db.models.signals import post_delete 

5from django.dispatch import receiver 

6 

7from core.auxiliary.models.MLModel import MLModel 

8from core.auxiliary.services.ml_artifacts import ( 

9 delete_ml_artifact_if_unreferenced, 

10) 

11 

12 

13@receiver(post_delete, sender=MLModel) 

14def delete_ml_results_on_delete(sender, instance: MLModel, **kwargs) -> None: 

15 for bucket, key in ( 

16 (instance.csv_bucket, instance.csv_object_key), 

17 (instance.test_results_bucket, instance.test_results_key), 

18 ): 

19 if bucket and key: 

20 # Storage deletion is irreversible, so defer both the final 

21 # reference check and delete until the aggregate deletion commits. 

22 # A rolled-back restore/prune must leave its resurrected rows with 

23 # intact artifacts. 

24 transaction.on_commit( 

25 partial( 

26 delete_ml_artifact_if_unreferenced, 

27 bucket=bucket, 

28 key=key, 

29 ), 

30 robust=True, 

31 )