Make all manager methods return querysets. This removes all the last remnants of the old return_typeclass/return_typeclass_list decorators that were a remnant of the old pre-proxy Typeclass system. Resolves #1206.

This commit is contained in:
Griatch 2017-04-20 19:43:39 +02:00
parent dd7d18f041
commit cf77d90c71
7 changed files with 25 additions and 98 deletions

View file

@ -5,10 +5,8 @@ Comm system components.
""" """
from __future__ import print_function from __future__ import print_function
from django.db import models
from django.db.models import Q from django.db.models import Q
from evennia.typeclasses.managers import (TypedObjectManager, TypeclassManager, from evennia.typeclasses.managers import (TypedObjectManager, TypeclassManager)
returns_typeclass_list, returns_typeclass)
from evennia.utils import logger from evennia.utils import logger
_GA = object.__getattribute__ _GA = object.__getattribute__
@ -131,6 +129,7 @@ def to_object(inp, objtype='player'):
# an unknown # an unknown
return None return None
# #
# Msg manager # Msg manager
# #
@ -314,6 +313,7 @@ class MsgManager(TypedObjectManager):
# back-compatibility alias # back-compatibility alias
message_search = search_message message_search = search_message
# #
# Channel manager # Channel manager
# #
@ -332,7 +332,6 @@ class ChannelDBManager(TypedObjectManager):
subscribed to the Channel. subscribed to the Channel.
""" """
@returns_typeclass_list
def get_all_channels(self): def get_all_channels(self):
""" """
Get all channels. Get all channels.
@ -343,7 +342,6 @@ class ChannelDBManager(TypedObjectManager):
""" """
return self.all() return self.all()
@returns_typeclass
def get_channel(self, channelkey): def get_channel(self, channelkey):
""" """
Return the channel object if given its key. Return the channel object if given its key.
@ -366,7 +364,6 @@ class ChannelDBManager(TypedObjectManager):
return channels[0] return channels[0]
return None return None
@returns_typeclass_list
def get_subscriptions(self, subscriber): def get_subscriptions(self, subscriber):
""" """
Return all channels a given entity is subscribed to. Return all channels a given entity is subscribed to.
@ -385,7 +382,6 @@ class ChannelDBManager(TypedObjectManager):
return subscriber.object_subscription_set.all() return subscriber.object_subscription_set.all()
return [] return []
@returns_typeclass_list
def search_channel(self, ostring, exact=True): def search_channel(self, ostring, exact=True):
""" """
Search the channel database for a particular channel. Search the channel database for a particular channel.
@ -397,7 +393,8 @@ class ChannelDBManager(TypedObjectManager):
""" """
channels = [] channels = []
if not ostring: return channels if not ostring:
return channels
try: try:
# try an id match first # try an id match first
dbref = int(ostring.strip('#')) dbref = int(ostring.strip('#'))
@ -414,16 +411,14 @@ class ChannelDBManager(TypedObjectManager):
if not channels: if not channels:
# still no match. Search by alias. # still no match. Search by alias.
channels = [channel for channel in self.all() channels = [channel for channel in self.all()
if ostring.lower() in [a.lower if ostring.lower() in [a.lower for a in channel.aliases.all()]]
for a in channel.aliases.all()]]
return channels return channels
# back-compatibility alias # back-compatibility alias
channel_search = search_channel channel_search = search_channel
class ChannelManager(ChannelDBManager, TypeclassManager): class ChannelManager(ChannelDBManager, TypeclassManager):
""" """
Wrapper to group the typeclass manager to a consistent name. Wrapper to group the typeclass manager to a consistent name.
""" """
pass pass

View file

