Use source class as a cache namespace, more expesive lookups to the encapsulate method and made the get method lightweight

This commit is contained in:
Roberto Rosario
2011-10-28 21:47:46 -04:00
parent 548abaaf70
commit 0c512ccaec

View File

@@ -34,20 +34,29 @@ class EncapsulatedObject(object):
cls.source_object_name = new_name
@classmethod
def encapsulate(cls, source_object):
if source_object not in _encapsulation_cache:
def encapsulate(cls, source_object=None, app_label=None, model=None, pk=None):
if source_object:
content_type = ContentType.objects.get_for_model(source_object)
elif app_label and model and pk:
content_type = ContentType.objects.get(app_label=app_label, model=model)
source_object = content_type.get_object_for_this_type(pk=pk)
object_id = '%s.%s.%s.%s' % (cls.__name__, content_type.app_label, content_type.model, source_object.pk)
if object_id not in _encapsulation_cache:
encapsulated_object = cls(source_object)
_encapsulation_cache[source_object] = encapsulated_object
_encapsulation_cache[object_id] = encapsulated_object
else:
return _encapsulation_cache[source_object]
return _encapsulation_cache[object_id]
return encapsulated_object
@classmethod
def get(cls, gid):
app_label, model, pk = gid.split('.')
content_type = ContentType.objects.get(app_label=app_label, model=model)
source_object = content_type.get_object_for_this_type(pk=pk)
return cls.encapsulate(source_object)
object_id = '%s.%s.%s.%s' % (cls.__name__, app_label, model, pk)
try:
return _encapsulation_cache[object_id]
except KeyError:
return cls.encapsulate(app_label=app_label, model=model, pk=pk)
def __init__(self, source_object):
content_type = ContentType.objects.get_for_model(source_object)