def handle_noargs(self, **options): from django.db.models import get_apps, get_models print " CHECKING CASCADE DELETE" for app in get_apps(): loaded_models = get_models(app) print "%30s" % app.__name__.upper().replace('.MODELS','') for x in loaded_models: model_name = unicode(x._meta.verbose_name).title() print "%30s :" % model_name, seen_count = 0 seen_types = [] try: while 1: objs = x.objects.all().order_by('?')[:LOOP] seen_objs = CollectedObjects() for obj in objs: obj._collect_sub_objects(seen_objs, nullable=False) seen_types = [] for seen_cls, seen_objs in seen_objs.items(): if seen_cls not in seen_types: seen_types.append(seen_cls) if len(seen_types)==seen_count: break seen_count = len(seen_types) print [ x.__name__ for x in seen_types ] except Exception, e: print unicode(e) print "" print ""
def get_related_objects(obj): ''' Return all related objects to this object. These objects will be deleted when the object is deleted. Return form is [(ModelClass, {id, instance}),] ''' seen_objects = CollectedObjects() obj._collect_sub_objects(seen_objects) return seen_objects.items()
def delete_marked_for_deletion(self, collect=True): """If this instance, or some remote instances are marked for deletion kill them. """ if collect: from django.db.models.query_utils import CollectedObjects seen = CollectedObjects() self._collect_sub_objects(seen) for cls, items in seen.items(): if issubclass(cls, PublicPublisher): for item in items.values(): item.delete_marked_for_deletion(collect=False) if self.mark_delete: self.delete()
def _publisher_delete_marked(self, collect=True): """If this instance, or some remote instances are marked for deletion kill them. """ if self.publisher_is_draft: # escape soon from draft models return if collect: from django.db.models.query_utils import CollectedObjects seen = CollectedObjects() self._collect_sub_objects(seen) for cls, items in seen.items(): if issubclass(cls, Publisher): for item in items.values(): item._publisher_delete_marked(collect=False) if self.publisher_state == Publisher.PUBLISHER_STATE_DELETE: try: self.delete() except AttributeError: # this exception may happen because of the plugin relations # to CMSPlugin and mppt way of _meta assignment pass