Better checks for pk in delete command. Update how the delete method of objects avoid recursive calls. Resolves #1453.

This commit is contained in:
Griatch 2017-09-30 12:00:42 +02:00
parent 0ba913332a
commit a6ed6ff5ea
2 changed files with 28 additions and 36 deletions

View file

@ -647,6 +647,9 @@ class CmdDestroy(COMMAND_DEFAULT_CLASS):
def delobj(obj): def delobj(obj):
# helper function for deleting a single object # helper function for deleting a single object
string = "" string = ""
if not obj.pk:
string = "\nObject %s was already deleted." % obj.db_key
else:
objname = obj.name objname = obj.name
if not (obj.access(caller, "control") or obj.access(caller, 'delete')): if not (obj.access(caller, "control") or obj.access(caller, 'delete')):
return "\nYou don't have permission to delete %s." % objname return "\nYou don't have permission to delete %s." % objname

View file

@ -830,8 +830,6 @@ class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)):
new_key = new_key or find_clone_key() new_key = new_key or find_clone_key()
return ObjectDB.objects.copy_object(self, new_key=new_key) return ObjectDB.objects.copy_object(self, new_key=new_key)
delete_iter = 0
def delete(self): def delete(self):
""" """
Deletes this object. Before deletion, this method makes sure Deletes this object. Before deletion, this method makes sure
@ -847,20 +845,11 @@ class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)):
if not _ScriptDB: if not _ScriptDB:
from evennia.scripts.models import ScriptDB as _ScriptDB from evennia.scripts.models import ScriptDB as _ScriptDB
if self.delete_iter > 0: if not self.pk or not self.at_object_delete():
# make sure to only call delete once on this object # This object has already been deleted,
# (avoid recursive loops) # or the pre-delete check return False
return False return False
if not self.at_object_delete():
# this is an extra pre-check
# run before deletion field-related properties
# is kicked into gear.
self.delete_iter = 0
return False
self.delete_iter += 1
# See if we need to kick the account off. # See if we need to kick the account off.
for session in self.sessions.all(): for session in self.sessions.all():