From b67faf45d9f9d3cdd9b7deffdb43c39732adaf5b Mon Sep 17 00:00:00 2001 From: Tehom Date: Fri, 3 Feb 2017 12:58:00 -0500 Subject: [PATCH] Attempt at making bulk deletion clear out handlers, to remove the problem of orphaned Attributes. --- evennia/typeclasses/__init__.py | 2 ++ evennia/typeclasses/apps.py | 10 ++++++++++ evennia/typeclasses/attributes.py | 1 + evennia/typeclasses/models.py | 5 ----- evennia/typeclasses/signals.py | 28 ++++++++++++++++++++++++++++ evennia/typeclasses/tags.py | 1 + 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 evennia/typeclasses/apps.py create mode 100644 evennia/typeclasses/signals.py diff --git a/evennia/typeclasses/__init__.py b/evennia/typeclasses/__init__.py index b72aa9ba39..9bc7f645c7 100644 --- a/evennia/typeclasses/__init__.py +++ b/evennia/typeclasses/__init__.py @@ -8,3 +8,5 @@ inherit from the models in this package. Here is also were the Attribute and Tag models are defined along with their handlers. """ + +default_app_config = "evennia.typeclasses.apps.TypeclassesConfig" diff --git a/evennia/typeclasses/apps.py b/evennia/typeclasses/apps.py new file mode 100644 index 0000000000..1520928ae4 --- /dev/null +++ b/evennia/typeclasses/apps.py @@ -0,0 +1,10 @@ +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class TypeclassesConfig(AppConfig): + name = 'typeclasses' + + def ready(self): + from . import signals diff --git a/evennia/typeclasses/attributes.py b/evennia/typeclasses/attributes.py index 4a415aaf7f..8bc16ad44a 100644 --- a/evennia/typeclasses/attributes.py +++ b/evennia/typeclasses/attributes.py @@ -99,6 +99,7 @@ class Attribute(SharedMemoryModel): class Meta(object): "Define Django meta options" verbose_name = "Evennia Attribute" + app_label = 'typeclasses' # read-only wrappers key = property(lambda self: self.db_key) diff --git a/evennia/typeclasses/models.py b/evennia/typeclasses/models.py index a267408d69..9d4e95d9af 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -606,11 +606,6 @@ class TypedObject(SharedMemoryModel): """ global TICKER_HANDLER - self.permissions.clear() - self.attributes.clear() - self.aliases.clear() - if hasattr(self, "nicks"): - self.nicks.clear() # scrambling properties self.delete = self._deleted diff --git a/evennia/typeclasses/signals.py b/evennia/typeclasses/signals.py new file mode 100644 index 0000000000..6c2cd8220c --- /dev/null +++ b/evennia/typeclasses/signals.py @@ -0,0 +1,28 @@ +from .models import TypedObject +from django.db.models.signals import pre_delete + + +def get_subclasses(cls): + result = [] + classes_to_inspect = [cls] + while classes_to_inspect: + class_to_inspect = classes_to_inspect.pop() + for subclass in class_to_inspect.__subclasses__(): + if subclass not in result: + result.append(subclass) + classes_to_inspect.append(subclass) + return result + + +def remove_attributes_on_delete(sender, instance, **kwargs): + print "remove_attribtes_on_delete called in instance %s" % instance + instance.permissions.clear() + instance.attributes.clear() + instance.aliases.clear() + if hasattr(instance, "nicks"): + instance.nicks.clear() + + +for subclass in get_subclasses(TypedObject): + pre_delete.connect(remove_attributes_on_delete, subclass) + print "connected to subclass %s" % subclass \ No newline at end of file diff --git a/evennia/typeclasses/tags.py b/evennia/typeclasses/tags.py index e9bd24eed0..3a165a00d2 100644 --- a/evennia/typeclasses/tags.py +++ b/evennia/typeclasses/tags.py @@ -63,6 +63,7 @@ class Tag(models.Model): verbose_name = "Tag" unique_together = (('db_key', 'db_category', 'db_tagtype', 'db_model'),) index_together = (('db_key', 'db_category', 'db_tagtype', 'db_model'),) + app_label = 'typeclasses' def __unicode__(self): return u"" % (self.db_key, "(category:%s)" % self.db_category if self.db_category else "")