@ -34,10 +34,9 @@ from django.conf import settings
from evennia.players.models import PlayerDB from evennia.players.models import PlayerDB
from evennia.objects.models import ObjectDB from evennia.objects.models import ObjectDB
from evennia.server.models import ServerConfig from evennia.server.models import ServerConfig
from evennia.comms.models import ChannelDB
from evennia.commands.cmdset import CmdSet from evennia.commands.cmdset import CmdSet
from evennia.utils import create, logger, utils, ansi from evennia.utils import logger, utils, ansi
from evennia.commands.default.muxcommand import MuxCommand from evennia.commands.default.muxcommand import MuxCommand
from evennia.commands.cmdhandler import CMD_LOGINSTART from evennia.commands.cmdhandler import CMD_LOGINSTART
from evennia.commands.default import unloggedin as default_unloggedin # Used in CmdUnconnectedCreate from evennia.commands.default import unloggedin as default_unloggedin # Used in CmdUnconnectedCreate
@ -100,14 +99,13 @@ class CmdUnconnectedConnect(MuxCommand):
session.msg(string) session.msg(string)
return return
# We have at least one result, so we can check the password. # We have at least one result, so we can check the password.
if not player.check_password(password): if not player[0].check_password(password):
session.msg("Incorrect password.") session.msg("Incorrect password.")
return return
# Check IP and/or name bans # Check IP and/or name bans
bans = ServerConfig.objects.conf("server_bans") bans = ServerConfig.objects.conf("server_bans")
if bans and (any(tup[0] == player.name for tup in bans) if bans and (any(tup[0] == player.name for tup in bans) or
or
any(tup[2].match(session.address[0]) for tup in bans if tup[2])): any(tup[2].match(session.address[0]) for tup in bans if tup[2])):
# this is a banned IP or name! # this is a banned IP or name!
string = "|rYou have been banned and cannot continue from here." string = "|rYou have been banned and cannot continue from here."
@ -207,8 +205,7 @@ class CmdUnconnectedCreate(MuxCommand):
# Check IP and/or name bans # Check IP and/or name bans
bans = ServerConfig.objects.conf("server_bans") bans = ServerConfig.objects.conf("server_bans")
if bans and (any(tup[0] == playername.lower() for tup in bans) if bans and (any(tup[0] == playername.lower() for tup in bans) or
or
any(tup[2].match(session.address) for tup in bans if tup[2])): any(tup[2].match(session.address) for tup in bans if tup[2])):
# this is a banned IP or name! # this is a banned IP or name!
string = "|rYou have been banned and cannot continue from here." \ string = "|rYou have been banned and cannot continue from here." \

View file

@ -92,7 +92,7 @@ class CmdMail(default_cmds.MuxCommand):
player = self.caller.player player = self.caller.player
except AttributeError: except AttributeError:
player = self.caller player = self.caller
messages = Msg.objects.get_by_tag(category="mail", raw_queryset=True).filter(db_receivers_players=player) messages = Msg.objects.get_by_tag(category="mail").filter(db_receivers_players=player)
return messages return messages
def send_mail(self, recipients, subject, message, caller): def send_mail(self, recipients, subject, message, caller):

View file

