From d4c97d7df819ab92b80c710de17b351849ec72c8 Mon Sep 17 00:00:00 2001 From: Griatch Date: Thu, 29 Mar 2012 20:30:35 +0200 Subject: [PATCH] Fixed a caching issue with TypedAttributes. --- src/objects/manager.py | 4 +++- src/typeclasses/managers.py | 11 +++++++++++ src/typeclasses/models.py | 8 ++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/objects/manager.py b/src/objects/manager.py index 64c5a6947a..3d652f6dfe 100644 --- a/src/objects/manager.py +++ b/src/objects/manager.py @@ -119,8 +119,10 @@ class ObjectManager(TypedObjectManager): from src.objects.models import ObjAttribute lstring = "" if location: - lstring = ", db_obj__db_location=location" + lstring = ", db_obj__db_location=location" attrs = eval("ObjAttribute.objects.filter(db_key=attribute_name%s)" % lstring) + # since attribute values are pickled in database, we cannot search directly, but + # must loop through the results. . if exact: return [attr.obj for attr in attrs if attribute_value == attr.value] else: diff --git a/src/typeclasses/managers.py b/src/typeclasses/managers.py index df95c62733..4a5e8e1fdb 100644 --- a/src/typeclasses/managers.py +++ b/src/typeclasses/managers.py @@ -81,6 +81,17 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): except Exception: return None return dbref + + @returns_typeclass_list + def get_with_attr(self, attribute_name, attribute_value=None): + """ + Returns the typeclassed entity depending on having a given attribute. + + attribute_name - only entities with an attribute of this name will be included in match + attribute_value - if != None, only entities with db.attribute_name=attribute_value will match. + """ + self.filter() + @returns_typeclass def dbref_search(self, dbref): diff --git a/src/typeclasses/models.py b/src/typeclasses/models.py index def313a972..9d7ecf5ec3 100644 --- a/src/typeclasses/models.py +++ b/src/typeclasses/models.py @@ -307,24 +307,24 @@ class Attribute(SharedMemoryModel): #@property def obj_get(self): "Getter. Allows for value = self.obj" - return get_cache(self, "db_obj") + return get_cache(self, "obj") #@obj.setter def obj_set(self, value): "Setter. Allows for self.obj = value" - set_cache(self, "db_obj", value) + set_cache(self, "obj", value) #@obj.deleter def obj_del(self): "Deleter. Allows for del self.obj" self.db_obj = None self.save() - del_cache(self, "db_obj") + del_cache(self, "obj") obj = property(obj_get, obj_set, obj_del) # date_created property (wraps db_date_created) #@property def date_created_get(self): "Getter. Allows for value = self.date_created" - return get_cache(self, "db_date_created") + return get_cache(self, "date_created") #@date_created.setter def date_created_set(self, value): "Setter. Allows for self.date_created = value"