diff --git a/src/objects/managers/object.py b/src/objects/managers/object.py index 87dd5b675f..a162c1801d 100644 --- a/src/objects/managers/object.py +++ b/src/objects/managers/object.py @@ -15,15 +15,9 @@ from src.objects.exceptions import ObjectNotExist from src.objects.util import object as util_object from src import defines_global from src import logger - -class UniqueMatch(Exception): - """ - This allows a fuzzy match to give precedence to a perfect match. - """ - def __init__(self,matchobj): - self.matchobj = matchobj class ObjectManager(models.Manager): + def num_total_players(self): """ Returns the total number of registered players. @@ -112,18 +106,30 @@ class ObjectManager(models.Manager): """ if dbref_only: if limit_types: - return [prospect for prospect in searchlist if prospect.dbref_match(ostring) and prospect.type in limit_types] + return [prospect for prospect in searchlist if prospect.dbref_match(ostring) + and prospect.type in limit_types] else: return [prospect for prospect in searchlist if prospect.dbref_match(ostring)] - else: - try: - if limit_types: - return [prospect for prospect in searchlist if prospect.name_match(ostring, match_type=match_type) and prospect.type in limit_types] + else: + if limit_types: + results = [prospect for prospect in searchlist + if prospect.name_match(ostring, match_type=match_type) + and prospect.type in limit_types] + else: + results = [prospect for prospect in searchlist + if prospect.name_match(ostring, match_type=match_type)] + + if match_type == "exact": + return results + else: + #fuzzy matching; run second sweep to catch exact matches + exact_results = [prospect for prospect in results + if prospect.name_match(ostring, match_type="exact")] + if exact_results: + return exact_results else: - return [prospect for prospect in searchlist if prospect.name_match(ostring, match_type=match_type)] - except UniqueMatch, e: - return [e.matchobj] - + return results + def object_totals(self): """ diff --git a/src/objects/models.py b/src/objects/models.py index 5f4c5c4759..46d73e0e88 100755 --- a/src/objects/models.py +++ b/src/objects/models.py @@ -11,7 +11,6 @@ from django.contrib.auth.models import User, Group from django.conf import settings from src.objects.util import object as util_object from src.objects.managers.object import ObjectManager -from src.objects.managers.object import UniqueMatch from src.objects.managers.attribute import AttributeManager from src.config.models import ConfigValue from src.ansi import ANSITable, parse_ansi @@ -961,22 +960,17 @@ class Object(models.Model): if util_object.is_dbref(oname): # First character is a pound sign, looks to be a dbref. return self.dbref_match(oname) - else: - # Check if this is an exact match - oname = oname.lower() + + oname = oname.lower() + if match_type == "exact": + #exact matching name_chunks = self.name.lower().split(';') - # True=1, False=0, so if any hit, sum(result)>0. - exact_match = sum(map(lambda o: oname == o, name_chunks)) > 0 - if match_type == "exact": - #return result outright - return exact_match - if match_type == "fuzzy": - if exact_match: - #even if a fuzzy match, an exact match is worth more - raise UniqueMatch(self) - else: - #not an exact match; use fuzzy matching - return oname in self.name.lower() + #False=0 and True=1 in python, so if sum>0, we + #have at least one exact match. + return sum(map(lambda o: oname == o, name_chunks)) > 0 + else: + #fuzzy matching + return oname in self.name.lower() def filter_contents_from_str(self, oname): """