Skip to content

Commit

Permalink
Merge b4563aa into 555ae55
Browse files Browse the repository at this point in the history
  • Loading branch information
tongtie committed Jun 2, 2022
2 parents 555ae55 + b4563aa commit c6ebdfb
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions safedelete/models.py
@@ -1,10 +1,13 @@
from collections import Counter
from collections import defaultdict
from itertools import chain
import warnings

import django
from collections import Counter
from django.contrib.admin.utils import NestedObjects
from django.db import models, router
from django.db.models import UniqueConstraint
from django.db.models.deletion import ProtectedError
from django.utils import timezone

from .config import (
Expand Down Expand Up @@ -206,6 +209,23 @@ def hard_delete_cascade_policy_action(self, **kwargs):
return self._delete(force_policy=HARD_DELETE, **kwargs)

def soft_delete_cascade_policy_action(self, **kwargs):
collector = NestedObjects(using=router.db_for_write(self))
collector.collect([self])
# Soft-delete-cascade raises an exception when trying to delete a object that related object is PROTECT
protected_objects = defaultdict(list)
for obj in collector.protected:
if getattr(obj, FIELD_NAME) is None:
protected_objects[obj.__class__.__name__].append(obj)
if protected_objects:
raise ProtectedError(
'Cannot delete some instances of model %r because they are '
'referenced through protected foreign keys: %s.' % (
self.__class__.__name__,
', '.join(protected_objects),
),
set(chain.from_iterable(protected_objects.values())),
)

# Soft-delete on related objects before
deleted_counter = Counter()
for related in related_objects(self):
Expand All @@ -217,8 +237,6 @@ def soft_delete_cascade_policy_action(self, **kwargs):
_, delete_response = self._delete(force_policy=SOFT_DELETE, **kwargs)
deleted_counter.update(delete_response)

collector = NestedObjects(using=router.db_for_write(self))
collector.collect([self])
# update fields (SET, SET_DEFAULT or SET_NULL)
for model, instances_for_fieldvalues in collector.field_updates.items():
for (field, value), instances in instances_for_fieldvalues.items():
Expand Down

0 comments on commit c6ebdfb

Please sign in to comment.