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.

This commit is contained in:
Griatch 2012-10-14 15:45:21 +02:00
parent 31daf5b013
commit 5b5328e6ca
3 changed files with 13 additions and 7 deletions

View file

@ -23,12 +23,14 @@ class CommError(Exception):
# helper functions # helper functions
# #
def dbref(dbref): def dbref(dbref, reqhash=True):
""" """
Valid forms of dbref (database reference number) Valid forms of dbref (database reference number)
are either a string '#N' or an integer N. are either a string '#N' or an integer N.
Output is the integer part. Output is the integer part.
""" """
if reqhash and not (isinstance(dbref, basestring) and dbref.startswith("#")):
return None
if isinstance(dbref, basestring): if isinstance(dbref, basestring):
dbref = dbref.lstrip('#') dbref = dbref.lstrip('#')
try: try:
@ -136,7 +138,7 @@ class MsgManager(models.Manager):
def get_message_by_id(self, idnum): def get_message_by_id(self, idnum):
"Retrieve message by its id." "Retrieve message by its id."
try: try:
return self.get(id=self.dbref(idnum)) return self.get(id=self.dbref(idnum, reqhash=False))
except Exception: except Exception:
return None return None

View file

@ -43,7 +43,7 @@ class ScriptManager(TypedObjectManager):
return [] return []
if key: if key:
dbref = self.dbref(key) dbref = self.dbref(key)
if dbref: if dbref or dbref == 0:
script = self.filter(db_obj=obj, id=dbref) script = self.filter(db_obj=obj, id=dbref)
if script: if script:
return script return script
@ -59,7 +59,7 @@ class ScriptManager(TypedObjectManager):
if key: if key:
script = [] script = []
dbref = self.dbref(key) dbref = self.dbref(key)
if dbref: if dbref or dbref == 0:
script = self.dbref_search(dbref) script = self.dbref_search(dbref)
if not script: if not script:
scripts = self.filter(db_key=key) scripts = self.filter(db_key=key)
@ -153,7 +153,7 @@ class ScriptManager(TypedObjectManager):
elif not scripts: elif not scripts:
# normal operation # normal operation
if dbref and self.dbref(dbref): if dbref and self.dbref(dbref, reqhash=False):
scripts = self.get_id(dbref) scripts = self.get_id(dbref)
elif obj: elif obj:
scripts = self.get_all_scripts_on_obj(obj, key=key) scripts = self.get_all_scripts_on_obj(obj, key=key)

View file

@ -67,12 +67,16 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
Common ObjectManager for all dbobjects. Common ObjectManager for all dbobjects.
""" """
def dbref(self, dbref): def dbref(self, dbref, reqhash=True):
""" """
Valid forms of dbref (database reference number) Valid forms of dbref (database reference number)
are either a string '#N' or an integer N. are either a string '#N' or an integer N.
Output is the integer part. 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): if isinstance(dbref, basestring):
dbref = dbref.lstrip('#') dbref = dbref.lstrip('#')
try: try:
@ -98,7 +102,7 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
""" """
Find object with given dbref Find object with given dbref
""" """
dbref = self.dbref(dbref) dbref = self.dbref(dbref, reqhash=False)
try: try:
return self.get(id=dbref) return self.get(id=dbref)
except self.model.DoesNotExist: except self.model.DoesNotExist: