From 7f0d0dd0f8a794517ec509a06f9ee06944b93118 Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 11 Nov 2013 22:44:22 +0100 Subject: [PATCH] Fixed more errors with quelling as well as some other things with updating permissions in general. Resolves Issue 430. --- src/commands/default/admin.py | 7 +++++-- src/commands/default/player.py | 10 +++++++++- src/server/initial_setup.py | 1 + src/typeclasses/models.py | 14 ++++++-------- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/commands/default/admin.py b/src/commands/default/admin.py index 51d4afbdbc..f527b64ca2 100644 --- a/src/commands/default/admin.py +++ b/src/commands/default/admin.py @@ -528,8 +528,11 @@ class CmdPerm(MuxCommand): if 'del' in switches: # delete the given permission(s) from object. obj.permissions.remove(self.rhslist) - cstring += "\nPermission(s) %s removed from %s (if they existed)." % (", ".join(self.rhslist), obj.name) - tstring += "\n%s revokes the permission(s) %s from you." % (caller.name, ", ".join(self.rhslist)) + if obj.permissions.get(self.rhslist): + cstring += "\nPermissions(s) %s could not be removed from %s." % (", ".join(self.rhslist), obj.name) + else: + cstring += "\nPermission(s) %s removed from %s (if they existed)." % (", ".join(self.rhslist), obj.name) + tstring += "\n%s revokes the permission(s) %s from you." % (caller.name, ", ".join(self.rhslist)) else: # add a new permission permissions = obj.permissions.all() diff --git a/src/commands/default/player.py b/src/commands/default/player.py index 603c52c1b5..d971bef2ba 100644 --- a/src/commands/default/player.py +++ b/src/commands/default/player.py @@ -633,6 +633,14 @@ class CmdQuell(MuxPlayerCommand): self.msg("Already quelling Player%s permissions." % permstr) return player.attributes.add('_quell', True) - self.msg("Quelling Player permissions%s. Use @unquell to get them back." % permstr) + puppet = player.get_puppet(self.sessid) + if puppet: + cpermstr = " (%s)" % ", ".join(puppet.permissions.all()) + cpermstr = "Quelling to current puppet's permissions%s." % cpermstr + cpermstr += "\n(Note: If this is higher than Player permissions%s, the lowest of the two will be used.)" % permstr + cpermstr += "\nUse @unquell to return to normal permission usage." + self.msg(cpermstr) + else: + self.msg("Quelling Player permissions%s. Use @unquell to get them back." % permstr) self._recache_locks(player) diff --git a/src/server/initial_setup.py b/src/server/initial_setup.py index f9226890e4..b6f3f73ec3 100644 --- a/src/server/initial_setup.py +++ b/src/server/initial_setup.py @@ -59,6 +59,7 @@ def create_objects(): god_player.basetype_setup() god_player.at_player_creation() god_player.locks.add("examine:perm(Immortals);edit:false();delete:false();boot:false();msg:all()") + god_player.permissions.add("Immortals") # this is necessary for quelling to work correctly. # Limbo is the default "nowhere" starting room diff --git a/src/typeclasses/models.py b/src/typeclasses/models.py index c75f9b89be..6da144f892 100644 --- a/src/typeclasses/models.py +++ b/src/typeclasses/models.py @@ -482,8 +482,8 @@ class TagHandler(object): self._cache = None def _recache(self): - self._cache = dict([(to_str(p[0]), True) for p in _GA(self.obj, self._m2m_fieldname).filter( - db_category__startswith=self.prefix).values_list("db_key")]) + self._cache = dict((to_str(p.db_key), p) for p in _GA(self.obj, self._m2m_fieldname).filter( + db_category__startswith=self.prefix)) def add(self, tag, category=None, data=None): "Add a new tag to the handler. Tag is a string or a list of strings." @@ -505,9 +505,8 @@ class TagHandler(object): self._recache() ret = [] category = "%s%s" % (self.prefix, category.strip().lower() if category!=None else "") - for keystr in (k.strip.lower() for k in make_iter(key)): - ret.append(self._cache.get(keystr)) - ret = ret if return_obj else [to_str(tag.db_data) for tag in ret] + ret = [val for val in (self._cache.get(keystr.strip().lower()) for keystr in make_iter(key)) if val] + ret = ret if return_obj else [to_str(tag.db_data) for tag in ret if tag] return ret[0] if len(ret)==1 else ret def remove(self, tag, category=None): @@ -515,7 +514,7 @@ class TagHandler(object): if self._cache == None or not _TYPECLASS_AGGRESSIVE_CACHE: self._recache() for tag in make_iter(tag): - if not tag or tag.strip(): # we don't allow empty tags + if not (tag or tag.strip()): # we don't allow empty tags continue tagstr = tag.strip().lower() if tag!=None else None category = "%s%s" % (self.prefix, category.strip().lower() if category!=None else "") @@ -524,8 +523,7 @@ class TagHandler(object): tagobj = self.obj.db_tags.filter(db_key=tagstr, db_category=category) if tagobj: _GA(self.obj, self._m2m_fieldname).remove(tagobj[0]) - if tagstr in self._cache: - del self._cache[tagstr] + self._recache() def clear(self): "Remove all tags from the handler"