diff --git a/pinax/models/models.py b/pinax/models/models.py index f219649..92c73aa 100644 --- a/pinax/models/models.py +++ b/pinax/models/models.py @@ -20,12 +20,28 @@ def active(self): return self.date_removed is None active.boolean = True - def delete(self): + def delete(self, _collect_related=True): + """Soft-delete the object. + + Args: + _collect_related(bool): is deletion of this object requires to + collect and delete some related objects. + + `_collect_related` used with cascade deletion. Just root object + should collect related objects. If related objects will also start to + collect realted objects we may fail into endless recursion + """ # Fetch related models - to_delete = get_related_objects(self) + if _collect_related: + to_delete = get_related_objects(self) + else: + to_delete = [] for obj in to_delete: - obj.delete() + if isinstance(obj, LogicalDeleteModel): + obj.delete(_collect_related=False) + else: + obj.delete() # Soft delete the object self.date_removed = timezone.now()