From 1130dc5757e48228c0850d3098b4defe3dcaf26a Mon Sep 17 00:00:00 2001 From: Griatch Date: Fri, 2 Jan 2015 19:01:09 +0100 Subject: [PATCH] Started to go through the unittest errors, fixing player creation. --- src/commands/default/comms.py | 2 +- src/commands/default/system.py | 4 ++-- src/commands/default/tests.py | 23 ++++++++++++----------- src/comms/comms.py | 17 ++++++++--------- src/objects/objects.py | 28 ++++++++++++++-------------- src/players/models.py | 4 ---- src/players/player.py | 4 ++-- src/scripts/scripts.py | 14 +++++++------- src/typeclasses/models.py | 2 ++ src/utils/create.py | 18 +++++++++--------- src/utils/idmapper/base.py | 2 +- 11 files changed, 58 insertions(+), 60 deletions(-) diff --git a/src/commands/default/comms.py b/src/commands/default/comms.py index a507d236f5..a6f2d0d40a 100644 --- a/src/commands/default/comms.py +++ b/src/commands/default/comms.py @@ -386,7 +386,7 @@ class CmdCBoot(MuxPlayerCommand): string = "You don't control this channel." self.msg(string) return - if not player.dbobj in channel.db_subscriptions.all(): + if not player in channel.db_subscriptions.all(): string = "Player %s is not connected to channel %s." % (player.key, channel.key) self.msg(string) return diff --git a/src/commands/default/system.py b/src/commands/default/system.py index 596177e243..b7f88db110 100644 --- a/src/commands/default/system.py +++ b/src/commands/default/system.py @@ -394,7 +394,7 @@ class CmdObjects(MuxCommand): latesttable.align = 'l' for obj in objs: latesttable.add_row(utils.datetime_format(obj.date_created), - obj.dbref, obj.key, obj.typeclass.path) + obj.dbref, obj.key, obj.path) string = "\n{wObject subtype totals (out of %i Objects):{n\n%s" % (nobjs, totaltable) string += "\n{wObject typeclass distribution:{n\n%s" % typetable @@ -437,7 +437,7 @@ class CmdPlayers(MuxCommand): plyrs = PlayerDB.objects.all().order_by("db_date_created")[max(0, nplayers - nlim):] latesttable = EvTable("{wcreated{n", "{wdbref{n", "{wname{n", "{wtypeclass{n", border="cells", align="l") for ply in plyrs: - latesttable.add_row(utils.datetime_format(ply.date_created), ply.dbref, ply.key, ply.typeclass.path) + latesttable.add_row(utils.datetime_format(ply.date_created), ply.dbref, ply.key, ply.path) string = "\n{wPlayer typeclass distribution:{n\n%s" % typetable string += "\n{wLast %s Players created:{n\n%s" % (min(nplayers, nlim), latesttable) diff --git a/src/commands/default/tests.py b/src/commands/default/tests.py index 05ef9b60c7..664e5be882 100644 --- a/src/commands/default/tests.py +++ b/src/commands/default/tests.py @@ -16,8 +16,8 @@ import re from django.conf import settings from django.utils.unittest import TestCase from src.server.serversession import ServerSession -from src.objects.objects import Object, Character -from src.players.player import Player +from src.objects.objects import DefaultObject, DefaultCharacter +from src.players.player import DefaultPlayer from src.utils import create, ansi from src.server.sessionhandler import SESSIONS @@ -41,13 +41,13 @@ SESSIONS.data_out = dummy SESSIONS.disconnect = dummy -class TestObjectClass(Object): +class TestObjectClass(DefaultObject): def msg(self, text="", **kwargs): "test message" pass -class TestCharacterClass(Character): +class TestCharacterClass(DefaultCharacter): def msg(self, text="", **kwargs): "test message" if self.player: @@ -58,17 +58,18 @@ class TestCharacterClass(Character): self.ndb.stored_msg.append(text) -class TestPlayerClass(Player): +class TestPlayerClass(DefaultPlayer): def msg(self, text="", **kwargs): "test message" if not self.ndb.stored_msg: self.ndb.stored_msg = [] self.ndb.stored_msg.append(text) - def _get_superuser(self): - "test with superuser flag" - return self.ndb.is_superuser - is_superuser = property(_get_superuser) + # not supported to overload is_superuser field with property. + #def _get_superuser(self): + # "test with superuser flag" + # return self.ndb.is_superuser + #is_superuser = property(_get_superuser) class CommandTest(TestCase): @@ -81,10 +82,10 @@ class CommandTest(TestCase): #print "creating player %i: %s" % (self.CID, self.__class__.__name__) self.player = create.create_player("TestPlayer%i" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass) self.player2 = create.create_player("TestPlayer%ib" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass) - self.room1 = create.create_object("src.objects.objects.Room", key="Room%i"%self.CID, nohome=True) + self.room1 = create.create_object("src.objects.objects.DefaultRoom", key="Room%i"%self.CID, nohome=True) self.room1.db.desc = "room_desc" settings.DEFAULT_HOME = "#%i" % self.room1.id # we must have a default home - self.room2 = create.create_object("src.objects.objects.Room", key="Room%ib" % self.CID) + self.room2 = create.create_object("src.objects.objects.DefaultRoom", key="Room%ib" % self.CID) self.obj1 = create.create_object(TestObjectClass, key="Obj%i" % self.CID, location=self.room1, home=self.room1) self.obj2 = create.create_object(TestObjectClass, key="Obj%ib" % self.CID, location=self.room1, home=self.room1) self.char1 = create.create_object(TestCharacterClass, key="Char%i" % self.CID, location=self.room1, home=self.room1) diff --git a/src/comms/comms.py b/src/comms/comms.py index 22d625bd0e..f6e7da869d 100644 --- a/src/comms/comms.py +++ b/src/comms/comms.py @@ -30,20 +30,20 @@ class Channel(ChannelDB): # this is only set if the channel was created # with the utils.create.create_channel function. cdict = self._createdict - if not cdict["key"]: + if not cdict.get("key"): if not self.db_key: self.db_key = "#i" % self.dbid elif cdict["key"] and self.key != cdict["key"]: self.key = cdict["key"] - if cdict["keep_log"]: + if cdict.get("keep_log"): self.db_keep_log = cdict["keep_log"] - if cdict["aliases"]: + if cdict.get("aliases"): self.aliases.add(cdict["aliases"]) - if cdict["locks"]: + if cdict.get("locks"): self.locks.add(cdict["locks"]) - if cdict["keep_log"]: + if cdict.get("keep_log"): self.attributes.add("keep_log", cdict["keep_log"]) - if cdict["desc"]: + if cdict.get("desc"): self.attributes.add("desc", cdict["desc"]) def at_channel_creation(self): @@ -61,7 +61,6 @@ class Channel(ChannelDB): """ if hasattr(player, "player"): player = player.player - player = player.dbobj return player in self.db_subscriptions.all() def connect(self, player): @@ -90,9 +89,9 @@ class Channel(ChannelDB): if not disconnect: return False # disconnect - self.db_subscriptions.remove(player.dbobj) + self.db_subscriptions.remove(player) # post-disconnect hook - self.post_leave_channel(player.dbobj) + self.post_leave_channel(player) return True def access(self, accessing_obj, access_type='listen', default=False): diff --git a/src/objects/objects.py b/src/objects/objects.py index 5dd39d9dee..597a0fd7c9 100644 --- a/src/objects/objects.py +++ b/src/objects/objects.py @@ -283,11 +283,11 @@ class DefaultObject(ObjectDB): """ return any(self.sessions) - @property - def is_superuser(self): - "Check if user has a player, and if so, if it is a superuser." - return self.db_player and self.db_player.is_superuser \ - and not self.db_player.attributes.get("_quell") + #@property + #def is_superuser(self): + # "Check if user has a player, and if so, if it is a superuser." + # return self.db_player and self.db_player.is_superuser \ + # and not self.db_player.attributes.get("_quell") def contents_get(self, exclude=None): """ @@ -858,32 +858,32 @@ class DefaultObject(ObjectDB): # call's kwargs to override the values set by hooks. cdict = self._createdict updates = [] - if not cdict["key"]: + if not cdict.get("key"): if not self.db_key: self.db_key = "#%i" % self.dbid updates.append("db_key") - elif self.key != cdict["key"]: + elif self.key != cdict.get("key"): updates.append("db_key") self.db_key = cdict["key"] - if cdict["location"] and self.location != cdict["location"]: + if cdict.get("location") and self.location != cdict["location"]: self.db_location = cdict["location"] updates.append("db_location") - if cdict["home"] and self.home != cdict["home"]: + if cdict.get("home") and self.home != cdict["home"]: self.home = cdict["home"] updates.append("db_home") - if cdict["destination"] and self.destination != cdict["destination"]: + if cdict.get("destination") and self.destination != cdict["destination"]: self.destination = cdict["destination"] updates.append("db_destination") if updates: self.save(update_fields=updates) - if cdict["permissions"]: + if cdict.get("permissions"): self.permissions.add(cdict["permissions"]) - if cdict["locks"]: + if cdict.get("locks"): self.locks.add(cdict["locks"]) - if cdict["aliases"]: + if cdict.get("aliases"): self.aliases.add(cdict["aliases"]) - if cdict["location"]: + if cdict.get("location"): cdict["location"].at_object_receive(self, None) self.at_after_move(None) del self._createdict diff --git a/src/players/models.py b/src/players/models.py index d1ae752664..83963967b5 100644 --- a/src/players/models.py +++ b/src/players/models.py @@ -93,10 +93,6 @@ class PlayerDB(TypedObject, AbstractUser): # Database manager objects = PlayerDBManager() - # caches for quick lookups - _typeclass_paths = settings.PLAYER_TYPECLASS_PATHS - _default_typeclass_path = settings.BASE_PLAYER_TYPECLASS or "src.players.player.Player" - class Meta: app_label = 'players' verbose_name = 'Player' diff --git a/src/players/player.py b/src/players/player.py index 644316ee72..67fe1872ce 100644 --- a/src/players/player.py +++ b/src/players/player.py @@ -535,9 +535,9 @@ class DefaultPlayer(PlayerDB): # this will only be set if the utils.create_player # function was used to create the object. cdict = self._createdict - if "locks" in cdict: + if cdict.get("locks"): self.locks.add(cdict["locks"]) - if "permissions" in cdict: + if cdict.get("permissions"): permissions = cdict["permissions"] del self._createdict diff --git a/src/scripts/scripts.py b/src/scripts/scripts.py index e8c9cd9916..2a63d430c1 100644 --- a/src/scripts/scripts.py +++ b/src/scripts/scripts.py @@ -443,28 +443,28 @@ class Script(ScriptBase): # set by hooks. cdict = self._createdict updates = [] - if not cdict["key"]: + if not cdict.get("key"): if not self.db_key: self.db_key = "#%i" % self.dbid updates.append("db_key") - elif self.db_key != cdict["db_key"]: + elif self.db_key != cdict["key"]: self.db_key = cdict["key"] updates.append("db_key") - if cdict["interval"] and self.interval != cdict["interval"]: + if cdict.get("interval") and self.interval != cdict["interval"]: self.db_interval = cdict["interval"] updates.append("db_interval") - if cdict["start_delay"] and self.start_delay != cdict["start_delay"]: + if cdict.get("start_delay") and self.start_delay != cdict["start_delay"]: self.db_start_delay = cdict["start_delay"] updates.append("db_start_delay") - if cdict["repeats"] and self.repeats != cdict["repeats"]: + if cdict.get("repeats") and self.repeats != cdict["repeats"]: self.db_repeats = cdict["repeats"] updates.append("db_repeats") - if cdict["persistent"] and self.persistent != cdict["persistent"]: + if cdict.get("persistent") and self.persistent != cdict["persistent"]: self.db_persistent = cdict["persistent"] updates.append("db_persistent") if updates: self.save(update_fields=updates) - if not cdict["autostart"]: + if not cdict.get("autostart"): # don't auto-start the script return diff --git a/src/typeclasses/models.py b/src/typeclasses/models.py index 79f794165e..3fabdd1e5e 100644 --- a/src/typeclasses/models.py +++ b/src/typeclasses/models.py @@ -325,6 +325,8 @@ class TypedObject(SharedMemoryModel): sure nothing in the new typeclass clashes with the old one. If you supply a list, only those named attributes will be cleared. + run_start_hooks - trigger the start hooks of the object, as if + it was created for the first time. no_default - if this is active, the swapper will not allow for swapping to a default typeclass in case the given one fails for some reason. Instead the old one diff --git a/src/utils/create.py b/src/utils/create.py index 1e35490518..25363623b8 100644 --- a/src/utils/create.py +++ b/src/utils/create.py @@ -23,6 +23,7 @@ Models covered: """ from django.conf import settings from django.db import IntegrityError +from django.utils import timezone from src.utils import logger from src.utils.utils import make_iter, class_from_module, dbid_to_obj @@ -348,7 +349,6 @@ def create_player(key, email, password, if isinstance(typeclass, basestring): # a path is given. Load the actual typeclass. typeclass = class_from_module(typeclass, settings.OBJECT_TYPECLASS_PATHS) - typeclass_path = typeclass.path # setup input for the create command. We use PlayerDB as baseclass # here to give us maximum freedom (the typeclasses will load @@ -362,16 +362,16 @@ def create_player(key, email, password, # this handles a given dbref-relocate to a player. report_to = dbid_to_obj(report_to, _PlayerDB) - # create the correct player object - if is_superuser: - new_player = _PlayerDB.objects.create_superuser(key, email, password) - else: - new_player = _PlayerDB.objects.create_user(key, email, password) - new_player.db_typeclass_path = typeclass_path - # store the call signature for the signal + # create the correct player entity, using the setup from + # base django auth. + now = timezone.now() + email = typeclass.objects.normalize_email(email) + new_player = typeclass(username=key, email=email, + is_staff=is_superuser, is_superuser=is_superuser, + last_login=now, date_joined=now) + new_player.set_password(password) new_player._createdict = {"locks":locks, "permissions":permissions, "report_to":report_to} - # saving will trigger the signal that calls the # at_first_save hook on the typeclass, where the _createdict # can be used. diff --git a/src/utils/idmapper/base.py b/src/utils/idmapper/base.py index 0b6eb82037..8b7957191d 100755 --- a/src/utils/idmapper/base.py +++ b/src/utils/idmapper/base.py @@ -187,8 +187,8 @@ class SharedMemoryModelBase(ModelBase): for fieldname, field in ((fname, field) for fname, field in attrs.items() if fname.startswith("db_") and type(field).__name__ != "ManyToManyField"): foreignkey = type(field).__name__ == "ForeignKey" - #print fieldname, type(field).__name__, field wrappername = "dbid" if fieldname == "id" else fieldname.replace("db_", "", 1) + #print fieldname, wrappername if wrappername not in attrs: # makes sure not to overload manually created wrappers on the model #print "wrapping %s -> %s" % (fieldname, wrappername)