From 6bbd35da8a02686473b30359e4b2840a1ee6566a Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 18 Jan 2015 11:30:49 +0100 Subject: [PATCH] Changed how tags are looked up during their creation, makes for a much faster implementation. --- evennia/typeclasses/managers.py | 38 ++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/evennia/typeclasses/managers.py b/evennia/typeclasses/managers.py index 2a988eff53..26cf3a6408 100644 --- a/evennia/typeclasses/managers.py +++ b/evennia/typeclasses/managers.py @@ -97,21 +97,38 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): # Tag manager methods - def get_tag(self, key=None, category=None, obj=None, tagtype=None): + def get_tag(self, key=None, category=None, obj=None, tagtype=None, global_search=False): """ Return Tag objects by key, by category, by object (it is stored on) or with a combination of those criteria. tagtype - one of None (normal tags), "alias" or "permission" + global_search - include all possible tags, not just tags on + this object """ - query = [("tag__db_tagtype", tagtype)] - if obj: - query.append(("%s__id" % self.model.__name__.lower(), obj.id)) - if key: - query.append(("tag__db_key", key)) - if category: - query.append(("tag__db_category", category)) - return [th.tag for th in self.model.db_tags.through.objects.filter(**dict(query))] + global _Tag + if not _Tag: + from evennia.typeclasses.models import Tag as _Tag + if global_search: + # search all tags using the Tag model + query = [("db_tagtype", tagtype)] + if obj: + query.append(("id", obj.id)) + if key: + query.append(("db_key", key)) + if category: + query.append(("db_category", category)) + return _Tag.objects.filter(**dict(query)) + else: + # search only among tags stored on on this model + query = [("tag__db_tagtype", tagtype)] + if obj: + query.append(("%s__id" % self.model.__name__.lower(), obj.id)) + if key: + query.append(("tag__db_key", key)) + if category: + query.append(("tag__db_category", category)) + return [th.tag for th in self.model.db_tags.through.objects.filter(**dict(query))] def get_permission(self, key=None, category=None, obj=None): return self.get_tag(key=key, category=category, obj=obj, tagtype="permission") @@ -151,7 +168,8 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): """ data = str(data) if data is not None else None # try to get old tag - tag = self.get_tag(key=key, category=category, tagtype=tagtype) + + tag = self.get_tag(key=key, category=category, tagtype=tagtype, global_search=True) if tag and data is not None: # overload data on tag tag.db_data = data