From aa62c2014c5f02e347f57f152c2b5354aa4ba628 Mon Sep 17 00:00:00 2001 From: Johnny Date: Thu, 18 Oct 2018 21:30:02 +0000 Subject: [PATCH] Fixes object delete method so that deleted characters are removed from owner's playable character list. --- evennia/accounts/tests.py | 18 ++++++++++++++++++ evennia/objects/objects.py | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/evennia/accounts/tests.py b/evennia/accounts/tests.py index 78ee87f37d..1285891d32 100644 --- a/evennia/accounts/tests.py +++ b/evennia/accounts/tests.py @@ -7,6 +7,7 @@ from evennia.accounts.accounts import AccountSessionHandler from evennia.accounts.accounts import DefaultAccount from evennia.server.session import Session from evennia.utils import create +from evennia.utils.test_resources import EvenniaTest from django.conf import settings @@ -199,3 +200,20 @@ class TestDefaultAccount(TestCase): account.puppet_object(self.s1, obj) self.assertTrue(self.s1.data_out.call_args[1]['text'].endswith("is already puppeted by another Account.")) self.assertIsNone(obj.at_post_puppet.call_args) + + +class TestAccountPuppetDeletion(EvenniaTest): + + @override_settings(MULTISESSION_MODE=2) + def test_puppet_deletion(self): + # Check for existing chars + self.assertFalse(self.account.db._playable_characters, 'Account should not have any chars by default.') + + # Add char1 to account's playable characters + self.account.db._playable_characters.append(self.char1) + self.assertTrue(self.account.db._playable_characters, 'Char was not added to account.') + + # See what happens when we delete char1. + self.char1.delete() + # Playable char list should be empty. + self.assertFalse(self.account.db._playable_characters, 'Playable character list is not empty! %s' % self.account.db._playable_characters) \ No newline at end of file diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index 27d8147999..3d0b9e02b7 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -913,8 +913,12 @@ class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)): # no need to disconnect, Account just jumps to OOC mode. # sever the connection (important!) if self.account: + # Remove the object from playable characters list + if self in self.account.db._playable_characters: + self.account.db._playable_characters = [x for x in self.account.db._playable_characters if x != self] for session in self.sessions.all(): self.account.unpuppet_object(session) + self.account = None for script in _ScriptDB.objects.get_all_scripts_on_obj(self):