From d8d2ba416817b331ca7df80460a5ca3a9efab21f Mon Sep 17 00:00:00 2001 From: David Estrada Date: Thu, 9 Apr 2020 13:47:17 -0700 Subject: [PATCH 1/6] Manager.py is returning a couple of querysets instead of lists. Fix for bug #2088 --- evennia/objects/manager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/evennia/objects/manager.py b/evennia/objects/manager.py index 1217d0a91d..f66c1fe253 100644 --- a/evennia/objects/manager.py +++ b/evennia/objects/manager.py @@ -178,11 +178,11 @@ class ObjectDBManager(TypedObjectManager): # This doesn't work if attribute_value is an object. Workaround below if isinstance(attribute_value, (str, int, float, bool)): - return self.filter( + return list(self.filter( cand_restriction & type_restriction & Q(db_attributes__db_key=attribute_name, db_attributes__db_value=attribute_value) - ).order_by("id") + ).order_by("id")) else: # We must loop for safety since the referenced lookup gives deepcopy error if attribute value is an object. global _ATTR @@ -278,7 +278,7 @@ class ObjectDBManager(TypedObjectManager): exclude_restriction = ( Q(pk__in=[_GA(obj, "id") for obj in make_iter(excludeobj)]) if excludeobj else Q() ) - return self.filter(db_location=location).exclude(exclude_restriction).order_by("id") + return list(self.filter(db_location=location).exclude(exclude_restriction).order_by("id")) def get_objs_with_key_or_alias(self, ostring, exact=True, candidates=None, typeclasses=None): """ @@ -309,7 +309,7 @@ class ObjectDBManager(TypedObjectManager): type_restriction = typeclasses and Q(db_typeclass_path__in=make_iter(typeclasses)) or Q() if exact: # exact match - do direct search - return ( + return list( ( self.filter( cand_restriction From f294af210688c8d62432390c368bb88f0a2f7713 Mon Sep 17 00:00:00 2001 From: David Estrada Date: Mon, 20 Apr 2020 18:36:08 -0700 Subject: [PATCH 2/6] Some of the doc strings were incorrect in manager.py. Manager.py methods should return querySets, not lists --- evennia/objects/manager.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/evennia/objects/manager.py b/evennia/objects/manager.py index f66c1fe253..3e609991ff 100644 --- a/evennia/objects/manager.py +++ b/evennia/objects/manager.py @@ -159,7 +159,7 @@ class ObjectDBManager(TypedObjectManager): typeclasses (list, optional): Python pats to restrict matches with. Returns: - matches (list): Objects fullfilling both the `attribute_name` and + matches (query): Objects fullfilling both the `attribute_name` and `attribute_value` criterions. Notes: @@ -178,11 +178,11 @@ class ObjectDBManager(TypedObjectManager): # This doesn't work if attribute_value is an object. Workaround below if isinstance(attribute_value, (str, int, float, bool)): - return list(self.filter( + return self.filter( cand_restriction & type_restriction & Q(db_attributes__db_key=attribute_name, db_attributes__db_value=attribute_value) - ).order_by("id")) + ).order_by("id") else: # We must loop for safety since the referenced lookup gives deepcopy error if attribute value is an object. global _ATTR @@ -273,12 +273,12 @@ class ObjectDBManager(TypedObjectManager): to exclude from the match. Returns: - contents (list): Matching contents, without excludeobj, if given. + contents (query): Matching contents, without excludeobj, if given. """ exclude_restriction = ( Q(pk__in=[_GA(obj, "id") for obj in make_iter(excludeobj)]) if excludeobj else Q() ) - return list(self.filter(db_location=location).exclude(exclude_restriction).order_by("id")) + return self.filter(db_location=location).exclude(exclude_restriction).order_by("id") def get_objs_with_key_or_alias(self, ostring, exact=True, candidates=None, typeclasses=None): """ @@ -291,7 +291,7 @@ class ObjectDBManager(TypedObjectManager): typeclasses (list): Only match objects with typeclasses having thess path strings. Returns: - matches (list): A list of matches of length 0, 1 or more. + matches (query): A list of matches of length 0, 1 or more. """ if not isinstance(ostring, str): if hasattr(ostring, "key"): @@ -309,7 +309,7 @@ class ObjectDBManager(TypedObjectManager): type_restriction = typeclasses and Q(db_typeclass_path__in=make_iter(typeclasses)) or Q() if exact: # exact match - do direct search - return list( + return ( ( self.filter( cand_restriction From 66c8bb2be8a91e54e638f8ca31d079591dd42ab2 Mon Sep 17 00:00:00 2001 From: David Estrada Date: Mon, 20 Apr 2020 18:36:49 -0700 Subject: [PATCH 3/6] Send Search Results through _AT_SEARCH_RESULT in DefaultObject class --- evennia/objects/objects.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index de9d09abae..b5ec9a7647 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -498,12 +498,11 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): use_dbref=use_dbref, ) - if quiet: - return results return _AT_SEARCH_RESULT( results, self, query=searchdata, + quiet=quiet, nofound_string=nofound_string, multimatch_string=multimatch_string, ) From 5f5f51304b1c6b0e711ecc742a0b603d1f76c48a Mon Sep 17 00:00:00 2001 From: David Estrada Date: Mon, 20 Apr 2020 18:59:55 -0700 Subject: [PATCH 4/6] Seems DefaultObject search should return a list, even if _AT_SEARCH_RESULT returns None --- evennia/objects/objects.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index b5ec9a7647..c51b8079ba 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -498,7 +498,7 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): use_dbref=use_dbref, ) - return _AT_SEARCH_RESULT( + matches = _AT_SEARCH_RESULT( results, self, query=searchdata, @@ -506,6 +506,9 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): nofound_string=nofound_string, multimatch_string=multimatch_string, ) + if matches: + return matches + return [] def search_account(self, searchdata, quiet=False): """ From 224ad5322fa1356ae25850e6fc7309018493fad9 Mon Sep 17 00:00:00 2001 From: David Estrada Date: Mon, 20 Apr 2020 19:20:50 -0700 Subject: [PATCH 5/6] Misunderstood what the quiet flag was doing. If quiet flag is set, DefaultObject will return a list --- evennia/objects/objects.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index c51b8079ba..d9d355172a 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -498,7 +498,10 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): use_dbref=use_dbref, ) - matches = _AT_SEARCH_RESULT( + if quiet: + return list(results) + + return _AT_SEARCH_RESULT( results, self, query=searchdata, @@ -506,9 +509,6 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): nofound_string=nofound_string, multimatch_string=multimatch_string, ) - if matches: - return matches - return [] def search_account(self, searchdata, quiet=False): """ From 534df9529ba9ffa5789e73ad0af87270dffbfbda Mon Sep 17 00:00:00 2001 From: David Estrada Date: Mon, 20 Apr 2020 19:23:04 -0700 Subject: [PATCH 6/6] No longer passing quiet argument to _AT_SEARCH_RESULT. Took out empty line --- evennia/objects/objects.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index d9d355172a..2d093f15ab 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -500,12 +500,10 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase): if quiet: return list(results) - return _AT_SEARCH_RESULT( results, self, query=searchdata, - quiet=quiet, nofound_string=nofound_string, multimatch_string=multimatch_string, )