Changed importing of SESSION_HANDLER to avoid circular imports when extending Portal or Server SessionHandler.

This commit is contained in:
Andrew Bastien 2023-05-11 20:39:30 -04:00
parent 3d3bd5e9d7
commit 53d963e14c
25 changed files with 118 additions and 152 deletions

View file

@ -30,6 +30,7 @@ except ImportError:
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.utils.safestring import SafeString
import evennia
from evennia.utils import logger
from evennia.utils.utils import is_iter, to_bytes, uses_database
@ -71,7 +72,6 @@ _SA = object.__setattr__
_FROM_MODEL_MAP = None
_TO_MODEL_MAP = None
_IGNORE_DATETIME_MODELS = None
_SESSION_HANDLER = None
def _IS_PACKED_DBOBJ(o):
@ -114,7 +114,7 @@ def _TO_DATESTRING(obj):
def _init_globals():
"""Lazy importing to avoid circular import issues"""
global _FROM_MODEL_MAP, _TO_MODEL_MAP, _SESSION_HANDLER, _IGNORE_DATETIME_MODELS
global _FROM_MODEL_MAP, _TO_MODEL_MAP, _IGNORE_DATETIME_MODELS
if not _FROM_MODEL_MAP:
_FROM_MODEL_MAP = defaultdict(str)
_FROM_MODEL_MAP.update(dict((c.model, c.natural_key()) for c in ContentType.objects.all()))
@ -129,9 +129,6 @@ def _init_globals():
for src_key, dst_key in settings.ATTRIBUTE_STORED_MODEL_RENAME:
_TO_MODEL_MAP[src_key] = _TO_MODEL_MAP.get(dst_key, None)
_IGNORE_DATETIME_MODELS.append(src_key)
if not _SESSION_HANDLER:
from evennia.server.sessionhandler import SESSION_HANDLER as _SESSION_HANDLER
#
# SaverList, SaverDict, SaverSet - Attribute-specific helper classes and functions
@ -609,7 +606,7 @@ def pack_session(item):
"""
_init_globals()
session = _SESSION_HANDLER.get(item.sessid)
session = evennia.SESSION_HANDLER.get(item.sessid)
if session and session.conn_time == item.conn_time:
# we require connection times to be identical for the Session
# to be accepted as actually being a session (sessids gets
@ -636,7 +633,7 @@ def unpack_session(item):
exists, None will be returned.
"""
_init_globals()
session = _SESSION_HANDLER.get(item[1])
session = evennia.SESSION_HANDLER.get(item[1])
if session and session.conn_time == item[2]:
# we require connection times to be identical for the Session
# to be accepted as the same as the one stored (sessids gets

View file