@ -7,7 +7,6 @@ from django.db.models import Q
from django.conf import settings from django.conf import settings
from django.db.models.fields import exceptions from django.db.models.fields import exceptions
from evennia.typeclasses.managers import TypedObjectManager, TypeclassManager from evennia.typeclasses.managers import TypedObjectManager, TypeclassManager
from evennia.typeclasses.managers import returns_typeclass, returns_typeclass_list
from evennia.utils.utils import to_unicode, is_iter, make_iter, string_partial_matching from evennia.utils.utils import to_unicode, is_iter, make_iter, string_partial_matching
from builtins import int from builtins import int
@ -56,7 +55,6 @@ class ObjectDBManager(TypedObjectManager):
# player related # player related
@returns_typeclass
def get_object_with_player(self, ostring, exact=True, candidates=None): def get_object_with_player(self, ostring, exact=True, candidates=None):
""" """
Search for an object based on its player's name or dbref. Search for an object based on its player's name or dbref.
@ -93,7 +91,6 @@ class ObjectDBManager(TypedObjectManager):
else: else:
return string_partial_matching(ply_cands, ostring, ret_index=False) return string_partial_matching(ply_cands, ostring, ret_index=False)
@returns_typeclass_list
def get_objs_with_key_and_typeclass(self, oname, otypeclass_path, candidates=None): def get_objs_with_key_and_typeclass(self, oname, otypeclass_path, candidates=None):
""" """
Returns objects based on simultaneous key and typeclass match. Returns objects based on simultaneous key and typeclass match.
@ -112,7 +109,6 @@ class ObjectDBManager(TypedObjectManager):
# attr/property related # attr/property related
@returns_typeclass_list
def get_objs_with_attr(self, attribute_name, candidates=None): def get_objs_with_attr(self, attribute_name, candidates=None):
""" """
Get objects based on having a certain Attribute defined. Get objects based on having a certain Attribute defined.
@ -130,7 +126,6 @@ class ObjectDBManager(TypedObjectManager):
if obj]) or Q() if obj]) or Q()
return list(self.filter(cand_restriction & Q(db_attributes__db_key=attribute_name))) return list(self.filter(cand_restriction & Q(db_attributes__db_key=attribute_name)))
@returns_typeclass_list
def get_objs_with_attr_value(self, attribute_name, attribute_value, candidates=None, typeclasses=None): def get_objs_with_attr_value(self, attribute_name, attribute_value, candidates=None, typeclasses=None):
""" """
Get all objects having the given attrname set to the given value. Get all objects having the given attrname set to the given value.
@ -169,7 +164,6 @@ class ObjectDBManager(TypedObjectManager):
db_value=attribute_value)] db_value=attribute_value)]
return chain(*results) return chain(*results)
@returns_typeclass_list
def get_objs_with_db_property(self, property_name, candidates=None): def get_objs_with_db_property(self, property_name, candidates=None):
""" """
Get all objects having a given db field property. Get all objects having a given db field property.
@ -191,7 +185,6 @@ class ObjectDBManager(TypedObjectManager):
except exceptions.FieldError: except exceptions.FieldError:
return [] return []
@returns_typeclass_list
def get_objs_with_db_property_value(self, property_name, property_value, candidates=None, typeclasses=None): def get_objs_with_db_property_value(self, property_name, property_value, candidates=None, typeclasses=None):
""" """
Get objects with a specific field name and value. Get objects with a specific field name and value.
@ -222,7 +215,6 @@ class ObjectDBManager(TypedObjectManager):
(property_name, type(property_value))) (property_name, type(property_value)))
return [] return []
@returns_typeclass_list
def get_contents(self, location, excludeobj=None): def get_contents(self, location, excludeobj=None):
""" """
Get all objects that has a location set to this one. Get all objects that has a location set to this one.
@ -238,7 +230,6 @@ class ObjectDBManager(TypedObjectManager):
exclude_restriction = Q(pk__in=[_GA(obj, "id") for obj in make_iter(excludeobj)]) if excludeobj else Q() exclude_restriction = Q(pk__in=[_GA(obj, "id") for obj in make_iter(excludeobj)]) if excludeobj else Q()
return self.filter(db_location=location).exclude(exclude_restriction) return self.filter(db_location=location).exclude(exclude_restriction)
@returns_typeclass_list
def get_objs_with_key_or_alias(self, ostring, exact=True, def get_objs_with_key_or_alias(self, ostring, exact=True,
candidates=None, typeclasses=None): candidates=None, typeclasses=None):
""" """
@ -303,7 +294,6 @@ class ObjectDBManager(TypedObjectManager):
# main search methods and helper functions # main search methods and helper functions
@returns_typeclass_list
def search_object(self, searchdata, def search_object(self, searchdata,
attribute_name=None, attribute_name=None,
typeclass=None, typeclass=None,

View file

@ -5,10 +5,7 @@ The managers for the custom Player object and permissions.
import datetime import datetime
from django.utils import timezone from django.utils import timezone
from django.contrib.auth.models import UserManager from django.contrib.auth.models import UserManager
#from functools import update_wrapper from evennia.typeclasses.managers import (TypedObjectManager, TypeclassManager)
from evennia.typeclasses.managers import (returns_typeclass_list, returns_typeclass,
TypedObjectManager, TypeclassManager)
from evennia.utils.utils import make_iter
__all__ = ("PlayerManager",) __all__ = ("PlayerManager",)
@ -51,7 +48,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
""" """
return self.count() return self.count()
@returns_typeclass_list
def get_connected_players(self): def get_connected_players(self):
""" """
Get all currently connected players. Get all currently connected players.
@ -63,7 +59,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
""" """
return self.filter(db_is_connected=True) return self.filter(db_is_connected=True)
@returns_typeclass_list
def get_recently_created_players(self, days=7): def get_recently_created_players(self, days=7):
""" """
Get players recently created. Get players recently created.
@ -80,7 +75,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
start_date = end_date - tdelta start_date = end_date - tdelta
return self.filter(date_joined__range=(start_date, end_date)) return self.filter(date_joined__range=(start_date, end_date))
@returns_typeclass_list
def get_recently_connected_players(self, days=7): def get_recently_connected_players(self, days=7):
""" """
Get players recently connected to the game. Get players recently connected to the game.
@ -99,7 +93,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
return self.filter(last_login__range=( return self.filter(last_login__range=(
start_date, end_date)).order_by('-last_login') start_date, end_date)).order_by('-last_login')
@returns_typeclass
def get_player_from_email(self, uemail): def get_player_from_email(self, uemail):
""" """
Search player by Search player by
@ -114,7 +107,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
""" """
return self.filter(email__iexact=uemail) return self.filter(email__iexact=uemail)
@returns_typeclass
def get_player_from_uid(self, uid): def get_player_from_uid(self, uid):
""" """
Get a player by id. Get a player by id.
@ -131,7 +123,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
except self.model.DoesNotExist: except self.model.DoesNotExist:
return None return None
@returns_typeclass
def get_player_from_name(self, uname): def get_player_from_name(self, uname):
""" """
Get player object based on name. Get player object based on name.
@ -148,7 +139,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
except self.model.DoesNotExist: except self.model.DoesNotExist:
return None return None
@returns_typeclass_list
def search_player(self, ostring, exact=True, typeclass=None): def search_player(self, ostring, exact=True, typeclass=None):
""" """
Searches for a particular player by name or Searches for a particular player by name or
@ -185,5 +175,6 @@ class PlayerDBManager(TypedObjectManager, UserManager):
# back-compatibility alias # back-compatibility alias
player_search = search_player player_search = search_player
class PlayerManager(PlayerDBManager, TypeclassManager): class PlayerManager(PlayerDBManager, TypeclassManager):
pass pass

View file

@ -4,7 +4,6 @@ The custom manager for Scripts.
from django.db.models import Q from django.db.models import Q
from evennia.typeclasses.managers import TypedObjectManager, TypeclassManager from evennia.typeclasses.managers import TypedObjectManager, TypeclassManager
from evennia.typeclasses.managers import returns_typeclass_list
from evennia.utils.utils import make_iter from evennia.utils.utils import make_iter
__all__ = ("ScriptManager",) __all__ = ("ScriptManager",)
_GA = object.__getattribute__ _GA = object.__getattribute__
@ -35,7 +34,6 @@ class ScriptDBManager(TypedObjectManager):
copy_script copy_script
""" """
@returns_typeclass_list
def get_all_scripts_on_obj(self, obj, key=None): def get_all_scripts_on_obj(self, obj, key=None):
""" """
Find all Scripts related to a particular object. Find all Scripts related to a particular object.
@ -68,7 +66,6 @@ class ScriptDBManager(TypedObjectManager):
else: else:
return self.filter(db_obj=obj) return self.filter(db_obj=obj)
@returns_typeclass_list
def get_all_scripts(self, key=None): def get_all_scripts(self, key=None):
""" """
Get all scripts in the database. Get all scripts in the database.
@ -200,7 +197,7 @@ class ScriptDBManager(TypedObjectManager):
elif obj: elif obj:
scripts = self.get_all_scripts_on_obj(obj, key=key) scripts = self.get_all_scripts_on_obj(obj, key=key)
else: else:
scripts = self.get_all_scripts(key=key) #self.model.get_all_cached_instances() scripts = self.get_all_scripts(key=key)
if not scripts: if not scripts:
# no scripts available to validate # no scripts available to validate
@ -216,7 +213,6 @@ class ScriptDBManager(TypedObjectManager):
VALIDATE_ITERATION -= 1 VALIDATE_ITERATION -= 1
return nr_started, nr_stopped return nr_started, nr_stopped
@returns_typeclass_list
def search_script(self, ostring, obj=None, only_timed=False): def search_script(self, ostring, obj=None, only_timed=False):
""" """
Search for a particular script. Search for a particular script.
@ -236,8 +232,8 @@ class ScriptDBManager(TypedObjectManager):
if dbref or dbref == 0: if dbref or dbref == 0:
# this is a dbref, try to find the script directly # this is a dbref, try to find the script directly
dbref_match = self.dbref_search(dbref) dbref_match = self.dbref_search(dbref)
if dbref_match and not ((obj and obj != dbref_match.obj) if dbref_match and not ((obj and obj != dbref_match.obj) or
or (only_timed and dbref_match.interval)): (only_timed and dbref_match.interval)):
return [dbref_match] return [dbref_match]
# not a dbref; normal search # not a dbref; normal search
@ -273,5 +269,6 @@ class ScriptDBManager(TypedObjectManager):
locks=new_locks, autostart=True) locks=new_locks, autostart=True)
return new_script return new_script
class ScriptManager(ScriptDBManager, TypeclassManager): class ScriptManager(ScriptDBManager, TypeclassManager):
pass pass

