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
« prev ^ index » next coverage.py v7.10.7, created at 2026-07-22 05:22 +0000
1from functools import partial
3from django.db import transaction
4from django.db.models.signals import post_delete
5from django.dispatch import receiver
7from core.auxiliary.models.MLModel import MLModel
8from core.auxiliary.services.ml_artifacts import (
9 delete_ml_artifact_if_unreferenced,
10)
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 )