@ -13,6 +13,7 @@ from datetime import datetime, timedelta
from django.conf import settings
from django.db.utils import OperationalError
import evennia
from evennia import DefaultScript
from evennia.server.models import ServerConfig
from evennia.utils.create import create_script
@ -125,9 +126,8 @@ def portal_uptime():
Returns:
time (float): The uptime of the portal.
"""
from evennia.server.sessionhandler import SESSIONS
return time.time() - SESSIONS.portal_start_time
return time.time() - evennia.SESSION_HANDLER.portal_start_time
def game_epoch():

View file

@ -31,6 +31,7 @@ from django.test import TestCase, override_settings
from mock import MagicMock, Mock, patch
from twisted.internet.defer import Deferred
import evennia
from evennia import settings_default
from evennia.accounts.accounts import DefaultAccount
from evennia.commands.command import InterruptCommand
@ -43,7 +44,6 @@ from evennia.objects.objects import (
)
from evennia.scripts.scripts import DefaultScript
from evennia.server.serversession import ServerSession
from evennia.server.sessionhandler import SESSIONS
from evennia.utils import ansi, create
from evennia.utils.idmapper.models import flush_cache
from evennia.utils.utils import all_from_module, to_str
@ -234,18 +234,18 @@ class EvenniaTestMixin:
def setup_session(self):
dummysession = ServerSession()
dummysession.init_session("telnet", ("localhost", "testmode"), SESSIONS)
dummysession.init_session("telnet", ("localhost", "testmode"), evennia.SESSION_HANDLER)
dummysession.sessid = 1
SESSIONS.portal_connect(
evennia.SESSION_HANDLER.portal_connect(
dummysession.get_sync_data()
) # note that this creates a new Session!
session = SESSIONS.session_from_sessid(1) # the real session
SESSIONS.login(session, self.account, testmode=True)
session = evennia.SESSION_HANDLER.session_from_sessid(1) # the real session
evennia.SESSION_HANDLER.login(session, self.account, testmode=True)
self.session = session
def teardown_session(self):
if hasattr(self, "sessions"):
del SESSIONS[self.session.sessid]
del evennia.SESSION_HANDLER[self.session.sessid]
@patch("evennia.scripts.taskhandler.deferLater", _mock_deferlater)
def setUp(self):
@ -253,13 +253,13 @@ class EvenniaTestMixin:
Sets up testing environment
"""
self.backups = (
SESSIONS.data_out,
SESSIONS.disconnect,
evennia.SESSION_HANDLER.data_out,
evennia.SESSION_HANDLER.disconnect,
settings.DEFAULT_HOME,
settings.PROTOTYPE_MODULES,
)
SESSIONS.data_out = Mock()
SESSIONS.disconnect = Mock()
evennia.SESSION_HANDLER.data_out = Mock()
evennia.SESSION_HANDLER.disconnect = Mock()
self.create_accounts()
self.create_rooms()
@ -271,8 +271,8 @@ class EvenniaTestMixin:
def tearDown(self):
flush_cache()
try:
SESSIONS.data_out = self.backups[0]
SESSIONS.disconnect = self.backups[1]
evennia.SESSION_HANDLER.data_out = self.backups[0]
evennia.SESSION_HANDLER.disconnect = self.backups[1]
settings.DEFAULT_HOME = self.backups[2]
settings.PROTOTYPE_MODULES = self.backups[3]
except AttributeError as err:
@ -281,7 +281,7 @@ class EvenniaTestMixin:
"in your test, make sure you also added `super().setUp()`!"
)
del SESSIONS[self.session.sessid]
del evennia.SESSION_HANDLER[self.session.sessid]
self.teardown_accounts()
super().tearDown()
@ -422,7 +422,7 @@ class EvenniaCommandTestMixin:
cmdobj.cmdstring = cmdobj.cmdname # deprecated
cmdobj.args = input_args
cmdobj.cmdset = cmdset
cmdobj.session = SESSIONS.session_from_sessid(1)
cmdobj.session = evennia.SESSION_HANDLER.session_from_sessid(1)
cmdobj.account = self.account
cmdobj.raw_string = raw_string if raw_string is not None else cmdobj.key + " " + input_args
cmdobj.obj = obj or (caller if caller else self.char1)

View file

@ -34,6 +34,8 @@ from django.core.validators import validate_email as django_validate_email
from django.utils import timezone
from django.utils.html import strip_tags
from django.utils.translation import gettext as _
import evennia
from evennia.utils import logger
from simpleeval import simple_eval
from twisted.internet import reactor, threads
@ -1061,14 +1063,13 @@ def server_services():
services (dict): A dict of available services.
"""
from evennia.server.sessionhandler import SESSIONS
if hasattr(SESSIONS, "server") and hasattr(SESSIONS.server, "services"):
server = SESSIONS.server.services.namedServices
if hasattr(evennia.SESSION_HANDLER, "server") and hasattr(evennia.SESSION_HANDLER.server, "services"):
server = evennia.SESSION_HANDLER.server.services.namedServices
else:
# This function must be called from inside the evennia process.
server = {}
del SESSIONS
del evennia.SESSION_HANDLER
return server