View file

@ -5,7 +5,6 @@ all Attributes and TypedObjects).
""" """
import shlex import shlex
from functools import update_wrapper
from django.db.models import Q from django.db.models import Q
from evennia.utils import idmapper from evennia.utils import idmapper
from evennia.utils.utils import make_iter, variable_from_module, to_unicode from evennia.utils.utils import make_iter, variable_from_module, to_unicode
@ -14,40 +13,6 @@ __all__ = ("TypedObjectManager", )
_GA = object.__getattribute__ _GA = object.__getattribute__
_Tag = None _Tag = None
#
# Decorators
#
def returns_typeclass_list(method):
"""
Decorator: Always returns a list, even if it is empty.
"""
def func(self, *args, **kwargs):
self.__doc__ = method.__doc__
raw_queryset = kwargs.pop('raw_queryset', False)
result = method(self, *args, **kwargs)
if raw_queryset:
return result
else:
return list(result)
return update_wrapper(func, method)
def returns_typeclass(method):
"""
Decorator: Returns a single typeclass match or None.
"""
def func(self, *args, **kwargs):
self.__doc__ = method.__doc__
query = method(self, *args, **kwargs)
if hasattr(query, "__iter__"):
result = list(query)
return result[0] if result else None
else:
return query
return update_wrapper(func, method)
# Managers # Managers
@ -59,7 +24,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
# common methods for all typed managers. These are used # common methods for all typed managers. These are used
# in other methods. Returns querysets. # in other methods. Returns querysets.
# Attribute manager methods # Attribute manager methods
def get_attribute(self, key=None, category=None, value=None, strvalue=None, obj=None, attrtype=None): def get_attribute(self, key=None, category=None, value=None, strvalue=None, obj=None, attrtype=None):
""" """
@ -125,7 +89,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
""" """
return self.get_attribute(key=key, category=category, value=value, strvalue=strvalue, obj=obj) return self.get_attribute(key=key, category=category, value=value, strvalue=strvalue, obj=obj)
@returns_typeclass_list
def get_by_attribute(self, key=None, category=None, value=None, strvalue=None, attrtype=None): def get_by_attribute(self, key=None, category=None, value=None, strvalue=None, attrtype=None):
""" """
Return objects having attributes with the given key, category, Return objects having attributes with the given key, category,
@ -257,7 +220,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
""" """
return self.get_tag(key=key, category=category, obj=obj, tagtype="alias") return self.get_tag(key=key, category=category, obj=obj, tagtype="alias")
@returns_typeclass_list
def get_by_tag(self, key=None, category=None, tagtype=None): def get_by_tag(self, key=None, category=None, tagtype=None):
""" """
Return objects having tags with a given key or category or Return objects having tags with a given key or category or
@ -384,7 +346,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
return None return None
return dbref return dbref
@returns_typeclass
def get_id(self, dbref): def get_id(self, dbref):
""" """
Find object with given dbref. Find object with given dbref.
@ -416,7 +377,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
""" """
return self.get_id(dbref) return self.get_id(dbref)
@returns_typeclass_list
def get_dbref_range(self, min_dbref=None, max_dbref=None): def get_dbref_range(self, min_dbref=None, max_dbref=None):
""" """
Get objects within a certain range of dbrefs. Get objects within a certain range of dbrefs.
@ -455,7 +415,6 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager):
self.filter(db_typeclass_path=typeclass_path).count() self.filter(db_typeclass_path=typeclass_path).count()
return dbtotals return dbtotals
@returns_typeclass_list
def typeclass_search(self, typeclass, include_children=False, include_parents=False): def typeclass_search(self, typeclass, include_children=False, include_parents=False):
""" """
Searches through all objects returning those which has a Searches through all objects returning those which has a
@ -720,5 +679,3 @@ class TypeclassManager(TypedObjectManager):
paths = [self.model.path] + ["%s.%s" % (cls.__module__, cls.__name__) paths = [self.model.path] + ["%s.%s" % (cls.__module__, cls.__name__)
for cls in self._get_subclasses(self.model)] for cls in self._get_subclasses(self.model)]
return super(TypeclassManager, self).all().filter(db_typeclass_path__in=paths) return super(TypeclassManager, self).all().filter(db_typeclass_path__in=paths)