diff --git a/src/typeclasses/models.py b/src/typeclasses/models.py index 0f841dd0d7..6595a79562 100644 --- a/src/typeclasses/models.py +++ b/src/typeclasses/models.py @@ -29,6 +29,7 @@ these to create custom managers. import sys import re import traceback +import weakref from django.db import models from django.conf import settings @@ -453,6 +454,7 @@ class NAttributeHandler(object): def __init__(self, obj): "initialized on the object" self._store = {} + self.obj = weakref.proxy(obj) def has(self, key): "Check if object has this attribute or not" @@ -465,11 +467,13 @@ class NAttributeHandler(object): def add(self, key, value): "Add new key and value" self._store[key] = value + self.obj.set_recache_protection() def remove(self, key): "Remove key from storage" if key in self._store: del self._store[key] + self.obj.set_recache_protection(self._store) def all(self, return_tuples=False): "List all keys or (keys, values) stored, except _keys" diff --git a/src/utils/idmapper/base.py b/src/utils/idmapper/base.py index 847b59102e..d745d21ed7 100755 --- a/src/utils/idmapper/base.py +++ b/src/utils/idmapper/base.py @@ -67,7 +67,7 @@ class SharedMemoryModelBase(ModelBase): def _prepare(cls): cls.__instance_cache__ = {} - cls._idmapper_cache_flush_safe = True + cls._idmapper_recache_protection = False super(SharedMemoryModelBase, cls)._prepare() def __new__(cls, classname, bases, classdict, *args, **kwargs): @@ -232,16 +232,16 @@ class SharedMemoryModel(Model): def _flush_cached_by_key(cls, key, force=True): "Remove the cached reference." try: - if force or cls._idmapper_cache_flush_safe: + if force or not cls._idmapper_recache_protection: del cls.__instance_cache__[key] except KeyError: pass _flush_cached_by_key = classmethod(_flush_cached_by_key) - def _set_recache(cls, mode=True): + def set_recache_protection(cls, mode=True): "set if this instance should be allowed to be recached." - cls._idmapper_cache_flush_safe = bool(mode) - _set_recache = classmethod(_set_recache) + cls._idmapper_recache_protection = bool(mode) + set_recache_protection = classmethod(set_recache_protection) def flush_cached_instance(cls, instance, force=True): """ @@ -263,7 +263,7 @@ class SharedMemoryModel(Model): cls.__instance_cache__ = {} else: cls.__instance_cache__ = dict((key, obj) for key, obj in cls.__instance_cache__.items() - if not obj._idmapper_cache_flush_safe) + if obj._idmapper_recache_protection) flush_instance_cache = classmethod(flush_instance_cache) def save(cls, *args, **kwargs):