From 1c6b74dc89f276194752bb5ae7253c0bd11fb7ae Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 6 Jan 2018 20:12:51 +0100 Subject: [PATCH] Update/refactor search_channel with aliases and proper query. Resolves #1534. --- evennia/comms/managers.py | 53 +++++++++++++++++--------------------- evennia/objects/manager.py | 10 ++++--- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/evennia/comms/managers.py b/evennia/comms/managers.py index f50d813123..dc541528c7 100644 --- a/evennia/comms/managers.py +++ b/evennia/comms/managers.py @@ -355,15 +355,16 @@ class ChannelDBManager(TypedObjectManager): channel (Channel or None): A channel match. """ - # first check the channel key - channels = self.filter(db_key__iexact=channelkey) - if not channels: - # also check aliases - channels = [channel for channel in self.all() - if channelkey in channel.aliases.all()] - if channels: - return channels[0] - return None + dbref = self.dbref(channelkey) + if dbref: + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + results = self.filter(Q(db_key__iexact=channelkey) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__iexact=channelkey)).distinct() + return results[0] if results else None def get_subscriptions(self, subscriber): """ @@ -393,26 +394,20 @@ class ChannelDBManager(TypedObjectManager): case sensitive) match. """ - channels = [] - if not ostring: - return channels - try: - # try an id match first - dbref = int(ostring.strip('#')) - channels = self.filter(id=dbref) - except Exception: - # Usually because we couldn't convert to int - not a dbref - pass - if not channels: - # no id match. Search on the key. - if exact: - channels = self.filter(db_key__iexact=ostring) - else: - channels = self.filter(db_key__icontains=ostring) - if not channels: - # still no match. Search by alias. - channels = [channel for channel in self.all() - if ostring.lower() in [a.lower for a in channel.aliases.all()]] + dbref = self.dbref(ostring) + if dbref: + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + if exact: + channels = self.filter(Q(db_key__iexact=ostring) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__iexact=ostring)).distinct() + else: + channels = self.filter(Q(db_key__icontains=ostring) | + Q(db_tags__db_tagtype__iexact="alias", + db_tags__db_key__icontains=ostring)).distinct() return channels # back-compatibility alias channel_search = search_channel diff --git a/evennia/objects/manager.py b/evennia/objects/manager.py index 3d29768e5a..4c81ea186a 100644 --- a/evennia/objects/manager.py +++ b/evennia/objects/manager.py @@ -76,10 +76,14 @@ class ObjectDBManager(TypedObjectManager): # simplest case - search by dbref dbref = self.dbref(ostring) if dbref: - return dbref + try: + return self.get(id=dbref) + except self.model.DoesNotExist: + pass + # not a dbref. Search by name. - cand_restriction = candidates is not None and Q(pk__in=[_GA(obj, "id") for obj in make_iter(candidates) - if obj]) or Q() + cand_restriction = candidates is not None and Q( + pk__in=[_GA(obj, "id") for obj in make_iter(candidates) if obj]) or Q() if exact: return self.filter(cand_restriction & Q(db_account__username__iexact=ostring)) else: # fuzzy matching