From 5b5328e6ca728eb40e13d7520cc1b1b0fde8600a Mon Sep 17 00:00:00 2001 From: Griatch Date: Sun, 14 Oct 2012 15:45:21 +0200 Subject: [PATCH] Changed default dbref search mechanic to require #N format and thus allow searching for objects named as integers (so "@create/drop 2" followed by 'look 2' will now work as expected instead of looking at the object with dbref=2). Doing "look #2" will now look at the object with dbref 2 (Limbo). Resolves Issue 284. --- src/comms/managers.py | 6 ++++-- src/scripts/manager.py | 6 +++--- src/typeclasses/managers.py | 8 ++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/comms/managers.py b/src/comms/managers.py index 8d3057b254..8ce0c28a92 100644 --- a/src/comms/managers.py +++ b/src/comms/managers.py @@ -23,12 +23,14 @@ class CommError(Exception): # helper functions # -def dbref(dbref): +def dbref(dbref, reqhash=True): """ Valid forms of dbref (database reference number) are either a string '#N' or an integer N. Output is the integer part. """ + if reqhash and not (isinstance(dbref, basestring) and dbref.startswith("#")): + return None if isinstance(dbref, basestring): dbref = dbref.lstrip('#') try: @@ -136,7 +138,7 @@ class MsgManager(models.Manager): def get_message_by_id(self, idnum): "Retrieve message by its id." try: - return self.get(id=self.dbref(idnum)) + return self.get(id=self.dbref(idnum, reqhash=False)) except Exception: return None diff --git a/src/scripts/manager.py b/src/scripts/manager.py index 1c4e0ae19c..66c739aa16 100644 --- a/src/scripts/manager.py +++ b/src/scripts/manager.py @@ -43,7 +43,7 @@ class ScriptManager(TypedObjectManager): return [] if key: dbref = self.dbref(key) - if dbref: + if dbref or dbref == 0: script = self.filter(db_obj=obj, id=dbref) if script: return script @@ -59,7 +59,7 @@ class ScriptManager(TypedObjectManager): if key: script = [] dbref = self.dbref(key) - if dbref: + if dbref or dbref == 0: script = self.dbref_search(dbref) if not script: scripts = self.filter(db_key=key) @@ -153,7 +153,7 @@ class ScriptManager(TypedObjectManager): elif not scripts: # normal operation - if dbref and self.dbref(dbref): + if dbref and self.dbref(dbref, reqhash=False): scripts = self.get_id(dbref) elif obj: scripts = self.get_all_scripts_on_obj(obj, key=key) diff --git a/src/typeclasses/managers.py b/src/typeclasses/managers.py index c478893e39..c1d8091573 100644 --- a/src/typeclasses/managers.py +++ b/src/typeclasses/managers.py @@ -67,12 +67,16 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): Common ObjectManager for all dbobjects. """ - def dbref(self, dbref): + def dbref(self, dbref, reqhash=True): """ Valid forms of dbref (database reference number) are either a string '#N' or an integer N. Output is the integer part. + reqhash - require input to be on form "#N" to be + identified as a dbref """ + if reqhash and not (isinstance(dbref, basestring) and dbref.startswith("#")): + return None if isinstance(dbref, basestring): dbref = dbref.lstrip('#') try: @@ -98,7 +102,7 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): """ Find object with given dbref """ - dbref = self.dbref(dbref) + dbref = self.dbref(dbref, reqhash=False) try: return self.get(id=dbref) except self.model.DoesNotExist: