From da008a69d930db4958d0ed1e0d3f061d5f5f0171 Mon Sep 17 00:00:00 2001 From: Tehom Date: Fri, 3 Feb 2017 15:13:35 -0500 Subject: [PATCH] Figured out that proxy models do not call signals attached to their classes they proxy for. I used the metaclass that already had a post_save signal attached to it, and it works fine now! I took out the unnecessary apps.py now that we're no longer attaching a signal to the base model classes and just doing it to the proxies. --- evennia/typeclasses/__init__.py | 1 - evennia/typeclasses/apps.py | 10 ---------- evennia/typeclasses/models.py | 19 ++++++++----------- evennia/typeclasses/signals.py | 30 +++++++++--------------------- 4 files changed, 17 insertions(+), 43 deletions(-) delete mode 100644 evennia/typeclasses/apps.py diff --git a/evennia/typeclasses/__init__.py b/evennia/typeclasses/__init__.py index 9bc7f645c7..597a7d00ff 100644 --- a/evennia/typeclasses/__init__.py +++ b/evennia/typeclasses/__init__.py @@ -9,4 +9,3 @@ 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 deleted file mode 100644 index 1520928ae4..0000000000 --- a/evennia/typeclasses/apps.py +++ /dev/null @@ -1,10 +0,0 @@ -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/models.py b/evennia/typeclasses/models.py index 9d4e95d9af..3cb4af35d5 100644 --- a/evennia/typeclasses/models.py +++ b/evennia/typeclasses/models.py @@ -46,6 +46,7 @@ from evennia.utils.utils import ( class_from_module) from evennia.utils.logger import log_trace from evennia.typeclasses.django_new_patch import patched_new +from .signals import remove_attributes_on_delete, post_save __all__ = ("TypedObject", ) @@ -68,14 +69,6 @@ _SA = object.__setattr__ # -# signal receivers. Assigned in __new__ -def post_save(sender, instance, created, **kwargs): - """ - Receives a signal just after the object is saved. - """ - if created: - instance.at_first_save() - class TypeclassBase(SharedMemoryModelBase): """ Metaclass which should be set for the root of model proxies @@ -107,9 +100,9 @@ class TypeclassBase(SharedMemoryModelBase): # https://code.djangoproject.com/ticket/11560 new_class = patched_new(cls, name, bases, attrs) - # attach signal + # attach signals signals.post_save.connect(post_save, sender=new_class) - + signals.pre_delete.connect(remove_attributes_on_delete, sender=new_class) return new_class @@ -606,7 +599,11 @@ 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 super(TypedObject, self).delete() diff --git a/evennia/typeclasses/signals.py b/evennia/typeclasses/signals.py index 6c2cd8220c..14526c7c27 100644 --- a/evennia/typeclasses/signals.py +++ b/evennia/typeclasses/signals.py @@ -1,28 +1,16 @@ -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 +# signal receivers. Assigned in __new__ +def post_save(sender, instance, created, **kwargs): + """ + Receives a signal just after the object is saved. + """ + if created: + instance.at_first_save() 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() + instance.db_attributes.all().delete() + -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