diff --git a/docs/latest/Coding/Changelog.html b/docs/latest/Coding/Changelog.html
index c5e217bf44..e22aa1d784 100644
--- a/docs/latest/Coding/Changelog.html
+++ b/docs/latest/Coding/Changelog.html
@@ -49,10 +49,15 @@
Main branch
-Security dependency updates: Django >5.2.8 (<5.3), Django RestFramework 3.16
-Feat: Make at_pre_cmd
+Feat (backwards incompatble): Drop Python 3.11 support (supported: Python 3.12, 3.13, 3.14 (req)). (Griatch)
+Security: Django >=6.0.2 (<6.1), Django RestFramework 3.16 (Griatch)
+Update: XYZGrid contrib now requires scipy 1.15->1.17. Note: Pathfinding may pick different
+shortest routes from before, due to private changes in scipy Dijkstra algorithm (Griatch)
+Feat: Make at_pre_cmd testable in unit tests (blongden)
[Fix]: API /openapi/setattribute endpoints were both POST and PUT, causing schema
errors; now changed to PUT only. (Griatch)
+[Feat][issue2627]: Add settings.AUDIT_MASKS to customize what Evennia should
+obfuscate in server error logs (such as passwords from custom login commands) (Griatch)
Fix: Fix typo in basic_tc.py contrib for beginner tutorial (Tharic99)
Fix: EvMore wouldn’t pass Session to next cmd when exiting (gas-public-wooden-clean)
Fix: Admin page - Repair link to Account button (UserlandAlchemist)
@@ -72,6 +77,25 @@ removed in py3.12 for new installs (count-infinity)
ANSIString after reset (speeds up EvForm other string ops, fixes compatibility) (count-infinity)
Fix: Properly handle multimatch separations with native dashes, like
‘t-shirt-1’ (count-infinity)
+Fix: Allow CmdSetAttribute to use categery, view dicts by key (InspectorCaracal)
+Fix: Fix parsing issues in dice contrib (Griatch)
+Fix: Typeclass.objects.get_by_tag() will now always convert tag keys/categories to integers, to
+avoid inconsistencies with PostgreSQL databases (Griatch)
+[Fix][issue3513]: Fixed issue where OnDemandHandler could traceback on an
+un-pickle-able object and cause an error at server shutdown (Griatch)
+Fix: The :j command in EvEditor would squash empty lines (Griatch)
+Fix: Tutorial QuestHandler failed to load after server restart (Griatch)
+Fix: CmdSet.add(..., allow_duplicates=True) didn’t allow duplicate cmd keys (Griatch)
+Fix: Make filtering on AttributeProperties consistent across typeclasses (Griatch)
+Fix: Properly support \n in evennia connections long descriptions (Griatch)
+Fix: Handle all edge cases breaking monitor/monitored input_funcs (Griatch)
+Fix: Persistent EvMenu caused multiple cmdsets on reload (Griatch)
+Fix: Formatting of inner nested evtable would break (Griatch)
+Fix: MXP linking broke EvTable formatting (Griatch)
+Fix: Using |/ in EvTable broke padding (Griatch)
+Fix: Correctly use cached dijkstra results for XYZGrid (jaborsh)
+Fix: XYZGrid performance improvement in teleporter search (jaborsh)
+Fix: TraitHandler typo/bug fixes (jaborsh)
Doc: Move Evennia doc build system to latest Sphinx/myST
(PowershellNinja, also honorary mention to electroglyph)
Doc: Describe support for Telnet SSH in HAProxy documentation (holl0wstar)
diff --git a/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.html b/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.html
index 0c7f5b4fbd..bd0b06e0f0 100644
--- a/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.html
+++ b/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.html
@@ -61,7 +61,7 @@
At suitable times the quest’s progress is checked. This could happen on a timer or when trying to ‘hand in’ the quest. When checking, the current ‘step’ is checked against its finish conditions. If ok, that step is closed and the next step is checked until it either hits a step that is not yet complete, or there are no more steps, in which case the entire quest is complete.
To represent quests in code, we need
@@ -89,25 +89,25 @@
8 self.obj = obj
9 self.quest_classes = {}
10 self.quests = {}
-11 self._load()
-12
-13 def _load(self):
-14 self.quest_classes = self.obj.attributes.get(
+11 self._load()
+12
+13 def _load(self):
+14 self.quest_classes = self.obj.attributes.get(
15 self.quest_storage_attribute_key,
16 category=self.quest_storage_attribute_category,
17 default={},
-18 )
-19 # instantiate all quests
-20 for quest_key, quest_class in self.quest_classes.items():
-21 self.quests[quest_key] = quest_class(self.obj)
-22
-23 def _save(self):
-24 self.obj.attributes.add(
+18 )
+19 # instantiate all quests
+20 for quest_key, quest_class in self.quest_classes.items():
+21 self.quests[quest_key] = quest_class(self.obj, questhandler=self)
+22
+23 def _save(self):
+24 self.obj.attributes.add(
25 self.quest_storage_attribute_key,
26 self.quest_classes,
27 category=self.quest_storage_attribute_category,
-28 )
-29
+28 )
+29
30 def get(self, quest_key):
31 return self.quests.get(quest_key)
32
@@ -116,7 +116,7 @@
35
36 def add(self, quest_class):
37 self.quest_classes[quest_class.key] = quest_class
-38 self.quests[quest_class.key] = quest_class(self.obj)
+38 self.quests[quest_class.key] = quest_class(self.obj, questhandler=self)
39 self._save()
40
41 def remove(self, quest_key):
@@ -221,46 +221,48 @@ Instead we store only the classes, instantiate those classes with the Character,
7 key = "base-quest"
8 desc = "Base quest"
9 start_step = "start"
-10
-11 def __init__(self, quester):
-12 self.quester = quester
-13 self.data = self.questhandler.load_quest_data(self.key)
-14 self._current_step = self.get_data("current_step")
-15
-16 if not self.current_step:
-17 self.current_step = self.start_step
-18
-19 def add_data(self, key, value):
-20 self.data[key] = value
-21 self.questhandler.save_quest_data(self.key)
-22
-23 def get_data(self, key, default=None):
-24 return self.data.get(key, default)
-25
-26 def remove_data(self, key):
-27 self.data.pop(key, None)
-28 self.questhandler.save_quest_data(self.key)
-29
-30 @property
-31 def questhandler(self):
-32 return self.quester.quests
-33
-34 @property
-35 def current_step(self):
-36 return self._current_step
-37
-38 @current_step.setter
-39 def current_step(self, step_name):
-40 self._current_step = step_name
-41 self.add_data("current_step", step_name)
+10
+11 def __init__(self, quester, questhandler=None):
+12 self.quester = quester
+13 self._questhandler = questhandler
+14 self.data = self.questhandler.load_quest_data(self.key)
+15 self._current_step = self.get_data("current_step")
+16
+17 if not self.current_step:
+18 self.current_step = self.start_step
+19
+20 def add_data(self, key, value):
+21 self.data[key] = value
+22 self.questhandler.save_quest_data(self.key)
+23
+24 def get_data(self, key, default=None):
+25 return self.data.get(key, default)
+26
+27 def remove_data(self, key):
+28 self.data.pop(key, None)
+29 self.questhandler.save_quest_data(self.key)
+30
+31 @property
+32 def questhandler(self):
+33 return self._questhandler if self._questhandler else self.quester.quests
+34
+35 @property
+36 def current_step(self):
+37 return self._current_step
+38
+39 @current_step.setter
+40 def current_step(self, step_name):
+41 self._current_step = step_name
+42 self.add_data("current_step", step_name)
Line 7: Each class must have a .key property unquely identifying the quest. We depend on this in the quest-handler.
Line 12: quester (the Character) is passed into this class when it is initiated inside EvAdventureQuestHandler._load().
-Line 13: We load the quest data into self.data directly using the questhandler.load_quest-data method (which in turn loads it from an Attribute on the Character). Note that the .questhandler property is defined on lines 34-36 as a shortcut to get to the handler.
+Line 13: The handler is also passed in during loading, so this quest instance can use it directly without triggering recursion during lazy loading.
+Lines 17, 24 and 31: add_data and remove_data call back to questhandler.save_quest_data so persistence happens in one place.
-The add/get/remove_data methods are convenient wrappers for getting data in and out of the database using the matching methods on the handler. When we implement a quest we should prefer to use .get_data, add_data and remove_data over manipulating .data directly, since the former will make sure to save said that to the database automatically.
+The add/get/remove_data methods are convenient wrappers for getting data in and out of the database. When we implement a quest we should prefer to use .get_data, add_data and remove_data over manipulating .data directly, since the former will make sure to save said that to the database automatically.
The current_step tracks the current quest ‘step’ we are in; what this means is up to each Quest. We set up convenient properties for setting the current_state and also make sure to save it in the data dict as “current_step”.
The quest can have a few possible statuses: “started”, “completed”, “abandoned” and “failed”. We create a few properties and methods for easily control that, while saving everything under the hood:
# in evadventure/quests.py
diff --git a/docs/latest/Setup/Settings-Default.html b/docs/latest/Setup/Settings-Default.html
index 07e9e5af6b..5feb977cab 100644
--- a/docs/latest/Setup/Settings-Default.html
+++ b/docs/latest/Setup/Settings-Default.html
@@ -331,6 +331,25 @@ to change into myga
# debugging. OBS: Showing full tracebacks to regular users could be a
# security problem -turn this off in a production game!
IN_GAME_ERRORS = True
+# Default masking regexes used by security/audit logging to avoid writing
+# cleartext credentials to logs. Each entry is a dict mapping an arbitrary
+# label to a regex with a named group `(?P<secret>...)` indicating what to mask.
+# You can override this list in your settings.py, or append to it to support
+# custom login/password commands:
+# AUDIT_MASKS += [{"mycmd": r"^mycmd\\s+(?P<secret>.+)$"}]
+AUDIT_MASKS = [
+ {"connect": r'^\s*(?:connect|conn|con|co)\s+("[^"]+"|[^\s]+)\s+(?P<secret>.+)$'},
+ {"create": r'^\s*(?:create|cre|cr)\s+("[^"]+"|[^\s]+)\s+(?P<secret>.+)$'},
+ {"userpassword": r'^[@\s]*userpassword\s+(\w+|".+?")\s+=*\s*(?P<secret>[\w]+)$'},
+ {"userpassword": r"^.*new password set to '(?P<secret>[^']+)'\."},
+ {"userpassword": r"^.* has changed your password to '(?P<secret>[^']+)'\."},
+ {"password": r"^[@\s]*(?:password|passwd)\s+(?P<secret>.*)$"},
+ # Legacy typo-tolerant variants (kept for backwards compatibility with auditing behavior).
+ {"connect": r'^[@\s]*[connect]{5,8}\s+(".+?"|[^\s]+)\s+(?P<secret>.+)$'},
+ {"connect": r"^[@\s]*[connect]{5,8}\s+(?P<secret>[\w]+)$"},
+ {"create": r'^[^@]?[create]{5,6}\s+(\w+|".+?")\s+(?P<secret>[\w]+)$'},
+ {"create": r"^[^@]?[create]{5,6}\s+(?P<secret>[\w]+)$"},
+]
# Broadcast "Server restart"-like messages to all sessions.
BROADCAST_SERVER_RESTART_MESSAGES = True
diff --git a/docs/latest/_modules/django/contrib/auth.html b/docs/latest/_modules/django/contrib/auth.html
index 1e9c48d07f..c0a26c6aa4 100644
--- a/docs/latest/_modules/django/contrib/auth.html
+++ b/docs/latest/_modules/django/contrib/auth.html
@@ -275,8 +275,12 @@
await request.session.aset(SESSION_KEY, user._meta.pk.value_to_string(user))
await request.session.aset(BACKEND_SESSION_KEY, backend)
await request.session.aset(HASH_SESSION_KEY, session_auth_hash)
- if hasattr(request, "user"):
- request.user = user
+ if hasattr(request, "auser"):
+
+ async def auser():
+ return user
+
+ request.auser = auser
rotate_token(request)
await user_logged_in.asend(sender=user.__class__, request=request, user=user)
@@ -306,14 +310,17 @@
user = getattr(request, "auser", None)
if user is not None:
user = await user()
- if not getattr(user, "is_authenticated", True):
- user = None
+ if not getattr(user, "is_authenticated", True):
+ user = None
await user_logged_out.asend(sender=user.__class__, request=request, user=user)
await request.session.aflush()
- if hasattr(request, "user"):
+ if hasattr(request, "auser"):
from django.contrib.auth.models import AnonymousUser
- request.user = AnonymousUser()
+ async def auser():
+ return AnonymousUser()
+
+ request.auser = auser
def get_user_model():
@@ -398,8 +405,8 @@
session_hash_verified = False
else:
session_auth_hash = user.get_session_auth_hash()
- session_hash_verified = session_hash and constant_time_compare(
- session_hash, user.get_session_auth_hash()
+ session_hash_verified = constant_time_compare(
+ session_hash, session_auth_hash
)
if not session_hash_verified:
# If the current secret does not verify the session, try
@@ -442,7 +449,7 @@
async def aupdate_session_auth_hash(request, user):
"""See update_session_auth_hash()."""
await request.session.acycle_key()
- if hasattr(user, "get_session_auth_hash") and request.user == user:
+ if hasattr(user, "get_session_auth_hash") and await request.auser() == user:
await request.session.aset(HASH_SESSION_KEY, user.get_session_auth_hash())
diff --git a/docs/latest/_modules/django/contrib/auth/models.html b/docs/latest/_modules/django/contrib/auth/models.html
index eeddacc4c5..6a27eed122 100644
--- a/docs/latest/_modules/django/contrib/auth/models.html
+++ b/docs/latest/_modules/django/contrib/auth/models.html
@@ -119,7 +119,7 @@
return "%s | %s" % (self.content_type, self.name)
def natural_key(self):
-
return (self.codename,) + self.content_type.natural_key()
+
return (self.codename, *self.content_type.natural_key())
natural_key.dependencies = ["contenttypes.contenttype"]
@@ -270,9 +270,9 @@
self, perm, is_active=True, include_superusers=True, backend=None, obj=None
):
if backend is None:
-
backends = auth._get_backends(return_tuples=True)
+
backends = auth.get_backends()
if len(backends) == 1:
-
backend, _ = backends[0]
+
backend = backends[0]
else:
raise ValueError(
"You have multiple authentication backends configured and "
@@ -317,7 +317,7 @@
def _user_has_perm(user, perm, obj):
"""
-
A backend can raise `PermissionDenied` to short-circuit permission checking.
+
A backend can raise `PermissionDenied` to short-circuit permission checks.
"""
for backend in auth.get_backends():
if not hasattr(backend, "has_perm"):
@@ -345,7 +345,7 @@
def _user_has_module_perms(user, app_label):
"""
-
A backend can raise `PermissionDenied` to short-circuit permission checking.
+
A backend can raise `PermissionDenied` to short-circuit permission checks.
"""
for backend in auth.get_backends():
if not hasattr(backend, "has_module_perms"):
diff --git a/docs/latest/_modules/django/core/exceptions.html b/docs/latest/_modules/django/core/exceptions.html
index 318237264b..e0e9661acc 100644
--- a/docs/latest/_modules/django/core/exceptions.html
+++ b/docs/latest/_modules/django/core/exceptions.html
@@ -66,6 +66,10 @@
+
class ObjectNotUpdated(Exception):
+
"""The updated object no longer exists."""
+
+
class MultipleObjectsReturned(Exception):
"""The query returned multiple objects when only one was expected."""
diff --git a/docs/latest/_modules/django/core/paginator.html b/docs/latest/_modules/django/core/paginator.html
index 6174ff5a17..5465a8ff14 100644
--- a/docs/latest/_modules/django/core/paginator.html
+++ b/docs/latest/_modules/django/core/paginator.html
@@ -41,6 +41,9 @@
import warnings
from math import ceil
+
from asgiref.sync import iscoroutinefunction, sync_to_async
+
+
from django.utils.deprecation import RemovedInDjango70Warning
from django.utils.functional import cached_property
from django.utils.inspect import method_has_no_args
from django.utils.translation import gettext_lazy as _
@@ -62,9 +65,7 @@
pass
-
-
[docs]
-
class Paginator:
+
class BasePaginator:
# Translators: String used to replace omitted page numbers in elided page
# range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10].
ELLIPSIS = _("…")
@@ -74,8 +75,6 @@
"no_results": _("That page contains no results"),
}
-
-
[docs]
def __init__(
self,
object_list,
@@ -93,16 +92,89 @@
self.default_error_messages
if error_messages is None
else self.default_error_messages | error_messages
-
)
+
)
+
if self.per_page <= self.orphans:
+
# RemovedInDjango70Warning: When the deprecation ends, replace
+
# with:
+
# raise ValueError(
+
# "The orphans argument cannot be larger than or equal to the "
+
# "per_page argument."
+
# )
+
msg = (
+
"Support for the orphans argument being larger than or equal to the "
+
"per_page argument is deprecated. This will raise a ValueError in "
+
"Django 7.0."
+
)
+
warnings.warn(msg, category=RemovedInDjango70Warning, stacklevel=2)
+
def _check_object_list_is_ordered(self):
+
"""
+
Warn if self.object_list is unordered (typically a QuerySet).
+
"""
+
ordered = getattr(self.object_list, "ordered", None)
+
if ordered is not None and not ordered:
+
obj_list_repr = (
+
"{} {}".format(
+
self.object_list.model, self.object_list.__class__.__name__
+
)
+
if hasattr(self.object_list, "model")
+
else "{!r}".format(self.object_list)
+
)
+
warnings.warn(
+
"Pagination may yield inconsistent results with an unordered "
+
"object_list: {}.".format(obj_list_repr),
+
UnorderedObjectListWarning,
+
stacklevel=3,
+
)
-
def __iter__(self):
-
for page_number in self.page_range:
-
yield self.page(page_number)
+
def _get_elided_page_range(
+
self, number, num_pages, page_range, on_each_side=3, on_ends=2
+
):
+
"""
+
Return a 1-based range of pages with some values elided.
-
-
[docs]
-
def validate_number(self, number):
+
If the page range is larger than a given size, the whole range is not
+
provided and a compact form is returned instead, e.g. for a paginator
+
with 50 pages, if page 43 were the current page, the output, with the
+
default arguments, would be:
+
+
1, 2, …, 40, 41, 42, 43, 44, 45, 46, …, 49, 50.
+
"""
+
if num_pages <= (on_each_side + on_ends) * 2:
+
for page in page_range:
+
yield page
+
return
+
+
if number > (1 + on_each_side + on_ends) + 1:
+
for page in range(1, on_ends + 1):
+
yield page
+
yield self.ELLIPSIS
+
for page in range(number - on_each_side, number + 1):
+
yield page
+
else:
+
for page in range(1, number + 1):
+
yield page
+
+
if number < (num_pages - on_each_side - on_ends) - 1:
+
for page in range(number + 1, number + on_each_side + 1):
+
yield page
+
yield self.ELLIPSIS
+
for page in range(num_pages - on_ends + 1, num_pages + 1):
+
yield page
+
else:
+
for page in range(number + 1, num_pages + 1):
+
yield page
+
+
def _get_page(self, *args, **kwargs):
+
"""
+
Return an instance of a single page.
+
+
This hook can be used by subclasses to use an alternative to the
+
standard :cls:`Page` object.
+
"""
+
return Page(*args, **kwargs)
+
+
def _validate_number(self, number, num_pages):
"""Validate the given 1-based page number."""
try:
if isinstance(number, float) and not number.is_integer():
@@ -112,9 +184,22 @@
raise PageNotAnInteger(self.error_messages["invalid_page"])
if number < 1:
raise EmptyPage(self.error_messages["min_page"])
-
if number > self.num_pages:
+
if number > num_pages:
raise EmptyPage(self.error_messages["no_results"])
-
return number
+
return number
+
+
+
+
[docs]
+
class Paginator(BasePaginator):
+
def __iter__(self):
+
for page_number in self.page_range:
+
yield self.page(page_number)
+
+
+
[docs]
+
def validate_number(self, number):
+
return self._validate_number(number, self.num_pages)
@@ -145,15 +230,6 @@
return self._get_page(self.object_list[bottom:top], number, self)
-
def _get_page(self, *args, **kwargs):
-
"""
-
Return an instance of a single page.
-
-
This hook can be used by subclasses to use an alternative to the
-
standard :cls:`Page` object.
-
"""
-
return Page(*args, **kwargs)
-
@cached_property
def count(self):
"""Return the total number of objects, across all pages."""
@@ -178,62 +254,111 @@
"""
return range(1, self.num_pages + 1)
-
def _check_object_list_is_ordered(self):
-
"""
-
Warn if self.object_list is unordered (typically a QuerySet).
-
"""
-
ordered = getattr(self.object_list, "ordered", None)
-
if ordered is not None and not ordered:
-
obj_list_repr = (
-
"{} {}".format(
-
self.object_list.model, self.object_list.__class__.__name__
-
)
-
if hasattr(self.object_list, "model")
-
else "{!r}".format(self.object_list)
-
)
-
warnings.warn(
-
"Pagination may yield inconsistent results with an unordered "
-
"object_list: {}.".format(obj_list_repr),
-
UnorderedObjectListWarning,
-
stacklevel=3,
-
)
-
[docs]
def get_elided_page_range(self, number=1, *, on_each_side=3, on_ends=2):
-
"""
-
Return a 1-based range of pages with some values elided.
-
-
If the page range is larger than a given size, the whole range is not
-
provided and a compact form is returned instead, e.g. for a paginator
-
with 50 pages, if page 43 were the current page, the output, with the
-
default arguments, would be:
-
-
1, 2, …, 40, 41, 42, 43, 44, 45, 46, …, 49, 50.
-
"""
number = self.validate_number(number)
-
-
if self.num_pages <= (on_each_side + on_ends) * 2:
-
yield from self.page_range
-
return
-
-
if number > (1 + on_each_side + on_ends) + 1:
-
yield from range(1, on_ends + 1)
-
yield self.ELLIPSIS
-
yield from range(number - on_each_side, number + 1)
-
else:
-
yield from range(1, number + 1)
-
-
if number < (self.num_pages - on_each_side - on_ends) - 1:
-
yield from range(number + 1, number + on_each_side + 1)
-
yield self.ELLIPSIS
-
yield from range(self.num_pages - on_ends + 1, self.num_pages + 1)
-
else:
-
yield from range(number + 1, self.num_pages + 1)
+
yield from self._get_elided_page_range(
+
number, self.num_pages, self.page_range, on_each_side, on_ends
+
)
+
class AsyncPaginator(BasePaginator):
+
def __init__(
+
self,
+
object_list,
+
per_page,
+
orphans=0,
+
allow_empty_first_page=True,
+
error_messages=None,
+
):
+
super().__init__(
+
object_list, per_page, orphans, allow_empty_first_page, error_messages
+
)
+
self._cache_acount = None
+
self._cache_anum_pages = None
+
+
async def __aiter__(self):
+
page_range = await self.apage_range()
+
for page_number in page_range:
+
yield await self.apage(page_number)
+
+
async def avalidate_number(self, number):
+
num_pages = await self.anum_pages()
+
return self._validate_number(number, num_pages)
+
+
async def aget_page(self, number):
+
"""See Paginator.get_page()."""
+
try:
+
number = await self.avalidate_number(number)
+
except PageNotAnInteger:
+
number = 1
+
except EmptyPage:
+
number = await self.anum_pages()
+
return await self.apage(number)
+
+
async def apage(self, number):
+
"""See Paginator.page()."""
+
number = await self.avalidate_number(number)
+
bottom = (number - 1) * self.per_page
+
top = bottom + self.per_page
+
count = await self.acount()
+
if top + self.orphans >= count:
+
top = count
+
+
return self._get_page(self.object_list[bottom:top], number, self)
+
+
def _get_page(self, *args, **kwargs):
+
return AsyncPage(*args, **kwargs)
+
+
async def acount(self):
+
"""See Paginator.count()."""
+
if self._cache_acount is not None:
+
return self._cache_acount
+
c = getattr(self.object_list, "acount", None)
+
if (
+
iscoroutinefunction(c)
+
and not inspect.isbuiltin(c)
+
and method_has_no_args(c)
+
):
+
count = await c()
+
else:
+
count = len(self.object_list)
+
+
self._cache_acount = count
+
return count
+
+
async def anum_pages(self):
+
"""See Paginator.num_pages()."""
+
if self._cache_anum_pages is not None:
+
return self._cache_anum_pages
+
count = await self.acount()
+
if count == 0 and not self.allow_empty_first_page:
+
self._cache_anum_pages = 0
+
return self._cache_anum_pages
+
hits = max(1, count - self.orphans)
+
num_pages = ceil(hits / self.per_page)
+
+
self._cache_anum_pages = num_pages
+
return num_pages
+
+
async def apage_range(self):
+
"""See Paginator.page_range()"""
+
num_pages = await self.anum_pages()
+
return range(1, num_pages + 1)
+
+
async def aget_elided_page_range(self, number=1, *, on_each_side=3, on_ends=2):
+
number = await self.avalidate_number(number)
+
num_pages = await self.anum_pages()
+
page_range = await self.apage_range()
+
for page in self._get_elided_page_range(
+
number, num_pages, page_range, on_each_side, on_ends
+
):
+
yield page
+
+
class Page(collections.abc.Sequence):
def __init__(self, object_list, number, paginator):
self.object_list = object_list
@@ -292,6 +417,99 @@
if self.number == self.paginator.num_pages:
return self.paginator.count
return self.number * self.paginator.per_page
+
+
+
class AsyncPage:
+
def __init__(self, object_list, number, paginator):
+
self.object_list = object_list
+
self.number = number
+
self.paginator = paginator
+
+
def __repr__(self):
+
return "<Async Page %s>" % self.number
+
+
async def __aiter__(self):
+
if hasattr(self.object_list, "__aiter__"):
+
async for obj in self.object_list:
+
yield obj
+
else:
+
for obj in self.object_list:
+
yield obj
+
+
def __len__(self):
+
if not isinstance(self.object_list, list):
+
raise TypeError(
+
"AsyncPage.aget_object_list() must be awaited before calling len()."
+
)
+
return len(self.object_list)
+
+
def __reversed__(self):
+
if not isinstance(self.object_list, list):
+
raise TypeError(
+
"AsyncPage.aget_object_list() "
+
"must be awaited before calling reversed()."
+
)
+
+
return reversed(self.object_list)
+
+
def __getitem__(self, index):
+
if not isinstance(index, (int, slice)):
+
raise TypeError(
+
"AsyncPage indices must be integers or slices, not %s."
+
% type(index).__name__
+
)
+
+
if not isinstance(self.object_list, list):
+
raise TypeError(
+
"AsyncPage.aget_object_list() must be awaited before using indexing."
+
)
+
return self.object_list[index]
+
+
async def aget_object_list(self):
+
"""
+
Returns self.object_list as a list.
+
+
This method must be awaited before AsyncPage can be
+
treated as a sequence of self.object_list.
+
"""
+
if not isinstance(self.object_list, list):
+
if hasattr(self.object_list, "__aiter__"):
+
self.object_list = [obj async for obj in self.object_list]
+
else:
+
self.object_list = await sync_to_async(list)(self.object_list)
+
return self.object_list
+
+
async def ahas_next(self):
+
num_pages = await self.paginator.anum_pages()
+
return self.number < num_pages
+
+
async def ahas_previous(self):
+
return self.number > 1
+
+
async def ahas_other_pages(self):
+
has_previous = await self.ahas_previous()
+
has_next = await self.ahas_next()
+
return has_previous or has_next
+
+
async def anext_page_number(self):
+
return await self.paginator.avalidate_number(self.number + 1)
+
+
async def aprevious_page_number(self):
+
return await self.paginator.avalidate_number(self.number - 1)
+
+
async def astart_index(self):
+
"""See Page.start_index()."""
+
count = await self.paginator.acount()
+
if count == 0:
+
return 0
+
return (self.paginator.per_page * (self.number - 1)) + 1
+
+
async def aend_index(self):
+
"""See Page.end_index()."""
+
num_pages = await self.paginator.anum_pages()
+
if self.number == num_pages:
+
return await self.paginator.acount()
+
return self.number * self.paginator.per_page
diff --git a/docs/latest/_modules/django/db/models/aggregates.html b/docs/latest/_modules/django/db/models/aggregates.html
index 21570ba54a..1b60fbaa0c 100644
--- a/docs/latest/_modules/django/db/models/aggregates.html
+++ b/docs/latest/_modules/django/db/models/aggregates.html
@@ -41,8 +41,17 @@
"""
from django.core.exceptions import FieldError, FullResultSet
-from django.db.models.expressions import Case, ColPairs, Func, Star, Value, When
-from django.db.models.fields import IntegerField
+from django.db import NotSupportedError
+from django.db.models.expressions import (
+ Case,
+ ColPairs,
+ Func,
+ OrderByList,
+ Star,
+ Value,
+ When,
+)
+from django.db.models.fields import IntegerField, TextField
from django.db.models.functions import Coalesce
from django.db.models.functions.mixins import (
FixDurationInputMixin,
@@ -51,47 +60,97 @@
__all__ = [
"Aggregate",
+ "AnyValue",
"Avg",
"Count",
"Max",
"Min",
"StdDev",
+ "StringAgg",
"Sum",
"Variance",
]
+class AggregateFilter(Func):
+ arity = 1
+ template = " FILTER (WHERE %(expressions)s)"
+
+ def as_sql(self, compiler, connection, **extra_context):
+ if not connection.features.supports_aggregate_filter_clause:
+ raise NotSupportedError(
+ "Aggregate filter clauses are not supported on this database backend."
+ )
+ try:
+ return super().as_sql(compiler, connection, **extra_context)
+ except FullResultSet:
+ return "", ()
+
+ @property
+ def condition(self):
+ return self.source_expressions[0]
+
+ def __str__(self):
+ return self.arg_joiner.join(str(arg) for arg in self.source_expressions)
+
+
+class AggregateOrderBy(OrderByList):
+ template = " ORDER BY %(expressions)s"
+
+ def as_sql(self, compiler, connection, **extra_context):
+ if not connection.features.supports_aggregate_order_by_clause:
+ raise NotSupportedError(
+ "This database backend does not support specifying an order on "
+ "aggregates."
+ )
+
+ return super().as_sql(compiler, connection, **extra_context)
+
+
class Aggregate(Func):
- template = "%(function)s(%(distinct)s%(expressions)s)"
+ template = "%(function)s(%(distinct)s%(expressions)s%(order_by)s)%(filter)s"
contains_aggregate = True
name = None
- filter_template = "%s FILTER (WHERE %%(filter)s)"
window_compatible = True
allow_distinct = False
+ allow_order_by = False
empty_result_set_value = None
def __init__(
- self, *expressions, distinct=False, filter=None, default=None, **extra
+ self,
+ *expressions,
+ distinct=False,
+ filter=None,
+ default=None,
+ order_by=None,
+ **extra,
):
if distinct and not self.allow_distinct:
raise TypeError("%s does not allow distinct." % self.__class__.__name__)
+ if order_by and not self.allow_order_by:
+ raise TypeError("%s does not allow order_by." % self.__class__.__name__)
if default is not None and self.empty_result_set_value is not None:
raise TypeError(f"{self.__class__.__name__} does not allow default.")
+
self.distinct = distinct
- self.filter = filter
+ self.filter = None if filter is None else AggregateFilter(filter)
self.default = default
+ self.order_by = AggregateOrderBy.from_param(
+ f"{self.__class__.__name__}.order_by", order_by
+ )
super().__init__(*expressions, **extra)
def get_source_fields(self):
- # Don't return the filter expression since it's not a source field.
+ # Don't consider filter and order by expression as they have nothing
+ # to do with the output field resolution.
return [e._output_field_or_none for e in super().get_source_expressions()]
def get_source_expressions(self):
source_expressions = super().get_source_expressions()
- return source_expressions + [self.filter]
+ return [*source_expressions, self.filter, self.order_by]
def set_source_expressions(self, exprs):
- *exprs, self.filter = exprs
+ *exprs, self.filter, self.order_by = exprs
return super().set_source_expressions(exprs)
def resolve_expression(
@@ -148,35 +207,45 @@
return []
def as_sql(self, compiler, connection, **extra_context):
- extra_context["distinct"] = "DISTINCT " if self.distinct else ""
- if self.filter:
- if connection.features.supports_aggregate_filter_clause:
- try:
- filter_sql, filter_params = self.filter.as_sql(compiler, connection)
- except FullResultSet:
- pass
- else:
- template = self.filter_template % extra_context.get(
- "template", self.template
- )
- sql, params = super().as_sql(
- compiler,
- connection,
- template=template,
- filter=filter_sql,
- **extra_context,
- )
- return sql, (*params, *filter_params)
- else:
+ if (
+ self.distinct
+ and not connection.features.supports_aggregate_distinct_multiple_argument
+ and len(super().get_source_expressions()) > 1
+ ):
+ raise NotSupportedError(
+ f"{self.name} does not support distinct with multiple expressions on "
+ f"this database backend."
+ )
+
+ distinct_sql = "DISTINCT " if self.distinct else ""
+ order_by_sql = ""
+ order_by_params = []
+ filter_sql = ""
+ filter_params = []
+
+ if (order_by := self.order_by) is not None:
+ order_by_sql, order_by_params = compiler.compile(order_by)
+
+ if self.filter is not None:
+ try:
+ filter_sql, filter_params = compiler.compile(self.filter)
+ except NotSupportedError:
+ # Fallback to a CASE statement on backends that don't support
+ # the FILTER clause.
copy = self.copy()
copy.filter = None
source_expressions = copy.get_source_expressions()
- condition = When(self.filter, then=source_expressions[0])
+ condition = When(self.filter.condition, then=source_expressions[0])
copy.set_source_expressions([Case(condition)] + source_expressions[1:])
- return super(Aggregate, copy).as_sql(
- compiler, connection, **extra_context
- )
- return super().as_sql(compiler, connection, **extra_context)
+ return copy.as_sql(compiler, connection, **extra_context)
+
+ extra_context.update(
+ distinct=distinct_sql,
+ filter=filter_sql,
+ order_by=order_by_sql,
+ )
+ sql, params = super().as_sql(compiler, connection, **extra_context)
+ return sql, (*params, *order_by_params, *filter_params)
def _get_repr_options(self):
options = super()._get_repr_options()
@@ -184,9 +253,25 @@
options["distinct"] = self.distinct
if self.filter:
options["filter"] = self.filter
+ if self.order_by:
+ options["order_by"] = self.order_by
return options
+class AnyValue(Aggregate):
+ function = "ANY_VALUE"
+ name = "AnyValue"
+ arity = 1
+ window_compatible = False
+
+ def as_sql(self, compiler, connection, **extra_context):
+ if not connection.features.supports_any_value:
+ raise NotSupportedError(
+ "ANY_VALUE is not supported on this database backend."
+ )
+ return super().as_sql(compiler, connection, **extra_context)
+
+
class Avg(FixDurationInputMixin, NumericOutputFieldMixin, Aggregate):
function = "AVG"
name = "Avg"
@@ -219,17 +304,17 @@
[docs]
def resolve_expression(self, *args, **kwargs):
result = super().resolve_expression(*args, **kwargs)
- expr = result.source_expressions[0]
+ source_expressions = result.get_source_expressions()
# In case of composite primary keys, count the first column.
- if isinstance(expr, ColPairs):
+ if isinstance(expr := source_expressions[0], ColPairs):
if self.distinct:
raise ValueError(
"COUNT(DISTINCT) doesn't support composite primary keys"
)
- cols = expr.get_cols()
- return Count(cols[0], filter=result.filter)
+ source_expressions[0] = expr.get_cols()[0]
+ result.set_source_expressions(source_expressions)
return result
@@ -266,6 +351,88 @@
return {**super()._get_repr_options(), "sample": self.function == "STDDEV_SAMP"}
+class StringAggDelimiter(Func):
+ arity = 1
+ template = "%(expressions)s"
+
+ def __init__(self, value):
+ self.value = value
+ super().__init__(value)
+
+ def as_mysql(self, compiler, connection, **extra_context):
+ template = " SEPARATOR %(expressions)s"
+
+ return self.as_sql(
+ compiler,
+ connection,
+ template=template,
+ **extra_context,
+ )
+
+
+class StringAgg(Aggregate):
+ template = "%(function)s(%(distinct)s%(expressions)s%(order_by)s)%(filter)s"
+ function = "STRING_AGG"
+ name = "StringAgg"
+ allow_distinct = True
+ allow_order_by = True
+ output_field = TextField()
+
+ def __init__(self, expression, delimiter, **extra):
+ self.delimiter = StringAggDelimiter(delimiter)
+ super().__init__(expression, self.delimiter, **extra)
+
+ def as_oracle(self, compiler, connection, **extra_context):
+ if self.order_by:
+ template = (
+ "%(function)s(%(distinct)s%(expressions)s) WITHIN GROUP (%(order_by)s)"
+ "%(filter)s"
+ )
+ else:
+ template = "%(function)s(%(distinct)s%(expressions)s)%(filter)s"
+
+ return self.as_sql(
+ compiler,
+ connection,
+ function="LISTAGG",
+ template=template,
+ **extra_context,
+ )
+
+ def as_mysql(self, compiler, connection, **extra_context):
+ extra_context["function"] = "GROUP_CONCAT"
+
+ template = "%(function)s(%(distinct)s%(expressions)s%(order_by)s%(delimiter)s)"
+ extra_context["template"] = template
+
+ c = self.copy()
+ # The creation of the delimiter SQL and the ordering of the parameters
+ # must be handled explicitly, as MySQL puts the delimiter at the end of
+ # the aggregate using the `SEPARATOR` declaration (rather than treating
+ # as an expression like other database backends).
+ delimiter_params = []
+ if c.delimiter:
+ delimiter_sql, delimiter_params = compiler.compile(c.delimiter)
+ # Drop the delimiter from the source expressions.
+ c.source_expressions = c.source_expressions[:-1]
+ extra_context["delimiter"] = delimiter_sql
+
+ sql, params = c.as_sql(compiler, connection, **extra_context)
+
+ return sql, (*params, *delimiter_params)
+
+ def as_sqlite(self, compiler, connection, **extra_context):
+ if connection.get_database_version() < (3, 44):
+ return self.as_sql(
+ compiler,
+ connection,
+ function="GROUP_CONCAT",
+ **extra_context,
+ )
+
+ return self.as_sql(compiler, connection, **extra_context)
+
+
class Sum(FixDurationInputMixin, Aggregate):
function = "SUM"
name = "Sum"
diff --git a/docs/latest/_modules/django/db/models/base.html b/docs/latest/_modules/django/db/models/base.html
index 8853e4f025..72c52e3bd1 100644
--- a/docs/latest/_modules/django/db/models/base.html
+++ b/docs/latest/_modules/django/db/models/base.html
@@ -55,6 +55,7 @@
FieldError,
MultipleObjectsReturned,
ObjectDoesNotExist,
+ ObjectNotUpdated,
ValidationError,
)
from django.db import (
@@ -88,7 +89,6 @@
pre_save,
)
from django.db.models.utils import AltersData, make_model_tuple
-from django.utils.deprecation import RemovedInDjango60Warning
from django.utils.encoding import force_str
from django.utils.hashable import make_hashable
from django.utils.text import capfirst, get_text_list
@@ -212,6 +212,23 @@
attached_to=new_class,
),
)
+ new_class.add_to_class(
+ "NotUpdated",
+ subclass_exception(
+ "NotUpdated",
+ tuple(
+ x.NotUpdated
+ for x in parents
+ if hasattr(x, "_meta") and not x._meta.abstract
+ )
+ # Subclass DatabaseError as well for backward compatibility
+ # reasons as __subclasshook__ is not taken into account on
+ # exception handling.
+ or (ObjectNotUpdated, DatabaseError),
+ module,
+ attached_to=new_class,
+ ),
+ )
if base_meta and not base_meta.abstract:
# Non-abstract child classes inherit some attributes from their
# non-abstract parent (unless an ABC comes before it in the
@@ -273,7 +290,7 @@
# Collect the parent links for multi-table inheritance.
parent_links = {}
- for base in reversed([new_class] + parents):
+ for base in reversed([new_class, *parents]):
# Conceptually equivalent to `if base is Model`.
if not hasattr(base, "_meta"):
continue
@@ -371,7 +388,7 @@
new_class._meta.parents.update(base_parents)
# Inherit private fields (like GenericForeignKey) from the parent
- # class
+ # class if they are not overridden.
for field in base._meta.private_fields:
if field.name in field_names:
if not base._meta.abstract:
@@ -384,7 +401,10 @@
base.__name__,
)
)
- else:
+ elif (
+ field.name not in new_class.__dict__
+ and field.name not in inherited_attributes
+ ):
field = copy.deepcopy(field)
if not base._meta.abstract:
field.mti_inherited = True
@@ -517,10 +537,10 @@
# Set up the storage for instance state
self._state = ModelState()
- # There is a rather weird disparity here; if kwargs, it's set, then args
- # overrides it. It should be one or the other; don't duplicate the work
- # The reason for the kwargs check is that standard iterator passes in by
- # args, and instantiation for iteration is 33% faster.
+ # There is a rather weird disparity here; if kwargs, it's set, then
+ # args overrides it. It should be one or the other; don't duplicate the
+ # work The reason for the kwargs check is that standard iterator passes
+ # in by args, and instantiation for iteration is 33% faster.
if len(args) > len(opts.concrete_fields):
# Daft, but matches old exception sans the err msg.
raise IndexError("Number of args exceeds number of fields")
@@ -528,9 +548,9 @@
if not kwargs:
fields_iter = iter(opts.concrete_fields)
# The ordering of the zip calls matter - zip throws StopIteration
- # when an iter throws it. So if the first iter throws it, the second
- # is *not* consumed. We rely on this, so don't change the order
- # without changing the logic.
+ # when an iter throws it. So if the first iter throws it, the
+ # second is *not* consumed. We rely on this, so don't change the
+ # order without changing the logic.
for val, field in zip(args, fields_iter):
if val is _DEFERRED:
continue
@@ -564,7 +584,8 @@
is_related_object = True
except KeyError:
try:
- # Object instance wasn't passed in -- must be an ID.
+ # Object instance wasn't passed in -- must be an
+ # ID.
val = kwargs.pop(field.attname)
except KeyError:
val = field.get_default()
@@ -780,11 +801,12 @@
db_instance = db_instance_qs.get()
non_loaded_fields = db_instance.get_deferred_fields()
- for field in self._meta.concrete_fields:
+ for field in self._meta.fields:
if field.attname in non_loaded_fields:
# This field wasn't refreshed - skip ahead.
continue
- setattr(self, field.attname, getattr(db_instance, field.attname))
+ if field.concrete:
+ setattr(self, field.attname, getattr(db_instance, field.attname))
# Clear or copy cached foreign keys.
if field.is_relation:
if field.is_cached(db_instance):
@@ -830,50 +852,9 @@
return getattr(self, field_name)
return getattr(self, field.attname)
- # RemovedInDjango60Warning: When the deprecation ends, remove completely.
- def _parse_save_params(self, *args, method_name, **kwargs):
- defaults = {
- "force_insert": False,
- "force_update": False,
- "using": None,
- "update_fields": None,
- }
-
- warnings.warn(
- f"Passing positional arguments to {method_name}() is deprecated",
- RemovedInDjango60Warning,
- stacklevel=3,
- )
- total_len_args = len(args) + 1 # include self
- max_len_args = len(defaults) + 1
- if total_len_args > max_len_args:
- # Recreate the proper TypeError message from Python.
- raise TypeError(
- f"Model.{method_name}() takes from 1 to {max_len_args} positional "
- f"arguments but {total_len_args} were given"
- )
-
- def get_param(param_name, param_value, arg_index):
- if arg_index < len(args):
- if param_value is not defaults[param_name]:
- # Recreate the proper TypeError message from Python.
- raise TypeError(
- f"Model.{method_name}() got multiple values for argument "
- f"'{param_name}'"
- )
- return args[arg_index]
-
- return param_value
-
- return [get_param(k, v, i) for i, (k, v) in enumerate(kwargs.items())]
-
- # RemovedInDjango60Warning: When the deprecation ends, replace with:
- # def save(
- # self, *, force_insert=False, force_update=False, using=None, update_fields=None,
- # ):
def save(
self,
- *args,
+ *,
force_insert=False,
force_update=False,
using=None,
@@ -887,16 +868,6 @@
that the "save" must be an SQL insert or update (or equivalent for
non-SQL backends), respectively. Normally, they should not be set.
"""
- # RemovedInDjango60Warning.
- if args:
- force_insert, force_update, using, update_fields = self._parse_save_params(
- *args,
- method_name="save",
- force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields,
- )
self._prepare_related_fields_for_save(operation_name="save")
@@ -933,6 +904,7 @@
not force_insert
and deferred_non_generated_fields
and using == self._state.db
+ and self._is_pk_set()
):
field_names = set()
pk_fields = self._meta.pk_fields
@@ -952,28 +924,14 @@
save.alters_data = True
- # RemovedInDjango60Warning: When the deprecation ends, replace with:
- # async def asave(
- # self, *, force_insert=False, force_update=False, using=None, update_fields=None,
- # ):
async def asave(
self,
- *args,
+ *,
force_insert=False,
force_update=False,
using=None,
update_fields=None,
):
- # RemovedInDjango60Warning.
- if args:
- force_insert, force_update, using, update_fields = self._parse_save_params(
- *args,
- method_name="asave",
- force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields,
- )
return await sync_to_async(self.save)(
force_insert=force_insert,
force_update=force_update,
@@ -1166,7 +1124,8 @@
and all(f.has_default() or f.has_db_default() for f in meta.pk_fields)
):
force_insert = True
- # If possible, try an UPDATE. If that doesn't update anything, do an INSERT.
+ # If possible, try an UPDATE. If that doesn't update anything, do an
+ # INSERT.
if pk_set and not force_insert:
base_qs = cls._base_manager.using(using)
values = [
@@ -1179,13 +1138,36 @@
]
forced_update = update_fields or force_update
pk_val = self._get_pk_val(meta)
- updated = self._do_update(
- base_qs, using, pk_val, values, update_fields, forced_update
+ returning_fields = [
+ f
+ for f in meta.local_concrete_fields
+ if (
+ f.generated
+ and f.referenced_fields.intersection(non_pks_non_generated)
+ )
+ ]
+ for field, _model, value in values:
+ if (update_fields is None or field.name in update_fields) and hasattr(
+ value, "resolve_expression"
+ ):
+ returning_fields.append(field)
+ results = self._do_update(
+ base_qs,
+ using,
+ pk_val,
+ values,
+ update_fields,
+ forced_update,
+ returning_fields,
)
- if force_update and not updated:
- raise DatabaseError("Forced update did not affect any rows.")
- if update_fields and not updated:
- raise DatabaseError("Save with update_fields did not affect any rows.")
+ if updated := bool(results):
+ self._assign_returned_values(results[0], returning_fields)
+ elif force_update:
+ raise self.NotUpdated("Forced update did not affect any rows.")
+ elif update_fields:
+ raise self.NotUpdated(
+ "Save with update_fields did not affect any rows."
+ )
if not updated:
if meta.order_with_respect_to:
# If this is a model with an order_with_respect_to
@@ -1204,21 +1186,47 @@
),
)["_order__max"]
)
- fields = [
+ insert_fields = [
f
for f in meta.local_concrete_fields
if not f.generated and (pk_set or f is not meta.auto_field)
]
- returning_fields = meta.db_returning_fields
+ returning_fields = list(meta.db_returning_fields)
+ can_return_columns_from_insert = connections[
+ using
+ ].features.can_return_columns_from_insert
+ for field in insert_fields:
+ value = (
+ getattr(self, field.attname)
+ if raw
+ else field.pre_save(self, add=True)
+ )
+ if hasattr(value, "resolve_expression"):
+ if field not in returning_fields:
+ returning_fields.append(field)
+ elif (
+ field.db_returning
+ and not can_return_columns_from_insert
+ and not (pk_set and field is meta.auto_field)
+ ):
+ returning_fields.remove(field)
results = self._do_insert(
- cls._base_manager, using, fields, returning_fields, raw
+ cls._base_manager, using, insert_fields, returning_fields, raw
)
if results:
- for value, field in zip(results[0], returning_fields):
- setattr(self, field.attname, value)
+ self._assign_returned_values(results[0], returning_fields)
return updated
- def _do_update(self, base_qs, using, pk_val, values, update_fields, forced_update):
+ def _do_update(
+ self,
+ base_qs,
+ using,
+ pk_val,
+ values,
+ update_fields,
+ forced_update,
+ returning_fields,
+ ):
"""
Try to update the model. Return True if the model was updated (if an
update query was done and a matching row was found in the DB).
@@ -1227,24 +1235,26 @@
if not values:
# We can end up here when saving a model in inheritance chain where
# update_fields doesn't target any field in current model. In that
- # case we just say the update succeeded. Another case ending up here
- # is a model with just PK - in that case check that the PK still
- # exists.
- return update_fields is not None or filtered.exists()
+ # case we just say the update succeeded. Another case ending up
+ # here is a model with just PK - in that case check that the PK
+ # still exists.
+ if update_fields is not None or filtered.exists():
+ return [()]
+ return []
if self._meta.select_on_save and not forced_update:
- return (
- filtered.exists()
- and
- # It may happen that the object is deleted from the DB right after
- # this check, causing the subsequent UPDATE to return zero matching
- # rows. The same result can occur in some rare cases when the
- # database returns zero despite the UPDATE being executed
- # successfully (a row is matched and updated). In order to
- # distinguish these two cases, the object's existence in the
- # database is again checked for if the UPDATE query returns 0.
- (filtered._update(values) > 0 or filtered.exists())
- )
- return filtered._update(values) > 0
+ # It may happen that the object is deleted from the DB right after
+ # this check, causing the subsequent UPDATE to return zero matching
+ # rows. The same result can occur in some rare cases when the
+ # database returns zero despite the UPDATE being executed
+ # successfully (a row is matched and updated). In order to
+ # distinguish these two cases, the object's existence in the
+ # database is again checked for if the UPDATE query returns 0.
+ if not filtered.exists():
+ return []
+ if results := filtered._update(values, returning_fields):
+ return results
+ return [()] if filtered.exists() else []
+ return filtered._update(values, returning_fields)
def _do_insert(self, manager, using, fields, returning_fields, raw):
"""
@@ -1259,6 +1269,15 @@
raw=raw,
)
+ def _assign_returned_values(self, returned_values, returning_fields):
+ returning_fields_iter = iter(returning_fields)
+ for value, field in zip(returned_values, returning_fields_iter):
+ setattr(self, field.attname, value)
+ # Defer all fields that were meant to be updated with their database
+ # resolved values but couldn't as they are effectively stale.
+ for field in returning_fields_iter:
+ self.__dict__.pop(field.attname, None)
+
def _prepare_related_fields_for_save(self, operation_name, fields=None):
# Ensure that a model instance without a PK hasn't been assigned to
# a ForeignKey, GenericForeignKey or OneToOneField on this model. If
@@ -1392,7 +1411,7 @@
meta = meta or self._meta
field_map = {}
generated_fields = []
- for field in meta.local_concrete_fields:
+ for field in meta.local_fields:
if field.name in exclude:
continue
if field.generated:
@@ -1403,10 +1422,23 @@
continue
generated_fields.append(field)
continue
- value = getattr(self, field.attname)
+ if (
+ isinstance(field.remote_field, ForeignObjectRel)
+ and field not in meta.local_concrete_fields
+ ):
+ value = tuple(
+ getattr(self, from_field) for from_field in field.from_fields
+ )
+ if len(value) == 1:
+ value = value[0]
+ elif field.concrete:
+ value = getattr(self, field.attname)
+ else:
+ continue
if not value or not hasattr(value, "resolve_expression"):
value = Value(value, field)
field_map[field.name] = value
+ field_map[field.attname] = value
if "pk" not in exclude:
field_map["pk"] = Value(self.pk, meta.pk)
if generated_fields:
@@ -1431,7 +1463,8 @@
Hook for doing any extra model-wide validation after clean() has been
called on every field by self.clean_fields. Any ValidationError raised
by this method will not be associated with a particular field; it will
- have a special-case association with the field defined by NON_FIELD_ERRORS.
+ have a special-case association with the field defined by
+ NON_FIELD_ERRORS.
"""
pass
@@ -1781,45 +1814,12 @@
*cls._check_indexes(databases),
*cls._check_ordering(),
*cls._check_constraints(databases),
- *cls._check_default_pk(),
*cls._check_db_table_comment(databases),
*cls._check_composite_pk(),
]
return errors
- @classmethod
- def _check_default_pk(cls):
- if (
- not cls._meta.abstract
- and cls._meta.pk.auto_created
- and
- # Inherited PKs are checked in parents models.
- not (
- isinstance(cls._meta.pk, OneToOneField)
- and cls._meta.pk.remote_field.parent_link
- )
- and not settings.is_overridden("DEFAULT_AUTO_FIELD")
- and cls._meta.app_config
- and not cls._meta.app_config._is_default_auto_field_overridden
- ):
- return [
- checks.Warning(
- f"Auto-created primary key used when not defining a "
- f"primary key type, by default "
- f"'{settings.DEFAULT_AUTO_FIELD}'.",
- hint=(
- f"Configure the DEFAULT_AUTO_FIELD setting or the "
- f"{cls._meta.app_config.__class__.__qualname__}."
- f"default_auto_field attribute to point to a subclass "
- f"of AutoField, e.g. 'django.db.models.BigAutoField'."
- ),
- obj=cls,
- id="models.W042",
- ),
- ]
- return []
-
@classmethod
def _check_composite_pk(cls):
errors = []
@@ -1962,7 +1962,9 @@
@classmethod
def _check_m2m_through_same_relationship(cls):
- """Check if no relationship model is used by more than one m2m field."""
+ """
+ Check if no relationship model is used by more than one m2m field.
+ """
errors = []
seen_intermediary_signatures = []
@@ -2087,7 +2089,8 @@
@classmethod
def _check_column_name_clashes(cls):
- # Store a list of column names which have already been used by other fields.
+ # Store a list of column names which have already been used by other
+ # fields.
used_column_names = []
errors = []
@@ -2201,93 +2204,13 @@
@classmethod
def _check_indexes(cls, databases):
- """Check fields, names, and conditions of indexes."""
errors = []
- references = set()
- for index in cls._meta.indexes:
- # Index name can't start with an underscore or a number, restricted
- # for cross-database compatibility with Oracle.
- if index.name[0] == "_" or index.name[0].isdigit():
- errors.append(
- checks.Error(
- "The index name '%s' cannot start with an underscore "
- "or a number." % index.name,
- obj=cls,
- id="models.E033",
- ),
- )
- if len(index.name) > index.max_name_length:
- errors.append(
- checks.Error(
- "The index name '%s' cannot be longer than %d "
- "characters." % (index.name, index.max_name_length),
- obj=cls,
- id="models.E034",
- ),
- )
- if index.contains_expressions:
- for expression in index.expressions:
- references.update(
- ref[0] for ref in cls._get_expr_references(expression)
- )
for db in databases:
if not router.allow_migrate_model(db, cls):
continue
connection = connections[db]
- if not (
- connection.features.supports_partial_indexes
- or "supports_partial_indexes" in cls._meta.required_db_features
- ) and any(index.condition is not None for index in cls._meta.indexes):
- errors.append(
- checks.Warning(
- "%s does not support indexes with conditions."
- % connection.display_name,
- hint=(
- "Conditions will be ignored. Silence this warning "
- "if you don't care about it."
- ),
- obj=cls,
- id="models.W037",
- )
- )
- if not (
- connection.features.supports_covering_indexes
- or "supports_covering_indexes" in cls._meta.required_db_features
- ) and any(index.include for index in cls._meta.indexes):
- errors.append(
- checks.Warning(
- "%s does not support indexes with non-key columns."
- % connection.display_name,
- hint=(
- "Non-key columns will be ignored. Silence this "
- "warning if you don't care about it."
- ),
- obj=cls,
- id="models.W040",
- )
- )
- if not (
- connection.features.supports_expression_indexes
- or "supports_expression_indexes" in cls._meta.required_db_features
- ) and any(index.contains_expressions for index in cls._meta.indexes):
- errors.append(
- checks.Warning(
- "%s does not support indexes on expressions."
- % connection.display_name,
- hint=(
- "An index won't be created. Silence this warning "
- "if you don't care about it."
- ),
- obj=cls,
- id="models.W043",
- )
- )
- fields = [
- field for index in cls._meta.indexes for field, _ in index.fields_orders
- ]
- fields += [include for index in cls._meta.indexes for include in index.include]
- fields += references
- errors.extend(cls._check_local_fields(fields, "indexes"))
+ for index in cls._meta.indexes:
+ errors.extend(index.check(cls, connection))
return errors
@classmethod
@@ -2343,6 +2266,20 @@
id="models.E048",
)
)
+ elif (
+ isinstance(field.remote_field, ForeignObjectRel)
+ and field not in cls._meta.local_concrete_fields
+ and len(field.from_fields) > 1
+ ):
+ errors.append(
+ checks.Error(
+ f"{option!r} refers to a ForeignObject {field_name!r} with "
+ "multiple 'from_fields', which is not supported for that "
+ "option.",
+ obj=cls,
+ id="models.E049",
+ )
+ )
elif field not in cls._meta.local_fields:
errors.append(
checks.Error(
@@ -2568,7 +2505,7 @@
continue
connection = connections[db]
for constraint in cls._meta.constraints:
- errors.extend(constraint._check(cls, connection))
+ errors.extend(constraint.check(cls, connection))
return errors
diff --git a/docs/latest/_modules/django/db/models/expressions.html b/docs/latest/_modules/django/db/models/expressions.html
index 9f3a465f98..e72038d7ed 100644
--- a/docs/latest/_modules/django/db/models/expressions.html
+++ b/docs/latest/_modules/django/db/models/expressions.html
@@ -327,7 +327,8 @@
in this query
* reuse: a set of reusable joins for multijoins
* summarize: a terminal aggregate clause
- * for_save: whether this expression about to be used in a save or update
+ * for_save: whether this expression about to be used in a save or
+ update
Return: an Expression to be added to the query.
"""
@@ -387,9 +388,9 @@
As a guess, if the output fields of all source fields match then simply
infer the same type here.
- If a source's output field resolves to None, exclude it from this check.
- If all sources are None, then an error is raised higher up the stack in
- the output_field property.
+ If a source's output field resolves to None, exclude it from this
+ check. If all sources are None, then an error is raised higher up the
+ stack in the output_field property.
"""
# This guess is mostly a bad idea, but there is quite a lot of code
# (especially 3rd party Func subclasses) that depend on it, we'd need a
@@ -538,7 +539,8 @@
return sql, params
def get_expression_for_validation(self):
- # Ignore expressions that cannot be used during a constraint validation.
+ # Ignore expressions that cannot be used during a constraint
+ # validation.
if not getattr(self, "constraint_validation_compatible", True):
try:
(expression,) = self.get_source_expressions()
@@ -1184,7 +1186,7 @@
template = template or data.get("template", self.template)
arg_joiner = arg_joiner or data.get("arg_joiner", self.arg_joiner)
data["expressions"] = data["field"] = arg_joiner.join(sql_parts)
- return template % data, params
+ return template % data, tuple(params)
def copy(self):
copy = super().copy()
@@ -1323,7 +1325,8 @@
class DatabaseDefault(Expression):
"""
- Expression to use DEFAULT keyword during insert otherwise the underlying expression.
+ Expression to use DEFAULT keyword during insert otherwise the underlying
+ expression.
"""
def __init__(self, expression, output_field=None):
@@ -1379,7 +1382,7 @@
alias, column = self.alias, self.target.column
identifiers = (alias, column) if alias else (column,)
sql = ".".join(map(compiler.quote_name_unless_alias, identifiers))
- return sql, []
+ return sql, ()
def relabeled_clone(self, relabels):
if self.alias is None:
@@ -1540,6 +1543,21 @@
)
super().__init__(*expressions, **extra)
+ @classmethod
+ def from_param(cls, context, param):
+ if param is None:
+ return None
+ if isinstance(param, (list, tuple)):
+ if not param:
+ return None
+ return cls(*param)
+ elif isinstance(param, str) or hasattr(param, "resolve_expression"):
+ return cls(param)
+ raise ValueError(
+ f"{context} must be either a string reference to a "
+ f"field, an expression, or a list or tuple of them not {param!r}."
+ )
+
[docs]
@@ -1687,7 +1705,8 @@
):
c = super().resolve_expression(query, allow_joins, reuse, summarize, for_save)
if for_save and c.condition is not None:
-
# Resolve condition with for_save=False, since it's used as a filter.
+
# Resolve condition with for_save=False, since it's used as a
+
# filter.
c.condition = self.condition.resolve_expression(
query, allow_joins, reuse, summarize, for_save=False
)
@@ -1759,7 +1778,7 @@
return "<%s: %s>" % (self.__class__.__name__, self)
def get_source_expressions(self):
-
return self.cases + [self.default]
+
return [*self.cases, self.default]
def set_source_expressions(self, exprs):
*self.cases, self.default = exprs
@@ -1784,14 +1803,24 @@
except EmptyResultSet:
continue
except FullResultSet:
-
default_sql, default_params = compiler.compile(case.result)
+
default = case.result
break
case_parts.append(case_sql)
sql_params.extend(case_params)
else:
-
default_sql, default_params = compiler.compile(self.default)
-
if not case_parts:
-
return default_sql, default_params
+
default = self.default
+
if case_parts:
+
default_sql, default_params = compiler.compile(default)
+
else:
+
if (
+
isinstance(default, Value)
+
and (output_field := default._output_field_or_none) is not None
+
):
+
from django.db.models.functions import Cast
+
+
default = Cast(default, output_field)
+
return compiler.compile(default)
+
case_joiner = case_joiner or self.case_joiner
template_params["cases"] = case_joiner.join(case_parts)
template_params["default"] = default_sql
@@ -1829,6 +1858,7 @@
# Allow the usage of both QuerySet and sql.Query objects.
self.query = getattr(queryset, "query", queryset).clone()
self.query.subquery = True
+
self.template = extra.pop("template", self.template)
self.extra = extra
super().__init__(output_field)
@@ -1841,6 +1871,23 @@
def _resolve_output_field(self):
return self.query.output_field
+
def resolve_expression(self, *args, **kwargs):
+
resolved = super().resolve_expression(*args, **kwargs)
+
if type(self) is Subquery and self.template == Subquery.template:
+
resolved.query.contains_subquery = True
+
# Subquery is an unnecessary shim for a resolved query as it
+
# complexifies the lookup's right-hand-side introspection.
+
try:
+
self.output_field
+
except AttributeError:
+
return resolved.query
+
if self.output_field and type(self.output_field) is not type(
+
resolved.query.output_field
+
):
+
return ExpressionWrapper(resolved.query, output_field=self.output_field)
+
return resolved.query
+
return resolved
+
def copy(self):
clone = super().copy()
clone.query = clone.query.clone()
@@ -2031,16 +2078,7 @@
self.partition_by = (self.partition_by,)
self.partition_by = ExpressionList(*self.partition_by)
-
if self.order_by is not None:
-
if isinstance(self.order_by, (list, tuple)):
-
self.order_by = OrderByList(*self.order_by)
-
elif isinstance(self.order_by, (BaseExpression, str)):
-
self.order_by = OrderByList(self.order_by)
-
else:
-
raise ValueError(
-
"Window.order_by must be either a string reference to a "
-
"field, an expression, or a list or tuple of them."
-
)
+
self.order_by = OrderByList.from_param("Window.order_by", self.order_by)
super().__init__(output_field=output_field)
self.source_expression = self._parse_expressions(expression)[0]
diff --git a/docs/latest/_modules/django/db/models/fields.html b/docs/latest/_modules/django/db/models/fields.html
index ef73dcdb15..914dd44d4f 100644
--- a/docs/latest/_modules/django/db/models/fields.html
+++ b/docs/latest/_modules/django/db/models/fields.html
@@ -970,9 +970,7 @@
@property
def db_returning(self):
"""Private API intended only to be used by Django itself."""
-
return (
-
self.has_db_default() and connection.features.can_return_columns_from_insert
-
)
+
return self.has_db_default()
def set_attributes_from_name(self, name):
self.name = self.name or name
@@ -1035,7 +1033,8 @@
def get_db_prep_value(self, value, connection, prepared=False):
"""
-
Return field's value prepared for interacting with the database backend.
+
Return field's value prepared for interacting with the database
+
backend.
Used by the default implementations of get_db_prep_save().
"""
@@ -1377,7 +1376,7 @@
def _to_naive(value):
if timezone.is_aware(value):
-
value = timezone.make_naive(value, datetime.timezone.utc)
+
value = timezone.make_naive(value, datetime.UTC)
return value
@@ -1826,8 +1825,9 @@
@cached_property
def validators(self):
-
return super().validators + [
-
validators.DecimalValidator(self.max_digits, self.decimal_places)
+
return [
+
*super().validators,
+
validators.DecimalValidator(self.max_digits, self.decimal_places),
]
@cached_property
@@ -1964,8 +1964,8 @@
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
-
# We do not exclude max_length if it matches default as we want to change
-
# the default in future.
+
# We do not exclude max_length if it matches default as we want to
+
# change the default in future.
return name, path, args, kwargs
def formfield(self, **kwargs):
diff --git a/docs/latest/_modules/django/db/models/functions/comparison.html b/docs/latest/_modules/django/db/models/functions/comparison.html
index 6270d34e38..09441c9db3 100644
--- a/docs/latest/_modules/django/db/models/functions/comparison.html
+++ b/docs/latest/_modules/django/db/models/functions/comparison.html
@@ -74,7 +74,7 @@
compiler, connection, template=template, **extra_context
)
format_string = "%H:%M:%f" if db_type == "time" else "%Y-%m-%d %H:%M:%f"
-
params.insert(0, format_string)
+
params = (format_string, *params)
return sql, params
elif db_type == "date":
template = "date(%(expressions)s)"
diff --git a/docs/latest/_modules/django/db/models/query_utils.html b/docs/latest/_modules/django/db/models/query_utils.html
index 5aa0cdaf92..4dcc6275e5 100644
--- a/docs/latest/_modules/django/db/models/query_utils.html
+++ b/docs/latest/_modules/django/db/models/query_utils.html
@@ -322,9 +322,10 @@
# might be able to reuse the already loaded value. Refs #18343.
val = self._check_parent_chain(instance)
if val is None:
-
if not instance._is_pk_set() and self.field.generated:
+
if not instance._is_pk_set():
raise AttributeError(
-
"Cannot read a generated field from an unsaved model."
+
f"Cannot retrieve deferred field {field_name!r} "
+
"from an unsaved model."
)
instance.refresh_from_db(fields=[field_name])
else:
@@ -403,8 +404,9 @@
@staticmethod
def merge_dicts(dicts):
"""
-
Merge dicts in reverse to preference the order of the original list. e.g.,
-
merge_dicts([a, b]) will preference the keys in 'a' over those in 'b'.
+
Merge dicts in reverse to preference the order of the original list.
+
e.g., merge_dicts([a, b]) will preference the keys in 'a' over those in
+
'b'.
"""
merged = {}
for d in reversed(dicts):
@@ -536,8 +538,8 @@
# Restaurant.objects.filter(pk__in=Restaurant.objects.all()).
# If we didn't have the primary key check, then pk__in (== place__in) would
# give Place's opts as the target opts, but Restaurant isn't compatible
-
# with that. This logic applies only to primary keys, as when doing __in=qs,
-
# we are going to turn this into __in=qs.values('pk') later on.
+
# with that. This logic applies only to primary keys, as when doing
+
# __in=qs, we are going to turn this into __in=qs.values('pk') later on.
return check(target_opts) or (
getattr(field, "primary_key", False) and check(field.model._meta)
)
diff --git a/docs/latest/_modules/django/db/utils.html b/docs/latest/_modules/django/db/utils.html
index 20532ac3d3..f67330b4c0 100644
--- a/docs/latest/_modules/django/db/utils.html
+++ b/docs/latest/_modules/django/db/utils.html
@@ -105,6 +105,9 @@
"""
self.wrapper = wrapper
+
def __del__(self):
+
del self.wrapper
+
def __enter__(self):
pass
@@ -262,7 +265,8 @@
try:
method = getattr(router, action)
except AttributeError:
-
# If the router doesn't have a method, skip to the next one.
+
# If the router doesn't have a method, skip to the next
+
# one.
pass
else:
chosen_db = method(model, **hints)
diff --git a/docs/latest/_modules/django/utils/functional.html b/docs/latest/_modules/django/utils/functional.html
index 9386f1ed4a..a1431b5ab8 100644
--- a/docs/latest/_modules/django/utils/functional.html
+++ b/docs/latest/_modules/django/utils/functional.html
@@ -134,7 +134,7 @@
def __reduce__(self):
return (
_lazy_proxy_unpickle,
-
(func, self._args, self._kw) + resultclasses,
+
(func, self._args, self._kw, *resultclasses),
)
def __deepcopy__(self, memo):
diff --git a/docs/latest/_modules/django/utils/module_loading.html b/docs/latest/_modules/django/utils/module_loading.html
index cefc9d15cd..2044d6c9ca 100644
--- a/docs/latest/_modules/django/utils/module_loading.html
+++ b/docs/latest/_modules/django/utils/module_loading.html
@@ -58,8 +58,8 @@
[docs]
def import_string(dotted_path):
"""
-
Import a dotted module path and return the attribute/class designated by the
-
last name in the path. Raise ImportError if the import failed.
+
Import a dotted module path and return the attribute/class designated by
+
the last name in the path. Raise ImportError if the import failed.
"""
try:
module_path, class_name = dotted_path.rsplit(".", 1)
diff --git a/docs/latest/_modules/django/utils/text.html b/docs/latest/_modules/django/utils/text.html
index 4bd542f948..100511c84b 100644
--- a/docs/latest/_modules/django/utils/text.html
+++ b/docs/latest/_modules/django/utils/text.html
@@ -164,10 +164,11 @@
def handle_endtag(self, tag):
if tag not in self.void_elements:
self.output += f"</{tag}>"
-
try:
-
self.tags.remove(tag)
-
except ValueError:
-
pass
+
# Remove from the stack only if the tag matches the most recently
+
# opened tag (LIFO). This avoids O(n) linear scans for unmatched
+
# end tags if `deque.remove()` would be called.
+
if self.tags and self.tags[0] == tag:
+
self.tags.popleft()
def handle_data(self, data):
data, output = self.process(data)
@@ -431,6 +432,22 @@
yield buf.read()
+
async def acompress_sequence(sequence, *, max_random_bytes=None):
+
buf = StreamingBuffer()
+
filename = _get_random_filename(max_random_bytes) if max_random_bytes else None
+
with GzipFile(
+
filename=filename, mode="wb", compresslevel=6, fileobj=buf, mtime=0
+
) as zfile:
+
# Output headers...
+
yield buf.read()
+
async for item in sequence:
+
zfile.write(item)
+
data = buf.read()
+
if data:
+
yield data
+
yield buf.read()
+
+
# Expression to match some_token and some_token="with spaces" (and similarly
# for single-quoted strings).
smart_split_re = _lazy_re_compile(
diff --git a/docs/latest/_modules/enum.html b/docs/latest/_modules/enum.html
index 6171d9a987..878d5920bc 100644
--- a/docs/latest/_modules/enum.html
+++ b/docs/latest/_modules/enum.html
@@ -168,7 +168,7 @@
def bin(num, max_bits=None):
"""
Like built-in bin(), except negative values are represented in
-
twos-compliment, and the leading bit always indicates sign
+
twos-complement, and the leading bit always indicates sign
(0=positive, 1=negative).
>>> bin(10)
@@ -177,6 +177,7 @@
'0b1 0101'
"""
+
num = num.__index__()
ceiling = 2 ** (num).bit_length()
if num >= 0:
s = bltns.bin(num + ceiling).replace('1', '0', 1)
diff --git a/docs/latest/_modules/evennia/commands/cmdhandler.html b/docs/latest/_modules/evennia/commands/cmdhandler.html
index deec26da71..0a690f4880 100644
--- a/docs/latest/_modules/evennia/commands/cmdhandler.html
+++ b/docs/latest/_modules/evennia/commands/cmdhandler.html
@@ -716,7 +716,7 @@
pass
except Exception:
_msg_err(caller, _ERROR_UNTRAPPED)
-
raise ErrorReported(raw_string)
+
raise ErrorReported(cmd.raw_string)
finally:
_COMMAND_NESTING[called_by] -= 1
@@ -826,7 +826,7 @@
except ErrorReported as exc:
# this error was already reported, so we
# catch it here and don't pass it on.
-
logger.log_err("User input was: '%s'." % exc.raw_string)
+
logger.log_err("User input was: '%s'." % logger.mask_sensitive_input(exc.raw_string))
except ExecSystemCommand as exc:
# Not a normal command: run a system command, if available,
diff --git a/docs/latest/_modules/evennia/commands/cmdparser.html b/docs/latest/_modules/evennia/commands/cmdparser.html
index d18304843f..60f17bd040 100644
--- a/docs/latest/_modules/evennia/commands/cmdparser.html
+++ b/docs/latest/_modules/evennia/commands/cmdparser.html
@@ -49,7 +49,7 @@
from django.conf import settings
-
from evennia.utils.logger import log_trace
+
from evennia.utils.logger import log_trace, mask_sensitive_input
_MULTIMATCH_REGEX = re.compile(settings.SEARCH_MULTIMATCH_REGEX, re.I + re.U)
_CMD_IGNORE_PREFIXES = settings.CMD_IGNORE_PREFIXES
@@ -115,7 +115,7 @@
if cmdname:
matches.append(create_match(cmdname, raw_string, cmd, raw_cmdname))
except Exception:
-
log_trace("cmdhandler error. raw_input:%s" % raw_string)
+
log_trace("cmdhandler error. raw_input:%s" % mask_sensitive_input(raw_string))
return matches
diff --git a/docs/latest/_modules/evennia/commands/cmdset.html b/docs/latest/_modules/evennia/commands/cmdset.html
index 17e20c31fd..c09b91238b 100644
--- a/docs/latest/_modules/evennia/commands/cmdset.html
+++ b/docs/latest/_modules/evennia/commands/cmdset.html
@@ -595,17 +595,19 @@
if not hasattr(cmd, "obj") or cmd.obj is None:
cmd.obj = self.cmdsetobj
- # remove duplicates and add new
- for _dum in range(commands.count(cmd)):
- commands.remove(cmd)
+ if not allow_duplicates:
+ # remove duplicates and add new
+ for _dum in range(commands.count(cmd)):
+ commands.remove(cmd)
commands.append(cmd)
# add system_command to separate list as well,
# for quick look-up. These have no
if cmd.key.startswith("__"):
- # remove same-matches and add new
- for _dum in range(system_commands.count(cmd)):
- system_commands.remove(cmd)
+ if not allow_duplicates:
+ # remove same-matches and add new
+ for _dum in range(system_commands.count(cmd)):
+ system_commands.remove(cmd)
system_commands.append(cmd)
if not allow_duplicates:
diff --git a/docs/latest/_modules/evennia/commands/default/building.html b/docs/latest/_modules/evennia/commands/default/building.html
index c6f19bc467..5aa9bbda76 100644
--- a/docs/latest/_modules/evennia/commands/default/building.html
+++ b/docs/latest/_modules/evennia/commands/default/building.html
@@ -44,11 +44,10 @@
import re
import typing
+import evennia
from django.conf import settings
from django.core.paginator import Paginator
from django.db.models import Max, Min, Q
-
-import evennia
from evennia import InterruptCommand
from evennia.commands.cmdhandler import generate_cmdset_providers, get_and_merge_cmdsets
from evennia.locks.lockhandler import LockException
@@ -2033,12 +2032,21 @@
nested = False
for key, nested_keys in self.split_nested_attr(attr):
nested = True
- if obj.attributes.has(key):
- val = obj.attributes.get(key)
- val = self.do_nested_lookup(val, *nested_keys)
- if val is not self.not_found:
- return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}"
- error = f"\nAttribute {obj.name}/|w{attr} [category:{category}] does not exist."
+ if obj.attributes.has(key, category):
+ if nested_keys:
+ val = obj.attributes.get(key, category=category)
+ deep = self.do_nested_lookup(val, *nested_keys[:-1])
+ if deep is not self.not_found:
+ try:
+ val = deep[nested_keys[-1]]
+ except (IndexError, KeyError, TypeError):
+ continue
+ return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}"
+ else:
+ val = obj.attributes.get(key, category=category)
+ if val:
+ return f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] = {val}"
+ error = f"\nAttribute {obj.name}/|w{attr}|n [category:{category}] does not exist."
if nested:
error += " (Nested lookups attempted)"
return error
@@ -4618,23 +4626,23 @@
# treat as string
eval_err = err
prototype = utils.to_str(inp)
- finally:
- # it's possible that the input was a prototype-key, in which case
- # it's okay for the LITERAL_EVAL to fail. Only if the result does not
- # match the expected type do we have a problem.
- if not isinstance(prototype, expect):
- if eval_err:
- string = (
- f"{inp}\n{eval_err}\n|RCritical Python syntax error in argument. Only"
- " primitive Python structures are allowed. \nMake sure to use correct"
- " Python syntax. Remember especially to put quotes around all strings"
- " inside lists and dicts.|n For more advanced uses, embed funcparser"
- " callables ($funcs) in the strings."
- )
- else:
- string = f"Expected {expect}, got {type(prototype)}."
- self.msg(string)
- return
+
+ # validation - it's possible that the input was a prototype-key, in which case
+ # it's okay for the LITERAL_EVAL to fail. Only if the result does not
+ # match the expected type do we have a problem.
+ if not isinstance(prototype, expect):
+ if eval_err:
+ string = (
+ f"{inp}\n{eval_err}\n|RCritical Python syntax error in argument. Only"
+ " primitive Python structures are allowed. \nMake sure to use correct"
+ " Python syntax. Remember especially to put quotes around all strings"
+ " inside lists and dicts.|n For more advanced uses, embed funcparser"
+ " callables ($funcs) in the strings."
+ )
+ else:
+ string = f"Expected {expect}, got {type(prototype)}."
+ self.msg(string)
+ return
if expect == dict:
# an actual prototype. We need to make sure it's safe,
diff --git a/docs/latest/_modules/evennia/commands/default/tests.html b/docs/latest/_modules/evennia/commands/default/tests.html
index f01a22cae8..20a89fb27e 100644
--- a/docs/latest/_modules/evennia/commands/default/tests.html
+++ b/docs/latest/_modules/evennia/commands/default/tests.html
@@ -2260,6 +2260,28 @@
self.call(
building.CmdSpawn(), "/examine NO_EXISTS", "No prototype named 'NO_EXISTS' was found."
)
+
+
+
+
[docs]
+
def test_setattr_view_with_category(self):
+
"""
+
Test checking attributes with a category, including nested attributes.
+
"""
+
self.obj1.attributes.add("test", "value", category="cat")
+
self.call(
+
building.CmdSetAttribute(),
+
"Obj/test:cat",
+
"Attribute Obj/test [category:cat] = value",
+
)
+
+
# nested dict
+
self.obj1.attributes.add("testdict", {"key": "value"}, category="cat")
+
self.call(
+
building.CmdSetAttribute(),
+
"Obj/testdict['key']:cat",
+
"Attribute Obj/testdict['key'] [category:cat] = value",
+
)
diff --git a/docs/latest/_modules/evennia/contrib/game_systems/puzzles/tests.html b/docs/latest/_modules/evennia/contrib/game_systems/puzzles/tests.html
index 89f3941585..29e126396f 100644
--- a/docs/latest/_modules/evennia/contrib/game_systems/puzzles/tests.html
+++ b/docs/latest/_modules/evennia/contrib/game_systems/puzzles/tests.html
@@ -47,11 +47,10 @@
import itertools
import re
-from mock import Mock
-
from evennia.commands.default.tests import BaseEvenniaCommandTest
from evennia.utils import search
from evennia.utils.create import create_object
+from mock import Mock
from . import puzzles
@@ -86,7 +85,7 @@
def _keys(items):
return [item["key"] for item in items]
- recipes = search.search_script_tag("", category=puzzles._PUZZLES_TAG_CATEGORY)
+ recipes = search.search_script_tag(category=puzzles._PUZZLES_TAG_CATEGORY)
self.assertEqual(expected_count, len(recipes))
self.assertEqual(name, recipes[expected_count - 1].db.puzzle_name)
self.assertEqual(parts, _keys(recipes[expected_count - 1].db.parts))
diff --git a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/tests.html b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/tests.html
index d942fecc1f..6b2927949c 100644
--- a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/tests.html
+++ b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/tests.html
@@ -47,9 +47,8 @@
from unittest import mock
from django.test import TestCase
-from parameterized import parameterized
-
from evennia.utils.test_resources import BaseEvenniaCommandTest, BaseEvenniaTest
+from parameterized import parameterized
from . import commands, xymap, xymap_legend, xyzgrid, xyzroom
@@ -486,14 +485,15 @@
[docs]
def test_get_shortest_path(self):
directions, path = self.map.get_shortest_path((0, 0), (1, 1))
- self.assertEqual(directions, ["e", "n"])
+ # self.assertEqual(directions, ["e", "n"])
+ self.assertEqual(directions, ["n", "e"])
self.assertEqual(
[str(node) for node in path],
[
str(self.map.node_index_map[0]),
- "<LinkNode '-' XY=(0.5,0)>",
- str(self.map.node_index_map[1]),
- "<LinkNode '|' XY=(1,0.5)>",
+ "<LinkNode '|' XY=(0,0.5)>",
+ str(self.map.node_index_map[2]),
+ "<LinkNode '-' XY=(0.5,1)>",
str(self.map.node_index_map[3]),
],
)
@@ -758,9 +758,11 @@
((4, 1), (4, 3), ("ne", "nw")),
((2, 2), (3, 5), ("nw", "ne")),
((2, 2), (1, 5), ("nw", "ne", "w")),
- ((5, 5), (0, 0), ("sw", "nw", "sw", "s", "s", "sw")),
- ((5, 5), (0, 0), ("sw", "nw", "sw", "s", "s", "sw")),
- ((5, 2), (1, 2), ("sw", "nw", "w", "nw", "s")),
+ # ((5, 5), (0, 0), ("sw", "nw", "sw", "s", "s", "sw")),
+ ((5, 5), (0, 0), ("sw", "nw", "sw", "se", "sw", "sw")),
+ ((5, 5), (0, 0), ("sw", "nw", "sw", "se", "sw", "sw")),
+ # ((5, 2), (1, 2), ("sw", "nw", "w", "nw", "s")),
+ ((5, 2), (1, 2), ("nw", "n", "nw", "sw", "s")),
((4, 1), (1, 1), ("nw", "w", "sw")),
]
)
@@ -836,7 +838,8 @@
((4, 1), (1, 0), ("w", "w", "n", "e", "s")),
((1, 2), (2, 3), ("ne",)), # cross x
((1, 2), (2, 3), ("ne",)),
- ((2, 2), (0, 4), ("w", "ne", "nw", "w")),
+ # ((2, 2), (0, 4), ("w", "ne", "nw", "w")),
+ ((2, 2), (0, 4), ("ne", "w", "nw", "w")),
]
)
def test_shortest_path(self, startcoord, endcoord, expected_directions):
@@ -1039,7 +1042,8 @@
((1, 1), (2, 2), ("n", "w", "s")),
((5, 3), (5, 3), ()),
((5, 3), (0, 4), ("s", "n", "n", "w")),
- ((1, 4), (3, 3), ("e", "w", "e")),
+ # ((1, 4), (3, 3), ("e", "w", "e")),
+ ((1, 4), (3, 3), ("w", "s", "e")),
]
)
def test_shortest_path(self, startcoord, endcoord, expected_directions):
diff --git a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap.html b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap.html
index 258f967f9c..83f61eabd2 100644
--- a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap.html
+++ b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap.html
@@ -679,6 +679,7 @@
# we can re-use the stored data!
self.dist_matrix = dist_matrix
self.pathfinding_routes = pathfinding_routes
+ return
# build a matrix representing the map graph, with 0s as impassable areas
diff --git a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap_legend.html b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap_legend.html
index 1ac503a5cd..1c9079d403 100644
--- a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap_legend.html
+++ b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xymap_legend.html
@@ -1070,16 +1070,14 @@
'pointing to an empty space' error we'd get if returning `None`.
"""
- xygrid = self.xymap.xygrid
if not self.paired_teleporter:
- # scan for another teleporter
- symbol = self.symbol
- found_teleporters = []
- for iy, line in xygrid.items():
- for ix, node_or_link in xygrid[iy].items():
- if node_or_link.symbol == symbol and node_or_link is not self:
- found_teleporters.append(node_or_link)
-
+ # find the matching teleporter via pre-built symbol map
+ found_teleporters = [
+ comp
+ for comp in self.xymap.symbol_map.get(self.symbol, [])
+ if comp is not self
+ ]
+
if not found_teleporters:
raise MapParserError("found no matching teleporter to link to.", self)
if len(found_teleporters) > 1:
diff --git a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xyzroom.html b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xyzroom.html
index 6484c02c07..679d3e7693 100644
--- a/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xyzroom.html
+++ b/docs/latest/_modules/evennia/contrib/grid/xyzgrid/xyzroom.html
@@ -116,6 +116,7 @@
if z == wildcard
else Q(db_tags__db_key__iexact=str(z), db_tags__db_category=MAP_Z_TAG_CATEGORY)
)
+ .distinct()
)
@@ -143,9 +144,12 @@
"""
# filter by tags, then figure out of we got a single match or not
query = self.filter_xyz(xyz=xyz, **kwargs)
- ncount = query.count()
+ # Avoid expensive count() on multi-join tag queries; we only need to
+ # know if there are 0, 1 or more than 1 unique matches.
+ matches = list(query[:2])
+ ncount = len(matches)
if ncount == 1:
- return query.first()
+ return matches[0]
# error - mimic default get() behavior but with a little more info
x, y, z = xyz
@@ -236,6 +240,7 @@
db_tags__db_key__iexact=str(zdest), db_tags__db_category=MAP_ZDEST_TAG_CATEGORY
)
)
+ .distinct()
)
@@ -285,6 +290,7 @@
.filter(
db_tags__db_key__iexact=str(zdest), db_tags__db_category=MAP_ZDEST_TAG_CATEGORY
)
+ .distinct()
.get(**kwargs)
)
except self.model.DoesNotExist:
diff --git a/docs/latest/_modules/evennia/contrib/rpg/dice/dice.html b/docs/latest/_modules/evennia/contrib/rpg/dice/dice.html
index 9b164cc05a..103149f643 100644
--- a/docs/latest/_modules/evennia/contrib/rpg/dice/dice.html
+++ b/docs/latest/_modules/evennia/contrib/rpg/dice/dice.html
@@ -299,8 +299,10 @@
def func(self):
"""Mostly parsing for calling the dice roller function"""
+ helptxt = "Usage: @dice <nr>d<sides> [modifier] [conditional]"
+
if not self.args:
- self.caller.msg("Usage: @dice <nr>d<sides> [modifier] [conditional]")
+ self.caller.msg(helptxt)
return
argstring = "".join(str(arg) for arg in self.args)
@@ -310,36 +312,48 @@
conditional = None
if len_parts < 3 or parts[1] != "d":
- self.caller.msg(
- "You must specify the die roll(s) as <nr>d<sides>."
- " For example, 2d6 means rolling a 6-sided die 2 times."
- )
+ self.caller.msg(f"Malformed input. {helptxt}")
return
# Limit the number of dice and sides a character can roll to prevent server slow down and crashes
ndicelimit = 10000 # Maximum number of dice
nsidelimit = 10000 # Maximum number of sides
- if int(parts[0]) > ndicelimit or int(parts[2]) > nsidelimit:
- self.caller.msg("The maximum roll allowed is %sd%s." % (ndicelimit, nsidelimit))
+ try:
+ if int(parts[0]) > ndicelimit or int(parts[2]) > nsidelimit:
+ self.caller.msg("The maximum roll allowed is %sd%s." % (ndicelimit, nsidelimit))
+ return
+ except ValueError:
+ self.caller.msg(f"Malformed input. {helptxt}")
return
- ndice, nsides = parts[0], parts[2]
if len_parts == 3:
# just something like 1d6
+ ndice, nsides = parts[0], parts[2]
pass
elif len_parts == 5:
# either e.g. 1d6 + 3 or something like 1d6 > 3
+ ndice, nsides = parts[0], parts[2]
if parts[3] in ("+", "-", "*", "/"):
modifier = (parts[3], parts[4])
- else: # assume it is a conditional
+ elif parts[3] in ("<", ">", "<=", ">=", "!=", "=="):
conditional = (parts[3], parts[4])
+ else:
+ self.caller.msg(f"Malformed input. {helptxt}")
+ return
elif len_parts == 7:
# the whole sequence, e.g. 1d6 + 3 > 5
- modifier = (parts[3], parts[4])
- conditional = (parts[5], parts[6])
+ ndice, nsides = parts[0], parts[2]
+ err = parts[3] not in ("+", "-", "*", "/")
+ err = err or parts[5] not in ("<", ">", "<=", ">=", "!=", "==")
+ if err:
+ self.caller.msg(f"Malformed input. {helptxt}")
+ return
+ else:
+ modifier = (parts[3], parts[4])
+ conditional = (parts[5], parts[6])
else:
# error
- self.caller.msg("You must specify a valid die roll")
+ self.caller.msg(f"Malformed input. {helptxt}")
return
# do the roll
try:
diff --git a/docs/latest/_modules/evennia/contrib/rpg/dice/tests.html b/docs/latest/_modules/evennia/contrib/rpg/dice/tests.html
index 4b4669c3bf..1ce3671e39 100644
--- a/docs/latest/_modules/evennia/contrib/rpg/dice/tests.html
+++ b/docs/latest/_modules/evennia/contrib/rpg/dice/tests.html
@@ -87,6 +87,18 @@
dice.roll(11, 1001, max_dicenum=10, max_dicetype=1000)
with self.assertRaises(TypeError):
dice.roll(10, 1001, max_dicenum=10, max_dicetype=1000)
+
+
+
diff --git a/docs/latest/_modules/evennia/contrib/rpg/traits/traits.html b/docs/latest/_modules/evennia/contrib/rpg/traits/traits.html
index 176174306a..4c9ddead8c 100644
--- a/docs/latest/_modules/evennia/contrib/rpg/traits/traits.html
+++ b/docs/latest/_modules/evennia/contrib/rpg/traits/traits.html
@@ -544,7 +544,7 @@
if hasattr(cls, "trait_type"):
trait_type = cls.trait_type
else:
- trait_type = str(cls.__name___).lower()
+ trait_type = str(cls.__name__).lower()
_TRAIT_CLASSES[trait_type] = cls
@@ -962,7 +962,7 @@
if not isinstance(trait_data, _SaverDict):
logger.log_warn(
- f"Non-persistent Trait data (type(trait_data)) loaded for {type(self).__name__}."
+ f"Non-persistent Trait data ({type(trait_data).__name__}) loaded for {type(self).__name__}."
)
@@ -1286,7 +1286,7 @@
def base(self, value):
if value is None:
self._data["base"] = self.default_keys["base"]
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
self._data["base"] = value
@property
@@ -1478,7 +1478,7 @@
def base(self, value):
if value is None:
self._data["base"] = self.default_keys["base"]
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
if self.min is not None and value + self.mod < self.min:
value = self.min - self.mod
if self.max is not None and value + self.mod > self.max:
@@ -1494,7 +1494,7 @@
if value is None:
# unsetting the boundary to default
self._data["mod"] = self.default_keys["mod"]
- elif type(value) in (int, float):
+ elif isinstance(value, (int, float)):
if self.min is not None and value + self.base < self.min:
value = self.min - self.base
if self.max is not None and value + self.base > self.max:
@@ -1523,7 +1523,7 @@
if value is None:
# unsetting the boundary
self._data["min"] = value
- elif type(value) in (int, float):
+ elif isinstance(value, (int, float)):
if self.max is not None:
value = min(self.max, value)
self._data["min"] = min(value, self.base + self.mod)
@@ -1537,7 +1537,7 @@
if value is None:
# unsetting the boundary
self._data["max"] = value
- elif type(value) in (int, float):
+ elif isinstance(value, (int, float)):
if self.min is not None:
value = max(self.min, value)
self._data["max"] = max(value, self.base + self.mod)
@@ -1549,7 +1549,7 @@
@current.setter
def current(self, value):
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
self._data["current"] = self._check_and_start_timer(self._enforce_boundaries(value))
@current.deleter
@@ -1721,7 +1721,7 @@
@base.setter
def base(self, value):
"""Limit so base+mod can never go below min."""
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
if value + self.mod < self.min:
value = self.min - self.mod
self._data["base"] = value
@@ -1733,7 +1733,7 @@
@mod.setter
def mod(self, value):
"""Limit so base+mod can never go below min."""
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
if value + self.base < self.min:
value = self.min - self.base
self._data["mod"] = value
@@ -1761,7 +1761,7 @@
"""Limit so min can never be greater than (base+mod)*mult."""
if value is None:
self._data["min"] = self.default_keys["min"]
- elif type(value) in (int, float):
+ elif isinstance(value, (int, float)):
self._data["min"] = min(value, (self.base + self.mod) * self.mult)
@property
@@ -1790,7 +1790,7 @@
@current.setter
def current(self, value):
- if type(value) in (int, float):
+ if isinstance(value, (int, float)):
self._data["current"] = self._check_and_start_timer(self._enforce_boundaries(value))
@current.deleter
diff --git a/docs/latest/_modules/evennia/contrib/tutorials/evadventure/quests.html b/docs/latest/_modules/evennia/contrib/tutorials/evadventure/quests.html
index 4cd8735323..0b4daf099f 100644
--- a/docs/latest/_modules/evennia/contrib/tutorials/evadventure/quests.html
+++ b/docs/latest/_modules/evennia/contrib/tutorials/evadventure/quests.html
@@ -106,8 +106,9 @@
[docs]
-
def __init__(self, quester):
+
def __init__(self, quester, questhandler=None):
self.quester = quester
+
self._questhandler = questhandler
self.data = self.questhandler.load_quest_data(self.key)
self._current_step = self.get_data("current_step")
@@ -163,7 +164,7 @@
@property
def questhandler(self):
-
return self.quester.quests
+
return self._questhandler if self._questhandler else self.quester.quests
@property
def current_step(self):
@@ -336,7 +337,7 @@
)
# instantiate all quests
for quest_key, quest_class in self.quest_classes.items():
-
self.quests[quest_key] = quest_class(self.obj)
+
self.quests[quest_key] = quest_class(self.obj, questhandler=self)
def _save(self):
self.obj.attributes.add(
@@ -403,7 +404,7 @@
"""
self.quest_classes[quest_class.key] = quest_class
-
self.quests[quest_class.key] = quest_class(self.obj)
+
self.quests[quest_class.key] = quest_class(self.obj, questhandler=self)
self._save()
diff --git a/docs/latest/_modules/evennia/contrib/tutorials/evadventure/tests/test_quests.html b/docs/latest/_modules/evennia/contrib/tutorials/evadventure/tests/test_quests.html
index 3950556178..a53af6b8cf 100644
--- a/docs/latest/_modules/evennia/contrib/tutorials/evadventure/tests/test_quests.html
+++ b/docs/latest/_modules/evennia/contrib/tutorials/evadventure/tests/test_quests.html
@@ -44,6 +44,7 @@
from unittest.mock import MagicMock
+from evennia.utils import create
from evennia.utils.test_resources import BaseEvenniaTest
from .. import quests
@@ -198,6 +199,28 @@
quest.progress()
self.assertEqual(quest.current_step, "C") # still on last step
self.assertEqual(quest.is_completed, True)
+
+
+
+
[docs]
+
def test_questhandler_reload_after_restart(self):
+
"""
+
Test #3560: quest handler should reload and keep quest data after restart.
+
"""
+
quest = self._get_quest()
+
questgiver = create.create_object(
+
EvAdventureObject, key="questgiver", location=self.location
+
)
+
quest.add_data("client", questgiver)
+
+
# simulate server restart by clearing lazy-property cache
+
self.character.__dict__.pop("quests", None)
+
+
reloaded_quest = self.character.quests.get(_TestQuest.key)
+
self.assertIsNotNone(reloaded_quest)
+
self.assertEqual(reloaded_quest.get_data("client"), questgiver)
+
+
questgiver.delete()
diff --git a/docs/latest/_modules/evennia/contrib/utils/auditing/server.html b/docs/latest/_modules/evennia/contrib/utils/auditing/server.html
index 3591c774a0..efb6efc621 100644
--- a/docs/latest/_modules/evennia/contrib/utils/auditing/server.html
+++ b/docs/latest/_modules/evennia/contrib/utils/auditing/server.html
@@ -62,16 +62,7 @@
AUDIT_IN = getattr(ev_settings, "AUDIT_IN", False)
AUDIT_OUT = getattr(ev_settings, "AUDIT_OUT", False)
AUDIT_ALLOW_SPARSE = getattr(ev_settings, "AUDIT_ALLOW_SPARSE", False)
-AUDIT_MASKS = [
- {"connect": r"^[@\s]*[connect]{5,8}\s+(\".+?\"|[^\s]+)\s+(?P<secret>.+)"},
- {"connect": r"^[@\s]*[connect]{5,8}\s+(?P<secret>[\w]+)"},
- {"create": r"^[^@]?[create]{5,6}\s+(\w+|\".+?\")\s+(?P<secret>[\w]+)"},
- {"create": r"^[^@]?[create]{5,6}\s+(?P<secret>[\w]+)"},
- {"userpassword": r"^[@\s]*[userpassword]{11,14}\s+(\w+|\".+?\")\s+=*\s*(?P<secret>[\w]+)"},
- {"userpassword": r"^.*new password set to '(?P<secret>[^']+)'\."},
- {"userpassword": r"^.* has changed your password to '(?P<secret>[^']+)'\."},
- {"password": r"^[@\s]*[password]{6,9}\s+(?P<secret>.*)"},
-] + getattr(ev_settings, "AUDIT_MASKS", [])
+AUDIT_MASKS = getattr(ev_settings, "AUDIT_MASKS", [])
if AUDIT_CALLBACK:
diff --git a/docs/latest/_modules/evennia/contrib/utils/auditing/tests.html b/docs/latest/_modules/evennia/contrib/utils/auditing/tests.html
index 2e0f3fa380..d7e8c29711 100644
--- a/docs/latest/_modules/evennia/contrib/utils/auditing/tests.html
+++ b/docs/latest/_modules/evennia/contrib/utils/auditing/tests.html
@@ -45,7 +45,6 @@
import re
from anything import Anything
-from django.test import override_settings
from mock import patch
import evennia
@@ -56,7 +55,6 @@
[docs]
-
@override_settings(AUDIT_MASKS=[])
class AuditingTest(BaseEvenniaTest):
[docs]
diff --git a/docs/latest/_modules/evennia/contrib/utils/debugpy/cmd.html b/docs/latest/_modules/evennia/contrib/utils/debugpy/cmd.html
index 0d4e9881ad..8143d4a96c 100644
--- a/docs/latest/_modules/evennia/contrib/utils/debugpy/cmd.html
+++ b/docs/latest/_modules/evennia/contrib/utils/debugpy/cmd.html
@@ -38,19 +38,13 @@
Source code for evennia.contrib.utils.debugpy.cmd
import sys
+
from django.conf import settings
from evennia.utils import utils
COMMAND_DEFAULT_CLASS = utils.class_from_module(settings.COMMAND_DEFAULT_CLASS)
-ERROR_MSG = """Error, debugpy not found! Please install debugpy by running: `pip install debugpy`
-After that please reboot Evennia with `evennia reboot`"""
-
-try:
- import debugpy
-except ImportError:
- print(ERROR_MSG)
- sys.exit()
+ERROR_MSG = "debugpy needed for the debugpy contrib. Admin must install it and reboot."
@@ -61,6 +55,7 @@
Usage:
debugpy
+
"""
key = "debugpy"
@@ -69,6 +64,13 @@
[docs]
def func(self):
+
+
try:
+
import debugpy
+
except ImportError:
+
self.caller.msg(ERROR_MSG)
+
return
+
caller = self.caller
caller.msg("Waiting for debugger attach...")
yield 0.1 # make sure msg is sent first
diff --git a/docs/latest/_modules/evennia/objects/manager.html b/docs/latest/_modules/evennia/objects/manager.html
index db4e62b0c6..f0c6e401b8 100644
--- a/docs/latest/_modules/evennia/objects/manager.html
+++ b/docs/latest/_modules/evennia/objects/manager.html
@@ -44,6 +44,7 @@
import re
from django.conf import settings
+
from django.db import connection
from django.db.models import Q
from django.db.models.fields import exceptions
@@ -104,6 +105,19 @@
# account related
+
@staticmethod
+
def _build_fuzzy_search_regex(ostring):
+
"""
+
Build a backend-compatible regex for partial word-start matching.
+
+
PostgreSQL uses POSIX regex where `\\b` is not a word-boundary token.
+
"""
+
words = ostring.split()
+
if not words:
+
return r".*"
+
word_boundary = r"\m" if connection.vendor == "postgresql" else r"\b"
+
return r".* ".join(f"{word_boundary}{re.escape(word)}" for word in words) + r".*"
+
[docs]
def get_object_with_account(self, ostring, exact=True, candidates=None):
@@ -386,7 +400,7 @@
)
# convert search term to partial-match regex
-
search_regex = r".* ".join(r"\b" + re.escape(word) for word in ostring.split()) + r".*"
+
search_regex = self._build_fuzzy_search_regex(ostring)
# do the fuzzy search and return whatever it matches
return (
diff --git a/docs/latest/_modules/evennia/scripts/ondemandhandler.html b/docs/latest/_modules/evennia/scripts/ondemandhandler.html
index 02ef4d15ff..b94ac70605 100644
--- a/docs/latest/_modules/evennia/scripts/ondemandhandler.html
+++ b/docs/latest/_modules/evennia/scripts/ondemandhandler.html
@@ -101,6 +101,8 @@
"""
+
import pickle
+
from evennia.server.models import ServerConfig
from evennia.utils import logger
from evennia.utils.utils import is_iter
@@ -477,10 +479,25 @@
Save the on-demand timers to ServerConfig storage. Should be called when Evennia shuts down.
"""
+
cleaned_tasks = {}
for key, category in list(self.tasks.keys()):
# in case an object was used for categories, and were since deleted, drop the task
if hasattr(category, "id") and category.id is None:
-
self.tasks.pop((key, category))
+
self.tasks.pop((key, category), None)
+
continue
+
+
task = self.tasks.get((key, category))
+
try:
+
pickle.dumps(task)
+
except Exception as err:
+
logger.log_trace(
+
f"Error saving on-demand task {key}[{category}] (purging task): {err}"
+
)
+
self.tasks.pop((key, category), None)
+
continue
+
cleaned_tasks[(key, category)] = task
+
+
self.tasks = cleaned_tasks
ServerConfig.objects.conf(ONDEMAND_HANDLER_SAVE_NAME, self.tasks)
diff --git a/docs/latest/_modules/evennia/scripts/taskhandler.html b/docs/latest/_modules/evennia/scripts/taskhandler.html
index 67e7c0aa3f..f1a7265a07 100644
--- a/docs/latest/_modules/evennia/scripts/taskhandler.html
+++ b/docs/latest/_modules/evennia/scripts/taskhandler.html
@@ -121,7 +121,7 @@
"""
d = self.deferred
-
if d:
+
if d is not None:
d.pause()
@@ -133,7 +133,7 @@
"""
d = self.deferred
-
if d:
+
if d is not None:
d.unpause()
@@ -150,7 +150,7 @@
"""
d = self.deferred
- if d:
+ if d is not None:
return d.paused
else:
return None
@@ -247,7 +247,7 @@
"""
d = self.deferred
- if d:
+ if d is not None:
return d.called
else:
return None
@@ -546,7 +546,7 @@
if task_id in self.tasks:
# if the task has not been run, cancel it
deferred = self.get_deferred(task_id)
- return not (deferred and deferred.called)
+ return not (deferred is not None and deferred.called)
else:
return False
@@ -569,7 +569,7 @@
if task_id in self.tasks:
# if the task has not been run, cancel it
d = self.get_deferred(task_id)
-
if d: # it is remotely possible for a task to not have a deferred
+
if d is not None: # it is remotely possible for a task to not have a deferred
if d.called:
return False
else: # the callback has not been called yet.
@@ -683,7 +683,7 @@
date, callback, args, kwargs, persistent, d = self.tasks.get(task_id)
else: # the task does not exist
return False
-
if d: # it is remotely possible for a task to not have a deferred
+
if d is not None: # it is remotely possible for a task to not have a deferred
if not d.called: # the task's deferred has not been called yet
d.cancel() # cancel the automated callback
else: # this task has no deferred, and should not be called
diff --git a/docs/latest/_modules/evennia/server/game_index_client/client.html b/docs/latest/_modules/evennia/server/game_index_client/client.html
index 8927716148..02974e9df9 100644
--- a/docs/latest/_modules/evennia/server/game_index_client/client.html
+++ b/docs/latest/_modules/evennia/server/game_index_client/client.html
@@ -133,13 +133,19 @@
# We are using `or` statements below with dict.get() to avoid sending
# stringified 'None' values to the server.
try:
+
long_description = egi_config.get("long_description", "")
+
if long_description:
+
# The connection wizard documents using "\n" for line breaks;
+
# normalize that to actual newlines before sending to EGI.
+
long_description = long_description.replace("\\n", "\n")
+
values = {
# Game listing stuff
"game_name": egi_config.get("game_name", settings.SERVERNAME),
"game_status": egi_config["game_status"],
"game_website": egi_config.get("game_website", ""),
"short_description": egi_config["short_description"],
-
"long_description": egi_config.get("long_description", ""),
+
"long_description": long_description,
"listing_contact": egi_config["listing_contact"],
# How to play
"telnet_hostname": egi_config.get("telnet_hostname", ""),
diff --git a/docs/latest/_modules/evennia/server/inputfuncs.html b/docs/latest/_modules/evennia/server/inputfuncs.html
index 98bcfcffb8..2fe0b1e96e 100644
--- a/docs/latest/_modules/evennia/server/inputfuncs.html
+++ b/docs/latest/_modules/evennia/server/inputfuncs.html
@@ -579,9 +579,20 @@
"""
from evennia.scripts.monitorhandler import MONITOR_HANDLER
+
import pickle
+
+
def _safe_pickle(value):
+
try:
+
pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
+
return value
+
except Exception:
+
return str(value)
obj = session.puppet
-
monitors = MONITOR_HANDLER.all(obj=obj)
+
monitors = []
+
for mon_obj, fieldname, idstring, persistent, monitor_kwargs in MONITOR_HANDLER.all(obj=obj):
+
safe_kwargs = {key: _safe_pickle(val) for key, val in monitor_kwargs.items()}
+
monitors.append((_safe_pickle(mon_obj), fieldname, idstring, persistent, safe_kwargs))
session.msg(monitored=(monitors, {}))
diff --git a/docs/latest/_modules/evennia/server/portal/telnet.html b/docs/latest/_modules/evennia/server/portal/telnet.html
index fc9905a39d..f463a95233 100644
--- a/docs/latest/_modules/evennia/server/portal/telnet.html
+++ b/docs/latest/_modules/evennia/server/portal/telnet.html
@@ -49,6 +49,12 @@
import re
from django.conf import settings
+
from evennia.server.portal import mssp, naws, suppress_ga, telnet_oob, ttype
+
from evennia.server.portal.mccp import MCCP, Mccp, mccp_compress
+
from evennia.server.portal.mxp import Mxp, mxp_parse
+
from evennia.server.portal.naws import NAWS
+
from evennia.utils import ansi
+
from evennia.utils.utils import class_from_module, to_bytes
from twisted.conch.telnet import (
ECHO,
GA,
@@ -67,13 +73,6 @@
from twisted.internet import protocol
from twisted.internet.task import LoopingCall
-
from evennia.server.portal import mssp, naws, suppress_ga, telnet_oob, ttype
-
from evennia.server.portal.mccp import MCCP, Mccp, mccp_compress
-
from evennia.server.portal.mxp import Mxp, mxp_parse
-
from evennia.server.portal.naws import NAWS
-
from evennia.utils import ansi
-
from evennia.utils.utils import class_from_module, to_bytes
-
_RE_N = re.compile(r"\|n$")
_RE_LEND = re.compile(rb"\n$|\r$|\r\n$|\r\x00$|", re.MULTILINE)
_RE_LINEBREAK = re.compile(rb"\n\r|\r\n|\n|\r", re.DOTALL + re.MULTILINE)
@@ -84,7 +83,7 @@
# identify HTTP indata
_HTTP_REGEX = re.compile(
-
b"(GET|HEAD|POST|PUT|DELETE|TRACE|OPTIONS|CONNECT|PATCH) (.*? HTTP/[0-9]\.[0-9])", re.I
+
r"(GET|HEAD|POST|PUT|DELETE|TRACE|OPTIONS|CONNECT|PATCH) (.*? HTTP/[0-9]\.[0-9])", re.I
)
_HTTP_WARNING = bytes(
diff --git a/docs/latest/_modules/evennia/server/service.html b/docs/latest/_modules/evennia/server/service.html
index b6a695fe87..4b9280a34d 100644
--- a/docs/latest/_modules/evennia/server/service.html
+++ b/docs/latest/_modules/evennia/server/service.html
@@ -601,7 +601,10 @@
# only save monitor state on reload, not on shutdown/reset
from evennia.scripts.monitorhandler import MONITOR_HANDLER
-
MONITOR_HANDLER.save()
+
try:
+
MONITOR_HANDLER.save()
+
except Exception as err:
+
logger.log_trace(f"Error saving MonitorHandler state: {err}")
else:
if mode == "reset":
# like shutdown but don't unset the is_connected flag and don't disconnect sessions
@@ -631,12 +634,18 @@
# tickerhandler state should always be saved.
from evennia.scripts.tickerhandler import TICKER_HANDLER
-
TICKER_HANDLER.save()
+
try:
+
TICKER_HANDLER.save()
+
except Exception as err:
+
logger.log_trace(f"Error saving TickerHandler state: {err}")
# on-demand handler state should always be saved.
from evennia.scripts.ondemandhandler import ON_DEMAND_HANDLER
-
ON_DEMAND_HANDLER.save()
+
try:
+
ON_DEMAND_HANDLER.save()
+
except Exception as err:
+
logger.log_trace(f"Error saving OnDemandHandler state: {err}")
# always called, also for a reload
self.at_server_stop()
diff --git a/docs/latest/_modules/evennia/typeclasses/managers.html b/docs/latest/_modules/evennia/typeclasses/managers.html
index 74dcda98aa..5cea419b47 100644
--- a/docs/latest/_modules/evennia/typeclasses/managers.html
+++ b/docs/latest/_modules/evennia/typeclasses/managers.html
@@ -342,7 +342,7 @@
than `key`.
"""
-
if not (key or category):
+
if key is None and category is None:
return []
global _Tag
@@ -351,8 +351,16 @@
anymatch = "any" == kwargs.get("match", "all").lower().strip()
-
keys = make_iter(key) if key else []
-
categories = make_iter(category) if category else []
+
_normalize_tag_value = lambda value: (
+
str(value).strip().lower() if value is not None else None
+
)
+
+
keys = [_normalize_tag_value(val) for val in make_iter(key)] if key is not None else []
+
categories = (
+
[_normalize_tag_value(val) for val in make_iter(category)]
+
if category is not None
+
else []
+
)
n_keys = len(keys)
n_categories = len(categories)
unique_categories = set(categories)
diff --git a/docs/latest/_modules/evennia/utils/evmenu.html b/docs/latest/_modules/evennia/utils/evmenu.html
index e3a4f13c70..c78df88125 100644
--- a/docs/latest/_modules/evennia/utils/evmenu.html
+++ b/docs/latest/_modules/evennia/utils/evmenu.html
@@ -755,6 +755,10 @@
logger.log_trace(_TRACE_PERSISTENT_SAVING)
persistent = False
+
# Make sure to not stack menu cmdsets across reload-restore cycles.
+
# On reload, ndb is cleared so we can't always close an old menu cleanly first.
+
self.caller.cmdset.remove(EvMenuCmdSet)
+
# set up the menu command on the caller
menu_cmdset = EvMenuCmdSet()
menu_cmdset.mergetype = str(cmdset_mergetype).lower().capitalize() or "Replace"
@@ -1756,17 +1760,19 @@
"""
key = _CMD_NOINPUT
-
aliases = [_CMD_NOMATCH, "yes", "no", "y", "n", "a", "abort"]
+
aliases = [_CMD_NOMATCH]
arg_regex = r"^$"
def _clean(self, caller):
-
del caller.ndb._yes_no_question
-
if not caller.cmdset.has(YesNoQuestionCmdSet) and inherits_from(
-
caller, evennia.DefaultObject
-
):
-
caller.account.cmdset.remove(YesNoQuestionCmdSet)
-
else:
+
if hasattr(caller.ndb, "_yes_no_question"):
+
del caller.ndb._yes_no_question
+
while caller.cmdset.has(YesNoQuestionCmdSet):
caller.cmdset.remove(YesNoQuestionCmdSet)
+
if inherits_from(caller, evennia.DefaultObject) and caller.account:
+
if hasattr(caller.account.ndb, "_yes_no_question"):
+
del caller.account.ndb._yes_no_question
+
while caller.account.cmdset.has(YesNoQuestionCmdSet):
+
caller.account.cmdset.remove(YesNoQuestionCmdSet)
[docs]
@@ -1785,7 +1791,7 @@
inp = self.cmdname
-
if inp == _CMD_NOINPUT:
+
if inp in (_CMD_NOINPUT, _CMD_NOMATCH):
raw = self.raw_cmdname.strip()
if not raw:
# use default
@@ -1793,6 +1799,9 @@
else:
inp = raw
+
if isinstance(inp, str):
+
inp = inp.lower()
+
if inp in ("a", "abort") and yes_no_question.allow_abort:
caller.msg(_("Aborted."))
self._clean(caller)
@@ -1950,7 +1959,14 @@
caller.ndb._yes_no_question.args = args
caller.ndb._yes_no_question.kwargs = kwargs
-
caller.cmdset.add(YesNoQuestionCmdSet)
+
# Avoid duplicate yes/no cmdsets across account/object command merges.
+
while caller.cmdset.has(YesNoQuestionCmdSet):
+
caller.cmdset.remove(YesNoQuestionCmdSet)
+
if inherits_from(caller, evennia.DefaultObject) and caller.account:
+
while caller.account.cmdset.has(YesNoQuestionCmdSet):
+
caller.account.cmdset.remove(YesNoQuestionCmdSet)
+
+
caller.cmdset.add(YesNoQuestionCmdSet, persistent=False)
caller.msg(prompt, session=session)
diff --git a/docs/latest/_modules/evennia/utils/evtable.html b/docs/latest/_modules/evennia/utils/evtable.html
index 7d5c84dbd4..74a591f14c 100644
--- a/docs/latest/_modules/evennia/utils/evtable.html
+++ b/docs/latest/_modules/evennia/utils/evtable.html
@@ -158,7 +158,7 @@
from django.conf import settings
-
from evennia.utils.ansi import ANSIString
+
from evennia.utils.ansi import ANSIString, strip_mxp
from evennia.utils.utils import display_len as d_len
from evennia.utils.utils import is_iter, justify
@@ -176,7 +176,7 @@
if is_iter(obj):
return [_to_ansi(o) for o in obj]
else:
-
return ANSIString(obj)
+
return ANSIString(strip_mxp(str(obj)))
_whitespace = "\t\n\x0b\x0c\r "
@@ -225,19 +225,17 @@
'use', ' ', 'the', ' ', '-b', ' ', option!'
otherwise.
"""
-
# NOTE-PYTHON3: The following code only roughly approximates what this
-
# function used to do. Regex splitting on ANSIStrings is
-
# dropping ANSI codes, so we're using ANSIString.split
-
# for the time being.
-
#
-
# A less hackier solution would be appreciated.
-
chunks = _to_ansi(text).split()
-
-
chunks = [chunk + " " for chunk in chunks if chunk] # remove empty chunks
-
-
if len(chunks) > 1:
-
chunks[-1] = chunks[-1][0:-1]
-
+
# ANSIString.split(None) collapses repeated whitespace, which breaks
+
# pre-formatted content (such as nested EvTables). Split on explicit
+
# spaces instead and keep separators as separate chunks.
+
text = _to_ansi(text)
+
parts = text.split(" ")
+
chunks = []
+
for idx, part in enumerate(parts):
+
if part:
+
chunks.append(part)
+
if idx < len(parts) - 1:
+
chunks.append(" ")
return chunks
def _wrap_chunks(self, chunks):
@@ -542,6 +540,7 @@
Returns:
split (list): split text.
"""
+
text = text.replace("\r\n", "\n").replace("\r", "\n")
return text.split("\n")
def _fit_width(self, data):
@@ -610,7 +609,29 @@
align = self.align
hfill_char = self.hfill_char
width = self.width
-
return [justify(line, width, align=align, fillchar=hfill_char) for line in data]
+
aligned = []
+
for line in data:
+
# Preserve manually spaced/pre-formatted lines (like nested tables).
+
raw_line = line.raw() if hasattr(line, "raw") else str(line)
+
has_link_markup = strip_mxp(raw_line) != raw_line
+
has_manual_spacing = " " in raw_line.lstrip(" ")
+
if has_manual_spacing or has_link_markup:
+
line_width = d_len(line)
+
if line_width >= width:
+
aligned.append(justify(line, width, align="a", fillchar=hfill_char))
+
continue
+
pad = width - line_width
+
if align == "r":
+
aligned.append(hfill_char * pad + line)
+
elif align == "c":
+
left = pad // 2
+
right = pad - left
+
aligned.append(hfill_char * left + line + hfill_char * right)
+
else:
+
aligned.append(line + hfill_char * pad)
+
else:
+
aligned.append(justify(line, width, align=align, fillchar=hfill_char))
+
return aligned
def _valign(self, data):
"""
diff --git a/docs/latest/_modules/evennia/utils/logger.html b/docs/latest/_modules/evennia/utils/logger.html
index ec71fdf5ba..27ba883255 100644
--- a/docs/latest/_modules/evennia/utils/logger.html
+++ b/docs/latest/_modules/evennia/utils/logger.html
@@ -53,10 +53,12 @@
"""
import os
+
import re
import time
from datetime import datetime
from traceback import format_exc
+
from django.conf import settings
from twisted import logger as twisted_logger
from twisted.internet.threads import deferToThread
from twisted.python import logfile
@@ -72,6 +74,74 @@
_TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
+
_SENSITIVE_INPUT_PATTERNS = None
+
_SENSITIVE_INPUT_PATTERNS_SIGNATURE = None
+
+
+
def _compile_sensitive_input_patterns():
+
"""
+
Compile masking regexes from settings.AUDIT_MASKS.
+
"""
+
patterns = []
+
masks = getattr(settings, "AUDIT_MASKS", [])
+
signature = repr(masks)
+
+
for mask in masks:
+
# auditing format is list[dict[label -> regex]], but we also
+
# support plain regex strings as a convenience.
+
if isinstance(mask, dict):
+
regexes = mask.values()
+
else:
+
regexes = [mask]
+
for regex in regexes:
+
try:
+
patterns.append(re.compile(regex, re.IGNORECASE))
+
except re.error as err:
+
log_err(f"Invalid AUDIT_MASKS regex '{regex}': {err}")
+
+
return patterns, signature
+
+
+
+
+
+
def _log(msg, logfunc, prefix="", **kwargs):
try:
msg = str(msg)
diff --git a/docs/latest/_modules/evennia/utils/picklefield.html b/docs/latest/_modules/evennia/utils/picklefield.html
index 60111fef71..00af33131f 100644
--- a/docs/latest/_modules/evennia/utils/picklefield.html
+++ b/docs/latest/_modules/evennia/utils/picklefield.html
@@ -139,6 +139,16 @@
# simple string matches, thus the character streams must be the same
# for the lookups to work properly. See tests.py for more information.
try:
+
if isinstance(value, _ObjectWrapper):
+
# Keep conflict wrappers for regular values, but still normalize wrapped
+
# db objects to the same packed representation as Attribute storage.
+
packed = pack_dbobj(value._obj)
+
if packed is not value._obj:
+
value = packed
+
else:
+
# Make sure database objects are normalized before pickling for lookups.
+
value = pack_dbobj(value)
+
value = deepcopy(value)
except CopyError:
# this can happen on a manager query where the search query string is a
diff --git a/docs/latest/_modules/evennia/utils/utils.html b/docs/latest/_modules/evennia/utils/utils.html
index b5bd431dea..e460a3e658 100644
--- a/docs/latest/_modules/evennia/utils/utils.html
+++ b/docs/latest/_modules/evennia/utils/utils.html
@@ -308,13 +308,13 @@
is_ansi = isinstance(text, _ANSISTRING)
lb = _ANSISTRING("\n") if is_ansi else "\n"
-
def _process_line(line):
+
def _process_line(line, line_word_length, line_gaps):
"""
helper function that distributes extra spaces between words. The number
of gaps is nwords - 1 but must be at least 1 for single-word lines. We
distribute odd spaces to one of the gaps.
"""
-
line_rest = width - (wlen + ngaps)
+
line_rest = width - (line_word_length + line_gaps)
gap = _ANSISTRING(" ") if is_ansi else " "
@@ -336,8 +336,8 @@
else:
line[-1] = line[-1] + pad + sp * (line_rest % 2)
else: # align 'f'
-
gap += sp * (line_rest // max(1, ngaps))
-
rest_gap = line_rest % max(1, ngaps)
+
gap += sp * (line_rest // max(1, line_gaps))
+
rest_gap = line_rest % max(1, line_gaps)
for i in range(rest_gap):
line[i] += sp
elif not any(line):
@@ -361,49 +361,61 @@
# all other aligns requires splitting into paragraphs and words
-
# split into paragraphs and words
-
paragraphs = [text] # re.split("\n\s*?\n", text, re.MULTILINE)
-
words = []
-
for ip, paragraph in enumerate(paragraphs):
-
if ip > 0:
-
words.append(("\n", 0))
-
words.extend((word, m_len(word)) for word in paragraph.split())
+
def _justify_paragraph(words):
+
ngaps = 0
+
wlen = 0
+
line = []
+
lines = []
-
if not words:
-
# Just whitespace!
-
return sp * width
-
-
ngaps = 0
-
wlen = 0
-
line = []
-
lines = []
-
-
while words:
-
if not line:
-
# start a new line
-
word = words.pop(0)
-
wlen = word[1]
-
line.append(word[0])
-
elif (words[0][1] + wlen + ngaps) >= width:
-
# next word would exceed word length of line + smallest gaps
-
lines.append(_process_line(line))
-
ngaps, wlen, line = 0, 0, []
-
else:
-
# put a new word on the line
-
word = words.pop(0)
-
line.append(word[0])
-
if word[1] == 0:
-
# a new paragraph, process immediately
-
lines.append(_process_line(line))
+
while words:
+
if not line:
+
# start a new line
+
word = words.pop(0)
+
wlen = word[1]
+
line.append(word[0])
+
elif (words[0][1] + wlen + ngaps) >= width:
+
# next word would exceed word length of line + smallest gaps
+
lines.append(_process_line(line, wlen, ngaps))
ngaps, wlen, line = 0, 0, []
else:
+
# put a new word on the line
+
word = words.pop(0)
+
line.append(word[0])
wlen += word[1]
ngaps += 1
-
if line: # catch any line left behind
-
lines.append(_process_line(line))
+
if line: # catch any line left behind
+
lines.append(_process_line(line, wlen, ngaps))
+
+
return lines
+
+
paragraphs = []
+
paragraph_words = []
+
for input_line in text.split("\n"):
+
line_words = [(word, m_len(word)) for word in input_line.split()]
+
if line_words:
+
paragraph_words.extend(line_words)
+
else:
+
if paragraph_words:
+
paragraphs.append(paragraph_words)
+
paragraph_words = []
+
paragraphs.append(None)
+
if paragraph_words:
+
paragraphs.append(paragraph_words)
+
+
if not paragraphs:
+
# Just whitespace!
+
return sp * width
+
+
blank_line = _ANSISTRING(sp * width) if is_ansi else sp * width
+
lines = []
+
for paragraph in paragraphs:
+
if paragraph is None:
+
lines.append(blank_line)
+
else:
+
lines.extend(_justify_paragraph(paragraph[:]))
+
indentstring = sp * indent
-
out = lb.join([indentstring + line for line in lines])
return lb.join([indentstring + line for line in lines])
diff --git a/docs/latest/_modules/inspect.html b/docs/latest/_modules/inspect.html
index e5621a06ba..af27e51d0c 100644
--- a/docs/latest/_modules/inspect.html
+++ b/docs/latest/_modules/inspect.html
@@ -503,6 +503,8 @@
gi_frame frame object or possibly None once the generator has
been exhausted
gi_running set to 1 when generator is executing, 0 otherwise
+ gi_suspended set to 1 when the generator is suspended at a yield point, 0 otherwise
+ gi_yieldfrom object being iterated by yield from or None
next return the next item from the container
send resumes the generator and "sends" a value that becomes
the result of the current yield-expression
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 830a97766c..af36d547f2 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -2,10 +2,15 @@
## Main branch
-- Security dependency updates: Django >5.2.8 (<5.3), Django RestFramework 3.16
-- [Feat][pull3599]: Make at_pre_cmd
+- Feat (backwards incompatble): Drop Python 3.11 support (supported: Python 3.12, 3.13, 3.14 (req)). (Griatch)
+- Security: Django >=6.0.2 (<6.1), Django RestFramework 3.16 (Griatch)
+- Update: `XYZGrid` contrib now requires scipy 1.15->1.17. Note: Pathfinding may pick different
+ shortest routes from before, due to private changes in scipy Dijkstra algorithm (Griatch)
+- [Feat][pull3599]: Make `at_pre_cmd` testable in unit tests (blongden)
- [Fix]: API /openapi/setattribute endpoints were both POST and PUT, causing schema
errors; now changed to PUT only. (Griatch)
+- [Feat][issue2627]: Add `settings.AUDIT_MASKS` to customize what Evennia should
+ obfuscate in server error logs (such as passwords from custom login commands) (Griatch)
- [Fix][pull3799]: Fix typo in `basic_tc.py` contrib for beginner tutorial (Tharic99)
- [Fix][pull3806]: EvMore wouldn't pass Session to next cmd when exiting (gas-public-wooden-clean)
- [Fix][pull3809]: Admin page - Repair link to Account button (UserlandAlchemist)
@@ -25,6 +30,25 @@
ANSIString after reset (speeds up EvForm other string ops, fixes compatibility) (count-infinity)
- [Fix][pull3853]: Properly handle multimatch separations with native dashes, like
't-shirt-1' (count-infinity)
+- [Fix][pull3733]: Allow `CmdSetAttribute` to use categery, view dicts by key (InspectorCaracal)
+- [Fix][issue3858]: Fix parsing issues in dice contrib (Griatch)
+- Fix: `Typeclass.objects.get_by_tag()` will now always convert tag keys/categories to integers, to
+ avoid inconsistencies with PostgreSQL databases (Griatch)
+- [Fix][issue3513]: Fixed issue where OnDemandHandler could traceback on an
+ un-pickle-able object and cause an error at server shutdown (Griatch)
+- [Fix][issue3649]: The `:j` command in EvEditor would squash empty lines (Griatch)
+- [Fix][issue3560]: Tutorial QuestHandler failed to load after server restart (Griatch)
+- [Fix][issue3601]: `CmdSet.add(..., allow_duplicates=True)` didn't allow duplicate cmd keys (Griatch)
+- [Fix][issue3194]: Make filtering on AttributeProperties consistent across typeclasses (Griatch)
+- [Fix][issue2774]: Properly support `\n` in `evennia connections` long descriptions (Griatch)
+- [Fix][issue3312]: Handle all edge cases breaking `monitor/monitored` `input_funcs` (Griatch)
+- [Fix][issue3154]: Persistent EvMenu caused multiple cmdsets on reload (Griatch)
+- [Fix][issue3193]: Formatting of inner nested evtable would break (Griatch)
+- [Fix][issue3082]: MXP linking broke EvTable formatting (Griatch)
+- [Fix][issue3693]: Using `|/` in EvTable broke padding (Griatch)
+- [Fix][pull3864]: Correctly use cached dijkstra results for XYZGrid (jaborsh)
+- [Fix][pull3863]: `XYZGrid` performance improvement in teleporter search (jaborsh)
+- [Fix][pull3862]: `TraitHandler` typo/bug fixes (jaborsh)
- [Doc][pull3801]: Move Evennia doc build system to latest Sphinx/myST
(PowershellNinja, also honorary mention to electroglyph)
- [Doc][pull3800]: Describe support for Telnet SSH in HAProxy documentation (holl0wstar)
@@ -51,6 +75,22 @@
[pull3852]: https://github.com/evennia/evennia/pull/3852
[pull3853]: https://github.com/evennia/evennia/pull/3853
[pull3854]: https://github.com/evennia/evennia/pull/3853
+[pull3733]: https://github.com/evennia/evennia/pull/3853
+[pull3864]: https://github.com/evennia/evennia/pull/3864
+[pull3863]: https://github.com/evennia/evennia/pull/3863
+[pull3862]: https://github.com/evennia/evennia/pull/3862
+[issue3858]: https://github.com/evennia/evennia/issues/3858
+[issue3813]: https://github.com/evennia/evennia/issues/3513
+[issue3649]: https://github.com/evennia/evennia/issues/3649
+[issue3560]: https://github.com/evennia/evennia/issues/3560
+[issue3601]: https://github.com/evennia/evennia/issues/3601
+[issue3194]: https://github.com/evennia/evennia/issues/3194
+[issue2774]: https://github.com/evennia/evennia/issues/2774
+[issue3312]: https://github.com/evennia/evennia/issues/3312
+[issue3154]: https://github.com/evennia/evennia/issues/3154
+[issue3193]: https://github.com/evennia/evennia/issues/3193
+[issue3082]: https://github.com/evennia/evennia/issues/3082
+[issue3693]: https://github.com/evennia/evennia/issues/3693
## Evennia 5.0.1
diff --git a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.md.txt b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.md.txt
index 91ff51f7ce..a190899b86 100644
--- a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.md.txt
+++ b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Quests.md.txt
@@ -14,7 +14,7 @@ A quest follows a specific development:
4. At suitable times the quest's _progress_ is checked. This could happen on a timer or when trying to 'hand in' the quest. When checking, the current 'step' is checked against its finish conditions. If ok, that step is closed and the next step is checked until it either hits a step that is not yet complete, or there are no more steps, in which case the entire quest is complete.
```{sidebar}
-An example implementation of quests is found under `evennia/contrib/tutorials`, in [evadvanture/quests.py](evennia.contrib.tutorials.evadventure.quests).
+An example implementation of quests is found under `evennia/contrib/tutorials`, in [evadventure/quests.py](evennia.contrib.tutorials.evadventure.quests).
```
To represent quests in code, we need
- A convenient flexible way to code how we check the status and current steps of the quest. We want this scripting to be as flexible as possible. Ideally we want to be able to code the quests's logic in full Python.
@@ -32,7 +32,7 @@ We saw the implementation of an on-object handler back in the [lesson about NPC
```{code-block} python
:linenos:
-:emphasize-lines: 9,10,11,14-18,21,24-28
+:emphasize-lines: 9,10,13-17,20,23-27
# in evadventure/quests.py
class EvAdventureQuestHandler:
@@ -53,7 +53,7 @@ class EvAdventureQuestHandler:
)
# instantiate all quests
for quest_key, quest_class in self.quest_classes.items():
- self.quests[quest_key] = quest_class(self.obj)
+ self.quests[quest_key] = quest_class(self.obj, questhandler=self)
def _save(self):
self.obj.attributes.add(
@@ -70,7 +70,7 @@ class EvAdventureQuestHandler:
def add(self, quest_class):
self.quest_classes[quest_class.key] = quest_class
- self.quests[quest_class.key] = quest_class(self.obj)
+ self.quests[quest_class.key] = quest_class(self.obj, questhandler=self)
self._save()
def remove(self, quest_key):
@@ -173,7 +173,7 @@ We also need a way to represent the quests themselves though!
```{code-block} python
:linenos:
-:emphasize-lines: 7,12,13,34-36
+:emphasize-lines: 7,10-14,17,24,31
# in evadventure/quests.py
# ...
@@ -183,9 +183,10 @@ class EvAdventureQuest:
key = "base-quest"
desc = "Base quest"
start_step = "start"
-
- def __init__(self, quester):
+
+ def __init__(self, quester, questhandler=None):
self.quester = quester
+ self._questhandler = questhandler
self.data = self.questhandler.load_quest_data(self.key)
self._current_step = self.get_data("current_step")
@@ -205,7 +206,7 @@ class EvAdventureQuest:
@property
def questhandler(self):
- return self.quester.quests
+ return self._questhandler if self._questhandler else self.quester.quests
@property
def current_step(self):
@@ -220,9 +221,10 @@ class EvAdventureQuest:
- **Line 7**: Each class must have a `.key` property unquely identifying the quest. We depend on this in the quest-handler.
- **Line 12**: `quester` (the Character) is passed into this class when it is initiated inside `EvAdventureQuestHandler._load()`.
-- **Line 13**: We load the quest data into `self.data` directly using the `questhandler.load_quest-data` method (which in turn loads it from an Attribute on the Character). Note that the `.questhandler` property is defined on **lines 34-36** as a shortcut to get to the handler.
+- **Line 13**: The handler is also passed in during loading, so this quest instance can use it directly without triggering recursion during lazy loading.
+- **Lines 17, 24 and 31**: `add_data` and `remove_data` call back to `questhandler.save_quest_data` so persistence happens in one place.
-The `add/get/remove_data` methods are convenient wrappers for getting data in and out of the database using the matching methods on the handler. When we implement a quest we should prefer to use `.get_data`, `add_data` and `remove_data` over manipulating `.data` directly, since the former will make sure to save said that to the database automatically.
+The `add/get/remove_data` methods are convenient wrappers for getting data in and out of the database. When we implement a quest we should prefer to use `.get_data`, `add_data` and `remove_data` over manipulating `.data` directly, since the former will make sure to save said that to the database automatically.
The `current_step` tracks the current quest 'step' we are in; what this means is up to each Quest. We set up convenient properties for setting the `current_state` and also make sure to save it in the data dict as "current_step".
@@ -403,4 +405,4 @@ Testing of the quests means creating a test character, making a dummy quest, add
## Conclusions
-What we created here is just the framework for questing. The actual complexity will come when creating the quests themselves (that is, implementing the `step_(*args, **kwargs)` methods), which is something we'll get to later, in [Part 4](../Part4/Beginner-Tutorial-Part4-Overview.md) of this tutorial.
\ No newline at end of file
+What we created here is just the framework for questing. The actual complexity will come when creating the quests themselves (that is, implementing the `step_(*args, **kwargs)` methods), which is something we'll get to later, in [Part 4](../Part4/Beginner-Tutorial-Part4-Overview.md) of this tutorial.
diff --git a/docs/latest/_sources/Setup/Settings-Default.md.txt b/docs/latest/_sources/Setup/Settings-Default.md.txt
index 353ebcccd8..55e0755dbf 100644
--- a/docs/latest/_sources/Setup/Settings-Default.md.txt
+++ b/docs/latest/_sources/Setup/Settings-Default.md.txt
@@ -291,6 +291,25 @@ MAX_CHAR_LIMIT_WARNING = (
# debugging. OBS: Showing full tracebacks to regular users could be a
# security problem -turn this off in a production game!
IN_GAME_ERRORS = True
+# Default masking regexes used by security/audit logging to avoid writing
+# cleartext credentials to logs. Each entry is a dict mapping an arbitrary
+# label to a regex with a named group `(?P...)` indicating what to mask.
+# You can override this list in your settings.py, or append to it to support
+# custom login/password commands:
+# AUDIT_MASKS += [{"mycmd": r"^mycmd\\s+(?P.+)$"}]
+AUDIT_MASKS = [
+ {"connect": r'^\s*(?:connect|conn|con|co)\s+("[^"]+"|[^\s]+)\s+(?P.+)$'},
+ {"create": r'^\s*(?:create|cre|cr)\s+("[^"]+"|[^\s]+)\s+(?P.+)$'},
+ {"userpassword": r'^[@\s]*userpassword\s+(\w+|".+?")\s+=*\s*(?P[\w]+)$'},
+ {"userpassword": r"^.*new password set to '(?P[^']+)'\."},
+ {"userpassword": r"^.* has changed your password to '(?P[^']+)'\."},
+ {"password": r"^[@\s]*(?:password|passwd)\s+(?P.*)$"},
+ # Legacy typo-tolerant variants (kept for backwards compatibility with auditing behavior).
+ {"connect": r'^[@\s]*[connect]{5,8}\s+(".+?"|[^\s]+)\s+(?P.+)$'},
+ {"connect": r"^[@\s]*[connect]{5,8}\s+(?P[\w]+)$"},
+ {"create": r'^[^@]?[create]{5,6}\s+(\w+|".+?")\s+(?P[\w]+)$'},
+ {"create": r"^[^@]?[create]{5,6}\s+(?P[\w]+)$"},
+]
# Broadcast "Server restart"-like messages to all sessions.
BROADCAST_SERVER_RESTART_MESSAGES = True
diff --git a/docs/latest/_sources/index.md.txt b/docs/latest/_sources/index.md.txt
index 66c14767a5..1f276a4d58 100644
--- a/docs/latest/_sources/index.md.txt
+++ b/docs/latest/_sources/index.md.txt
@@ -1,6 +1,6 @@
# Evennia Documentation
-This is the manual of [Evennia](https://www.evennia.com), the open source Python `MU*` creation system. Use the Search bar on the left to find or discover interesting articles. This manual was last updated January 12, 2026, see the [Evennia Changelog](Coding/Changelog.md). Latest released Evennia version is 5.0.1.
+This is the manual of [Evennia](https://www.evennia.com), the open source Python `MU*` creation system. Use the Search bar on the left to find or discover interesting articles. This manual was last updated February 15, 2026, see the [Evennia Changelog](Coding/Changelog.md). Latest released Evennia version is 5.0.1.
- [Introduction](./Evennia-Introduction.md) - what is this Evennia thing?
- [Evennia in Pictures](./Evennia-In-Pictures.md) - a visual overview of Evennia
diff --git a/docs/latest/api/evennia-api.html b/docs/latest/api/evennia-api.html
index 302605a4e5..0ba8832d4e 100644
--- a/docs/latest/api/evennia-api.html
+++ b/docs/latest/api/evennia-api.html
@@ -125,6 +125,7 @@
DefaultAccount.at_look()
DefaultAccount.DoesNotExist
DefaultAccount.MultipleObjectsReturned
+DefaultAccount.NotUpdated
DefaultAccount.path
DefaultAccount.typename
@@ -137,6 +138,7 @@
DefaultGuest.at_post_disconnect()
DefaultGuest.DoesNotExist
DefaultGuest.MultipleObjectsReturned
+DefaultGuest.NotUpdated
DefaultGuest.path
DefaultGuest.typename
@@ -144,6 +146,7 @@
AccountDB
@@ -430,6 +440,7 @@
GrapevineBot.execute_cmd()
GrapevineBot.DoesNotExist
GrapevineBot.MultipleObjectsReturned
+GrapevineBot.NotUpdated
GrapevineBot.path
GrapevineBot.typename
@@ -447,6 +458,7 @@
DiscordBot.execute_cmd()
DiscordBot.DoesNotExist
DiscordBot.MultipleObjectsReturned
+DiscordBot.NotUpdated
DiscordBot.path
DiscordBot.typename
@@ -532,6 +544,7 @@
AccountDB.uid
AccountDB.DoesNotExist
AccountDB.MultipleObjectsReturned
+AccountDB.NotUpdated
AccountDB.account_subscription_set
AccountDB.date_joined
AccountDB.db_attributes
@@ -828,6 +841,7 @@
ServerConfig
ServerConfig.DoesNotExist
ServerConfig.MultipleObjectsReturned
+ServerConfig.NotUpdated
ServerConfig.db_key
ServerConfig.db_value
ServerConfig.id
@@ -1144,6 +1158,7 @@
ServerConfig
ServerConfig.DoesNotExist
ServerConfig.MultipleObjectsReturned
+ServerConfig.NotUpdated
ServerConfig.db_key
ServerConfig.db_value
ServerConfig.id
@@ -1823,6 +1838,7 @@
ObjectDB
Paginator
-Paginator.ELLIPSIS
-Paginator.__init__()
Paginator.count
-Paginator.default_error_messages
Paginator.get_elided_page_range()
Paginator.get_page()
Paginator.num_pages
@@ -1896,6 +1909,7 @@
ScriptDB
ScriptDB.DoesNotExist
ScriptDB.MultipleObjectsReturned
+ScriptDB.NotUpdated
ScriptDB.account
ScriptDB.db_account
ScriptDB.db_account_id
@@ -2106,6 +2120,7 @@
AccountDB
AccountDB.DoesNotExist
AccountDB.MultipleObjectsReturned
+AccountDB.NotUpdated
AccountDB.account_subscription_set
AccountDB.cmdset_storage
AccountDB.date_joined
@@ -2155,6 +2170,7 @@
DefaultChannel
DefaultChannel.DoesNotExist
DefaultChannel.MultipleObjectsReturned
+DefaultChannel.NotUpdated
DefaultChannel.access()
DefaultChannel.add_user_channel_alias()
DefaultChannel.at_channel_creation()
@@ -2212,6 +2228,7 @@
Msg
Msg.DoesNotExist
Msg.MultipleObjectsReturned
+Msg.NotUpdated
Msg.access()
Msg.date_created
Msg.db_date_created
@@ -2411,6 +2428,7 @@
DefaultObject
DefaultObject.DoesNotExist
DefaultObject.MultipleObjectsReturned
+DefaultObject.NotUpdated
DefaultObject.access()
DefaultObject.announce_move_from()
DefaultObject.announce_move_to()
@@ -2639,6 +2657,7 @@
HelpEntry
HelpEntry.DoesNotExist
HelpEntry.MultipleObjectsReturned
+HelpEntry.NotUpdated
HelpEntry.access()
HelpEntry.aliases
HelpEntry.date_created
@@ -2908,6 +2927,7 @@
AccountDB
TestCommsChannel
@@ -3323,6 +3344,7 @@
ChannelDB
@@ -3465,6 +3488,7 @@
Msg.access()
Msg.DoesNotExist
Msg.MultipleObjectsReturned
+Msg.NotUpdated
Msg.get_next_by_db_date_created()
Msg.get_previous_by_db_date_created()
Msg.header
@@ -3491,6 +3515,7 @@
ChannelDB.objects
ChannelDB.DoesNotExist
ChannelDB.MultipleObjectsReturned
+ChannelDB.NotUpdated
ChannelDB.db_attributes
ChannelDB.db_date_created
ChannelDB.db_key
@@ -3555,6 +3580,7 @@
Tag
@@ -5711,6 +5744,7 @@
DefaultExit.get_return_exit()
DefaultExit.DoesNotExist
DefaultExit.MultipleObjectsReturned
+DefaultExit.NotUpdated
DefaultExit.path
DefaultExit.typename
@@ -5766,6 +5800,7 @@
DbPrototype.prototype
DbPrototype.DoesNotExist
DbPrototype.MultipleObjectsReturned
+DbPrototype.NotUpdated
DbPrototype.path
DbPrototype.typename
@@ -5897,6 +5932,7 @@
ScriptDB.object
ScriptDB.DoesNotExist
ScriptDB.MultipleObjectsReturned
+ScriptDB.NotUpdated
ScriptDB.account
ScriptDB.db_account_id
ScriptDB.db_attributes
@@ -6074,6 +6110,7 @@
DefaultScript.at_server_start()
DefaultScript.DoesNotExist
DefaultScript.MultipleObjectsReturned
+DefaultScript.NotUpdated
DefaultScript.path
DefaultScript.typename
@@ -6082,6 +6119,7 @@
DoNothing.at_script_creation()
DoNothing.DoesNotExist
DoNothing.MultipleObjectsReturned
+DoNothing.NotUpdated
DoNothing.path
DoNothing.typename
@@ -6090,6 +6128,7 @@
Store.at_script_creation()
Store.DoesNotExist
Store.MultipleObjectsReturned
+Store.NotUpdated
Store.path
Store.typename
@@ -6161,6 +6200,7 @@
ScriptBase.force_repeat()
ScriptBase.DoesNotExist
ScriptBase.MultipleObjectsReturned
+ScriptBase.NotUpdated
ScriptBase.path
ScriptBase.typename
@@ -6168,6 +6208,7 @@
ScriptDB
@@ -7419,6 +7462,7 @@
Attribute.value
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -7539,6 +7583,7 @@
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -7640,6 +7685,7 @@
Tag
Tag.DoesNotExist
Tag.MultipleObjectsReturned
+Tag.NotUpdated
Tag.accountdb_set
Tag.channeldb_set
Tag.db_category
@@ -7737,6 +7783,7 @@
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -7787,6 +7834,7 @@
ContentType
ContentType.DoesNotExist
ContentType.MultipleObjectsReturned
+ContentType.NotUpdated
ContentType.app_label
ContentType.app_labeled_name
ContentType.get_all_objects_for_this_type()
@@ -7883,6 +7931,7 @@
Tag
- evennia.utils.logger
+mask_sensitive_input()
log_info()
info()
log_infomsg()
@@ -9070,6 +9123,7 @@
Category.name
Category.DoesNotExist
Category.MultipleObjectsReturned
+Category.NotUpdated
Category.article_set
Category.id
Category.path
@@ -9081,6 +9135,7 @@
RegularCategory.name
RegularCategory.DoesNotExist
RegularCategory.MultipleObjectsReturned
+RegularCategory.NotUpdated
RegularCategory.article_set
RegularCategory.id
RegularCategory.objects
@@ -9093,6 +9148,7 @@
Article.category2
Article.DoesNotExist
Article.MultipleObjectsReturned
+Article.NotUpdated
Article.category2_id
Article.category_id
Article.id
@@ -9106,6 +9162,7 @@
RegularArticle.category2
RegularArticle.DoesNotExist
RegularArticle.MultipleObjectsReturned
+RegularArticle.NotUpdated
RegularArticle.category2_id
RegularArticle.category_id
RegularArticle.id
diff --git a/docs/latest/api/evennia.accounts.accounts.html b/docs/latest/api/evennia.accounts.accounts.html
index f6705dda37..a9f2a85682 100644
--- a/docs/latest/api/evennia.accounts.accounts.html
+++ b/docs/latest/api/evennia.accounts.accounts.html
@@ -1256,6 +1256,12 @@ overriding the call (unused by default).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.accounts.accounts.DefaultAccount'
@@ -1345,6 +1351,12 @@ overriding the call (unused by default).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.accounts.accounts.DefaultGuest'
@@ -1402,6 +1414,12 @@ our liking.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
account_subscription_set
@@ -1649,7 +1667,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -1669,7 +1687,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -1717,7 +1735,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -1864,6 +1882,12 @@ beyond the ones inherited from TypedObject:
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
db_account_subscriptions
@@ -2627,6 +2651,12 @@ type class with new database-stored variables.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
property account
@@ -2823,7 +2853,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -2870,7 +2900,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -2898,7 +2928,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -2955,7 +2985,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -3242,6 +3272,12 @@ If no key is given, delete all scripts on the object!
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
db_key
@@ -3541,8 +3577,8 @@ evennia repo itself.
-
evennia.accounts.accounts.import_string(dotted_path)[source]
-Import a dotted module path and return the attribute/class designated by the
-last name in the path. Raise ImportError if the import failed.
+Import a dotted module path and return the attribute/class designated by
+the last name in the path. Raise ImportError if the import failed.
@@ -3754,6 +3790,7 @@ are replaced by the default argument.
DefaultAccount.at_look()
DefaultAccount.DoesNotExist
DefaultAccount.MultipleObjectsReturned
+DefaultAccount.NotUpdated
DefaultAccount.path
DefaultAccount.typename
@@ -3766,6 +3803,7 @@ are replaced by the default argument.
DefaultGuest.at_post_disconnect()
DefaultGuest.DoesNotExist
DefaultGuest.MultipleObjectsReturned
+DefaultGuest.NotUpdated
DefaultGuest.path
DefaultGuest.typename
@@ -3773,6 +3811,7 @@ are replaced by the default argument.
AccountDB
@@ -676,6 +714,7 @@ triggered by the bot_data_in Inputfunc.
IRCBot.execute_cmd()
IRCBot.DoesNotExist
IRCBot.MultipleObjectsReturned
+IRCBot.NotUpdated
IRCBot.path
IRCBot.typename
@@ -685,6 +724,7 @@ triggered by the bot_data_in Inputfunc.
RSSBot.execute_cmd()
RSSBot.DoesNotExist
RSSBot.MultipleObjectsReturned
+RSSBot.NotUpdated
RSSBot.path
RSSBot.typename
@@ -697,6 +737,7 @@ triggered by the bot_data_in Inputfunc.
GrapevineBot.execute_cmd()
GrapevineBot.DoesNotExist
GrapevineBot.MultipleObjectsReturned
+GrapevineBot.NotUpdated
GrapevineBot.path
GrapevineBot.typename
@@ -714,6 +755,7 @@ triggered by the bot_data_in Inputfunc.
DiscordBot.execute_cmd()
DiscordBot.DoesNotExist
DiscordBot.MultipleObjectsReturned
+DiscordBot.NotUpdated
DiscordBot.path
DiscordBot.typename
diff --git a/docs/latest/api/evennia.accounts.html b/docs/latest/api/evennia.accounts.html
index fe5a6bcfd1..a6f230658a 100644
--- a/docs/latest/api/evennia.accounts.html
+++ b/docs/latest/api/evennia.accounts.html
@@ -126,6 +126,7 @@ more Objects depending on settings. An Account has no in-game existence.
DefaultAccount.at_look()
DefaultAccount.DoesNotExist
DefaultAccount.MultipleObjectsReturned
+DefaultAccount.NotUpdated
DefaultAccount.path
DefaultAccount.typename
@@ -138,6 +139,7 @@ more Objects depending on settings. An Account has no in-game existence.
DefaultGuest.at_post_disconnect()
DefaultGuest.DoesNotExist
DefaultGuest.MultipleObjectsReturned
+DefaultGuest.NotUpdated
DefaultGuest.path
DefaultGuest.typename
@@ -145,6 +147,7 @@ more Objects depending on settings. An Account has no in-game existence.
AccountDB
@@ -431,6 +441,7 @@ more Objects depending on settings. An Account has no in-game existence.
GrapevineBot.execute_cmd()
GrapevineBot.DoesNotExist
GrapevineBot.MultipleObjectsReturned
+GrapevineBot.NotUpdated
GrapevineBot.path
GrapevineBot.typename
@@ -448,6 +459,7 @@ more Objects depending on settings. An Account has no in-game existence.
DiscordBot.execute_cmd()
DiscordBot.DoesNotExist
DiscordBot.MultipleObjectsReturned
+DiscordBot.NotUpdated
DiscordBot.path
DiscordBot.typename
@@ -533,6 +545,7 @@ more Objects depending on settings. An Account has no in-game existence.
AccountDB.uid
AccountDB.DoesNotExist
AccountDB.MultipleObjectsReturned
+AccountDB.NotUpdated
AccountDB.account_subscription_set
AccountDB.date_joined
AccountDB.db_attributes
diff --git a/docs/latest/api/evennia.accounts.models.html b/docs/latest/api/evennia.accounts.models.html
index 269e55c8cf..7e56e0c598 100644
--- a/docs/latest/api/evennia.accounts.models.html
+++ b/docs/latest/api/evennia.accounts.models.html
@@ -153,6 +153,12 @@ object the first time, the query is executed.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
account_subscription_set
@@ -368,7 +374,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -383,7 +389,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -426,7 +432,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -524,7 +530,8 @@ admin-compliant permissions.
Hook for doing any extra model-wide validation after clean() has been
called on every field by self.clean_fields. Any ValidationError raised
by this method will not be associated with a particular field; it will
-have a special-case association with the field defined by NON_FIELD_ERRORS.
+have a special-case association with the field defined by
+NON_FIELD_ERRORS.
@@ -1624,6 +1631,7 @@ codec.
AccountDB.uid
AccountDB.DoesNotExist
AccountDB.MultipleObjectsReturned
+AccountDB.NotUpdated
AccountDB.account_subscription_set
AccountDB.date_joined
AccountDB.db_attributes
diff --git a/docs/latest/api/evennia.commands.cmdsethandler.html b/docs/latest/api/evennia.commands.cmdsethandler.html
index 2ba71cccfa..ddbac6806f 100644
--- a/docs/latest/api/evennia.commands.cmdsethandler.html
+++ b/docs/latest/api/evennia.commands.cmdsethandler.html
@@ -684,6 +684,12 @@ or the key of such a command.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
db_key
@@ -839,6 +845,7 @@ relative import to an absolute import.
ServerConfig
@@ -516,6 +534,7 @@
CodeInput.at_code_incorrect()
CodeInput.DoesNotExist
CodeInput.MultipleObjectsReturned
+CodeInput.NotUpdated
CodeInput.path
CodeInput.typename
@@ -528,6 +547,7 @@
BasePositionable.at_position()
BasePositionable.DoesNotExist
BasePositionable.MultipleObjectsReturned
+BasePositionable.NotUpdated
BasePositionable.path
BasePositionable.typename
@@ -536,6 +556,7 @@
Sittable.at_focus_sit()
Sittable.DoesNotExist
Sittable.MultipleObjectsReturned
+Sittable.NotUpdated
Sittable.path
Sittable.typename
@@ -544,6 +565,7 @@
Liable.at_focus_lie()
Liable.DoesNotExist
Liable.MultipleObjectsReturned
+Liable.NotUpdated
Liable.path
Liable.typename
@@ -552,6 +574,7 @@
Kneelable.at_focus_kneel()
Kneelable.DoesNotExist
Kneelable.MultipleObjectsReturned
+Kneelable.NotUpdated
Kneelable.path
Kneelable.typename
@@ -560,6 +583,7 @@
Climbable.at_focus_climb()
Climbable.DoesNotExist
Climbable.MultipleObjectsReturned
+Climbable.NotUpdated
Climbable.path
Climbable.typename
@@ -568,6 +592,7 @@
Positionable.get_cmd_signatures()
Positionable.DoesNotExist
Positionable.MultipleObjectsReturned
+Positionable.NotUpdated
Positionable.path
Positionable.typename
@@ -598,6 +623,7 @@
EvscapeRoom.return_appearance()
EvscapeRoom.DoesNotExist
EvscapeRoom.MultipleObjectsReturned
+EvscapeRoom.NotUpdated
EvscapeRoom.path
EvscapeRoom.typename
@@ -610,6 +636,7 @@
CleanupScript.at_repeat()
CleanupScript.DoesNotExist
CleanupScript.MultipleObjectsReturned
+CleanupScript.NotUpdated
CleanupScript.path
CleanupScript.typename
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.objects.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.objects.html
index 8ffbf80e0a..52c02802a6 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.objects.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.objects.html
@@ -351,6 +351,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.EvscaperoomObject'
@@ -385,6 +391,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Feelable'
@@ -419,6 +431,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Listenable'
@@ -453,6 +471,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Smellable'
@@ -518,6 +542,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Rotatable'
@@ -604,6 +634,12 @@ a flag.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Openable'
@@ -665,6 +701,12 @@ from a flag.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Readable'
@@ -738,6 +780,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.IndexReadable'
@@ -843,6 +891,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Movable'
@@ -909,6 +963,12 @@ a custom object if needed).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.BaseConsumable'
@@ -948,6 +1008,12 @@ a custom object if needed).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Edible'
@@ -1002,6 +1068,12 @@ a custom object if needed).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Drinkable'
@@ -1053,6 +1125,12 @@ This acts an an abstract base class.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.BaseApplicable'
@@ -1102,6 +1180,12 @@ This acts an an abstract base class.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Usable'
@@ -1174,6 +1258,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Insertable'
@@ -1256,6 +1346,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Combinable'
@@ -1334,6 +1430,12 @@ with this mixer_flag.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Mixable'
@@ -1415,6 +1517,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.HasButtons'
@@ -1507,6 +1615,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.CodeInput'
@@ -1579,6 +1693,12 @@ object or not.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.BasePositionable'
@@ -1613,6 +1733,12 @@ object or not.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Sittable'
@@ -1647,6 +1773,12 @@ object or not.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Liable'
@@ -1681,6 +1813,12 @@ object or not.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Kneelable'
@@ -1717,6 +1855,12 @@ command, which resets your position.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Climbable'
@@ -1769,6 +1913,12 @@ inject the list of callsigns.
Bases: MultipleObjectsReturned, MultipleObjectsReturned, MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated, NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.objects.Positionable'
@@ -1835,6 +1985,7 @@ inject the list of callsigns.
EvscaperoomObject.return_appearance()
EvscaperoomObject.DoesNotExist
EvscaperoomObject.MultipleObjectsReturned
+EvscaperoomObject.NotUpdated
EvscaperoomObject.path
EvscaperoomObject.typename
@@ -1843,6 +1994,7 @@ inject the list of callsigns.
Feelable.at_focus_feel()
Feelable.DoesNotExist
Feelable.MultipleObjectsReturned
+Feelable.NotUpdated
Feelable.path
Feelable.typename
@@ -1851,6 +2003,7 @@ inject the list of callsigns.
Listenable.at_focus_listen()
Listenable.DoesNotExist
Listenable.MultipleObjectsReturned
+Listenable.NotUpdated
Listenable.path
Listenable.typename
@@ -1859,6 +2012,7 @@ inject the list of callsigns.
Smellable.at_focus_smell()
Smellable.DoesNotExist
Smellable.MultipleObjectsReturned
+Smellable.NotUpdated
Smellable.path
Smellable.typename
@@ -1873,6 +2027,7 @@ inject the list of callsigns.
Rotatable.at_cannot_rotate()
Rotatable.DoesNotExist
Rotatable.MultipleObjectsReturned
+Rotatable.NotUpdated
Rotatable.path
Rotatable.typename
@@ -1891,6 +2046,7 @@ inject the list of callsigns.
Openable.at_already_closed()
Openable.DoesNotExist
Openable.MultipleObjectsReturned
+Openable.NotUpdated
Openable.path
Openable.typename
@@ -1904,6 +2060,7 @@ inject the list of callsigns.
Readable.at_cannot_read()
Readable.DoesNotExist
Readable.MultipleObjectsReturned
+Readable.NotUpdated
Readable.path
Readable.typename
@@ -1916,6 +2073,7 @@ inject the list of callsigns.
IndexReadable.at_read()
IndexReadable.DoesNotExist
IndexReadable.MultipleObjectsReturned
+IndexReadable.NotUpdated
IndexReadable.path
IndexReadable.typename
@@ -1934,6 +2092,7 @@ inject the list of callsigns.
Movable.at_right()
Movable.DoesNotExist
Movable.MultipleObjectsReturned
+Movable.NotUpdated
Movable.path
Movable.typename
@@ -1947,6 +2106,7 @@ inject the list of callsigns.
BaseConsumable.at_already_consumed()
BaseConsumable.DoesNotExist
BaseConsumable.MultipleObjectsReturned
+BaseConsumable.NotUpdated
BaseConsumable.path
BaseConsumable.typename
@@ -1956,6 +2116,7 @@ inject the list of callsigns.
Edible.at_focus_eat()
Edible.DoesNotExist
Edible.MultipleObjectsReturned
+Edible.NotUpdated
Edible.path
Edible.typename
@@ -1968,6 +2129,7 @@ inject the list of callsigns.
Drinkable.at_already_consumed()
Drinkable.DoesNotExist
Drinkable.MultipleObjectsReturned
+Drinkable.NotUpdated
Drinkable.path
Drinkable.typename
@@ -1979,6 +2141,7 @@ inject the list of callsigns.
BaseApplicable.at_cannot_apply()
BaseApplicable.DoesNotExist
BaseApplicable.MultipleObjectsReturned
+BaseApplicable.NotUpdated
BaseApplicable.path
BaseApplicable.typename
@@ -1990,6 +2153,7 @@ inject the list of callsigns.
Usable.at_cannot_apply()
Usable.DoesNotExist
Usable.MultipleObjectsReturned
+Usable.NotUpdated
Usable.path
Usable.typename
@@ -2002,6 +2166,7 @@ inject the list of callsigns.
Insertable.at_cannot_apply()
Insertable.DoesNotExist
Insertable.MultipleObjectsReturned
+Insertable.NotUpdated
Insertable.path
Insertable.typename
@@ -2016,6 +2181,7 @@ inject the list of callsigns.
Combinable.at_apply()
Combinable.DoesNotExist
Combinable.MultipleObjectsReturned
+Combinable.NotUpdated
Combinable.path
Combinable.typename
@@ -2031,6 +2197,7 @@ inject the list of callsigns.
Mixable.at_mix_success()
Mixable.DoesNotExist
Mixable.MultipleObjectsReturned
+Mixable.NotUpdated
Mixable.path
Mixable.typename
@@ -2045,6 +2212,7 @@ inject the list of callsigns.
HasButtons.at_red_button()
HasButtons.DoesNotExist
HasButtons.MultipleObjectsReturned
+HasButtons.NotUpdated
HasButtons.path
HasButtons.typename
@@ -2061,6 +2229,7 @@ inject the list of callsigns.
CodeInput.at_code_incorrect()
CodeInput.DoesNotExist
CodeInput.MultipleObjectsReturned
+CodeInput.NotUpdated
CodeInput.path
CodeInput.typename
@@ -2073,6 +2242,7 @@ inject the list of callsigns.
BasePositionable.at_position()
BasePositionable.DoesNotExist
BasePositionable.MultipleObjectsReturned
+BasePositionable.NotUpdated
BasePositionable.path
BasePositionable.typename
@@ -2081,6 +2251,7 @@ inject the list of callsigns.
Sittable.at_focus_sit()
Sittable.DoesNotExist
Sittable.MultipleObjectsReturned
+Sittable.NotUpdated
Sittable.path
Sittable.typename
@@ -2089,6 +2260,7 @@ inject the list of callsigns.
Liable.at_focus_lie()
Liable.DoesNotExist
Liable.MultipleObjectsReturned
+Liable.NotUpdated
Liable.path
Liable.typename
@@ -2097,6 +2269,7 @@ inject the list of callsigns.
Kneelable.at_focus_kneel()
Kneelable.DoesNotExist
Kneelable.MultipleObjectsReturned
+Kneelable.NotUpdated
Kneelable.path
Kneelable.typename
@@ -2105,6 +2278,7 @@ inject the list of callsigns.
Climbable.at_focus_climb()
Climbable.DoesNotExist
Climbable.MultipleObjectsReturned
+Climbable.NotUpdated
Climbable.path
Climbable.typename
@@ -2113,6 +2287,7 @@ inject the list of callsigns.
Positionable.get_cmd_signatures()
Positionable.DoesNotExist
Positionable.MultipleObjectsReturned
+Positionable.NotUpdated
Positionable.path
Positionable.typename
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.room.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.room.html
index 7772c5dd00..58ce8e8b1f 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.room.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.room.html
@@ -228,6 +228,12 @@ contents of the object by default.
Bases: MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.room.EvscapeRoom'
@@ -288,6 +294,7 @@ contents of the object by default.
EvscapeRoom.return_appearance()
EvscapeRoom.DoesNotExist
EvscapeRoom.MultipleObjectsReturned
+EvscapeRoom.NotUpdated
EvscapeRoom.path
EvscapeRoom.typename
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.scripts.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.scripts.html
index 6aa707cf2d..f1838b45f3 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.scripts.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.scripts.html
@@ -89,6 +89,12 @@ overriding the call (unused by default).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.full_systems.evscaperoom.scripts.CleanupScript'
@@ -131,6 +137,7 @@ overriding the call (unused by default).
CleanupScript.at_repeat()
CleanupScript.DoesNotExist
CleanupScript.MultipleObjectsReturned
+CleanupScript.NotUpdated
CleanupScript.path
CleanupScript.typename
diff --git a/docs/latest/api/evennia.contrib.full_systems.html b/docs/latest/api/evennia.contrib.full_systems.html
index 9929c678dc..56f3ba2cbe 100644
--- a/docs/latest/api/evennia.contrib.full_systems.html
+++ b/docs/latest/api/evennia.contrib.full_systems.html
@@ -290,6 +290,7 @@
EvscaperoomObject.return_appearance()
EvscaperoomObject.DoesNotExist
EvscaperoomObject.MultipleObjectsReturned
+EvscaperoomObject.NotUpdated
EvscaperoomObject.path
EvscaperoomObject.typename
@@ -298,6 +299,7 @@
Feelable.at_focus_feel()
Feelable.DoesNotExist
Feelable.MultipleObjectsReturned
+Feelable.NotUpdated
Feelable.path
Feelable.typename
@@ -306,6 +308,7 @@
Listenable.at_focus_listen()
Listenable.DoesNotExist
Listenable.MultipleObjectsReturned
+Listenable.NotUpdated
Listenable.path
Listenable.typename
@@ -314,6 +317,7 @@
Smellable.at_focus_smell()
Smellable.DoesNotExist
Smellable.MultipleObjectsReturned
+Smellable.NotUpdated
Smellable.path
Smellable.typename
@@ -328,6 +332,7 @@
Rotatable.at_cannot_rotate()
Rotatable.DoesNotExist
Rotatable.MultipleObjectsReturned
+Rotatable.NotUpdated
Rotatable.path
Rotatable.typename
@@ -346,6 +351,7 @@
Openable.at_already_closed()
Openable.DoesNotExist
Openable.MultipleObjectsReturned
+Openable.NotUpdated
Openable.path
Openable.typename
@@ -359,6 +365,7 @@
Readable.at_cannot_read()
Readable.DoesNotExist
Readable.MultipleObjectsReturned
+Readable.NotUpdated
Readable.path
Readable.typename
@@ -371,6 +378,7 @@
IndexReadable.at_read()
IndexReadable.DoesNotExist
IndexReadable.MultipleObjectsReturned
+IndexReadable.NotUpdated
IndexReadable.path
IndexReadable.typename
@@ -389,6 +397,7 @@
Movable.at_right()
Movable.DoesNotExist
Movable.MultipleObjectsReturned
+Movable.NotUpdated
Movable.path
Movable.typename
@@ -402,6 +411,7 @@
BaseConsumable.at_already_consumed()
BaseConsumable.DoesNotExist
BaseConsumable.MultipleObjectsReturned
+BaseConsumable.NotUpdated
BaseConsumable.path
BaseConsumable.typename
@@ -411,6 +421,7 @@
Edible.at_focus_eat()
Edible.DoesNotExist
Edible.MultipleObjectsReturned
+Edible.NotUpdated
Edible.path
Edible.typename
@@ -423,6 +434,7 @@
Drinkable.at_already_consumed()
Drinkable.DoesNotExist
Drinkable.MultipleObjectsReturned
+Drinkable.NotUpdated
Drinkable.path
Drinkable.typename
@@ -434,6 +446,7 @@
BaseApplicable.at_cannot_apply()
BaseApplicable.DoesNotExist
BaseApplicable.MultipleObjectsReturned
+BaseApplicable.NotUpdated
BaseApplicable.path
BaseApplicable.typename
@@ -445,6 +458,7 @@
Usable.at_cannot_apply()
Usable.DoesNotExist
Usable.MultipleObjectsReturned
+Usable.NotUpdated
Usable.path
Usable.typename
@@ -457,6 +471,7 @@
Insertable.at_cannot_apply()
Insertable.DoesNotExist
Insertable.MultipleObjectsReturned
+Insertable.NotUpdated
Insertable.path
Insertable.typename
@@ -471,6 +486,7 @@
Combinable.at_apply()
Combinable.DoesNotExist
Combinable.MultipleObjectsReturned
+Combinable.NotUpdated
Combinable.path
Combinable.typename
@@ -486,6 +502,7 @@
Mixable.at_mix_success()
Mixable.DoesNotExist
Mixable.MultipleObjectsReturned
+Mixable.NotUpdated
Mixable.path
Mixable.typename
@@ -500,6 +517,7 @@
HasButtons.at_red_button()
HasButtons.DoesNotExist
HasButtons.MultipleObjectsReturned
+HasButtons.NotUpdated
HasButtons.path
HasButtons.typename
@@ -516,6 +534,7 @@
CodeInput.at_code_incorrect()
CodeInput.DoesNotExist
CodeInput.MultipleObjectsReturned
+CodeInput.NotUpdated
CodeInput.path
CodeInput.typename
@@ -528,6 +547,7 @@
BasePositionable.at_position()
BasePositionable.DoesNotExist
BasePositionable.MultipleObjectsReturned
+BasePositionable.NotUpdated
BasePositionable.path
BasePositionable.typename
@@ -536,6 +556,7 @@
Sittable.at_focus_sit()
Sittable.DoesNotExist
Sittable.MultipleObjectsReturned
+Sittable.NotUpdated
Sittable.path
Sittable.typename
@@ -544,6 +565,7 @@
Liable.at_focus_lie()
Liable.DoesNotExist
Liable.MultipleObjectsReturned
+Liable.NotUpdated
Liable.path
Liable.typename
@@ -552,6 +574,7 @@
Kneelable.at_focus_kneel()
Kneelable.DoesNotExist
Kneelable.MultipleObjectsReturned
+Kneelable.NotUpdated
Kneelable.path
Kneelable.typename
@@ -560,6 +583,7 @@
Climbable.at_focus_climb()
Climbable.DoesNotExist
Climbable.MultipleObjectsReturned
+Climbable.NotUpdated
Climbable.path
Climbable.typename
@@ -568,6 +592,7 @@
Positionable.get_cmd_signatures()
Positionable.DoesNotExist
Positionable.MultipleObjectsReturned
+Positionable.NotUpdated
Positionable.path
Positionable.typename
@@ -598,6 +623,7 @@
EvscapeRoom.return_appearance()
EvscapeRoom.DoesNotExist
EvscapeRoom.MultipleObjectsReturned
+EvscapeRoom.NotUpdated
EvscapeRoom.path
EvscapeRoom.typename
@@ -610,6 +636,7 @@
CleanupScript.at_repeat()
CleanupScript.DoesNotExist
CleanupScript.MultipleObjectsReturned
+CleanupScript.NotUpdated
CleanupScript.path
CleanupScript.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
index 8ce9ad8eff..506a913771 100644
--- a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
+++ b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
@@ -223,7 +223,7 @@ achievements/progress rats
-
-aliases = ['achieves', 'achievement', 'achieve']
+aliases = ['achieve', 'achieves', 'achievement']
@@ -273,7 +273,7 @@ to all the variables defined therein.
-
-search_index_entry = {'aliases': 'achieves achievement achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieves achievement achieve', 'tags': '', 'text': '\nview achievements\n\nUsage:\n achievements[/switches] [args]\n\nSwitches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\nCheck your achievement statuses or browse the list. Providing a command argument\nwill search all your currently unlocked achievements for matches, and the switches\nwill filter the list to something other than "all unlocked". Combining a command\nargument with a switch will search only in that list.\n\nExamples:\n achievements apples\n achievements/all\n achievements/progress rats\n'}
+search_index_entry = {'aliases': 'achieve achieves achievement', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieve achieves achievement', 'tags': '', 'text': '\nview achievements\n\nUsage:\n achievements[/switches] [args]\n\nSwitches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\nCheck your achievement statuses or browse the list. Providing a command argument\nwill search all your currently unlocked achievements for matches, and the switches\nwill filter the list to something other than "all unlocked". Combining a command\nargument with a switch will search only in that list.\n\nExamples:\n achievements apples\n achievements/all\n achievements/progress rats\n'}
diff --git a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
index fc12f2d90b..67107e766a 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
@@ -185,6 +185,12 @@ in-game.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.barter.barter.TradeTimeout'
@@ -693,7 +699,7 @@ try to influence the other part in the deal.
-
-aliases = ['offers', 'deal']
+aliases = ['deal', 'offers']
@@ -719,7 +725,7 @@ try to influence the other part in the deal.
-
-search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\nshow a list of the current deal\n\nUsage:\n status\n deal\n offers\n\nShows the currently suggested offers on each sides of the deal. To\naccept the current deal, use the 'accept' command. Use 'offer' to\nchange your deal. You might also want to use 'say', 'emote' etc to\ntry to influence the other part in the deal.\n"}
+search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\nshow a list of the current deal\n\nUsage:\n status\n deal\n offers\n\nShows the currently suggested offers on each sides of the deal. To\naccept the current deal, use the 'accept' command. Use 'offer' to\nchange your deal. You might also want to use 'say', 'emote' etc to\ntry to influence the other part in the deal.\n"}
@@ -883,6 +889,7 @@ info to your choice.
TradeTimeout.is_valid()
TradeTimeout.DoesNotExist
TradeTimeout.MultipleObjectsReturned
+TradeTimeout.NotUpdated
TradeTimeout.path
TradeTimeout.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.barter.html b/docs/latest/api/evennia.contrib.game_systems.barter.html
index 2669d973f6..5d14260c69 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.html
@@ -60,6 +60,7 @@
TradeTimeout.is_valid()
TradeTimeout.DoesNotExist
TradeTimeout.MultipleObjectsReturned
+TradeTimeout.NotUpdated
TradeTimeout.path
TradeTimeout.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
index 2d389093c0..9f53c86be8 100644
--- a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -279,6 +279,12 @@ before it is even started.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.clothing.clothing.ContribClothing'
@@ -344,6 +350,12 @@ character typeclass.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.clothing.clothing.ClothedCharacter'
@@ -576,7 +588,7 @@ inv
-
-aliases = ['inv', 'i']
+aliases = ['i', 'inv']
@@ -607,7 +619,7 @@ inv
-
-search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\nview inventory\n\nUsage:\n inventory\n inv\n\nShows your inventory.\n'}
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\nview inventory\n\nUsage:\n inventory\n inv\n\nShows your inventory.\n'}
@@ -674,6 +686,7 @@ items.
ContribClothing.at_pre_move()
ContribClothing.DoesNotExist
ContribClothing.MultipleObjectsReturned
+ContribClothing.NotUpdated
ContribClothing.path
ContribClothing.typename
@@ -683,6 +696,7 @@ items.
ClothedCharacter.get_display_things()
ClothedCharacter.DoesNotExist
ClothedCharacter.MultipleObjectsReturned
+ClothedCharacter.NotUpdated
ClothedCharacter.path
ClothedCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.clothing.html b/docs/latest/api/evennia.contrib.game_systems.clothing.html
index 731415c828..cd2fa5f673 100644
--- a/docs/latest/api/evennia.contrib.game_systems.clothing.html
+++ b/docs/latest/api/evennia.contrib.game_systems.clothing.html
@@ -65,6 +65,7 @@
ContribClothing.at_pre_move()
ContribClothing.DoesNotExist
ContribClothing.MultipleObjectsReturned
+ContribClothing.NotUpdated
ContribClothing.path
ContribClothing.typename
@@ -74,6 +75,7 @@
ClothedCharacter.get_display_things()
ClothedCharacter.DoesNotExist
ClothedCharacter.MultipleObjectsReturned
+ClothedCharacter.NotUpdated
ClothedCharacter.path
ClothedCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.gendersub.gendersub.html b/docs/latest/api/evennia.contrib.game_systems.gendersub.gendersub.html
index 7e96e1bc75..6cbe2f331a 100644
--- a/docs/latest/api/evennia.contrib.game_systems.gendersub.gendersub.html
+++ b/docs/latest/api/evennia.contrib.game_systems.gendersub.gendersub.html
@@ -179,6 +179,12 @@ All extra kwargs will be passed on to the protocol.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.gendersub.gendersub.GenderCharacter'
@@ -231,6 +237,7 @@ All extra kwargs will be passed on to the protocol.
GenderCharacter.msg()
GenderCharacter.DoesNotExist
GenderCharacter.MultipleObjectsReturned
+GenderCharacter.NotUpdated
GenderCharacter.path
GenderCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.gendersub.html b/docs/latest/api/evennia.contrib.game_systems.gendersub.html
index 620d82b67e..b402afe66f 100644
--- a/docs/latest/api/evennia.contrib.game_systems.gendersub.html
+++ b/docs/latest/api/evennia.contrib.game_systems.gendersub.html
@@ -69,6 +69,7 @@
GenderCharacter.msg()
GenderCharacter.DoesNotExist
GenderCharacter.MultipleObjectsReturned
+GenderCharacter.NotUpdated
GenderCharacter.path
GenderCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.html b/docs/latest/api/evennia.contrib.game_systems.html
index a57bd3cf63..4d5fc96db4 100644
--- a/docs/latest/api/evennia.contrib.game_systems.html
+++ b/docs/latest/api/evennia.contrib.game_systems.html
@@ -98,6 +98,7 @@
TradeTimeout.is_valid()
TradeTimeout.DoesNotExist
TradeTimeout.MultipleObjectsReturned
+TradeTimeout.NotUpdated
TradeTimeout.path
TradeTimeout.typename
@@ -240,6 +241,7 @@
ContribClothing.at_pre_move()
ContribClothing.DoesNotExist
ContribClothing.MultipleObjectsReturned
+ContribClothing.NotUpdated
ContribClothing.path
ContribClothing.typename
@@ -249,6 +251,7 @@
ClothedCharacter.get_display_things()
ClothedCharacter.DoesNotExist
ClothedCharacter.MultipleObjectsReturned
+ClothedCharacter.NotUpdated
ClothedCharacter.path
ClothedCharacter.typename
@@ -625,6 +628,7 @@
GenderCharacter.msg()
GenderCharacter.DoesNotExist
GenderCharacter.MultipleObjectsReturned
+GenderCharacter.NotUpdated
GenderCharacter.path
GenderCharacter.typename
@@ -711,6 +715,7 @@
PuzzleRecipe.save_recipe()
PuzzleRecipe.DoesNotExist
PuzzleRecipe.MultipleObjectsReturned
+PuzzleRecipe.NotUpdated
PuzzleRecipe.path
PuzzleRecipe.typename
@@ -900,6 +905,7 @@
TBBasicCharacter.at_pre_move()
TBBasicCharacter.DoesNotExist
TBBasicCharacter.MultipleObjectsReturned
+TBBasicCharacter.NotUpdated
TBBasicCharacter.path
TBBasicCharacter.typename
@@ -916,6 +922,7 @@
TBBasicTurnHandler.join_fight()
TBBasicTurnHandler.DoesNotExist
TBBasicTurnHandler.MultipleObjectsReturned
+TBBasicTurnHandler.NotUpdated
TBBasicTurnHandler.path
TBBasicTurnHandler.typename
@@ -1004,6 +1011,7 @@
TBEquipTurnHandler.rules
TBEquipTurnHandler.DoesNotExist
TBEquipTurnHandler.MultipleObjectsReturned
+TBEquipTurnHandler.NotUpdated
TBEquipTurnHandler.path
TBEquipTurnHandler.typename
@@ -1015,6 +1023,7 @@
TBEWeapon.at_give()
TBEWeapon.DoesNotExist
TBEWeapon.MultipleObjectsReturned
+TBEWeapon.NotUpdated
TBEWeapon.path
TBEWeapon.typename
@@ -1027,6 +1036,7 @@
TBEArmor.at_give()
TBEArmor.DoesNotExist
TBEArmor.MultipleObjectsReturned
+TBEArmor.NotUpdated
TBEArmor.path
TBEArmor.typename
@@ -1035,6 +1045,7 @@
TBEquipCharacter.at_object_creation()
TBEquipCharacter.DoesNotExist
TBEquipCharacter.MultipleObjectsReturned
+TBEquipCharacter.NotUpdated
TBEquipCharacter.path
TBEquipCharacter.typename
@@ -1169,6 +1180,7 @@
TBItemsCharacter.at_update()
TBItemsCharacter.DoesNotExist
TBItemsCharacter.MultipleObjectsReturned
+TBItemsCharacter.NotUpdated
TBItemsCharacter.path
TBItemsCharacter.typename
@@ -1177,6 +1189,7 @@
TBItemsCharacterTest.at_object_creation()
TBItemsCharacterTest.DoesNotExist
TBItemsCharacterTest.MultipleObjectsReturned
+TBItemsCharacterTest.NotUpdated
TBItemsCharacterTest.path
TBItemsCharacterTest.typename
@@ -1186,6 +1199,7 @@
TBItemsTurnHandler.next_turn()
TBItemsTurnHandler.DoesNotExist
TBItemsTurnHandler.MultipleObjectsReturned
+TBItemsTurnHandler.NotUpdated
TBItemsTurnHandler.path
TBItemsTurnHandler.typename
@@ -1279,6 +1293,7 @@
TBMagicCharacter.at_object_creation()
TBMagicCharacter.DoesNotExist
TBMagicCharacter.MultipleObjectsReturned
+TBMagicCharacter.NotUpdated
TBMagicCharacter.path
TBMagicCharacter.typename
@@ -1287,6 +1302,7 @@
TBMagicTurnHandler.rules
TBMagicTurnHandler.DoesNotExist
TBMagicTurnHandler.MultipleObjectsReturned
+TBMagicTurnHandler.NotUpdated
TBMagicTurnHandler.path
TBMagicTurnHandler.typename
@@ -1405,6 +1421,7 @@
TBRangeTurnHandler.join_fight()
TBRangeTurnHandler.DoesNotExist
TBRangeTurnHandler.MultipleObjectsReturned
+TBRangeTurnHandler.NotUpdated
TBRangeTurnHandler.path
TBRangeTurnHandler.typename
@@ -1413,6 +1430,7 @@
TBRangeCharacter.rules
TBRangeCharacter.DoesNotExist
TBRangeCharacter.MultipleObjectsReturned
+TBRangeCharacter.NotUpdated
TBRangeCharacter.path
TBRangeCharacter.typename
@@ -1426,6 +1444,7 @@
TBRangeObject.at_give()
TBRangeObject.DoesNotExist
TBRangeObject.MultipleObjectsReturned
+TBRangeObject.NotUpdated
TBRangeObject.path
TBRangeObject.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.puzzles.html b/docs/latest/api/evennia.contrib.game_systems.puzzles.html
index 32de3d8729..99fe48de02 100644
--- a/docs/latest/api/evennia.contrib.game_systems.puzzles.html
+++ b/docs/latest/api/evennia.contrib.game_systems.puzzles.html
@@ -60,6 +60,7 @@
PuzzleRecipe.save_recipe()
PuzzleRecipe.DoesNotExist
PuzzleRecipe.MultipleObjectsReturned
+PuzzleRecipe.NotUpdated
PuzzleRecipe.path
PuzzleRecipe.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.puzzles.puzzles.html b/docs/latest/api/evennia.contrib.game_systems.puzzles.puzzles.html
index 0e9db42d5d..9bc73daa0d 100644
--- a/docs/latest/api/evennia.contrib.game_systems.puzzles.puzzles.html
+++ b/docs/latest/api/evennia.contrib.game_systems.puzzles.puzzles.html
@@ -142,6 +142,12 @@ and compare recipe with candidate part
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.puzzles.puzzles.PuzzleRecipe'
@@ -560,6 +566,7 @@ self.add().
PuzzleRecipe.save_recipe()
PuzzleRecipe.DoesNotExist
PuzzleRecipe.MultipleObjectsReturned
+PuzzleRecipe.NotUpdated
PuzzleRecipe.path
PuzzleRecipe.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.html
index 19c725376c..892da6148f 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.html
@@ -76,6 +76,7 @@
TBBasicCharacter.at_pre_move()
TBBasicCharacter.DoesNotExist
TBBasicCharacter.MultipleObjectsReturned
+TBBasicCharacter.NotUpdated
TBBasicCharacter.path
TBBasicCharacter.typename
@@ -92,6 +93,7 @@
TBBasicTurnHandler.join_fight()
TBBasicTurnHandler.DoesNotExist
TBBasicTurnHandler.MultipleObjectsReturned
+TBBasicTurnHandler.NotUpdated
TBBasicTurnHandler.path
TBBasicTurnHandler.typename
@@ -180,6 +182,7 @@
TBEquipTurnHandler.rules
TBEquipTurnHandler.DoesNotExist
TBEquipTurnHandler.MultipleObjectsReturned
+TBEquipTurnHandler.NotUpdated
TBEquipTurnHandler.path
TBEquipTurnHandler.typename
@@ -191,6 +194,7 @@
TBEWeapon.at_give()
TBEWeapon.DoesNotExist
TBEWeapon.MultipleObjectsReturned
+TBEWeapon.NotUpdated
TBEWeapon.path
TBEWeapon.typename
@@ -203,6 +207,7 @@
TBEArmor.at_give()
TBEArmor.DoesNotExist
TBEArmor.MultipleObjectsReturned
+TBEArmor.NotUpdated
TBEArmor.path
TBEArmor.typename
@@ -211,6 +216,7 @@
TBEquipCharacter.at_object_creation()
TBEquipCharacter.DoesNotExist
TBEquipCharacter.MultipleObjectsReturned
+TBEquipCharacter.NotUpdated
TBEquipCharacter.path
TBEquipCharacter.typename
@@ -345,6 +351,7 @@
TBItemsCharacter.at_update()
TBItemsCharacter.DoesNotExist
TBItemsCharacter.MultipleObjectsReturned
+TBItemsCharacter.NotUpdated
TBItemsCharacter.path
TBItemsCharacter.typename
@@ -353,6 +360,7 @@
TBItemsCharacterTest.at_object_creation()
TBItemsCharacterTest.DoesNotExist
TBItemsCharacterTest.MultipleObjectsReturned
+TBItemsCharacterTest.NotUpdated
TBItemsCharacterTest.path
TBItemsCharacterTest.typename
@@ -362,6 +370,7 @@
TBItemsTurnHandler.next_turn()
TBItemsTurnHandler.DoesNotExist
TBItemsTurnHandler.MultipleObjectsReturned
+TBItemsTurnHandler.NotUpdated
TBItemsTurnHandler.path
TBItemsTurnHandler.typename
@@ -455,6 +464,7 @@
TBMagicCharacter.at_object_creation()
TBMagicCharacter.DoesNotExist
TBMagicCharacter.MultipleObjectsReturned
+TBMagicCharacter.NotUpdated
TBMagicCharacter.path
TBMagicCharacter.typename
@@ -463,6 +473,7 @@
TBMagicTurnHandler.rules
TBMagicTurnHandler.DoesNotExist
TBMagicTurnHandler.MultipleObjectsReturned
+TBMagicTurnHandler.NotUpdated
TBMagicTurnHandler.path
TBMagicTurnHandler.typename
@@ -581,6 +592,7 @@
TBRangeTurnHandler.join_fight()
TBRangeTurnHandler.DoesNotExist
TBRangeTurnHandler.MultipleObjectsReturned
+TBRangeTurnHandler.NotUpdated
TBRangeTurnHandler.path
TBRangeTurnHandler.typename
@@ -589,6 +601,7 @@
TBRangeCharacter.rules
TBRangeCharacter.DoesNotExist
TBRangeCharacter.MultipleObjectsReturned
+TBRangeCharacter.NotUpdated
TBRangeCharacter.path
TBRangeCharacter.typename
@@ -602,6 +615,7 @@
TBRangeObject.at_give()
TBRangeObject.DoesNotExist
TBRangeObject.MultipleObjectsReturned
+TBRangeObject.NotUpdated
TBRangeObject.path
TBRangeObject.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 91b77111ef..82f03133bf 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -376,6 +376,12 @@ before it is even started.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_basic.TBBasicCharacter'
@@ -491,6 +497,12 @@ something similar.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_basic.TBBasicTurnHandler'
@@ -882,6 +894,7 @@ topics related to the game.
TBBasicCharacter.at_pre_move()
TBBasicCharacter.DoesNotExist
TBBasicCharacter.MultipleObjectsReturned
+TBBasicCharacter.NotUpdated
TBBasicCharacter.path
TBBasicCharacter.typename
@@ -898,6 +911,7 @@ topics related to the game.
TBBasicTurnHandler.join_fight()
TBBasicTurnHandler.DoesNotExist
TBBasicTurnHandler.MultipleObjectsReturned
+TBBasicTurnHandler.NotUpdated
TBBasicTurnHandler.path
TBBasicTurnHandler.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index 9ceeba8bd7..24b4b27ffa 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -248,6 +248,12 @@ remaining participants choose to end the combat with the ‘disengage’ command
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_equip.TBEquipTurnHandler'
@@ -301,6 +307,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_equip.TBEWeapon'
@@ -361,6 +373,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_equip.TBEArmor'
@@ -398,6 +416,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_equip.TBEquipCharacter'
@@ -941,6 +965,7 @@ You can’t use this command in combat.
TBEquipTurnHandler.rules
TBEquipTurnHandler.DoesNotExist
TBEquipTurnHandler.MultipleObjectsReturned
+TBEquipTurnHandler.NotUpdated
TBEquipTurnHandler.path
TBEquipTurnHandler.typename
@@ -952,6 +977,7 @@ You can’t use this command in combat.
TBEWeapon.at_give()
TBEWeapon.DoesNotExist
TBEWeapon.MultipleObjectsReturned
+TBEWeapon.NotUpdated
TBEWeapon.path
TBEWeapon.typename
@@ -964,6 +990,7 @@ You can’t use this command in combat.
TBEArmor.at_give()
TBEArmor.DoesNotExist
TBEArmor.MultipleObjectsReturned
+TBEArmor.NotUpdated
TBEArmor.path
TBEArmor.typename
@@ -972,6 +999,7 @@ You can’t use this command in combat.
TBEquipCharacter.at_object_creation()
TBEquipCharacter.DoesNotExist
TBEquipCharacter.MultipleObjectsReturned
+TBEquipCharacter.NotUpdated
TBEquipCharacter.path
TBEquipCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index 99cbac91db..9aee0182da 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -441,6 +441,12 @@ turn in combat, or every 30 seconds out of combat.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_items.TBItemsCharacter'
@@ -478,6 +484,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_items.TBItemsCharacterTest'
@@ -524,6 +536,12 @@ remaining participants choose to end the combat with the ‘disengage’ command
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_items.TBItemsTurnHandler'
@@ -933,6 +951,7 @@ to attack others, and as such can only be used in combat.
TBItemsCharacter.at_update()
TBItemsCharacter.DoesNotExist
TBItemsCharacter.MultipleObjectsReturned
+TBItemsCharacter.NotUpdated
TBItemsCharacter.path
TBItemsCharacter.typename
@@ -941,6 +960,7 @@ to attack others, and as such can only be used in combat.
TBItemsCharacterTest.at_object_creation()
TBItemsCharacterTest.DoesNotExist
TBItemsCharacterTest.MultipleObjectsReturned
+TBItemsCharacterTest.NotUpdated
TBItemsCharacterTest.path
TBItemsCharacterTest.typename
@@ -950,6 +970,7 @@ to attack others, and as such can only be used in combat.
TBItemsTurnHandler.next_turn()
TBItemsTurnHandler.DoesNotExist
TBItemsTurnHandler.MultipleObjectsReturned
+TBItemsTurnHandler.NotUpdated
TBItemsTurnHandler.path
TBItemsTurnHandler.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 5dca06a02d..0a671516c4 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -263,6 +263,12 @@ can be changed at creation and factor into combat calculations.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_magic.TBMagicCharacter'
@@ -303,6 +309,12 @@ remaining participants choose to end the combat with the ‘disengage’ command
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_magic.TBMagicTurnHandler'
@@ -805,6 +817,7 @@ topics related to the game.
TBMagicCharacter.at_object_creation()
TBMagicCharacter.DoesNotExist
TBMagicCharacter.MultipleObjectsReturned
+TBMagicCharacter.NotUpdated
TBMagicCharacter.path
TBMagicCharacter.typename
@@ -813,6 +826,7 @@ topics related to the game.
TBMagicTurnHandler.rules
TBMagicTurnHandler.DoesNotExist
TBMagicTurnHandler.MultipleObjectsReturned
+TBMagicTurnHandler.NotUpdated
TBMagicTurnHandler.path
TBMagicTurnHandler.typename
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index 652cb0ccb3..427c5b50b3 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -411,6 +411,12 @@ move twice or attack twice).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_range.TBRangeTurnHandler'
@@ -446,6 +452,12 @@ and maximum HP, and access to combat commands.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_range.TBRangeCharacter'
@@ -603,6 +615,12 @@ permissions or the at_pre_give() hook for that.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.game_systems.turnbattle.tb_range.TBRangeObject'
@@ -1164,6 +1182,7 @@ topics related to the game.
TBRangeTurnHandler.join_fight()
TBRangeTurnHandler.DoesNotExist
TBRangeTurnHandler.MultipleObjectsReturned
+TBRangeTurnHandler.NotUpdated
TBRangeTurnHandler.path
TBRangeTurnHandler.typename
@@ -1172,6 +1191,7 @@ topics related to the game.
TBRangeCharacter.rules
TBRangeCharacter.DoesNotExist
TBRangeCharacter.MultipleObjectsReturned
+TBRangeCharacter.NotUpdated
TBRangeCharacter.path
TBRangeCharacter.typename
@@ -1185,6 +1205,7 @@ topics related to the game.
TBRangeObject.at_give()
TBRangeObject.DoesNotExist
TBRangeObject.MultipleObjectsReturned
+TBRangeObject.NotUpdated
TBRangeObject.path
TBRangeObject.typename
diff --git a/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
index c676230cee..f147ddef5e 100644
--- a/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
+++ b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
@@ -552,6 +552,12 @@ finding the target.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.extended_room.extended_room.ExtendedRoom'
@@ -1174,6 +1180,7 @@ self.add().
ExtendedRoom.return_detail()
ExtendedRoom.DoesNotExist
ExtendedRoom.MultipleObjectsReturned
+ExtendedRoom.NotUpdated
ExtendedRoom.path
ExtendedRoom.typename
diff --git a/docs/latest/api/evennia.contrib.grid.extended_room.html b/docs/latest/api/evennia.contrib.grid.extended_room.html
index 48e6d5c35c..e24f14026a 100644
--- a/docs/latest/api/evennia.contrib.grid.extended_room.html
+++ b/docs/latest/api/evennia.contrib.grid.extended_room.html
@@ -93,6 +93,7 @@
ExtendedRoom.return_detail()
ExtendedRoom.DoesNotExist
ExtendedRoom.MultipleObjectsReturned
+ExtendedRoom.NotUpdated
ExtendedRoom.path
ExtendedRoom.typename
diff --git a/docs/latest/api/evennia.contrib.grid.html b/docs/latest/api/evennia.contrib.grid.html
index 1efa3e8d2c..9c9e12194b 100644
--- a/docs/latest/api/evennia.contrib.grid.html
+++ b/docs/latest/api/evennia.contrib.grid.html
@@ -93,6 +93,7 @@
ExtendedRoom.return_detail()
ExtendedRoom.DoesNotExist
ExtendedRoom.MultipleObjectsReturned
+ExtendedRoom.NotUpdated
ExtendedRoom.path
ExtendedRoom.typename
@@ -245,6 +246,7 @@
SimpleDoor.at_failed_traverse()
SimpleDoor.DoesNotExist
SimpleDoor.MultipleObjectsReturned
+SimpleDoor.NotUpdated
SimpleDoor.path
SimpleDoor.typename
@@ -295,6 +297,7 @@
SlowExit.at_traverse()
SlowExit.DoesNotExist
SlowExit.MultipleObjectsReturned
+SlowExit.NotUpdated
SlowExit.path
SlowExit.typename
@@ -372,6 +375,7 @@
WildernessScript.at_post_object_leave()
WildernessScript.DoesNotExist
WildernessScript.MultipleObjectsReturned
+WildernessScript.NotUpdated
WildernessScript.path
WildernessScript.typename
@@ -387,6 +391,7 @@
WildernessRoom.get_display_desc()
WildernessRoom.DoesNotExist
WildernessRoom.MultipleObjectsReturned
+WildernessRoom.NotUpdated
WildernessRoom.path
WildernessRoom.typename
@@ -398,6 +403,7 @@
WildernessExit.at_traverse()
WildernessExit.DoesNotExist
WildernessExit.MultipleObjectsReturned
+WildernessExit.NotUpdated
WildernessExit.path
WildernessExit.typename
@@ -760,6 +766,7 @@
TestXyzRoom.at_object_creation()
TestXyzRoom.DoesNotExist
TestXyzRoom.MultipleObjectsReturned
+TestXyzRoom.NotUpdated
TestXyzRoom.path
TestXyzRoom.typename
@@ -768,6 +775,7 @@
TestXyzExit.at_object_creation()
TestXyzExit.DoesNotExist
TestXyzExit.MultipleObjectsReturned
+TestXyzExit.NotUpdated
TestXyzExit.path
TestXyzExit.typename
@@ -1040,6 +1048,7 @@
XYZGrid.spawn()
XYZGrid.DoesNotExist
XYZGrid.MultipleObjectsReturned
+XYZGrid.NotUpdated
XYZGrid.path
XYZGrid.typename
@@ -1076,6 +1085,7 @@
XYZRoom.return_appearance()
XYZRoom.DoesNotExist
XYZRoom.MultipleObjectsReturned
+XYZRoom.NotUpdated
XYZRoom.path
XYZRoom.typename
@@ -1088,6 +1098,7 @@
XYZExit.create()
XYZExit.DoesNotExist
XYZExit.MultipleObjectsReturned
+XYZExit.NotUpdated
XYZExit.path
XYZExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.simpledoor.html b/docs/latest/api/evennia.contrib.grid.simpledoor.html
index f012a86321..c7de8e4242 100644
--- a/docs/latest/api/evennia.contrib.grid.simpledoor.html
+++ b/docs/latest/api/evennia.contrib.grid.simpledoor.html
@@ -62,6 +62,7 @@
SimpleDoor.at_failed_traverse()
SimpleDoor.DoesNotExist
SimpleDoor.MultipleObjectsReturned
+SimpleDoor.NotUpdated
SimpleDoor.path
SimpleDoor.typename
diff --git a/docs/latest/api/evennia.contrib.grid.simpledoor.simpledoor.html b/docs/latest/api/evennia.contrib.grid.simpledoor.simpledoor.html
index 7b317fea82..e5eb5ebc35 100644
--- a/docs/latest/api/evennia.contrib.grid.simpledoor.simpledoor.html
+++ b/docs/latest/api/evennia.contrib.grid.simpledoor.simpledoor.html
@@ -149,6 +149,12 @@ attempting the traversal.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.simpledoor.simpledoor.SimpleDoor'
@@ -308,6 +314,7 @@ self.add().
SimpleDoor.at_failed_traverse()
SimpleDoor.DoesNotExist
SimpleDoor.MultipleObjectsReturned
+SimpleDoor.NotUpdated
SimpleDoor.path
SimpleDoor.typename
diff --git a/docs/latest/api/evennia.contrib.grid.slow_exit.html b/docs/latest/api/evennia.contrib.grid.slow_exit.html
index 4c4d33d2ec..167a0f89a1 100644
--- a/docs/latest/api/evennia.contrib.grid.slow_exit.html
+++ b/docs/latest/api/evennia.contrib.grid.slow_exit.html
@@ -63,6 +63,7 @@
SlowExit.at_traverse()
SlowExit.DoesNotExist
SlowExit.MultipleObjectsReturned
+SlowExit.NotUpdated
SlowExit.path
SlowExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.slow_exit.slow_exit.html b/docs/latest/api/evennia.contrib.grid.slow_exit.slow_exit.html
index b424d94d0e..bafc77bb27 100644
--- a/docs/latest/api/evennia.contrib.grid.slow_exit.slow_exit.html
+++ b/docs/latest/api/evennia.contrib.grid.slow_exit.slow_exit.html
@@ -117,6 +117,12 @@ TickerHandler might be better.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.slow_exit.slow_exit.SlowExit'
@@ -271,6 +277,7 @@ self.add().
SlowExit.at_traverse()
SlowExit.DoesNotExist
SlowExit.MultipleObjectsReturned
+SlowExit.NotUpdated
SlowExit.path
SlowExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.wilderness.html b/docs/latest/api/evennia.contrib.grid.wilderness.html
index 1e30daee9d..4b43f78212 100644
--- a/docs/latest/api/evennia.contrib.grid.wilderness.html
+++ b/docs/latest/api/evennia.contrib.grid.wilderness.html
@@ -91,6 +91,7 @@
WildernessScript.at_post_object_leave()
WildernessScript.DoesNotExist
WildernessScript.MultipleObjectsReturned
+WildernessScript.NotUpdated
WildernessScript.path
WildernessScript.typename
@@ -106,6 +107,7 @@
WildernessRoom.get_display_desc()
WildernessRoom.DoesNotExist
WildernessRoom.MultipleObjectsReturned
+WildernessRoom.NotUpdated
WildernessRoom.path
WildernessRoom.typename
@@ -117,6 +119,7 @@
WildernessExit.at_traverse()
WildernessExit.DoesNotExist
WildernessExit.MultipleObjectsReturned
+WildernessExit.NotUpdated
WildernessExit.path
WildernessExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.wilderness.wilderness.html b/docs/latest/api/evennia.contrib.grid.wilderness.wilderness.html
index f8b759f93b..1255ffff7d 100644
--- a/docs/latest/api/evennia.contrib.grid.wilderness.wilderness.html
+++ b/docs/latest/api/evennia.contrib.grid.wilderness.wilderness.html
@@ -343,6 +343,12 @@ are a lot of objects in the map.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.wilderness.wilderness.WildernessScript'
@@ -494,6 +500,12 @@ avoiding having to write to the database on moving.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.wilderness.wilderness.WildernessRoom'
@@ -595,6 +607,12 @@ already been checked (in the Exit command) at this point.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.wilderness.wilderness.WildernessExit'
@@ -727,6 +745,7 @@ coordinate.
WildernessScript.at_post_object_leave()
WildernessScript.DoesNotExist
WildernessScript.MultipleObjectsReturned
+WildernessScript.NotUpdated
WildernessScript.path
WildernessScript.typename
@@ -742,6 +761,7 @@ coordinate.
WildernessRoom.get_display_desc()
WildernessRoom.DoesNotExist
WildernessRoom.MultipleObjectsReturned
+WildernessRoom.NotUpdated
WildernessRoom.path
WildernessRoom.typename
@@ -753,6 +773,7 @@ coordinate.
WildernessExit.at_traverse()
WildernessExit.DoesNotExist
WildernessExit.MultipleObjectsReturned
+WildernessExit.NotUpdated
WildernessExit.path
WildernessExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
index e8ac9be00b..939df047bb 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -370,7 +370,7 @@ there is no room above/below you, your movement will fail.
-
-aliases = ['dive', 'fly']
+aliases = ['fly', 'dive']
@@ -395,7 +395,7 @@ to all the variables defined therein.
-
-search_index_entry = {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\nFly or Dive up and down.\n\nUsage:\n fly\n dive\n\nWill fly up one room or dive down one room at your current position. If\nthere is no room above/below you, your movement will fail.\n\n'}
+search_index_entry = {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\nFly or Dive up and down.\n\nUsage:\n fly\n dive\n\nWill fly up one room or dive down one room at your current position. If\nthere is no room above/below you, your movement will fail.\n\n'}
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.html
index bd099e1467..a82bba3a89 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.html
@@ -398,6 +398,7 @@
TestXyzRoom.at_object_creation()
TestXyzRoom.DoesNotExist
TestXyzRoom.MultipleObjectsReturned
+TestXyzRoom.NotUpdated
TestXyzRoom.path
TestXyzRoom.typename
@@ -406,6 +407,7 @@
TestXyzExit.at_object_creation()
TestXyzExit.DoesNotExist
TestXyzExit.MultipleObjectsReturned
+TestXyzExit.NotUpdated
TestXyzExit.path
TestXyzExit.typename
@@ -678,6 +680,7 @@
XYZGrid.spawn()
XYZGrid.DoesNotExist
XYZGrid.MultipleObjectsReturned
+XYZGrid.NotUpdated
XYZGrid.path
XYZGrid.typename
@@ -714,6 +717,7 @@
XYZRoom.return_appearance()
XYZRoom.DoesNotExist
XYZRoom.MultipleObjectsReturned
+XYZRoom.NotUpdated
XYZRoom.path
XYZRoom.typename
@@ -726,6 +730,7 @@
XYZExit.create()
XYZExit.DoesNotExist
XYZExit.MultipleObjectsReturned
+XYZExit.NotUpdated
XYZExit.path
XYZExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.tests.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.tests.html
index efe364e3c8..42b604fc63 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.tests.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.tests.html
@@ -459,19 +459,19 @@ character @-symbol in that spot.
-
test_shortest_path_07(**kw)
-Test shortest-path calculations throughout the grid [with startcoord=(5, 5), endcoord=(0, 0), expected_directions=(‘sw’, ‘nw’, ‘sw’, ‘s’, ‘s’, ‘sw’)].
+Test shortest-path calculations throughout the grid [with startcoord=(5, 5), endcoord=(0, 0), expected_directions=(‘sw’, ‘nw’, ‘sw’, ‘se’, ‘sw’, ‘sw’)].
-
test_shortest_path_08(**kw)
-Test shortest-path calculations throughout the grid [with startcoord=(5, 5), endcoord=(0, 0), expected_directions=(‘sw’, ‘nw’, ‘sw’, ‘s’, ‘s’, ‘sw’)].
+Test shortest-path calculations throughout the grid [with startcoord=(5, 5), endcoord=(0, 0), expected_directions=(‘sw’, ‘nw’, ‘sw’, ‘se’, ‘sw’, ‘sw’)].
-
test_shortest_path_09(**kw)
-Test shortest-path calculations throughout the grid [with startcoord=(5, 2), endcoord=(1, 2), expected_directions=(‘sw’, ‘nw’, ‘w’, ‘nw’, ‘s’)].
+Test shortest-path calculations throughout the grid [with startcoord=(5, 2), endcoord=(1, 2), expected_directions=(‘nw’, ‘n’, ‘nw’, ‘sw’, ‘s’)].
@@ -547,7 +547,7 @@ character @-symbol in that spot.
-
test_shortest_path_5(**kw)
-Test shortest-path calculations throughout the grid [with startcoord=(2, 2), endcoord=(0, 4), expected_directions=(‘w’, ‘ne’, ‘nw’, ‘w’)].
+Test shortest-path calculations throughout the grid [with startcoord=(2, 2), endcoord=(0, 4), expected_directions=(‘ne’, ‘w’, ‘nw’, ‘w’)].
@@ -867,7 +867,7 @@ character @-symbol in that spot.
-
test_shortest_path_6(**kw)
-test shortest-path calculations throughout the grid [with startcoord=(1, 4), endcoord=(3, 3), expected_directions=(‘e’, ‘w’, ‘e’)].
+test shortest-path calculations throughout the grid [with startcoord=(1, 4), endcoord=(3, 3), expected_directions=(‘w’, ‘s’, ‘e’)].
@@ -1355,6 +1355,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.xyzgrid.tests.TestXyzRoom'
@@ -1390,6 +1396,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.xyzgrid.tests.TestXyzExit'
@@ -1798,6 +1810,7 @@ normal hook to overload for most object types.
TestXyzRoom.at_object_creation()
TestXyzRoom.DoesNotExist
TestXyzRoom.MultipleObjectsReturned
+TestXyzRoom.NotUpdated
TestXyzRoom.path
TestXyzRoom.typename
@@ -1806,6 +1819,7 @@ normal hook to overload for most object types.
TestXyzExit.at_object_creation()
TestXyzExit.DoesNotExist
TestXyzExit.MultipleObjectsReturned
+TestXyzExit.NotUpdated
TestXyzExit.path
TestXyzExit.typename
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzgrid.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzgrid.html
index d5b51b470c..8bb8eabf45 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzgrid.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzgrid.html
@@ -259,6 +259,12 @@ Spawn exits only the given direction. If unset, all needed directions are spawne
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.xyzgrid.xyzgrid.XYZGrid'
@@ -324,6 +330,7 @@ previously exist.
XYZGrid.spawn()
XYZGrid.DoesNotExist
XYZGrid.MultipleObjectsReturned
+XYZGrid.NotUpdated
XYZGrid.path
XYZGrid.typename
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzroom.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzroom.html
index 395209fc9d..d5a44797bb 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzroom.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.xyzroom.html
@@ -387,6 +387,12 @@ map is tagged with type=’xymap’.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.xyzgrid.xyzroom.XYZRoom'
@@ -470,6 +476,12 @@ be any room (including non-XYRooms) and is not checked for XYZ coordinates.<
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.grid.xyzgrid.xyzroom.XYZExit'
@@ -535,6 +547,7 @@ be any room (including non-XYRooms) and is not checked for XYZ coordinates.<
XYZRoom.return_appearance()
XYZRoom.DoesNotExist
XYZRoom.MultipleObjectsReturned
+XYZRoom.NotUpdated
XYZRoom.path
XYZRoom.typename
@@ -547,6 +560,7 @@ be any room (including non-XYRooms) and is not checked for XYZ coordinates.<
XYZExit.create()
XYZExit.DoesNotExist
XYZExit.MultipleObjectsReturned
+XYZExit.NotUpdated
XYZExit.path
XYZExit.typename
diff --git a/docs/latest/api/evennia.contrib.html b/docs/latest/api/evennia.contrib.html
index 2f005bc25c..fb031c43f7 100644
--- a/docs/latest/api/evennia.contrib.html
+++ b/docs/latest/api/evennia.contrib.html
@@ -455,6 +455,7 @@ useful but are deemed too game-specific to go into the core library.
CharacterWithComponents.ic_a
CharacterWithComponents.DoesNotExist
CharacterWithComponents.MultipleObjectsReturned
+CharacterWithComponents.NotUpdated
CharacterWithComponents.path
CharacterWithComponents.typename
@@ -463,6 +464,7 @@ useful but are deemed too game-specific to go into the core library.
InheritedTCWithComponents.test_c
InheritedTCWithComponents.DoesNotExist
InheritedTCWithComponents.MultipleObjectsReturned
+InheritedTCWithComponents.NotUpdated
InheritedTCWithComponents.path
InheritedTCWithComponents.typename
@@ -507,6 +509,7 @@ useful but are deemed too game-specific to go into the core library.
CharWithSignal.my_other_response()
CharWithSignal.DoesNotExist
CharWithSignal.MultipleObjectsReturned
+CharWithSignal.NotUpdated
CharWithSignal.path
CharWithSignal.typename
@@ -560,6 +563,7 @@ useful but are deemed too game-specific to go into the core library.
GametimeScript.at_repeat()
GametimeScript.DoesNotExist
GametimeScript.MultipleObjectsReturned
+GametimeScript.NotUpdated
GametimeScript.path
GametimeScript.typename
@@ -639,6 +643,7 @@ useful but are deemed too game-specific to go into the core library.
AccountDB
@@ -1503,6 +1511,7 @@ useful but are deemed too game-specific to go into the core library.
EvscaperoomObject.return_appearance()
EvscaperoomObject.DoesNotExist
EvscaperoomObject.MultipleObjectsReturned
+EvscaperoomObject.NotUpdated
EvscaperoomObject.path
EvscaperoomObject.typename
@@ -1511,6 +1520,7 @@ useful but are deemed too game-specific to go into the core library.
Feelable.at_focus_feel()
Feelable.DoesNotExist
Feelable.MultipleObjectsReturned
+Feelable.NotUpdated
Feelable.path
Feelable.typename
@@ -1519,6 +1529,7 @@ useful but are deemed too game-specific to go into the core library.
Listenable.at_focus_listen()
Listenable.DoesNotExist
Listenable.MultipleObjectsReturned
+Listenable.NotUpdated
Listenable.path
Listenable.typename
@@ -1527,6 +1538,7 @@ useful but are deemed too game-specific to go into the core library.
Smellable.at_focus_smell()
Smellable.DoesNotExist
Smellable.MultipleObjectsReturned
+Smellable.NotUpdated
Smellable.path
Smellable.typename
@@ -1541,6 +1553,7 @@ useful but are deemed too game-specific to go into the core library.
Rotatable.at_cannot_rotate()
Rotatable.DoesNotExist
Rotatable.MultipleObjectsReturned
+Rotatable.NotUpdated
Rotatable.path
Rotatable.typename
@@ -1559,6 +1572,7 @@ useful but are deemed too game-specific to go into the core library.
Openable.at_already_closed()
Openable.DoesNotExist
Openable.MultipleObjectsReturned
+Openable.NotUpdated
Openable.path
Openable.typename
@@ -1572,6 +1586,7 @@ useful but are deemed too game-specific to go into the core library.
Readable.at_cannot_read()
Readable.DoesNotExist
Readable.MultipleObjectsReturned
+Readable.NotUpdated
Readable.path
Readable.typename
@@ -1584,6 +1599,7 @@ useful but are deemed too game-specific to go into the core library.
IndexReadable.at_read()
IndexReadable.DoesNotExist
IndexReadable.MultipleObjectsReturned
+IndexReadable.NotUpdated
IndexReadable.path
IndexReadable.typename
@@ -1602,6 +1618,7 @@ useful but are deemed too game-specific to go into the core library.
Movable.at_right()
Movable.DoesNotExist
Movable.MultipleObjectsReturned
+Movable.NotUpdated
Movable.path
Movable.typename
@@ -1615,6 +1632,7 @@ useful but are deemed too game-specific to go into the core library.
BaseConsumable.at_already_consumed()
BaseConsumable.DoesNotExist
BaseConsumable.MultipleObjectsReturned
+BaseConsumable.NotUpdated
BaseConsumable.path
BaseConsumable.typename
@@ -1624,6 +1642,7 @@ useful but are deemed too game-specific to go into the core library.
Edible.at_focus_eat()
Edible.DoesNotExist
Edible.MultipleObjectsReturned
+Edible.NotUpdated
Edible.path
Edible.typename
@@ -1636,6 +1655,7 @@ useful but are deemed too game-specific to go into the core library.
Drinkable.at_already_consumed()
Drinkable.DoesNotExist
Drinkable.MultipleObjectsReturned
+Drinkable.NotUpdated
Drinkable.path
Drinkable.typename
@@ -1647,6 +1667,7 @@ useful but are deemed too game-specific to go into the core library.
BaseApplicable.at_cannot_apply()
BaseApplicable.DoesNotExist
BaseApplicable.MultipleObjectsReturned
+BaseApplicable.NotUpdated
BaseApplicable.path
BaseApplicable.typename
@@ -1658,6 +1679,7 @@ useful but are deemed too game-specific to go into the core library.
Usable.at_cannot_apply()
Usable.DoesNotExist
Usable.MultipleObjectsReturned
+Usable.NotUpdated
Usable.path
Usable.typename
@@ -1670,6 +1692,7 @@ useful but are deemed too game-specific to go into the core library.
Insertable.at_cannot_apply()
Insertable.DoesNotExist
Insertable.MultipleObjectsReturned
+Insertable.NotUpdated
Insertable.path
Insertable.typename
@@ -1684,6 +1707,7 @@ useful but are deemed too game-specific to go into the core library.
Combinable.at_apply()
Combinable.DoesNotExist
Combinable.MultipleObjectsReturned
+Combinable.NotUpdated
Combinable.path
Combinable.typename
@@ -1699,6 +1723,7 @@ useful but are deemed too game-specific to go into the core library.
Mixable.at_mix_success()
Mixable.DoesNotExist
Mixable.MultipleObjectsReturned
+Mixable.NotUpdated
Mixable.path
Mixable.typename
@@ -1713,6 +1738,7 @@ useful but are deemed too game-specific to go into the core library.
HasButtons.at_red_button()
HasButtons.DoesNotExist
HasButtons.MultipleObjectsReturned
+HasButtons.NotUpdated
HasButtons.path
HasButtons.typename
@@ -1729,6 +1755,7 @@ useful but are deemed too game-specific to go into the core library.
CodeInput.at_code_incorrect()
CodeInput.DoesNotExist
CodeInput.MultipleObjectsReturned
+CodeInput.NotUpdated
CodeInput.path
CodeInput.typename
@@ -1741,6 +1768,7 @@ useful but are deemed too game-specific to go into the core library.
BasePositionable.at_position()
BasePositionable.DoesNotExist
BasePositionable.MultipleObjectsReturned
+BasePositionable.NotUpdated
BasePositionable.path
BasePositionable.typename
@@ -1749,6 +1777,7 @@ useful but are deemed too game-specific to go into the core library.
Sittable.at_focus_sit()
Sittable.DoesNotExist
Sittable.MultipleObjectsReturned
+Sittable.NotUpdated
Sittable.path
Sittable.typename
@@ -1757,6 +1786,7 @@ useful but are deemed too game-specific to go into the core library.
Liable.at_focus_lie()
Liable.DoesNotExist
Liable.MultipleObjectsReturned
+Liable.NotUpdated
Liable.path
Liable.typename
@@ -1765,6 +1795,7 @@ useful but are deemed too game-specific to go into the core library.
Kneelable.at_focus_kneel()
Kneelable.DoesNotExist
Kneelable.MultipleObjectsReturned
+Kneelable.NotUpdated
Kneelable.path
Kneelable.typename
@@ -1773,6 +1804,7 @@ useful but are deemed too game-specific to go into the core library.
Climbable.at_focus_climb()
Climbable.DoesNotExist
Climbable.MultipleObjectsReturned
+Climbable.NotUpdated
Climbable.path
Climbable.typename
@@ -1781,6 +1813,7 @@ useful but are deemed too game-specific to go into the core library.
Positionable.get_cmd_signatures()
Positionable.DoesNotExist
Positionable.MultipleObjectsReturned
+Positionable.NotUpdated
Positionable.path
Positionable.typename
@@ -1811,6 +1844,7 @@ useful but are deemed too game-specific to go into the core library.
EvscapeRoom.return_appearance()
EvscapeRoom.DoesNotExist
EvscapeRoom.MultipleObjectsReturned
+EvscapeRoom.NotUpdated
EvscapeRoom.path
EvscapeRoom.typename
@@ -1823,6 +1857,7 @@ useful but are deemed too game-specific to go into the core library.
CleanupScript.at_repeat()
CleanupScript.DoesNotExist
CleanupScript.MultipleObjectsReturned
+CleanupScript.NotUpdated
CleanupScript.path
CleanupScript.typename
@@ -1950,6 +1985,7 @@ useful but are deemed too game-specific to go into the core library.
TradeTimeout.is_valid()
TradeTimeout.DoesNotExist
TradeTimeout.MultipleObjectsReturned
+TradeTimeout.NotUpdated
TradeTimeout.path
TradeTimeout.typename
@@ -2092,6 +2128,7 @@ useful but are deemed too game-specific to go into the core library.
ContribClothing.at_pre_move()
ContribClothing.DoesNotExist
ContribClothing.MultipleObjectsReturned
+ContribClothing.NotUpdated
ContribClothing.path
ContribClothing.typename
@@ -2101,6 +2138,7 @@ useful but are deemed too game-specific to go into the core library.
ClothedCharacter.get_display_things()
ClothedCharacter.DoesNotExist
ClothedCharacter.MultipleObjectsReturned
+ClothedCharacter.NotUpdated
ClothedCharacter.path
ClothedCharacter.typename
@@ -2477,6 +2515,7 @@ useful but are deemed too game-specific to go into the core library.
GenderCharacter.msg()
GenderCharacter.DoesNotExist
GenderCharacter.MultipleObjectsReturned
+GenderCharacter.NotUpdated
GenderCharacter.path
GenderCharacter.typename
@@ -2563,6 +2602,7 @@ useful but are deemed too game-specific to go into the core library.
PuzzleRecipe.save_recipe()
PuzzleRecipe.DoesNotExist
PuzzleRecipe.MultipleObjectsReturned
+PuzzleRecipe.NotUpdated
PuzzleRecipe.path
PuzzleRecipe.typename
@@ -2752,6 +2792,7 @@ useful but are deemed too game-specific to go into the core library.
TBBasicCharacter.at_pre_move()
TBBasicCharacter.DoesNotExist
TBBasicCharacter.MultipleObjectsReturned
+TBBasicCharacter.NotUpdated
TBBasicCharacter.path
TBBasicCharacter.typename
@@ -2768,6 +2809,7 @@ useful but are deemed too game-specific to go into the core library.
TBBasicTurnHandler.join_fight()
TBBasicTurnHandler.DoesNotExist
TBBasicTurnHandler.MultipleObjectsReturned
+TBBasicTurnHandler.NotUpdated
TBBasicTurnHandler.path
TBBasicTurnHandler.typename
@@ -2856,6 +2898,7 @@ useful but are deemed too game-specific to go into the core library.
TBEquipTurnHandler.rules
TBEquipTurnHandler.DoesNotExist
TBEquipTurnHandler.MultipleObjectsReturned
+TBEquipTurnHandler.NotUpdated
TBEquipTurnHandler.path
TBEquipTurnHandler.typename
@@ -2867,6 +2910,7 @@ useful but are deemed too game-specific to go into the core library.
TBEWeapon.at_give()
TBEWeapon.DoesNotExist
TBEWeapon.MultipleObjectsReturned
+TBEWeapon.NotUpdated
TBEWeapon.path
TBEWeapon.typename
@@ -2879,6 +2923,7 @@ useful but are deemed too game-specific to go into the core library.
TBEArmor.at_give()
TBEArmor.DoesNotExist
TBEArmor.MultipleObjectsReturned
+TBEArmor.NotUpdated
TBEArmor.path
TBEArmor.typename
@@ -2887,6 +2932,7 @@ useful but are deemed too game-specific to go into the core library.
TBEquipCharacter.at_object_creation()
TBEquipCharacter.DoesNotExist
TBEquipCharacter.MultipleObjectsReturned
+TBEquipCharacter.NotUpdated
TBEquipCharacter.path
TBEquipCharacter.typename
@@ -3021,6 +3067,7 @@ useful but are deemed too game-specific to go into the core library.
TBItemsCharacter.at_update()
TBItemsCharacter.DoesNotExist
TBItemsCharacter.MultipleObjectsReturned
+TBItemsCharacter.NotUpdated
TBItemsCharacter.path
TBItemsCharacter.typename
@@ -3029,6 +3076,7 @@ useful but are deemed too game-specific to go into the core library.
TBItemsCharacterTest.at_object_creation()
TBItemsCharacterTest.DoesNotExist
TBItemsCharacterTest.MultipleObjectsReturned
+TBItemsCharacterTest.NotUpdated
TBItemsCharacterTest.path
TBItemsCharacterTest.typename
@@ -3038,6 +3086,7 @@ useful but are deemed too game-specific to go into the core library.
TBItemsTurnHandler.next_turn()
TBItemsTurnHandler.DoesNotExist
TBItemsTurnHandler.MultipleObjectsReturned
+TBItemsTurnHandler.NotUpdated
TBItemsTurnHandler.path
TBItemsTurnHandler.typename
@@ -3131,6 +3180,7 @@ useful but are deemed too game-specific to go into the core library.
TBMagicCharacter.at_object_creation()
TBMagicCharacter.DoesNotExist
TBMagicCharacter.MultipleObjectsReturned
+TBMagicCharacter.NotUpdated
TBMagicCharacter.path
TBMagicCharacter.typename
@@ -3139,6 +3189,7 @@ useful but are deemed too game-specific to go into the core library.
TBMagicTurnHandler.rules
TBMagicTurnHandler.DoesNotExist
TBMagicTurnHandler.MultipleObjectsReturned
+TBMagicTurnHandler.NotUpdated
TBMagicTurnHandler.path
TBMagicTurnHandler.typename
@@ -3257,6 +3308,7 @@ useful but are deemed too game-specific to go into the core library.
TBRangeTurnHandler.join_fight()
TBRangeTurnHandler.DoesNotExist
TBRangeTurnHandler.MultipleObjectsReturned
+TBRangeTurnHandler.NotUpdated
TBRangeTurnHandler.path
TBRangeTurnHandler.typename
@@ -3265,6 +3317,7 @@ useful but are deemed too game-specific to go into the core library.
TBRangeCharacter.rules
TBRangeCharacter.DoesNotExist
TBRangeCharacter.MultipleObjectsReturned
+TBRangeCharacter.NotUpdated
TBRangeCharacter.path
TBRangeCharacter.typename
@@ -3278,6 +3331,7 @@ useful but are deemed too game-specific to go into the core library.
TBRangeObject.at_give()
TBRangeObject.DoesNotExist
TBRangeObject.MultipleObjectsReturned
+TBRangeObject.NotUpdated
TBRangeObject.path
TBRangeObject.typename
@@ -3488,6 +3542,7 @@ useful but are deemed too game-specific to go into the core library.
ExtendedRoom.return_detail()
ExtendedRoom.DoesNotExist
ExtendedRoom.MultipleObjectsReturned
+ExtendedRoom.NotUpdated
ExtendedRoom.path
ExtendedRoom.typename
@@ -3640,6 +3695,7 @@ useful but are deemed too game-specific to go into the core library.
SimpleDoor.at_failed_traverse()
SimpleDoor.DoesNotExist
SimpleDoor.MultipleObjectsReturned
+SimpleDoor.NotUpdated
SimpleDoor.path
SimpleDoor.typename
@@ -3690,6 +3746,7 @@ useful but are deemed too game-specific to go into the core library.
SlowExit.at_traverse()
SlowExit.DoesNotExist
SlowExit.MultipleObjectsReturned
+SlowExit.NotUpdated
SlowExit.path
SlowExit.typename
@@ -3767,6 +3824,7 @@ useful but are deemed too game-specific to go into the core library.
WildernessScript.at_post_object_leave()
WildernessScript.DoesNotExist
WildernessScript.MultipleObjectsReturned
+WildernessScript.NotUpdated
WildernessScript.path
WildernessScript.typename
@@ -3782,6 +3840,7 @@ useful but are deemed too game-specific to go into the core library.
WildernessRoom.get_display_desc()
WildernessRoom.DoesNotExist
WildernessRoom.MultipleObjectsReturned
+WildernessRoom.NotUpdated
WildernessRoom.path
WildernessRoom.typename
@@ -3793,6 +3852,7 @@ useful but are deemed too game-specific to go into the core library.
WildernessExit.at_traverse()
WildernessExit.DoesNotExist
WildernessExit.MultipleObjectsReturned
+WildernessExit.NotUpdated
WildernessExit.path
WildernessExit.typename
@@ -4155,6 +4215,7 @@ useful but are deemed too game-specific to go into the core library.
TestXyzRoom.at_object_creation()
TestXyzRoom.DoesNotExist
TestXyzRoom.MultipleObjectsReturned
+TestXyzRoom.NotUpdated
TestXyzRoom.path
TestXyzRoom.typename
@@ -4163,6 +4224,7 @@ useful but are deemed too game-specific to go into the core library.
TestXyzExit.at_object_creation()
TestXyzExit.DoesNotExist
TestXyzExit.MultipleObjectsReturned
+TestXyzExit.NotUpdated
TestXyzExit.path
TestXyzExit.typename
@@ -4435,6 +4497,7 @@ useful but are deemed too game-specific to go into the core library.
XYZGrid.spawn()
XYZGrid.DoesNotExist
XYZGrid.MultipleObjectsReturned
+XYZGrid.NotUpdated
XYZGrid.path
XYZGrid.typename
@@ -4471,6 +4534,7 @@ useful but are deemed too game-specific to go into the core library.
XYZRoom.return_appearance()
XYZRoom.DoesNotExist
XYZRoom.MultipleObjectsReturned
+XYZRoom.NotUpdated
XYZRoom.path
XYZRoom.typename
@@ -4483,6 +4547,7 @@ useful but are deemed too game-specific to go into the core library.
XYZExit.create()
XYZExit.DoesNotExist
XYZExit.MultipleObjectsReturned
+XYZExit.NotUpdated
XYZExit.path
XYZExit.typename
@@ -4690,6 +4755,7 @@ useful but are deemed too game-specific to go into the core library.
BuffableObject.at_init()
BuffableObject.DoesNotExist
BuffableObject.MultipleObjectsReturned
+BuffableObject.NotUpdated
BuffableObject.path
BuffableObject.typename
@@ -4749,6 +4815,7 @@ useful but are deemed too game-specific to go into the core library.
ContribChargenAccount.at_look()
ContribChargenAccount.DoesNotExist
ContribChargenAccount.MultipleObjectsReturned
+ContribChargenAccount.NotUpdated
ContribChargenAccount.path
ContribChargenAccount.typename
@@ -4797,6 +4864,7 @@ useful but are deemed too game-specific to go into the core library.
TestDice.test_cmddice()
TestDice.test_string_form()
TestDice.test_maxvals()
+TestDice.test_malformed_inputs()
@@ -4858,6 +4926,7 @@ useful but are deemed too game-specific to go into the core library.
LLMNPC.at_talked_to()
LLMNPC.DoesNotExist
LLMNPC.MultipleObjectsReturned
+LLMNPC.NotUpdated
LLMNPC.path
LLMNPC.typename
@@ -4898,6 +4967,7 @@ useful but are deemed too game-specific to go into the core library.
LanguageHandler.translate()
LanguageHandler.DoesNotExist
LanguageHandler.MultipleObjectsReturned
+LanguageHandler.NotUpdated
LanguageHandler.path
LanguageHandler.typename
@@ -5018,6 +5088,7 @@ useful but are deemed too game-specific to go into the core library.
ContribRPObject.get_display_things()
ContribRPObject.DoesNotExist
ContribRPObject.MultipleObjectsReturned
+ContribRPObject.NotUpdated
ContribRPObject.path
ContribRPObject.typename
@@ -5025,6 +5096,7 @@ useful but are deemed too game-specific to go into the core library.
ContribRPRoom
@@ -5040,6 +5112,7 @@ useful but are deemed too game-specific to go into the core library.
ContribRPCharacter.process_language()
ContribRPCharacter.DoesNotExist
ContribRPCharacter.MultipleObjectsReturned
+ContribRPCharacter.NotUpdated
ContribRPCharacter.path
ContribRPCharacter.typename
@@ -5182,6 +5255,7 @@ useful but are deemed too game-specific to go into the core library.
TraitContribTestingChar.HP
TraitContribTestingChar.DoesNotExist
TraitContribTestingChar.MultipleObjectsReturned
+TraitContribTestingChar.NotUpdated
TraitContribTestingChar.path
TraitContribTestingChar.typename
@@ -5303,6 +5377,7 @@ useful but are deemed too game-specific to go into the core library.
BodyFunctions.send_random_message()
BodyFunctions.DoesNotExist
BodyFunctions.MultipleObjectsReturned
+BodyFunctions.NotUpdated
BodyFunctions.path
BodyFunctions.typename
@@ -5390,6 +5465,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureCharacter.level_up()
EvAdventureCharacter.DoesNotExist
EvAdventureCharacter.MultipleObjectsReturned
+EvAdventureCharacter.NotUpdated
EvAdventureCharacter.path
EvAdventureCharacter.typename
@@ -5456,6 +5532,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureCombatBaseHandler.stop_combat()
EvAdventureCombatBaseHandler.DoesNotExist
EvAdventureCombatBaseHandler.MultipleObjectsReturned
+EvAdventureCombatBaseHandler.NotUpdated
EvAdventureCombatBaseHandler.path
EvAdventureCombatBaseHandler.typename
@@ -5494,6 +5571,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureTurnbasedCombatHandler.at_repeat()
EvAdventureTurnbasedCombatHandler.DoesNotExist
EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+EvAdventureTurnbasedCombatHandler.NotUpdated
EvAdventureTurnbasedCombatHandler.path
EvAdventureTurnbasedCombatHandler.typename
@@ -5547,6 +5625,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureCombatTwitchHandler.stop_combat()
EvAdventureCombatTwitchHandler.DoesNotExist
EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+EvAdventureCombatTwitchHandler.NotUpdated
EvAdventureCombatTwitchHandler.path
EvAdventureCombatTwitchHandler.typename
@@ -5703,6 +5782,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonRoom.get_display_footer()
EvAdventureDungeonRoom.DoesNotExist
EvAdventureDungeonRoom.MultipleObjectsReturned
+EvAdventureDungeonRoom.NotUpdated
EvAdventureDungeonRoom.path
EvAdventureDungeonRoom.typename
@@ -5713,6 +5793,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonExit.at_failed_traverse()
EvAdventureDungeonExit.DoesNotExist
EvAdventureDungeonExit.MultipleObjectsReturned
+EvAdventureDungeonExit.NotUpdated
EvAdventureDungeonExit.path
EvAdventureDungeonExit.typename
@@ -5733,6 +5814,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonBranch.new_room()
EvAdventureDungeonBranch.DoesNotExist
EvAdventureDungeonBranch.MultipleObjectsReturned
+EvAdventureDungeonBranch.NotUpdated
EvAdventureDungeonBranch.path
EvAdventureDungeonBranch.typename
@@ -5742,6 +5824,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonStartRoomExit.at_traverse()
EvAdventureDungeonStartRoomExit.DoesNotExist
EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+EvAdventureDungeonStartRoomExit.NotUpdated
EvAdventureDungeonStartRoomExit.path
EvAdventureDungeonStartRoomExit.typename
@@ -5752,6 +5835,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonBranchDeleter.at_repeat()
EvAdventureDungeonBranchDeleter.DoesNotExist
EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+EvAdventureDungeonBranchDeleter.NotUpdated
EvAdventureDungeonBranchDeleter.path
EvAdventureDungeonBranchDeleter.typename
@@ -5761,6 +5845,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureStartRoomResetter.at_repeat()
EvAdventureStartRoomResetter.DoesNotExist
EvAdventureStartRoomResetter.MultipleObjectsReturned
+EvAdventureStartRoomResetter.NotUpdated
EvAdventureStartRoomResetter.path
EvAdventureStartRoomResetter.typename
@@ -5775,6 +5860,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureDungeonStartRoom.at_object_receive()
EvAdventureDungeonStartRoom.DoesNotExist
EvAdventureDungeonStartRoom.MultipleObjectsReturned
+EvAdventureDungeonStartRoom.NotUpdated
EvAdventureDungeonStartRoom.path
EvAdventureDungeonStartRoom.typename
@@ -5871,6 +5957,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureNPC.ai_next_action()
EvAdventureNPC.DoesNotExist
EvAdventureNPC.MultipleObjectsReturned
+EvAdventureNPC.NotUpdated
EvAdventureNPC.path
EvAdventureNPC.typename
@@ -5884,6 +5971,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureTalkativeNPC.at_talk()
EvAdventureTalkativeNPC.DoesNotExist
EvAdventureTalkativeNPC.MultipleObjectsReturned
+EvAdventureTalkativeNPC.NotUpdated
EvAdventureTalkativeNPC.path
EvAdventureTalkativeNPC.typename
@@ -5892,6 +5980,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureQuestGiver
@@ -5903,6 +5992,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureShopKeeper.at_damage()
EvAdventureShopKeeper.DoesNotExist
EvAdventureShopKeeper.MultipleObjectsReturned
+EvAdventureShopKeeper.NotUpdated
EvAdventureShopKeeper.path
EvAdventureShopKeeper.typename
@@ -5917,6 +6007,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureMob.at_defeat()
EvAdventureMob.DoesNotExist
EvAdventureMob.MultipleObjectsReturned
+EvAdventureMob.NotUpdated
EvAdventureMob.path
EvAdventureMob.typename
@@ -5939,6 +6030,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureObject.at_post_use()
EvAdventureObject.DoesNotExist
EvAdventureObject.MultipleObjectsReturned
+EvAdventureObject.NotUpdated
EvAdventureObject.path
EvAdventureObject.typename
@@ -5948,6 +6040,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureObjectFiller.quality
EvAdventureObjectFiller.DoesNotExist
EvAdventureObjectFiller.MultipleObjectsReturned
+EvAdventureObjectFiller.NotUpdated
EvAdventureObjectFiller.path
EvAdventureObjectFiller.typename
@@ -5957,6 +6050,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureQuestObject.value
EvAdventureQuestObject.DoesNotExist
EvAdventureQuestObject.MultipleObjectsReturned
+EvAdventureQuestObject.NotUpdated
EvAdventureQuestObject.path
EvAdventureQuestObject.typename
@@ -5966,6 +6060,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureTreasure.value
EvAdventureTreasure.DoesNotExist
EvAdventureTreasure.MultipleObjectsReturned
+EvAdventureTreasure.NotUpdated
EvAdventureTreasure.path
EvAdventureTreasure.typename
@@ -5979,6 +6074,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureConsumable.at_post_use()
EvAdventureConsumable.DoesNotExist
EvAdventureConsumable.MultipleObjectsReturned
+EvAdventureConsumable.NotUpdated
EvAdventureConsumable.path
EvAdventureConsumable.typename
@@ -5996,6 +6092,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureWeapon.at_post_use()
EvAdventureWeapon.DoesNotExist
EvAdventureWeapon.MultipleObjectsReturned
+EvAdventureWeapon.NotUpdated
EvAdventureWeapon.path
EvAdventureWeapon.typename
@@ -6007,6 +6104,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureThrowable.damage_roll
EvAdventureThrowable.DoesNotExist
EvAdventureThrowable.MultipleObjectsReturned
+EvAdventureThrowable.NotUpdated
EvAdventureThrowable.path
EvAdventureThrowable.typename
@@ -6022,6 +6120,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureRunestone.refresh()
EvAdventureRunestone.DoesNotExist
EvAdventureRunestone.MultipleObjectsReturned
+EvAdventureRunestone.NotUpdated
EvAdventureRunestone.path
EvAdventureRunestone.typename
@@ -6033,6 +6132,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureArmor.quality
EvAdventureArmor.DoesNotExist
EvAdventureArmor.MultipleObjectsReturned
+EvAdventureArmor.NotUpdated
EvAdventureArmor.path
EvAdventureArmor.typename
@@ -6042,6 +6142,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureShield.inventory_use_slot
EvAdventureShield.DoesNotExist
EvAdventureShield.MultipleObjectsReturned
+EvAdventureShield.NotUpdated
EvAdventureShield.path
EvAdventureShield.typename
@@ -6051,6 +6152,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureHelmet.inventory_use_slot
EvAdventureHelmet.DoesNotExist
EvAdventureHelmet.MultipleObjectsReturned
+EvAdventureHelmet.NotUpdated
EvAdventureHelmet.path
EvAdventureHelmet.typename
@@ -6065,6 +6167,7 @@ useful but are deemed too game-specific to go into the core library.
WeaponBareHands.quality
WeaponBareHands.DoesNotExist
WeaponBareHands.MultipleObjectsReturned
+WeaponBareHands.NotUpdated
WeaponBareHands.path
WeaponBareHands.typename
@@ -6135,6 +6238,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureRoom.get_display_header()
EvAdventureRoom.DoesNotExist
EvAdventureRoom.MultipleObjectsReturned
+EvAdventureRoom.NotUpdated
EvAdventureRoom.path
EvAdventureRoom.typename
@@ -6145,6 +6249,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventurePvPRoom.get_display_footer()
EvAdventurePvPRoom.DoesNotExist
EvAdventurePvPRoom.MultipleObjectsReturned
+EvAdventurePvPRoom.NotUpdated
EvAdventurePvPRoom.path
EvAdventurePvPRoom.typename
@@ -6359,6 +6464,7 @@ useful but are deemed too game-specific to go into the core library.
EvAdventureQuestTest.test_help()
EvAdventureQuestTest.test_progress__fail()
EvAdventureQuestTest.test_progress()
+EvAdventureQuestTest.test_questhandler_reload_after_restart()
@@ -6405,6 +6511,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialMirror.msg()
TutorialMirror.DoesNotExist
TutorialMirror.MultipleObjectsReturned
+TutorialMirror.NotUpdated
TutorialMirror.path
TutorialMirror.typename
@@ -6531,6 +6638,7 @@ useful but are deemed too game-specific to go into the core library.
RedButton.break_lamp()
RedButton.DoesNotExist
RedButton.MultipleObjectsReturned
+RedButton.NotUpdated
RedButton.path
RedButton.typename
@@ -6566,6 +6674,7 @@ useful but are deemed too game-specific to go into the core library.
TalkingNPC.at_object_creation()
TalkingNPC.DoesNotExist
TalkingNPC.MultipleObjectsReturned
+TalkingNPC.NotUpdated
TalkingNPC.path
TalkingNPC.typename
@@ -6654,6 +6763,7 @@ useful but are deemed too game-specific to go into the core library.
Mob.at_new_arrival()
Mob.DoesNotExist
Mob.MultipleObjectsReturned
+Mob.NotUpdated
Mob.path
Mob.typename
@@ -6666,6 +6776,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialObject.reset()
TutorialObject.DoesNotExist
TutorialObject.MultipleObjectsReturned
+TutorialObject.NotUpdated
TutorialObject.path
TutorialObject.typename
@@ -6689,6 +6800,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialReadable.at_object_creation()
TutorialReadable.DoesNotExist
TutorialReadable.MultipleObjectsReturned
+TutorialReadable.NotUpdated
TutorialReadable.path
TutorialReadable.typename
@@ -6712,6 +6824,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialClimbable.at_object_creation()
TutorialClimbable.DoesNotExist
TutorialClimbable.MultipleObjectsReturned
+TutorialClimbable.NotUpdated
TutorialClimbable.path
TutorialClimbable.typename
@@ -6721,6 +6834,7 @@ useful but are deemed too game-specific to go into the core library.
Obelisk.return_appearance()
Obelisk.DoesNotExist
Obelisk.MultipleObjectsReturned
+Obelisk.NotUpdated
Obelisk.path
Obelisk.typename
@@ -6748,6 +6862,7 @@ useful but are deemed too game-specific to go into the core library.
LightSource.light()
LightSource.DoesNotExist
LightSource.MultipleObjectsReturned
+LightSource.NotUpdated
LightSource.path
LightSource.typename
@@ -6790,6 +6905,7 @@ useful but are deemed too game-specific to go into the core library.
CrumblingWall.reset()
CrumblingWall.DoesNotExist
CrumblingWall.MultipleObjectsReturned
+CrumblingWall.NotUpdated
CrumblingWall.path
CrumblingWall.typename
@@ -6814,6 +6930,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialWeapon.reset()
TutorialWeapon.DoesNotExist
TutorialWeapon.MultipleObjectsReturned
+TutorialWeapon.NotUpdated
TutorialWeapon.path
TutorialWeapon.typename
@@ -6839,6 +6956,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialWeaponRack.produce_weapon()
TutorialWeaponRack.DoesNotExist
TutorialWeaponRack.MultipleObjectsReturned
+TutorialWeaponRack.NotUpdated
TutorialWeaponRack.path
TutorialWeaponRack.typename
@@ -6898,6 +7016,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialRoom.set_detail()
TutorialRoom.DoesNotExist
TutorialRoom.MultipleObjectsReturned
+TutorialRoom.NotUpdated
TutorialRoom.path
TutorialRoom.typename
@@ -6906,6 +7025,7 @@ useful but are deemed too game-specific to go into the core library.
TutorialStartExit.at_object_creation()
TutorialStartExit.DoesNotExist
TutorialStartExit.MultipleObjectsReturned
+TutorialStartExit.NotUpdated
TutorialStartExit.path
TutorialStartExit.typename
@@ -6915,6 +7035,7 @@ useful but are deemed too game-specific to go into the core library.
WeatherRoom.update_weather()
WeatherRoom.DoesNotExist
WeatherRoom.MultipleObjectsReturned
+WeatherRoom.NotUpdated
WeatherRoom.path
WeatherRoom.typename
@@ -6939,6 +7060,7 @@ useful but are deemed too game-specific to go into the core library.
IntroRoom.at_object_receive()
IntroRoom.DoesNotExist
IntroRoom.MultipleObjectsReturned
+IntroRoom.NotUpdated
IntroRoom.path
IntroRoom.typename
@@ -6997,6 +7119,7 @@ useful but are deemed too game-specific to go into the core library.
BridgeRoom.at_object_leave()
BridgeRoom.DoesNotExist
BridgeRoom.MultipleObjectsReturned
+BridgeRoom.NotUpdated
BridgeRoom.path
BridgeRoom.typename
@@ -7047,6 +7170,7 @@ useful but are deemed too game-specific to go into the core library.
DarkRoom.at_object_leave()
DarkRoom.DoesNotExist
DarkRoom.MultipleObjectsReturned
+DarkRoom.NotUpdated
DarkRoom.path
DarkRoom.typename
@@ -7056,6 +7180,7 @@ useful but are deemed too game-specific to go into the core library.
TeleportRoom.at_object_receive()
TeleportRoom.DoesNotExist
TeleportRoom.MultipleObjectsReturned
+TeleportRoom.NotUpdated
TeleportRoom.path
TeleportRoom.typename
@@ -7066,6 +7191,7 @@ useful but are deemed too game-specific to go into the core library.
OutroRoom.at_object_leave()
OutroRoom.DoesNotExist
OutroRoom.MultipleObjectsReturned
+OutroRoom.NotUpdated
OutroRoom.path
OutroRoom.typename
@@ -7265,6 +7391,7 @@ useful but are deemed too game-specific to go into the core library.
RandomStringGeneratorScript.at_script_creation()
RandomStringGeneratorScript.DoesNotExist
RandomStringGeneratorScript.MultipleObjectsReturned
+RandomStringGeneratorScript.NotUpdated
RandomStringGeneratorScript.path
RandomStringGeneratorScript.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.buffs.html b/docs/latest/api/evennia.contrib.rpg.buffs.html
index eb5bc5cb68..ae6d7ebaf5 100644
--- a/docs/latest/api/evennia.contrib.rpg.buffs.html
+++ b/docs/latest/api/evennia.contrib.rpg.buffs.html
@@ -247,6 +247,7 @@
BuffableObject.at_init()
BuffableObject.DoesNotExist
BuffableObject.MultipleObjectsReturned
+BuffableObject.NotUpdated
BuffableObject.path
BuffableObject.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.buffs.tests.html b/docs/latest/api/evennia.contrib.rpg.buffs.tests.html
index da0ca78b5c..e4d5d61483 100644
--- a/docs/latest/api/evennia.contrib.rpg.buffs.tests.html
+++ b/docs/latest/api/evennia.contrib.rpg.buffs.tests.html
@@ -89,6 +89,12 @@ restart or reload.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.buffs.tests.BuffableObject'
@@ -223,6 +229,7 @@ restart or reload.
BuffableObject.at_init()
BuffableObject.DoesNotExist
BuffableObject.MultipleObjectsReturned
+BuffableObject.NotUpdated
BuffableObject.path
BuffableObject.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.character_creator.character_creator.html b/docs/latest/api/evennia.contrib.rpg.character_creator.character_creator.html
index 4d75806309..47c2628617 100644
--- a/docs/latest/api/evennia.contrib.rpg.character_creator.character_creator.html
+++ b/docs/latest/api/evennia.contrib.rpg.character_creator.character_creator.html
@@ -234,6 +234,12 @@ overriding the call (unused by default).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.character_creator.character_creator.ContribChargenAccount'
@@ -303,6 +309,7 @@ overriding the call (unused by default).
ContribChargenAccount.at_look()
ContribChargenAccount.DoesNotExist
ContribChargenAccount.MultipleObjectsReturned
+ContribChargenAccount.NotUpdated
ContribChargenAccount.path
ContribChargenAccount.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.character_creator.html b/docs/latest/api/evennia.contrib.rpg.character_creator.html
index b687e0b83d..94827fe3d3 100644
--- a/docs/latest/api/evennia.contrib.rpg.character_creator.html
+++ b/docs/latest/api/evennia.contrib.rpg.character_creator.html
@@ -86,6 +86,7 @@
ContribChargenAccount.at_look()
ContribChargenAccount.DoesNotExist
ContribChargenAccount.MultipleObjectsReturned
+ContribChargenAccount.NotUpdated
ContribChargenAccount.path
ContribChargenAccount.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.dice.html b/docs/latest/api/evennia.contrib.rpg.dice.html
index a973b12c89..487f521726 100644
--- a/docs/latest/api/evennia.contrib.rpg.dice.html
+++ b/docs/latest/api/evennia.contrib.rpg.dice.html
@@ -82,6 +82,7 @@
TestDice.test_cmddice()
TestDice.test_string_form()
TestDice.test_maxvals()
+TestDice.test_malformed_inputs()
diff --git a/docs/latest/api/evennia.contrib.rpg.dice.tests.html b/docs/latest/api/evennia.contrib.rpg.dice.tests.html
index 51eb3e5f4a..b9e3dec1d0 100644
--- a/docs/latest/api/evennia.contrib.rpg.dice.tests.html
+++ b/docs/latest/api/evennia.contrib.rpg.dice.tests.html
@@ -76,6 +76,11 @@
test_maxvals(mocked_randint)[source]
+
+-
+test_malformed_inputs(mocked_randint)[source]
+
+
@@ -108,6 +113,7 @@
TestDice.test_cmddice()
TestDice.test_string_form()
TestDice.test_maxvals()
+TestDice.test_malformed_inputs()
diff --git a/docs/latest/api/evennia.contrib.rpg.html b/docs/latest/api/evennia.contrib.rpg.html
index c204804488..60d9970275 100644
--- a/docs/latest/api/evennia.contrib.rpg.html
+++ b/docs/latest/api/evennia.contrib.rpg.html
@@ -247,6 +247,7 @@
BuffableObject.at_init()
BuffableObject.DoesNotExist
BuffableObject.MultipleObjectsReturned
+BuffableObject.NotUpdated
BuffableObject.path
BuffableObject.typename
@@ -306,6 +307,7 @@
ContribChargenAccount.at_look()
ContribChargenAccount.DoesNotExist
ContribChargenAccount.MultipleObjectsReturned
+ContribChargenAccount.NotUpdated
ContribChargenAccount.path
ContribChargenAccount.typename
@@ -354,6 +356,7 @@
TestDice.test_cmddice()
TestDice.test_string_form()
TestDice.test_maxvals()
+TestDice.test_malformed_inputs()
@@ -415,6 +418,7 @@
LLMNPC.at_talked_to()
LLMNPC.DoesNotExist
LLMNPC.MultipleObjectsReturned
+LLMNPC.NotUpdated
LLMNPC.path
LLMNPC.typename
@@ -455,6 +459,7 @@
LanguageHandler.translate()
LanguageHandler.DoesNotExist
LanguageHandler.MultipleObjectsReturned
+LanguageHandler.NotUpdated
LanguageHandler.path
LanguageHandler.typename
@@ -575,6 +580,7 @@
ContribRPObject.get_display_things()
ContribRPObject.DoesNotExist
ContribRPObject.MultipleObjectsReturned
+ContribRPObject.NotUpdated
ContribRPObject.path
ContribRPObject.typename
@@ -582,6 +588,7 @@
ContribRPRoom
@@ -597,6 +604,7 @@
ContribRPCharacter.process_language()
ContribRPCharacter.DoesNotExist
ContribRPCharacter.MultipleObjectsReturned
+ContribRPCharacter.NotUpdated
ContribRPCharacter.path
ContribRPCharacter.typename
@@ -739,6 +747,7 @@
TraitContribTestingChar.HP
TraitContribTestingChar.DoesNotExist
TraitContribTestingChar.MultipleObjectsReturned
+TraitContribTestingChar.NotUpdated
TraitContribTestingChar.path
TraitContribTestingChar.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.llm.html b/docs/latest/api/evennia.contrib.rpg.llm.html
index 09174cd917..668285aa7e 100644
--- a/docs/latest/api/evennia.contrib.rpg.llm.html
+++ b/docs/latest/api/evennia.contrib.rpg.llm.html
@@ -92,6 +92,7 @@
LLMNPC.at_talked_to()
LLMNPC.DoesNotExist
LLMNPC.MultipleObjectsReturned
+LLMNPC.NotUpdated
LLMNPC.path
LLMNPC.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.llm.llm_npc.html b/docs/latest/api/evennia.contrib.rpg.llm.llm_npc.html
index 24236bd9d7..f40535f9f4 100644
--- a/docs/latest/api/evennia.contrib.rpg.llm.llm_npc.html
+++ b/docs/latest/api/evennia.contrib.rpg.llm.llm_npc.html
@@ -144,6 +144,12 @@ then from settings, then from default
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.llm.llm_npc.LLMNPC'
@@ -252,6 +258,7 @@ set in self.parse())
LLMNPC.at_talked_to()
LLMNPC.DoesNotExist
LLMNPC.MultipleObjectsReturned
+LLMNPC.NotUpdated
LLMNPC.path
LLMNPC.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.html
index 3f73d62e59..7af5a012f6 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.html
@@ -65,6 +65,7 @@
LanguageHandler.translate()
LanguageHandler.DoesNotExist
LanguageHandler.MultipleObjectsReturned
+LanguageHandler.NotUpdated
LanguageHandler.path
LanguageHandler.typename
@@ -185,6 +186,7 @@
ContribRPObject.get_display_things()
ContribRPObject.DoesNotExist
ContribRPObject.MultipleObjectsReturned
+ContribRPObject.NotUpdated
ContribRPObject.path
ContribRPObject.typename
@@ -192,6 +194,7 @@
ContribRPRoom
@@ -207,6 +210,7 @@
ContribRPCharacter.process_language()
ContribRPCharacter.DoesNotExist
ContribRPCharacter.MultipleObjectsReturned
+ContribRPCharacter.NotUpdated
ContribRPCharacter.path
ContribRPCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.rplanguage.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rplanguage.html
index 1536211d98..db8f53b00f 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rplanguage.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rplanguage.html
@@ -329,6 +329,12 @@ same input sentence.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.rpsystem.rplanguage.LanguageHandler'
@@ -436,6 +442,7 @@ means fully obscured.
LanguageHandler.translate()
LanguageHandler.DoesNotExist
LanguageHandler.MultipleObjectsReturned
+LanguageHandler.NotUpdated
LanguageHandler.path
LanguageHandler.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 194c45cd52..a59ebad557 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -670,7 +670,7 @@ commands the caller can use.
-
-aliases = ['"', "'"]
+aliases = ["'", '"']
@@ -701,7 +701,7 @@ commands the caller can use.
-
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\nspeak as your character\n\nUsage:\n say <message>\n\nTalk to those in your current location.\n'}
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\nspeak as your character\n\nUsage:\n say <message>\n\nTalk to those in your current location.\n'}
@@ -1058,6 +1058,12 @@ is privileged to control said object.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.rpsystem.rpsystem.ContribRPObject'
@@ -1087,6 +1093,12 @@ is privileged to control said object.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.rpsystem.rpsystem.ContribRPRoom'
@@ -1282,6 +1294,12 @@ the evennia.contrib.rpg.rplanguage module.
Bases: MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.rpg.rpsystem.rpsystem.ContribRPCharacter'
@@ -1428,6 +1446,7 @@ the evennia.contrib.rpg.rplanguage module.
ContribRPObject.get_display_things()
ContribRPObject.DoesNotExist
ContribRPObject.MultipleObjectsReturned
+ContribRPObject.NotUpdated
ContribRPObject.path
ContribRPObject.typename
@@ -1435,6 +1454,7 @@ the evennia.contrib.rpg.rplanguage module.
ContribRPRoom
@@ -1450,6 +1470,7 @@ the evennia.contrib.rpg.rplanguage module.
ContribRPCharacter.process_language()
ContribRPCharacter.DoesNotExist
ContribRPCharacter.MultipleObjectsReturned
+ContribRPCharacter.NotUpdated
ContribRPCharacter.path
ContribRPCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.traits.html b/docs/latest/api/evennia.contrib.rpg.traits.html
index c06365288f..e42f546bf9 100644
--- a/docs/latest/api/evennia.contrib.rpg.traits.html
+++ b/docs/latest/api/evennia.contrib.rpg.traits.html
@@ -151,6 +151,7 @@
TraitContribTestingChar.HP
TraitContribTestingChar.DoesNotExist
TraitContribTestingChar.MultipleObjectsReturned
+TraitContribTestingChar.NotUpdated
TraitContribTestingChar.path
TraitContribTestingChar.typename
diff --git a/docs/latest/api/evennia.contrib.rpg.traits.tests.html b/docs/latest/api/evennia.contrib.rpg.traits.tests.html
index 0ac6167ee6..3184d8b114 100644
--- a/docs/latest/api/evennia.contrib.rpg.traits.tests.html
+++ b/docs/latest/api/evennia.contrib.rpg.traits.tests.html
@@ -593,6 +593,12 @@ under the hood.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.rpg.traits.tests.TraitContribTestingChar'
@@ -750,6 +756,7 @@ under the hood.
TraitContribTestingChar.HP
TraitContribTestingChar.DoesNotExist
TraitContribTestingChar.MultipleObjectsReturned
+TraitContribTestingChar.NotUpdated
TraitContribTestingChar.path
TraitContribTestingChar.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.bodyfunctions.html b/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.bodyfunctions.html
index 98e855c7d3..bc06a954ca 100644
--- a/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.bodyfunctions.html
+++ b/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.bodyfunctions.html
@@ -96,6 +96,12 @@ a random check here so as to only return 33% of the time.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.bodyfunctions.bodyfunctions.BodyFunctions'
@@ -139,6 +145,7 @@ a random check here so as to only return 33% of the time.
BodyFunctions.send_random_message()
BodyFunctions.DoesNotExist
BodyFunctions.MultipleObjectsReturned
+BodyFunctions.NotUpdated
BodyFunctions.path
BodyFunctions.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.html b/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.html
index 4ea579f1db..84c0b60d01 100644
--- a/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.html
+++ b/docs/latest/api/evennia.contrib.tutorials.bodyfunctions.html
@@ -60,6 +60,7 @@
BodyFunctions.send_random_message()
BodyFunctions.DoesNotExist
BodyFunctions.MultipleObjectsReturned
+BodyFunctions.NotUpdated
BodyFunctions.path
BodyFunctions.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.characters.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.characters.html
index 8c8dc94b5c..d98fe5278a 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.characters.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.characters.html
@@ -383,6 +383,12 @@ will need to be done earlier, when the user selects the ability to increase.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.characters.EvAdventureCharacter'
@@ -472,6 +478,7 @@ it easier to override the look of the sheet.
EvAdventureCharacter.level_up()
EvAdventureCharacter.DoesNotExist
EvAdventureCharacter.MultipleObjectsReturned
+EvAdventureCharacter.NotUpdated
EvAdventureCharacter.path
EvAdventureCharacter.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_base.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_base.html
index 76439376d3..f7ceecd8b5 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_base.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_base.html
@@ -471,6 +471,12 @@ the particular combat type.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.combat_base.EvAdventureCombatBaseHandler'
@@ -552,6 +558,7 @@ the particular combat type.
EvAdventureCombatBaseHandler.stop_combat()
EvAdventureCombatBaseHandler.DoesNotExist
EvAdventureCombatBaseHandler.MultipleObjectsReturned
+EvAdventureCombatBaseHandler.NotUpdated
EvAdventureCombatBaseHandler.path
EvAdventureCombatBaseHandler.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
index 0837acef5a..9879cb32a5 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
@@ -338,6 +338,12 @@ turn of combat, performing everyone’s actions in random order.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.combat_turnbased.EvAdventureTurnbasedCombatHandler'
@@ -414,7 +420,7 @@ turn of combat, performing everyone’s actions in random order.
-
-aliases = ['hit', 'turnbased combat']
+aliases = ['turnbased combat', 'hit']
@@ -460,7 +466,7 @@ set in self.parse())
-
-search_index_entry = {'aliases': 'hit turnbased combat', 'category': 'general', 'key': 'attack', 'no_prefix': ' hit turnbased combat', 'tags': '', 'text': '\nStart or join combat.\n\nUsage:\n attack [<target>]\n\n'}
+search_index_entry = {'aliases': 'turnbased combat hit', 'category': 'general', 'key': 'attack', 'no_prefix': ' turnbased combat hit', 'tags': '', 'text': '\nStart or join combat.\n\nUsage:\n attack [<target>]\n\n'}
@@ -546,6 +552,7 @@ self.add().
EvAdventureTurnbasedCombatHandler.at_repeat()
EvAdventureTurnbasedCombatHandler.DoesNotExist
EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+EvAdventureTurnbasedCombatHandler.NotUpdated
EvAdventureTurnbasedCombatHandler.path
EvAdventureTurnbasedCombatHandler.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
index 96d3858755..b8e2e1ddfe 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -251,6 +251,12 @@ an enemy.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.combat_twitch.EvAdventureCombatTwitchHandler'
@@ -425,7 +431,7 @@ boost INT Wizard Goblin
-
-aliases = ['foil', 'boost']
+aliases = ['boost', 'foil']
@@ -459,7 +465,7 @@ set in self.parse())
-
-search_index_entry = {'aliases': 'foil boost', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' foil boost', 'tags': '', 'text': '\nPerform a combat stunt, that boosts an ally against a target, or\nfoils an enemy, giving them disadvantage against an ally.\n\nUsage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\nExample:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n'}
+search_index_entry = {'aliases': 'boost foil', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' boost foil', 'tags': '', 'text': '\nPerform a combat stunt, that boosts an ally against a target, or\nfoils an enemy, giving them disadvantage against an ally.\n\nUsage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\nExample:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n'}
@@ -681,6 +687,7 @@ self.add().
EvAdventureCombatTwitchHandler.stop_combat()
EvAdventureCombatTwitchHandler.DoesNotExist
EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+EvAdventureCombatTwitchHandler.NotUpdated
EvAdventureCombatTwitchHandler.path
EvAdventureCombatTwitchHandler.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
index 3a00704d98..28a2cd87a2 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
@@ -140,7 +140,7 @@ self.args).
-
-aliases = ['inv', 'i']
+aliases = ['i', 'inv']
@@ -164,7 +164,7 @@ set in self.parse())
-
-search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\nView your inventory\n\nUsage:\n inventory\n\n'}
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\nView your inventory\n\nUsage:\n inventory\n\n'}
@@ -241,7 +241,7 @@ unwear <item>
-
-aliases = ['unwield', 'unwear']
+aliases = ['unwear', 'unwield']
@@ -265,7 +265,7 @@ set in self.parse())
-
-search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\nRemove a remove a weapon/shield, armor or helmet.\n\nUsage:\n remove <item>\n unwield <item>\n unwear <item>\n\nTo remove an item from the backpack, use |wdrop|n instead.\n\n'}
+search_index_entry = {'aliases': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\nRemove a remove a weapon/shield, armor or helmet.\n\nUsage:\n remove <item>\n unwield <item>\n unwear <item>\n\nTo remove an item from the backpack, use |wdrop|n instead.\n\n'}
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.dungeon.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.dungeon.html
index e69b8d1523..a1a423ef54 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.dungeon.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.dungeon.html
@@ -136,6 +136,12 @@ easier (for example we may want an empty room which auto-clears).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonRoom'
@@ -184,6 +190,12 @@ was not yet created. It checks the current location to get the dungeon-branch in
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonExit'
@@ -308,6 +320,12 @@ paths we have so as to not have it grow exponentially.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonBranch'
@@ -353,6 +371,12 @@ act of passing through creates a room on the other side.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonStartRoomExit'
@@ -401,6 +425,12 @@ back to the start room.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonBranchDeleter'
@@ -442,6 +472,12 @@ back to the start room.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureStartRoomResetter'
@@ -527,6 +563,12 @@ easier (for example we may want an empty room which auto-clears).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonStartRoom'
@@ -576,6 +618,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonRoom.get_display_footer()
EvAdventureDungeonRoom.DoesNotExist
EvAdventureDungeonRoom.MultipleObjectsReturned
+EvAdventureDungeonRoom.NotUpdated
EvAdventureDungeonRoom.path
EvAdventureDungeonRoom.typename
@@ -586,6 +629,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonExit.at_failed_traverse()
EvAdventureDungeonExit.DoesNotExist
EvAdventureDungeonExit.MultipleObjectsReturned
+EvAdventureDungeonExit.NotUpdated
EvAdventureDungeonExit.path
EvAdventureDungeonExit.typename
@@ -606,6 +650,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonBranch.new_room()
EvAdventureDungeonBranch.DoesNotExist
EvAdventureDungeonBranch.MultipleObjectsReturned
+EvAdventureDungeonBranch.NotUpdated
EvAdventureDungeonBranch.path
EvAdventureDungeonBranch.typename
@@ -615,6 +660,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonStartRoomExit.at_traverse()
EvAdventureDungeonStartRoomExit.DoesNotExist
EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+EvAdventureDungeonStartRoomExit.NotUpdated
EvAdventureDungeonStartRoomExit.path
EvAdventureDungeonStartRoomExit.typename
@@ -625,6 +671,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonBranchDeleter.at_repeat()
EvAdventureDungeonBranchDeleter.DoesNotExist
EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+EvAdventureDungeonBranchDeleter.NotUpdated
EvAdventureDungeonBranchDeleter.path
EvAdventureDungeonBranchDeleter.typename
@@ -634,6 +681,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureStartRoomResetter.at_repeat()
EvAdventureStartRoomResetter.DoesNotExist
EvAdventureStartRoomResetter.MultipleObjectsReturned
+EvAdventureStartRoomResetter.NotUpdated
EvAdventureStartRoomResetter.path
EvAdventureStartRoomResetter.typename
@@ -648,6 +696,7 @@ easier (for example we may want an empty room which auto-clears).
EvAdventureDungeonStartRoom.at_object_receive()
EvAdventureDungeonStartRoom.DoesNotExist
EvAdventureDungeonStartRoom.MultipleObjectsReturned
+EvAdventureDungeonStartRoom.NotUpdated
EvAdventureDungeonStartRoom.path
EvAdventureDungeonStartRoom.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.html
index 8e8d753015..f24cb3b7bb 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.html
@@ -122,6 +122,7 @@ documentation’s beginner tutorial.
EvAdventureCharacter.level_up()
EvAdventureCharacter.DoesNotExist
EvAdventureCharacter.MultipleObjectsReturned
+EvAdventureCharacter.NotUpdated
EvAdventureCharacter.path
EvAdventureCharacter.typename
@@ -188,6 +189,7 @@ documentation’s beginner tutorial.
EvAdventureCombatBaseHandler.stop_combat()
EvAdventureCombatBaseHandler.DoesNotExist
EvAdventureCombatBaseHandler.MultipleObjectsReturned
+EvAdventureCombatBaseHandler.NotUpdated
EvAdventureCombatBaseHandler.path
EvAdventureCombatBaseHandler.typename
@@ -226,6 +228,7 @@ documentation’s beginner tutorial.
EvAdventureTurnbasedCombatHandler.at_repeat()
EvAdventureTurnbasedCombatHandler.DoesNotExist
EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+EvAdventureTurnbasedCombatHandler.NotUpdated
EvAdventureTurnbasedCombatHandler.path
EvAdventureTurnbasedCombatHandler.typename
@@ -279,6 +282,7 @@ documentation’s beginner tutorial.
EvAdventureCombatTwitchHandler.stop_combat()
EvAdventureCombatTwitchHandler.DoesNotExist
EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+EvAdventureCombatTwitchHandler.NotUpdated
EvAdventureCombatTwitchHandler.path
EvAdventureCombatTwitchHandler.typename
@@ -435,6 +439,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonRoom.get_display_footer()
EvAdventureDungeonRoom.DoesNotExist
EvAdventureDungeonRoom.MultipleObjectsReturned
+EvAdventureDungeonRoom.NotUpdated
EvAdventureDungeonRoom.path
EvAdventureDungeonRoom.typename
@@ -445,6 +450,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonExit.at_failed_traverse()
EvAdventureDungeonExit.DoesNotExist
EvAdventureDungeonExit.MultipleObjectsReturned
+EvAdventureDungeonExit.NotUpdated
EvAdventureDungeonExit.path
EvAdventureDungeonExit.typename
@@ -465,6 +471,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonBranch.new_room()
EvAdventureDungeonBranch.DoesNotExist
EvAdventureDungeonBranch.MultipleObjectsReturned
+EvAdventureDungeonBranch.NotUpdated
EvAdventureDungeonBranch.path
EvAdventureDungeonBranch.typename
@@ -474,6 +481,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonStartRoomExit.at_traverse()
EvAdventureDungeonStartRoomExit.DoesNotExist
EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+EvAdventureDungeonStartRoomExit.NotUpdated
EvAdventureDungeonStartRoomExit.path
EvAdventureDungeonStartRoomExit.typename
@@ -484,6 +492,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonBranchDeleter.at_repeat()
EvAdventureDungeonBranchDeleter.DoesNotExist
EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+EvAdventureDungeonBranchDeleter.NotUpdated
EvAdventureDungeonBranchDeleter.path
EvAdventureDungeonBranchDeleter.typename
@@ -493,6 +502,7 @@ documentation’s beginner tutorial.
EvAdventureStartRoomResetter.at_repeat()
EvAdventureStartRoomResetter.DoesNotExist
EvAdventureStartRoomResetter.MultipleObjectsReturned
+EvAdventureStartRoomResetter.NotUpdated
EvAdventureStartRoomResetter.path
EvAdventureStartRoomResetter.typename
@@ -507,6 +517,7 @@ documentation’s beginner tutorial.
EvAdventureDungeonStartRoom.at_object_receive()
EvAdventureDungeonStartRoom.DoesNotExist
EvAdventureDungeonStartRoom.MultipleObjectsReturned
+EvAdventureDungeonStartRoom.NotUpdated
EvAdventureDungeonStartRoom.path
EvAdventureDungeonStartRoom.typename
@@ -603,6 +614,7 @@ documentation’s beginner tutorial.
EvAdventureNPC.ai_next_action()
EvAdventureNPC.DoesNotExist
EvAdventureNPC.MultipleObjectsReturned
+EvAdventureNPC.NotUpdated
EvAdventureNPC.path
EvAdventureNPC.typename
@@ -616,6 +628,7 @@ documentation’s beginner tutorial.
EvAdventureTalkativeNPC.at_talk()
EvAdventureTalkativeNPC.DoesNotExist
EvAdventureTalkativeNPC.MultipleObjectsReturned
+EvAdventureTalkativeNPC.NotUpdated
EvAdventureTalkativeNPC.path
EvAdventureTalkativeNPC.typename
@@ -624,6 +637,7 @@ documentation’s beginner tutorial.
EvAdventureQuestGiver
@@ -635,6 +649,7 @@ documentation’s beginner tutorial.
EvAdventureShopKeeper.at_damage()
EvAdventureShopKeeper.DoesNotExist
EvAdventureShopKeeper.MultipleObjectsReturned
+EvAdventureShopKeeper.NotUpdated
EvAdventureShopKeeper.path
EvAdventureShopKeeper.typename
@@ -649,6 +664,7 @@ documentation’s beginner tutorial.
EvAdventureMob.at_defeat()
EvAdventureMob.DoesNotExist
EvAdventureMob.MultipleObjectsReturned
+EvAdventureMob.NotUpdated
EvAdventureMob.path
EvAdventureMob.typename
@@ -671,6 +687,7 @@ documentation’s beginner tutorial.
EvAdventureObject.at_post_use()
EvAdventureObject.DoesNotExist
EvAdventureObject.MultipleObjectsReturned
+EvAdventureObject.NotUpdated
EvAdventureObject.path
EvAdventureObject.typename
@@ -680,6 +697,7 @@ documentation’s beginner tutorial.
EvAdventureObjectFiller.quality
EvAdventureObjectFiller.DoesNotExist
EvAdventureObjectFiller.MultipleObjectsReturned
+EvAdventureObjectFiller.NotUpdated
EvAdventureObjectFiller.path
EvAdventureObjectFiller.typename
@@ -689,6 +707,7 @@ documentation’s beginner tutorial.
EvAdventureQuestObject.value
EvAdventureQuestObject.DoesNotExist
EvAdventureQuestObject.MultipleObjectsReturned
+EvAdventureQuestObject.NotUpdated
EvAdventureQuestObject.path
EvAdventureQuestObject.typename
@@ -698,6 +717,7 @@ documentation’s beginner tutorial.
EvAdventureTreasure.value
EvAdventureTreasure.DoesNotExist
EvAdventureTreasure.MultipleObjectsReturned
+EvAdventureTreasure.NotUpdated
EvAdventureTreasure.path
EvAdventureTreasure.typename
@@ -711,6 +731,7 @@ documentation’s beginner tutorial.
EvAdventureConsumable.at_post_use()
EvAdventureConsumable.DoesNotExist
EvAdventureConsumable.MultipleObjectsReturned
+EvAdventureConsumable.NotUpdated
EvAdventureConsumable.path
EvAdventureConsumable.typename
@@ -728,6 +749,7 @@ documentation’s beginner tutorial.
EvAdventureWeapon.at_post_use()
EvAdventureWeapon.DoesNotExist
EvAdventureWeapon.MultipleObjectsReturned
+EvAdventureWeapon.NotUpdated
EvAdventureWeapon.path
EvAdventureWeapon.typename
@@ -739,6 +761,7 @@ documentation’s beginner tutorial.
EvAdventureThrowable.damage_roll
EvAdventureThrowable.DoesNotExist
EvAdventureThrowable.MultipleObjectsReturned
+EvAdventureThrowable.NotUpdated
EvAdventureThrowable.path
EvAdventureThrowable.typename
@@ -754,6 +777,7 @@ documentation’s beginner tutorial.
EvAdventureRunestone.refresh()
EvAdventureRunestone.DoesNotExist
EvAdventureRunestone.MultipleObjectsReturned
+EvAdventureRunestone.NotUpdated
EvAdventureRunestone.path
EvAdventureRunestone.typename
@@ -765,6 +789,7 @@ documentation’s beginner tutorial.
EvAdventureArmor.quality
EvAdventureArmor.DoesNotExist
EvAdventureArmor.MultipleObjectsReturned
+EvAdventureArmor.NotUpdated
EvAdventureArmor.path
EvAdventureArmor.typename
@@ -774,6 +799,7 @@ documentation’s beginner tutorial.
EvAdventureShield.inventory_use_slot
EvAdventureShield.DoesNotExist
EvAdventureShield.MultipleObjectsReturned
+EvAdventureShield.NotUpdated
EvAdventureShield.path
EvAdventureShield.typename
@@ -783,6 +809,7 @@ documentation’s beginner tutorial.
EvAdventureHelmet.inventory_use_slot
EvAdventureHelmet.DoesNotExist
EvAdventureHelmet.MultipleObjectsReturned
+EvAdventureHelmet.NotUpdated
EvAdventureHelmet.path
EvAdventureHelmet.typename
@@ -797,6 +824,7 @@ documentation’s beginner tutorial.
WeaponBareHands.quality
WeaponBareHands.DoesNotExist
WeaponBareHands.MultipleObjectsReturned
+WeaponBareHands.NotUpdated
WeaponBareHands.path
WeaponBareHands.typename
@@ -867,6 +895,7 @@ documentation’s beginner tutorial.
EvAdventureRoom.get_display_header()
EvAdventureRoom.DoesNotExist
EvAdventureRoom.MultipleObjectsReturned
+EvAdventureRoom.NotUpdated
EvAdventureRoom.path
EvAdventureRoom.typename
@@ -877,6 +906,7 @@ documentation’s beginner tutorial.
EvAdventurePvPRoom.get_display_footer()
EvAdventurePvPRoom.DoesNotExist
EvAdventurePvPRoom.MultipleObjectsReturned
+EvAdventurePvPRoom.NotUpdated
EvAdventurePvPRoom.path
EvAdventurePvPRoom.typename
@@ -1095,6 +1125,7 @@ documentation’s beginner tutorial.
EvAdventureQuestTest.test_help()
EvAdventureQuestTest.test_progress__fail()
EvAdventureQuestTest.test_progress()
+EvAdventureQuestTest.test_questhandler_reload_after_restart()
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.npcs.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.npcs.html
index 7862a285df..af302ec50a 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.npcs.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.npcs.html
@@ -201,6 +201,12 @@ get the next action the npc should perform in combat.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.npcs.EvAdventureNPC'
@@ -309,6 +315,12 @@ given to the NPC at creation.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.npcs.EvAdventureTalkativeNPC'
@@ -346,6 +358,12 @@ based on nodes named node_start_* are available in the node tre
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.npcs.EvAdventureQuestGiver'
@@ -399,6 +417,12 @@ based on nodes named node_start_* are available in the node tre
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.npcs.EvAdventureShopKeeper'
@@ -469,6 +493,12 @@ are found, switch to roam state.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.npcs.EvAdventureMob'
@@ -530,6 +560,7 @@ are found, switch to roam state.
EvAdventureNPC.ai_next_action()
EvAdventureNPC.DoesNotExist
EvAdventureNPC.MultipleObjectsReturned
+EvAdventureNPC.NotUpdated
EvAdventureNPC.path
EvAdventureNPC.typename
@@ -543,6 +574,7 @@ are found, switch to roam state.
EvAdventureTalkativeNPC.at_talk()
EvAdventureTalkativeNPC.DoesNotExist
EvAdventureTalkativeNPC.MultipleObjectsReturned
+EvAdventureTalkativeNPC.NotUpdated
EvAdventureTalkativeNPC.path
EvAdventureTalkativeNPC.typename
@@ -551,6 +583,7 @@ are found, switch to roam state.
EvAdventureQuestGiver
@@ -562,6 +595,7 @@ are found, switch to roam state.
EvAdventureShopKeeper.at_damage()
EvAdventureShopKeeper.DoesNotExist
EvAdventureShopKeeper.MultipleObjectsReturned
+EvAdventureShopKeeper.NotUpdated
EvAdventureShopKeeper.path
EvAdventureShopKeeper.typename
@@ -576,6 +610,7 @@ are found, switch to roam state.
EvAdventureMob.at_defeat()
EvAdventureMob.DoesNotExist
EvAdventureMob.MultipleObjectsReturned
+EvAdventureMob.NotUpdated
EvAdventureMob.path
EvAdventureMob.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.objects.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.objects.html
index 9d3597bebb..fdfcade9f0 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.objects.html
@@ -182,6 +182,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureObject'
@@ -228,6 +234,12 @@ meaning it’s unusable.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureObjectFiller'
@@ -268,6 +280,12 @@ meaning it’s unusable.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureQuestObject'
@@ -308,6 +326,12 @@ meaning it’s unusable.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureTreasure'
@@ -383,6 +407,12 @@ have a limited usage in this way.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureConsumable'
@@ -483,6 +513,12 @@ but it does not change an object’s keys or aliases when searching.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureWeapon'
@@ -536,6 +572,12 @@ but it does not change an object’s keys or aliases when searching.
Bases: MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureThrowable'
@@ -613,6 +655,12 @@ they are quite powerful (and scales with caster level).
Bases: MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureRunestone'
@@ -664,6 +712,12 @@ they are quite powerful (and scales with caster level).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureArmor'
@@ -703,6 +757,12 @@ they are quite powerful (and scales with caster level).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureShield'
@@ -742,6 +802,12 @@ they are quite powerful (and scales with caster level).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.EvAdventureHelmet'
@@ -806,6 +872,12 @@ they are quite powerful (and scales with caster level).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.objects.WeaponBareHands'
@@ -869,6 +941,7 @@ they are quite powerful (and scales with caster level).
EvAdventureObject.at_post_use()
EvAdventureObject.DoesNotExist
EvAdventureObject.MultipleObjectsReturned
+EvAdventureObject.NotUpdated
EvAdventureObject.path
EvAdventureObject.typename
@@ -878,6 +951,7 @@ they are quite powerful (and scales with caster level).
EvAdventureObjectFiller.quality
EvAdventureObjectFiller.DoesNotExist
EvAdventureObjectFiller.MultipleObjectsReturned
+EvAdventureObjectFiller.NotUpdated
EvAdventureObjectFiller.path
EvAdventureObjectFiller.typename
@@ -887,6 +961,7 @@ they are quite powerful (and scales with caster level).
EvAdventureQuestObject.value
EvAdventureQuestObject.DoesNotExist
EvAdventureQuestObject.MultipleObjectsReturned
+EvAdventureQuestObject.NotUpdated
EvAdventureQuestObject.path
EvAdventureQuestObject.typename
@@ -896,6 +971,7 @@ they are quite powerful (and scales with caster level).
EvAdventureTreasure.value
EvAdventureTreasure.DoesNotExist
EvAdventureTreasure.MultipleObjectsReturned
+EvAdventureTreasure.NotUpdated
EvAdventureTreasure.path
EvAdventureTreasure.typename
@@ -909,6 +985,7 @@ they are quite powerful (and scales with caster level).
EvAdventureConsumable.at_post_use()
EvAdventureConsumable.DoesNotExist
EvAdventureConsumable.MultipleObjectsReturned
+EvAdventureConsumable.NotUpdated
EvAdventureConsumable.path
EvAdventureConsumable.typename
@@ -926,6 +1003,7 @@ they are quite powerful (and scales with caster level).
EvAdventureWeapon.at_post_use()
EvAdventureWeapon.DoesNotExist
EvAdventureWeapon.MultipleObjectsReturned
+EvAdventureWeapon.NotUpdated
EvAdventureWeapon.path
EvAdventureWeapon.typename
@@ -937,6 +1015,7 @@ they are quite powerful (and scales with caster level).
EvAdventureThrowable.damage_roll
EvAdventureThrowable.DoesNotExist
EvAdventureThrowable.MultipleObjectsReturned
+EvAdventureThrowable.NotUpdated
EvAdventureThrowable.path
EvAdventureThrowable.typename
@@ -952,6 +1031,7 @@ they are quite powerful (and scales with caster level).
EvAdventureRunestone.refresh()
EvAdventureRunestone.DoesNotExist
EvAdventureRunestone.MultipleObjectsReturned
+EvAdventureRunestone.NotUpdated
EvAdventureRunestone.path
EvAdventureRunestone.typename
@@ -963,6 +1043,7 @@ they are quite powerful (and scales with caster level).
EvAdventureArmor.quality
EvAdventureArmor.DoesNotExist
EvAdventureArmor.MultipleObjectsReturned
+EvAdventureArmor.NotUpdated
EvAdventureArmor.path
EvAdventureArmor.typename
@@ -972,6 +1053,7 @@ they are quite powerful (and scales with caster level).
EvAdventureShield.inventory_use_slot
EvAdventureShield.DoesNotExist
EvAdventureShield.MultipleObjectsReturned
+EvAdventureShield.NotUpdated
EvAdventureShield.path
EvAdventureShield.typename
@@ -981,6 +1063,7 @@ they are quite powerful (and scales with caster level).
EvAdventureHelmet.inventory_use_slot
EvAdventureHelmet.DoesNotExist
EvAdventureHelmet.MultipleObjectsReturned
+EvAdventureHelmet.NotUpdated
EvAdventureHelmet.path
EvAdventureHelmet.typename
@@ -995,6 +1078,7 @@ they are quite powerful (and scales with caster level).
WeaponBareHands.quality
WeaponBareHands.DoesNotExist
WeaponBareHands.MultipleObjectsReturned
+WeaponBareHands.NotUpdated
WeaponBareHands.path
WeaponBareHands.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.quests.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.quests.html
index 0a38cca81e..971433fdcd 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.quests.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.quests.html
@@ -61,7 +61,7 @@ using the add_data and get_data methods with a
another quest.
-
-class evennia.contrib.tutorials.evadventure.quests.EvAdventureQuest(quester)[source]
+class evennia.contrib.tutorials.evadventure.quests.EvAdventureQuest(quester, questhandler=None)[source]
Bases: object
This represents a single questing unit of quest.
@@ -128,7 +128,7 @@ self.complete()
-
-__init__(quester)[source]
+__init__(quester, questhandler=None)[source]
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.rooms.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.rooms.html
index 5f52b0800c..7b8bf486fd 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.rooms.html
@@ -103,6 +103,12 @@ just not be able to fight in them).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.rooms.EvAdventureRoom'
@@ -150,6 +156,12 @@ just not be able to fight in them).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.evadventure.rooms.EvAdventurePvPRoom'
@@ -195,6 +207,7 @@ just not be able to fight in them).
EvAdventureRoom.get_display_header()
EvAdventureRoom.DoesNotExist
EvAdventureRoom.MultipleObjectsReturned
+EvAdventureRoom.NotUpdated
EvAdventureRoom.path
EvAdventureRoom.typename
@@ -205,6 +218,7 @@ just not be able to fight in them).
EvAdventurePvPRoom.get_display_footer()
EvAdventurePvPRoom.DoesNotExist
EvAdventurePvPRoom.MultipleObjectsReturned
+EvAdventurePvPRoom.NotUpdated
EvAdventurePvPRoom.path
EvAdventurePvPRoom.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.html
index 94e5da1048..28a61e2381 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.html
@@ -211,6 +211,7 @@
EvAdventureQuestTest.test_help()
EvAdventureQuestTest.test_progress__fail()
EvAdventureQuestTest.test_progress()
+EvAdventureQuestTest.test_questhandler_reload_after_restart()
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.test_quests.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.test_quests.html
index 5dea6aa113..28790546e3 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.test_quests.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.tests.test_quests.html
@@ -82,6 +82,12 @@
Fulfill the quest steps in sequence.
+
+-
+test_questhandler_reload_after_restart()[source]
+Test #3560: quest handler should reload and keep quest data after restart.
+
+
@@ -114,6 +120,7 @@
EvAdventureQuestTest.test_help()
EvAdventureQuestTest.test_progress__fail()
EvAdventureQuestTest.test_progress()
+EvAdventureQuestTest.test_questhandler_reload_after_restart()
diff --git a/docs/latest/api/evennia.contrib.tutorials.html b/docs/latest/api/evennia.contrib.tutorials.html
index a00d1c3c04..f6d57c3992 100644
--- a/docs/latest/api/evennia.contrib.tutorials.html
+++ b/docs/latest/api/evennia.contrib.tutorials.html
@@ -64,6 +64,7 @@
BodyFunctions.send_random_message()
BodyFunctions.DoesNotExist
BodyFunctions.MultipleObjectsReturned
+BodyFunctions.NotUpdated
BodyFunctions.path
BodyFunctions.typename
@@ -151,6 +152,7 @@
EvAdventureCharacter.level_up()
EvAdventureCharacter.DoesNotExist
EvAdventureCharacter.MultipleObjectsReturned
+EvAdventureCharacter.NotUpdated
EvAdventureCharacter.path
EvAdventureCharacter.typename
@@ -217,6 +219,7 @@
EvAdventureCombatBaseHandler.stop_combat()
EvAdventureCombatBaseHandler.DoesNotExist
EvAdventureCombatBaseHandler.MultipleObjectsReturned
+EvAdventureCombatBaseHandler.NotUpdated
EvAdventureCombatBaseHandler.path
EvAdventureCombatBaseHandler.typename
@@ -255,6 +258,7 @@
EvAdventureTurnbasedCombatHandler.at_repeat()
EvAdventureTurnbasedCombatHandler.DoesNotExist
EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+EvAdventureTurnbasedCombatHandler.NotUpdated
EvAdventureTurnbasedCombatHandler.path
EvAdventureTurnbasedCombatHandler.typename
@@ -308,6 +312,7 @@
EvAdventureCombatTwitchHandler.stop_combat()
EvAdventureCombatTwitchHandler.DoesNotExist
EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+EvAdventureCombatTwitchHandler.NotUpdated
EvAdventureCombatTwitchHandler.path
EvAdventureCombatTwitchHandler.typename
@@ -464,6 +469,7 @@
EvAdventureDungeonRoom.get_display_footer()
EvAdventureDungeonRoom.DoesNotExist
EvAdventureDungeonRoom.MultipleObjectsReturned
+EvAdventureDungeonRoom.NotUpdated
EvAdventureDungeonRoom.path
EvAdventureDungeonRoom.typename
@@ -474,6 +480,7 @@
EvAdventureDungeonExit.at_failed_traverse()
EvAdventureDungeonExit.DoesNotExist
EvAdventureDungeonExit.MultipleObjectsReturned
+EvAdventureDungeonExit.NotUpdated
EvAdventureDungeonExit.path
EvAdventureDungeonExit.typename
@@ -494,6 +501,7 @@
EvAdventureDungeonBranch.new_room()
EvAdventureDungeonBranch.DoesNotExist
EvAdventureDungeonBranch.MultipleObjectsReturned
+EvAdventureDungeonBranch.NotUpdated
EvAdventureDungeonBranch.path
EvAdventureDungeonBranch.typename
@@ -503,6 +511,7 @@
EvAdventureDungeonStartRoomExit.at_traverse()
EvAdventureDungeonStartRoomExit.DoesNotExist
EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+EvAdventureDungeonStartRoomExit.NotUpdated
EvAdventureDungeonStartRoomExit.path
EvAdventureDungeonStartRoomExit.typename
@@ -513,6 +522,7 @@
EvAdventureDungeonBranchDeleter.at_repeat()
EvAdventureDungeonBranchDeleter.DoesNotExist
EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+EvAdventureDungeonBranchDeleter.NotUpdated
EvAdventureDungeonBranchDeleter.path
EvAdventureDungeonBranchDeleter.typename
@@ -522,6 +532,7 @@
EvAdventureStartRoomResetter.at_repeat()
EvAdventureStartRoomResetter.DoesNotExist
EvAdventureStartRoomResetter.MultipleObjectsReturned
+EvAdventureStartRoomResetter.NotUpdated
EvAdventureStartRoomResetter.path
EvAdventureStartRoomResetter.typename
@@ -536,6 +547,7 @@
EvAdventureDungeonStartRoom.at_object_receive()
EvAdventureDungeonStartRoom.DoesNotExist
EvAdventureDungeonStartRoom.MultipleObjectsReturned
+EvAdventureDungeonStartRoom.NotUpdated
EvAdventureDungeonStartRoom.path
EvAdventureDungeonStartRoom.typename
@@ -632,6 +644,7 @@
EvAdventureNPC.ai_next_action()
EvAdventureNPC.DoesNotExist
EvAdventureNPC.MultipleObjectsReturned
+EvAdventureNPC.NotUpdated
EvAdventureNPC.path
EvAdventureNPC.typename
@@ -645,6 +658,7 @@
EvAdventureTalkativeNPC.at_talk()
EvAdventureTalkativeNPC.DoesNotExist
EvAdventureTalkativeNPC.MultipleObjectsReturned
+EvAdventureTalkativeNPC.NotUpdated
EvAdventureTalkativeNPC.path
EvAdventureTalkativeNPC.typename
@@ -653,6 +667,7 @@
EvAdventureQuestGiver
@@ -664,6 +679,7 @@
EvAdventureShopKeeper.at_damage()
EvAdventureShopKeeper.DoesNotExist
EvAdventureShopKeeper.MultipleObjectsReturned
+EvAdventureShopKeeper.NotUpdated
EvAdventureShopKeeper.path
EvAdventureShopKeeper.typename
@@ -678,6 +694,7 @@
EvAdventureMob.at_defeat()
EvAdventureMob.DoesNotExist
EvAdventureMob.MultipleObjectsReturned
+EvAdventureMob.NotUpdated
EvAdventureMob.path
EvAdventureMob.typename
@@ -700,6 +717,7 @@
EvAdventureObject.at_post_use()
EvAdventureObject.DoesNotExist
EvAdventureObject.MultipleObjectsReturned
+EvAdventureObject.NotUpdated
EvAdventureObject.path
EvAdventureObject.typename
@@ -709,6 +727,7 @@
EvAdventureObjectFiller.quality
EvAdventureObjectFiller.DoesNotExist
EvAdventureObjectFiller.MultipleObjectsReturned
+EvAdventureObjectFiller.NotUpdated
EvAdventureObjectFiller.path
EvAdventureObjectFiller.typename
@@ -718,6 +737,7 @@
EvAdventureQuestObject.value
EvAdventureQuestObject.DoesNotExist
EvAdventureQuestObject.MultipleObjectsReturned
+EvAdventureQuestObject.NotUpdated
EvAdventureQuestObject.path
EvAdventureQuestObject.typename
@@ -727,6 +747,7 @@
EvAdventureTreasure.value
EvAdventureTreasure.DoesNotExist
EvAdventureTreasure.MultipleObjectsReturned
+EvAdventureTreasure.NotUpdated
EvAdventureTreasure.path
EvAdventureTreasure.typename
@@ -740,6 +761,7 @@
EvAdventureConsumable.at_post_use()
EvAdventureConsumable.DoesNotExist
EvAdventureConsumable.MultipleObjectsReturned
+EvAdventureConsumable.NotUpdated
EvAdventureConsumable.path
EvAdventureConsumable.typename
@@ -757,6 +779,7 @@
EvAdventureWeapon.at_post_use()
EvAdventureWeapon.DoesNotExist
EvAdventureWeapon.MultipleObjectsReturned
+EvAdventureWeapon.NotUpdated
EvAdventureWeapon.path
EvAdventureWeapon.typename
@@ -768,6 +791,7 @@
EvAdventureThrowable.damage_roll
EvAdventureThrowable.DoesNotExist
EvAdventureThrowable.MultipleObjectsReturned
+EvAdventureThrowable.NotUpdated
EvAdventureThrowable.path
EvAdventureThrowable.typename
@@ -783,6 +807,7 @@
EvAdventureRunestone.refresh()
EvAdventureRunestone.DoesNotExist
EvAdventureRunestone.MultipleObjectsReturned
+EvAdventureRunestone.NotUpdated
EvAdventureRunestone.path
EvAdventureRunestone.typename
@@ -794,6 +819,7 @@
EvAdventureArmor.quality
EvAdventureArmor.DoesNotExist
EvAdventureArmor.MultipleObjectsReturned
+EvAdventureArmor.NotUpdated
EvAdventureArmor.path
EvAdventureArmor.typename
@@ -803,6 +829,7 @@
EvAdventureShield.inventory_use_slot
EvAdventureShield.DoesNotExist
EvAdventureShield.MultipleObjectsReturned
+EvAdventureShield.NotUpdated
EvAdventureShield.path
EvAdventureShield.typename
@@ -812,6 +839,7 @@
EvAdventureHelmet.inventory_use_slot
EvAdventureHelmet.DoesNotExist
EvAdventureHelmet.MultipleObjectsReturned
+EvAdventureHelmet.NotUpdated
EvAdventureHelmet.path
EvAdventureHelmet.typename
@@ -826,6 +854,7 @@
WeaponBareHands.quality
WeaponBareHands.DoesNotExist
WeaponBareHands.MultipleObjectsReturned
+WeaponBareHands.NotUpdated
WeaponBareHands.path
WeaponBareHands.typename
@@ -896,6 +925,7 @@
EvAdventureRoom.get_display_header()
EvAdventureRoom.DoesNotExist
EvAdventureRoom.MultipleObjectsReturned
+EvAdventureRoom.NotUpdated
EvAdventureRoom.path
EvAdventureRoom.typename
@@ -906,6 +936,7 @@
EvAdventurePvPRoom.get_display_footer()
EvAdventurePvPRoom.DoesNotExist
EvAdventurePvPRoom.MultipleObjectsReturned
+EvAdventurePvPRoom.NotUpdated
EvAdventurePvPRoom.path
EvAdventurePvPRoom.typename
@@ -1120,6 +1151,7 @@
EvAdventureQuestTest.test_help()
EvAdventureQuestTest.test_progress__fail()
EvAdventureQuestTest.test_progress()
+EvAdventureQuestTest.test_questhandler_reload_after_restart()
@@ -1166,6 +1198,7 @@
TutorialMirror.msg()
TutorialMirror.DoesNotExist
TutorialMirror.MultipleObjectsReturned
+TutorialMirror.NotUpdated
TutorialMirror.path
TutorialMirror.typename
@@ -1292,6 +1325,7 @@
RedButton.break_lamp()
RedButton.DoesNotExist
RedButton.MultipleObjectsReturned
+RedButton.NotUpdated
RedButton.path
RedButton.typename
@@ -1327,6 +1361,7 @@
TalkingNPC.at_object_creation()
TalkingNPC.DoesNotExist
TalkingNPC.MultipleObjectsReturned
+TalkingNPC.NotUpdated
TalkingNPC.path
TalkingNPC.typename
@@ -1415,6 +1450,7 @@
Mob.at_new_arrival()
Mob.DoesNotExist
Mob.MultipleObjectsReturned
+Mob.NotUpdated
Mob.path
Mob.typename
@@ -1427,6 +1463,7 @@
TutorialObject.reset()
TutorialObject.DoesNotExist
TutorialObject.MultipleObjectsReturned
+TutorialObject.NotUpdated
TutorialObject.path
TutorialObject.typename
@@ -1450,6 +1487,7 @@
TutorialReadable.at_object_creation()
TutorialReadable.DoesNotExist
TutorialReadable.MultipleObjectsReturned
+TutorialReadable.NotUpdated
TutorialReadable.path
TutorialReadable.typename
@@ -1473,6 +1511,7 @@
TutorialClimbable.at_object_creation()
TutorialClimbable.DoesNotExist
TutorialClimbable.MultipleObjectsReturned
+TutorialClimbable.NotUpdated
TutorialClimbable.path
TutorialClimbable.typename
@@ -1482,6 +1521,7 @@
Obelisk.return_appearance()
Obelisk.DoesNotExist
Obelisk.MultipleObjectsReturned
+Obelisk.NotUpdated
Obelisk.path
Obelisk.typename
@@ -1509,6 +1549,7 @@
LightSource.light()
LightSource.DoesNotExist
LightSource.MultipleObjectsReturned
+LightSource.NotUpdated
LightSource.path
LightSource.typename
@@ -1551,6 +1592,7 @@
CrumblingWall.reset()
CrumblingWall.DoesNotExist
CrumblingWall.MultipleObjectsReturned
+CrumblingWall.NotUpdated
CrumblingWall.path
CrumblingWall.typename
@@ -1575,6 +1617,7 @@
TutorialWeapon.reset()
TutorialWeapon.DoesNotExist
TutorialWeapon.MultipleObjectsReturned
+TutorialWeapon.NotUpdated
TutorialWeapon.path
TutorialWeapon.typename
@@ -1600,6 +1643,7 @@
TutorialWeaponRack.produce_weapon()
TutorialWeaponRack.DoesNotExist
TutorialWeaponRack.MultipleObjectsReturned
+TutorialWeaponRack.NotUpdated
TutorialWeaponRack.path
TutorialWeaponRack.typename
@@ -1659,6 +1703,7 @@
TutorialRoom.set_detail()
TutorialRoom.DoesNotExist
TutorialRoom.MultipleObjectsReturned
+TutorialRoom.NotUpdated
TutorialRoom.path
TutorialRoom.typename
@@ -1667,6 +1712,7 @@
TutorialStartExit.at_object_creation()
TutorialStartExit.DoesNotExist
TutorialStartExit.MultipleObjectsReturned
+TutorialStartExit.NotUpdated
TutorialStartExit.path
TutorialStartExit.typename
@@ -1676,6 +1722,7 @@
WeatherRoom.update_weather()
WeatherRoom.DoesNotExist
WeatherRoom.MultipleObjectsReturned
+WeatherRoom.NotUpdated
WeatherRoom.path
WeatherRoom.typename
@@ -1700,6 +1747,7 @@
IntroRoom.at_object_receive()
IntroRoom.DoesNotExist
IntroRoom.MultipleObjectsReturned
+IntroRoom.NotUpdated
IntroRoom.path
IntroRoom.typename
@@ -1758,6 +1806,7 @@
BridgeRoom.at_object_leave()
BridgeRoom.DoesNotExist
BridgeRoom.MultipleObjectsReturned
+BridgeRoom.NotUpdated
BridgeRoom.path
BridgeRoom.typename
@@ -1808,6 +1857,7 @@
DarkRoom.at_object_leave()
DarkRoom.DoesNotExist
DarkRoom.MultipleObjectsReturned
+DarkRoom.NotUpdated
DarkRoom.path
DarkRoom.typename
@@ -1817,6 +1867,7 @@
TeleportRoom.at_object_receive()
TeleportRoom.DoesNotExist
TeleportRoom.MultipleObjectsReturned
+TeleportRoom.NotUpdated
TeleportRoom.path
TeleportRoom.typename
@@ -1827,6 +1878,7 @@
OutroRoom.at_object_leave()
OutroRoom.DoesNotExist
OutroRoom.MultipleObjectsReturned
+OutroRoom.NotUpdated
OutroRoom.path
OutroRoom.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.mirror.html b/docs/latest/api/evennia.contrib.tutorials.mirror.html
index e3e16c0aa5..93592c060b 100644
--- a/docs/latest/api/evennia.contrib.tutorials.mirror.html
+++ b/docs/latest/api/evennia.contrib.tutorials.mirror.html
@@ -59,6 +59,7 @@
TutorialMirror.msg()
TutorialMirror.DoesNotExist
TutorialMirror.MultipleObjectsReturned
+TutorialMirror.NotUpdated
TutorialMirror.path
TutorialMirror.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.mirror.mirror.html b/docs/latest/api/evennia.contrib.tutorials.mirror.mirror.html
index 2775ff514a..b70840f040 100644
--- a/docs/latest/api/evennia.contrib.tutorials.mirror.mirror.html
+++ b/docs/latest/api/evennia.contrib.tutorials.mirror.mirror.html
@@ -110,6 +110,12 @@ on all entities in it.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.mirror.mirror.TutorialMirror'
@@ -152,6 +158,7 @@ on all entities in it.
TutorialMirror.msg()
TutorialMirror.DoesNotExist
TutorialMirror.MultipleObjectsReturned
+TutorialMirror.NotUpdated
TutorialMirror.path
TutorialMirror.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.red_button.html b/docs/latest/api/evennia.contrib.tutorials.red_button.html
index 38f58e1a1b..4781fac15b 100644
--- a/docs/latest/api/evennia.contrib.tutorials.red_button.html
+++ b/docs/latest/api/evennia.contrib.tutorials.red_button.html
@@ -170,6 +170,7 @@
RedButton.break_lamp()
RedButton.DoesNotExist
RedButton.MultipleObjectsReturned
+RedButton.NotUpdated
RedButton.path
RedButton.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
index 04792749a3..39f07449bd 100644
--- a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -94,7 +94,7 @@ such as when closing the lid and un-blinding a character.
-
-aliases = ['push', 'press', 'press button']
+aliases = ['press button', 'press', 'push']
@@ -123,7 +123,7 @@ check if the lid is open or closed.
-
-search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\nPush the red button (lid closed)\n\nUsage:\n push button\n\n'}
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\nPush the red button (lid closed)\n\nUsage:\n push button\n\n'}
@@ -193,7 +193,7 @@ check if the lid is open or closed.
-
-aliases = ['smash lid', 'smash', 'break lid']
+aliases = ['smash', 'break lid', 'smash lid']
@@ -220,7 +220,7 @@ break.
-
-search_index_entry = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid smash break lid', 'tags': '', 'text': '\nSmash the protective glass.\n\nUsage:\n smash glass\n\nTry to smash the glass of the button.\n\n'}
+search_index_entry = {'aliases': 'smash break lid smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash break lid smash lid', 'tags': '', 'text': '\nSmash the protective glass.\n\nUsage:\n smash glass\n\nTry to smash the glass of the button.\n\n'}
@@ -320,7 +320,7 @@ be mutually exclusive.
-
-aliases = ['push', 'press', 'press button']
+aliases = ['press button', 'press', 'push']
@@ -349,7 +349,7 @@ set in self.parse())
-
-search_index_entry = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\nPush the red button\n\nUsage:\n push button\n\n'}
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\nPush the red button\n\nUsage:\n push button\n\n'}
@@ -447,7 +447,7 @@ be mutually exclusive.
-
-aliases = ['get', 'ex', 'l', 'feel', 'examine', 'listen']
+aliases = ['l', 'examine', 'ex', 'listen', 'feel', 'get']
@@ -473,7 +473,7 @@ be mutually exclusive.
-
-search_index_entry = {'aliases': 'get ex l feel examine listen', 'category': 'general', 'key': 'look', 'no_prefix': ' get ex l feel examine listen', 'tags': '', 'text': "\nLooking around in darkness\n\nUsage:\n look <obj>\n\n... not that there's much to see in the dark.\n\n"}
+search_index_entry = {'aliases': 'l examine ex listen feel get', 'category': 'general', 'key': 'look', 'no_prefix': ' l examine ex listen feel get', 'tags': '', 'text': "\nLooking around in darkness\n\nUsage:\n look <obj>\n\n... not that there's much to see in the dark.\n\n"}
@@ -694,6 +694,12 @@ temporarily.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.red_button.red_button.RedButton'
@@ -847,6 +853,7 @@ temporarily.
RedButton.break_lamp()
RedButton.DoesNotExist
RedButton.MultipleObjectsReturned
+RedButton.NotUpdated
RedButton.path
RedButton.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.talking_npc.html b/docs/latest/api/evennia.contrib.tutorials.talking_npc.html
index f36f02c586..73ae655d8a 100644
--- a/docs/latest/api/evennia.contrib.tutorials.talking_npc.html
+++ b/docs/latest/api/evennia.contrib.tutorials.talking_npc.html
@@ -79,6 +79,7 @@
TalkingNPC.at_object_creation()
TalkingNPC.DoesNotExist
TalkingNPC.MultipleObjectsReturned
+TalkingNPC.NotUpdated
TalkingNPC.path
TalkingNPC.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.talking_npc.talking_npc.html b/docs/latest/api/evennia.contrib.tutorials.talking_npc.talking_npc.html
index 594bdc2811..9bb442c092 100644
--- a/docs/latest/api/evennia.contrib.tutorials.talking_npc.talking_npc.html
+++ b/docs/latest/api/evennia.contrib.tutorials.talking_npc.talking_npc.html
@@ -188,6 +188,12 @@ the conversation defined above.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.talking_npc.talking_npc.TalkingNPC'
@@ -250,6 +256,7 @@ the conversation defined above.
TalkingNPC.at_object_creation()
TalkingNPC.DoesNotExist
TalkingNPC.MultipleObjectsReturned
+TalkingNPC.NotUpdated
TalkingNPC.path
TalkingNPC.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.html
index ad3733e467..e1bd4de3df 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.html
@@ -125,6 +125,7 @@
Mob.at_new_arrival()
Mob.DoesNotExist
Mob.MultipleObjectsReturned
+Mob.NotUpdated
Mob.path
Mob.typename
@@ -137,6 +138,7 @@
TutorialObject.reset()
TutorialObject.DoesNotExist
TutorialObject.MultipleObjectsReturned
+TutorialObject.NotUpdated
TutorialObject.path
TutorialObject.typename
@@ -160,6 +162,7 @@
TutorialReadable.at_object_creation()
TutorialReadable.DoesNotExist
TutorialReadable.MultipleObjectsReturned
+TutorialReadable.NotUpdated
TutorialReadable.path
TutorialReadable.typename
@@ -183,6 +186,7 @@
TutorialClimbable.at_object_creation()
TutorialClimbable.DoesNotExist
TutorialClimbable.MultipleObjectsReturned
+TutorialClimbable.NotUpdated
TutorialClimbable.path
TutorialClimbable.typename
@@ -192,6 +196,7 @@
Obelisk.return_appearance()
Obelisk.DoesNotExist
Obelisk.MultipleObjectsReturned
+Obelisk.NotUpdated
Obelisk.path
Obelisk.typename
@@ -219,6 +224,7 @@
LightSource.light()
LightSource.DoesNotExist
LightSource.MultipleObjectsReturned
+LightSource.NotUpdated
LightSource.path
LightSource.typename
@@ -261,6 +267,7 @@
CrumblingWall.reset()
CrumblingWall.DoesNotExist
CrumblingWall.MultipleObjectsReturned
+CrumblingWall.NotUpdated
CrumblingWall.path
CrumblingWall.typename
@@ -285,6 +292,7 @@
TutorialWeapon.reset()
TutorialWeapon.DoesNotExist
TutorialWeapon.MultipleObjectsReturned
+TutorialWeapon.NotUpdated
TutorialWeapon.path
TutorialWeapon.typename
@@ -310,6 +318,7 @@
TutorialWeaponRack.produce_weapon()
TutorialWeaponRack.DoesNotExist
TutorialWeaponRack.MultipleObjectsReturned
+TutorialWeaponRack.NotUpdated
TutorialWeaponRack.path
TutorialWeaponRack.typename
@@ -369,6 +378,7 @@
TutorialRoom.set_detail()
TutorialRoom.DoesNotExist
TutorialRoom.MultipleObjectsReturned
+TutorialRoom.NotUpdated
TutorialRoom.path
TutorialRoom.typename
@@ -377,6 +387,7 @@
TutorialStartExit.at_object_creation()
TutorialStartExit.DoesNotExist
TutorialStartExit.MultipleObjectsReturned
+TutorialStartExit.NotUpdated
TutorialStartExit.path
TutorialStartExit.typename
@@ -386,6 +397,7 @@
WeatherRoom.update_weather()
WeatherRoom.DoesNotExist
WeatherRoom.MultipleObjectsReturned
+WeatherRoom.NotUpdated
WeatherRoom.path
WeatherRoom.typename
@@ -410,6 +422,7 @@
IntroRoom.at_object_receive()
IntroRoom.DoesNotExist
IntroRoom.MultipleObjectsReturned
+IntroRoom.NotUpdated
IntroRoom.path
IntroRoom.typename
@@ -468,6 +481,7 @@
BridgeRoom.at_object_leave()
BridgeRoom.DoesNotExist
BridgeRoom.MultipleObjectsReturned
+BridgeRoom.NotUpdated
BridgeRoom.path
BridgeRoom.typename
@@ -518,6 +532,7 @@
DarkRoom.at_object_leave()
DarkRoom.DoesNotExist
DarkRoom.MultipleObjectsReturned
+DarkRoom.NotUpdated
DarkRoom.path
DarkRoom.typename
@@ -527,6 +542,7 @@
TeleportRoom.at_object_receive()
TeleportRoom.DoesNotExist
TeleportRoom.MultipleObjectsReturned
+TeleportRoom.NotUpdated
TeleportRoom.path
TeleportRoom.typename
@@ -537,6 +553,7 @@
OutroRoom.at_object_leave()
OutroRoom.DoesNotExist
OutroRoom.MultipleObjectsReturned
+OutroRoom.NotUpdated
OutroRoom.path
OutroRoom.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.mob.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.mob.html
index 46736a6fc0..b01361c5fe 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.mob.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.mob.html
@@ -279,6 +279,12 @@ right away, also when patrolling on a very slow ticker.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.mob.Mob'
@@ -347,6 +353,7 @@ right away, also when patrolling on a very slow ticker.
Mob.at_new_arrival()
Mob.DoesNotExist
Mob.MultipleObjectsReturned
+Mob.NotUpdated
Mob.path
Mob.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 26f240365c..4d5a211e71 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -93,6 +93,12 @@ TutorialWeaponRack
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.TutorialObject'
@@ -195,6 +201,12 @@ Attribute and add the readable cmdset.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.TutorialReadable'
@@ -297,6 +309,12 @@ the “climb” command available on it.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.TutorialClimbable'
@@ -349,6 +367,12 @@ of the object. We overload it with our own version.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.Obelisk'
@@ -473,6 +497,12 @@ non-persistent delay() method.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.LightSource'
@@ -504,7 +534,7 @@ shift green root up/down
-
-aliases = ['push', 'move', 'shiftroot', 'pull']
+aliases = ['pull', 'move', 'shiftroot', 'push']
@@ -540,7 +570,7 @@ yellow/green - horizontal roots
-
-search_index_entry = {'aliases': 'push move shiftroot pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push move shiftroot pull', 'tags': '', 'text': '\nShifts roots around.\n\nUsage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n'}
+search_index_entry = {'aliases': 'pull move shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull move shiftroot push', 'tags': '', 'text': '\nShifts roots around.\n\nUsage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n'}
@@ -692,6 +722,12 @@ traversed the Exit.
Bases: MultipleObjectsReturned, MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated, NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.CrumblingWall'
@@ -727,7 +763,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-aliases = ['slash', 'defend', 'pierce', 'kill', 'parry', 'fight', 'hit', 'thrust', 'chop', 'stab', 'bash']
+aliases = ['stab', 'defend', 'hit', 'slash', 'parry', 'pierce', 'kill', 'chop', 'bash', 'thrust', 'fight']
@@ -753,7 +789,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-search_index_entry = {'aliases': 'slash defend pierce kill parry fight hit thrust chop stab bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash defend pierce kill parry fight hit thrust chop stab bash', 'tags': '', 'text': '\nAttack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\nstab - (thrust) makes a lot of damage but is harder to hit with.\nslash - is easier to land, but does not make as much damage.\nparry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n'}
+search_index_entry = {'aliases': 'stab defend hit slash parry pierce kill chop bash thrust fight', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' stab defend hit slash parry pierce kill chop bash thrust fight', 'tags': '', 'text': '\nAttack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\nstab - (thrust) makes a lot of damage but is harder to hit with.\nslash - is easier to land, but does not make as much damage.\nparry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n'}
@@ -815,6 +851,12 @@ to return to.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.TutorialWeapon'
@@ -945,6 +987,12 @@ pulling weapons from it indefinitely.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.objects.TutorialWeaponRack'
@@ -987,6 +1035,7 @@ pulling weapons from it indefinitely.
TutorialObject.reset()
TutorialObject.DoesNotExist
TutorialObject.MultipleObjectsReturned
+TutorialObject.NotUpdated
TutorialObject.path
TutorialObject.typename
@@ -1010,6 +1059,7 @@ pulling weapons from it indefinitely.
TutorialReadable.at_object_creation()
TutorialReadable.DoesNotExist
TutorialReadable.MultipleObjectsReturned
+TutorialReadable.NotUpdated
TutorialReadable.path
TutorialReadable.typename
@@ -1033,6 +1083,7 @@ pulling weapons from it indefinitely.
TutorialClimbable.at_object_creation()
TutorialClimbable.DoesNotExist
TutorialClimbable.MultipleObjectsReturned
+TutorialClimbable.NotUpdated
TutorialClimbable.path
TutorialClimbable.typename
@@ -1042,6 +1093,7 @@ pulling weapons from it indefinitely.
Obelisk.return_appearance()
Obelisk.DoesNotExist
Obelisk.MultipleObjectsReturned
+Obelisk.NotUpdated
Obelisk.path
Obelisk.typename
@@ -1069,6 +1121,7 @@ pulling weapons from it indefinitely.
LightSource.light()
LightSource.DoesNotExist
LightSource.MultipleObjectsReturned
+LightSource.NotUpdated
LightSource.path
LightSource.typename
@@ -1111,6 +1164,7 @@ pulling weapons from it indefinitely.
CrumblingWall.reset()
CrumblingWall.DoesNotExist
CrumblingWall.MultipleObjectsReturned
+CrumblingWall.NotUpdated
CrumblingWall.path
CrumblingWall.typename
@@ -1135,6 +1189,7 @@ pulling weapons from it indefinitely.
TutorialWeapon.reset()
TutorialWeapon.DoesNotExist
TutorialWeapon.MultipleObjectsReturned
+TutorialWeapon.NotUpdated
TutorialWeapon.path
TutorialWeapon.typename
@@ -1160,6 +1215,7 @@ pulling weapons from it indefinitely.
TutorialWeaponRack.produce_weapon()
TutorialWeaponRack.DoesNotExist
TutorialWeaponRack.MultipleObjectsReturned
+TutorialWeaponRack.NotUpdated
TutorialWeaponRack.path
TutorialWeaponRack.typename
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 93c768f1da..3264cd4dd3 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -360,6 +360,12 @@ at the given detailkey.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.TutorialRoom'
@@ -399,6 +405,12 @@ normal hook to overload for most object types.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.TutorialStartExit'
@@ -451,6 +463,12 @@ even though we don’t actually use them in this example)
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.WeatherRoom'
@@ -565,6 +583,12 @@ self.add().
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.IntroRoom'
@@ -766,7 +790,7 @@ if they fall off the bridge.
-
-aliases = ['?', 'h']
+aliases = ['h', '?']
@@ -792,7 +816,7 @@ if they fall off the bridge.
-
-search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\nOverwritten help command while on the bridge.\n'}
+search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\nOverwritten help command while on the bridge.\n'}
@@ -888,6 +912,12 @@ into this room.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.BridgeRoom'
@@ -918,7 +948,7 @@ to find something.
-
-aliases = ['search', 'feel around', 'l', 'feel', 'fiddle']
+aliases = ['fiddle', 'l', 'search', 'feel around', 'feel']
@@ -946,7 +976,7 @@ random chance of eventually finding a light source.
-
-search_index_entry = {'aliases': 'search feel around l feel fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel around l feel fiddle', 'tags': '', 'text': '\nLook around in darkness\n\nUsage:\n look\n\nLook around in the darkness, trying\nto find something.\n'}
+search_index_entry = {'aliases': 'fiddle l search feel around feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle l search feel around feel', 'tags': '', 'text': '\nLook around in darkness\n\nUsage:\n look\n\nLook around in the darkness, trying\nto find something.\n'}
@@ -1143,6 +1173,12 @@ teleported away.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.DarkRoom'
@@ -1194,6 +1230,12 @@ this room.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.TeleportRoom'
@@ -1257,6 +1299,12 @@ overriding the call (unused by default).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.tutorials.tutorial_world.rooms.OutroRoom'
@@ -1346,6 +1394,7 @@ overriding the call (unused by default).
TutorialRoom.set_detail()
TutorialRoom.DoesNotExist
TutorialRoom.MultipleObjectsReturned
+TutorialRoom.NotUpdated
TutorialRoom.path
TutorialRoom.typename
@@ -1354,6 +1403,7 @@ overriding the call (unused by default).
TutorialStartExit.at_object_creation()
TutorialStartExit.DoesNotExist
TutorialStartExit.MultipleObjectsReturned
+TutorialStartExit.NotUpdated
TutorialStartExit.path
TutorialStartExit.typename
@@ -1363,6 +1413,7 @@ overriding the call (unused by default).
WeatherRoom.update_weather()
WeatherRoom.DoesNotExist
WeatherRoom.MultipleObjectsReturned
+WeatherRoom.NotUpdated
WeatherRoom.path
WeatherRoom.typename
@@ -1387,6 +1438,7 @@ overriding the call (unused by default).
IntroRoom.at_object_receive()
IntroRoom.DoesNotExist
IntroRoom.MultipleObjectsReturned
+IntroRoom.NotUpdated
IntroRoom.path
IntroRoom.typename
@@ -1445,6 +1497,7 @@ overriding the call (unused by default).
BridgeRoom.at_object_leave()
BridgeRoom.DoesNotExist
BridgeRoom.MultipleObjectsReturned
+BridgeRoom.NotUpdated
BridgeRoom.path
BridgeRoom.typename
@@ -1495,6 +1548,7 @@ overriding the call (unused by default).
DarkRoom.at_object_leave()
DarkRoom.DoesNotExist
DarkRoom.MultipleObjectsReturned
+DarkRoom.NotUpdated
DarkRoom.path
DarkRoom.typename
@@ -1504,6 +1558,7 @@ overriding the call (unused by default).
TeleportRoom.at_object_receive()
TeleportRoom.DoesNotExist
TeleportRoom.MultipleObjectsReturned
+TeleportRoom.NotUpdated
TeleportRoom.path
TeleportRoom.typename
@@ -1514,6 +1569,7 @@ overriding the call (unused by default).
OutroRoom.at_object_leave()
OutroRoom.DoesNotExist
OutroRoom.MultipleObjectsReturned
+OutroRoom.NotUpdated
OutroRoom.path
OutroRoom.typename
diff --git a/docs/latest/api/evennia.contrib.utils.debugpy.cmd.html b/docs/latest/api/evennia.contrib.utils.debugpy.cmd.html
index 6439ac96a5..022b1abb0a 100644
--- a/docs/latest/api/evennia.contrib.utils.debugpy.cmd.html
+++ b/docs/latest/api/evennia.contrib.utils.debugpy.cmd.html
@@ -97,7 +97,7 @@ to all the variables defined therein.
-
-search_index_entry = {'aliases': '', 'category': 'general', 'key': 'debugpy', 'no_prefix': ' ', 'tags': '', 'text': '\nLaunch debugpy debugger and wait for attach on port 5678\n\nUsage:\n debugpy\n'}
+search_index_entry = {'aliases': '', 'category': 'general', 'key': 'debugpy', 'no_prefix': ' ', 'tags': '', 'text': '\nLaunch debugpy debugger and wait for attach on port 5678\n\nUsage:\n debugpy\n\n'}
diff --git a/docs/latest/api/evennia.contrib.utils.html b/docs/latest/api/evennia.contrib.utils.html
index 2d803d55f2..1868217002 100644
--- a/docs/latest/api/evennia.contrib.utils.html
+++ b/docs/latest/api/evennia.contrib.utils.html
@@ -210,6 +210,7 @@
RandomStringGeneratorScript.at_script_creation()
RandomStringGeneratorScript.DoesNotExist
RandomStringGeneratorScript.MultipleObjectsReturned
+RandomStringGeneratorScript.NotUpdated
RandomStringGeneratorScript.path
RandomStringGeneratorScript.typename
diff --git a/docs/latest/api/evennia.contrib.utils.random_string_generator.html b/docs/latest/api/evennia.contrib.utils.random_string_generator.html
index a454ebe40f..397fc4119b 100644
--- a/docs/latest/api/evennia.contrib.utils.random_string_generator.html
+++ b/docs/latest/api/evennia.contrib.utils.random_string_generator.html
@@ -60,6 +60,7 @@
RandomStringGeneratorScript.at_script_creation()
RandomStringGeneratorScript.DoesNotExist
RandomStringGeneratorScript.MultipleObjectsReturned
+RandomStringGeneratorScript.NotUpdated
RandomStringGeneratorScript.path
RandomStringGeneratorScript.typename
diff --git a/docs/latest/api/evennia.contrib.utils.random_string_generator.random_string_generator.html b/docs/latest/api/evennia.contrib.utils.random_string_generator.random_string_generator.html
index 8e891abdb3..991abe3b29 100644
--- a/docs/latest/api/evennia.contrib.utils.random_string_generator.random_string_generator.html
+++ b/docs/latest/api/evennia.contrib.utils.random_string_generator.random_string_generator.html
@@ -136,6 +136,12 @@ on a RandomStringGenerator object.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.contrib.utils.random_string_generator.random_string_generator.RandomStringGeneratorScript'
@@ -297,6 +303,7 @@ calling the get method.
RandomStringGeneratorScript.at_script_creation()
RandomStringGeneratorScript.DoesNotExist
RandomStringGeneratorScript.MultipleObjectsReturned
+RandomStringGeneratorScript.NotUpdated
RandomStringGeneratorScript.path
RandomStringGeneratorScript.typename
diff --git a/docs/latest/api/evennia.help.html b/docs/latest/api/evennia.help.html
index 39974f4a5d..8a42a6e841 100644
--- a/docs/latest/api/evennia.help.html
+++ b/docs/latest/api/evennia.help.html
@@ -139,6 +139,7 @@ itself.
HelpEntry.get_absolute_url()
HelpEntry.DoesNotExist
HelpEntry.MultipleObjectsReturned
+HelpEntry.NotUpdated
HelpEntry.entrytext
HelpEntry.get_next_by_db_date_created()
HelpEntry.get_previous_by_db_date_created()
@@ -154,6 +155,7 @@ itself.
ContentType
ContentType.DoesNotExist
ContentType.MultipleObjectsReturned
+ContentType.NotUpdated
ContentType.app_label
ContentType.app_labeled_name
ContentType.get_all_objects_for_this_type()
@@ -219,6 +221,7 @@ itself.
Tag
Tag.DoesNotExist
Tag.MultipleObjectsReturned
+Tag.NotUpdated
Tag.accountdb_set
Tag.channeldb_set
Tag.db_category
diff --git a/docs/latest/api/evennia.help.models.html b/docs/latest/api/evennia.help.models.html
index 8fe586ecf6..d30aca280d 100644
--- a/docs/latest/api/evennia.help.models.html
+++ b/docs/latest/api/evennia.help.models.html
@@ -325,6 +325,12 @@ responsibility.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
property entrytext
@@ -401,6 +407,12 @@ object the first time, the query is executed.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
app_label
@@ -447,7 +459,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -490,7 +502,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -1081,6 +1093,12 @@ default search functions of Evennia to allow quick searches by alias.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
accountdb_set
@@ -1513,6 +1531,7 @@ trailing whitespace, dashes, and underscores.
HelpEntry.get_absolute_url()
HelpEntry.DoesNotExist
HelpEntry.MultipleObjectsReturned
+HelpEntry.NotUpdated
HelpEntry.entrytext
HelpEntry.get_next_by_db_date_created()
HelpEntry.get_previous_by_db_date_created()
@@ -1528,6 +1547,7 @@ trailing whitespace, dashes, and underscores.
ContentType
@@ -248,6 +249,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultGuest.at_post_disconnect()
DefaultGuest.DoesNotExist
DefaultGuest.MultipleObjectsReturned
+DefaultGuest.NotUpdated
DefaultGuest.path
DefaultGuest.typename
@@ -255,6 +257,7 @@ with ‘q’, remove the break line and restart server when finished.
AccountDB
ChannelDB
ObjectDB
ServerConfig
BotStarter.at_repeat()
BotStarter.DoesNotExist
BotStarter.MultipleObjectsReturned
+BotStarter.NotUpdated
BotStarter.path
BotStarter.typename
@@ -505,6 +512,7 @@ with ‘q’, remove the break line and restart server when finished.
Bot.at_server_shutdown()
Bot.DoesNotExist
Bot.MultipleObjectsReturned
+Bot.NotUpdated
Bot.path
Bot.typename
@@ -520,6 +528,7 @@ with ‘q’, remove the break line and restart server when finished.
IRCBot.execute_cmd()
IRCBot.DoesNotExist
IRCBot.MultipleObjectsReturned
+IRCBot.NotUpdated
IRCBot.path
IRCBot.typename
@@ -529,6 +538,7 @@ with ‘q’, remove the break line and restart server when finished.
RSSBot.execute_cmd()
RSSBot.DoesNotExist
RSSBot.MultipleObjectsReturned
+RSSBot.NotUpdated
RSSBot.path
RSSBot.typename
@@ -541,6 +551,7 @@ with ‘q’, remove the break line and restart server when finished.
GrapevineBot.execute_cmd()
GrapevineBot.DoesNotExist
GrapevineBot.MultipleObjectsReturned
+GrapevineBot.NotUpdated
GrapevineBot.path
GrapevineBot.typename
@@ -558,6 +569,7 @@ with ‘q’, remove the break line and restart server when finished.
DiscordBot.execute_cmd()
DiscordBot.DoesNotExist
DiscordBot.MultipleObjectsReturned
+DiscordBot.NotUpdated
DiscordBot.path
DiscordBot.typename
@@ -643,6 +655,7 @@ with ‘q’, remove the break line and restart server when finished.
AccountDB.uid
AccountDB.DoesNotExist
AccountDB.MultipleObjectsReturned
+AccountDB.NotUpdated
AccountDB.account_subscription_set
AccountDB.date_joined
AccountDB.db_attributes
@@ -939,6 +952,7 @@ with ‘q’, remove the break line and restart server when finished.
ServerConfig
ServerConfig
ObjectDB
Paginator
ScriptDB
AccountDB
DefaultChannel
Msg
DefaultObject
HelpEntry
AccountDB
TestBuilding.test_teleport()
TestBuilding.test_tag()
TestBuilding.test_spawn()
+TestBuilding.test_setattr_view_with_category()
TestCommsChannel
@@ -3437,6 +3458,7 @@ with ‘q’, remove the break line and restart server when finished.
ChannelDB
DefaultChannel.post_send_message()
DefaultChannel.DoesNotExist
DefaultChannel.MultipleObjectsReturned
+DefaultChannel.NotUpdated
DefaultChannel.path
DefaultChannel.typename
@@ -3579,6 +3602,7 @@ with ‘q’, remove the break line and restart server when finished.
Msg.access()
Msg.DoesNotExist
Msg.MultipleObjectsReturned
+Msg.NotUpdated
Msg.get_next_by_db_date_created()
Msg.get_previous_by_db_date_created()
Msg.header
@@ -3605,6 +3629,7 @@ with ‘q’, remove the break line and restart server when finished.
ChannelDB.objects
ChannelDB.DoesNotExist
ChannelDB.MultipleObjectsReturned
+ChannelDB.NotUpdated
ChannelDB.db_attributes
ChannelDB.db_date_created
ChannelDB.db_key
@@ -3669,6 +3694,7 @@ with ‘q’, remove the break line and restart server when finished.
Tag
CharacterWithComponents.ic_a
CharacterWithComponents.DoesNotExist
CharacterWithComponents.MultipleObjectsReturned
+CharacterWithComponents.NotUpdated
CharacterWithComponents.path
CharacterWithComponents.typename
@@ -4174,6 +4201,7 @@ with ‘q’, remove the break line and restart server when finished.
InheritedTCWithComponents.test_c
InheritedTCWithComponents.DoesNotExist
InheritedTCWithComponents.MultipleObjectsReturned
+InheritedTCWithComponents.NotUpdated
InheritedTCWithComponents.path
InheritedTCWithComponents.typename
@@ -4218,6 +4246,7 @@ with ‘q’, remove the break line and restart server when finished.
CharWithSignal.my_other_response()
CharWithSignal.DoesNotExist
CharWithSignal.MultipleObjectsReturned
+CharWithSignal.NotUpdated
CharWithSignal.path
CharWithSignal.typename
@@ -4271,6 +4300,7 @@ with ‘q’, remove the break line and restart server when finished.
GametimeScript.at_repeat()
GametimeScript.DoesNotExist
GametimeScript.MultipleObjectsReturned
+GametimeScript.NotUpdated
GametimeScript.path
GametimeScript.typename
@@ -4350,6 +4380,7 @@ with ‘q’, remove the break line and restart server when finished.
AccountDB
ServerConfig
EventHandler.set_task()
EventHandler.DoesNotExist
EventHandler.MultipleObjectsReturned
+EventHandler.NotUpdated
EventHandler.path
EventHandler.typename
@@ -4655,6 +4688,7 @@ with ‘q’, remove the break line and restart server when finished.
TimeEventScript.at_repeat()
TimeEventScript.DoesNotExist
TimeEventScript.MultipleObjectsReturned
+TimeEventScript.NotUpdated
TimeEventScript.path
TimeEventScript.typename
@@ -5214,6 +5248,7 @@ with ‘q’, remove the break line and restart server when finished.
EvscaperoomObject.return_appearance()
EvscaperoomObject.DoesNotExist
EvscaperoomObject.MultipleObjectsReturned
+EvscaperoomObject.NotUpdated
EvscaperoomObject.path
EvscaperoomObject.typename
@@ -5222,6 +5257,7 @@ with ‘q’, remove the break line and restart server when finished.
Feelable.at_focus_feel()
Feelable.DoesNotExist
Feelable.MultipleObjectsReturned
+Feelable.NotUpdated
Feelable.path
Feelable.typename
@@ -5230,6 +5266,7 @@ with ‘q’, remove the break line and restart server when finished.
Listenable.at_focus_listen()
Listenable.DoesNotExist
Listenable.MultipleObjectsReturned
+Listenable.NotUpdated
Listenable.path
Listenable.typename
@@ -5238,6 +5275,7 @@ with ‘q’, remove the break line and restart server when finished.
Smellable.at_focus_smell()
Smellable.DoesNotExist
Smellable.MultipleObjectsReturned
+Smellable.NotUpdated
Smellable.path
Smellable.typename
@@ -5252,6 +5290,7 @@ with ‘q’, remove the break line and restart server when finished.
Rotatable.at_cannot_rotate()
Rotatable.DoesNotExist
Rotatable.MultipleObjectsReturned
+Rotatable.NotUpdated
Rotatable.path
Rotatable.typename
@@ -5270,6 +5309,7 @@ with ‘q’, remove the break line and restart server when finished.
Openable.at_already_closed()
Openable.DoesNotExist
Openable.MultipleObjectsReturned
+Openable.NotUpdated
Openable.path
Openable.typename
@@ -5283,6 +5323,7 @@ with ‘q’, remove the break line and restart server when finished.
Readable.at_cannot_read()
Readable.DoesNotExist
Readable.MultipleObjectsReturned
+Readable.NotUpdated
Readable.path
Readable.typename
@@ -5295,6 +5336,7 @@ with ‘q’, remove the break line and restart server when finished.
IndexReadable.at_read()
IndexReadable.DoesNotExist
IndexReadable.MultipleObjectsReturned
+IndexReadable.NotUpdated
IndexReadable.path
IndexReadable.typename
@@ -5313,6 +5355,7 @@ with ‘q’, remove the break line and restart server when finished.
Movable.at_right()
Movable.DoesNotExist
Movable.MultipleObjectsReturned
+Movable.NotUpdated
Movable.path
Movable.typename
@@ -5326,6 +5369,7 @@ with ‘q’, remove the break line and restart server when finished.
BaseConsumable.at_already_consumed()
BaseConsumable.DoesNotExist
BaseConsumable.MultipleObjectsReturned
+BaseConsumable.NotUpdated
BaseConsumable.path
BaseConsumable.typename
@@ -5335,6 +5379,7 @@ with ‘q’, remove the break line and restart server when finished.
Edible.at_focus_eat()
Edible.DoesNotExist
Edible.MultipleObjectsReturned
+Edible.NotUpdated
Edible.path
Edible.typename
@@ -5347,6 +5392,7 @@ with ‘q’, remove the break line and restart server when finished.
Drinkable.at_already_consumed()
Drinkable.DoesNotExist
Drinkable.MultipleObjectsReturned
+Drinkable.NotUpdated
Drinkable.path
Drinkable.typename
@@ -5358,6 +5404,7 @@ with ‘q’, remove the break line and restart server when finished.
BaseApplicable.at_cannot_apply()
BaseApplicable.DoesNotExist
BaseApplicable.MultipleObjectsReturned
+BaseApplicable.NotUpdated
BaseApplicable.path
BaseApplicable.typename
@@ -5369,6 +5416,7 @@ with ‘q’, remove the break line and restart server when finished.
Usable.at_cannot_apply()
Usable.DoesNotExist
Usable.MultipleObjectsReturned
+Usable.NotUpdated
Usable.path
Usable.typename
@@ -5381,6 +5429,7 @@ with ‘q’, remove the break line and restart server when finished.
Insertable.at_cannot_apply()
Insertable.DoesNotExist
Insertable.MultipleObjectsReturned
+Insertable.NotUpdated
Insertable.path
Insertable.typename
@@ -5395,6 +5444,7 @@ with ‘q’, remove the break line and restart server when finished.
Combinable.at_apply()
Combinable.DoesNotExist
Combinable.MultipleObjectsReturned
+Combinable.NotUpdated
Combinable.path
Combinable.typename
@@ -5410,6 +5460,7 @@ with ‘q’, remove the break line and restart server when finished.
Mixable.at_mix_success()
Mixable.DoesNotExist
Mixable.MultipleObjectsReturned
+Mixable.NotUpdated
Mixable.path
Mixable.typename
@@ -5424,6 +5475,7 @@ with ‘q’, remove the break line and restart server when finished.
HasButtons.at_red_button()
HasButtons.DoesNotExist
HasButtons.MultipleObjectsReturned
+HasButtons.NotUpdated
HasButtons.path
HasButtons.typename
@@ -5440,6 +5492,7 @@ with ‘q’, remove the break line and restart server when finished.
CodeInput.at_code_incorrect()
CodeInput.DoesNotExist
CodeInput.MultipleObjectsReturned
+CodeInput.NotUpdated
CodeInput.path
CodeInput.typename
@@ -5452,6 +5505,7 @@ with ‘q’, remove the break line and restart server when finished.
BasePositionable.at_position()
BasePositionable.DoesNotExist
BasePositionable.MultipleObjectsReturned
+BasePositionable.NotUpdated
BasePositionable.path
BasePositionable.typename
@@ -5460,6 +5514,7 @@ with ‘q’, remove the break line and restart server when finished.
Sittable.at_focus_sit()
Sittable.DoesNotExist
Sittable.MultipleObjectsReturned
+Sittable.NotUpdated
Sittable.path
Sittable.typename
@@ -5468,6 +5523,7 @@ with ‘q’, remove the break line and restart server when finished.
Liable.at_focus_lie()
Liable.DoesNotExist
Liable.MultipleObjectsReturned
+Liable.NotUpdated
Liable.path
Liable.typename
@@ -5476,6 +5532,7 @@ with ‘q’, remove the break line and restart server when finished.
Kneelable.at_focus_kneel()
Kneelable.DoesNotExist
Kneelable.MultipleObjectsReturned
+Kneelable.NotUpdated
Kneelable.path
Kneelable.typename
@@ -5484,6 +5541,7 @@ with ‘q’, remove the break line and restart server when finished.
Climbable.at_focus_climb()
Climbable.DoesNotExist
Climbable.MultipleObjectsReturned
+Climbable.NotUpdated
Climbable.path
Climbable.typename
@@ -5492,6 +5550,7 @@ with ‘q’, remove the break line and restart server when finished.
Positionable.get_cmd_signatures()
Positionable.DoesNotExist
Positionable.MultipleObjectsReturned
+Positionable.NotUpdated
Positionable.path
Positionable.typename
@@ -5522,6 +5581,7 @@ with ‘q’, remove the break line and restart server when finished.
EvscapeRoom.return_appearance()
EvscapeRoom.DoesNotExist
EvscapeRoom.MultipleObjectsReturned
+EvscapeRoom.NotUpdated
EvscapeRoom.path
EvscapeRoom.typename
@@ -5534,6 +5594,7 @@ with ‘q’, remove the break line and restart server when finished.
CleanupScript.at_repeat()
CleanupScript.DoesNotExist
CleanupScript.MultipleObjectsReturned
+CleanupScript.NotUpdated
CleanupScript.path
CleanupScript.typename
@@ -5661,6 +5722,7 @@ with ‘q’, remove the break line and restart server when finished.
TradeTimeout.is_valid()
TradeTimeout.DoesNotExist
TradeTimeout.MultipleObjectsReturned
+TradeTimeout.NotUpdated
TradeTimeout.path
TradeTimeout.typename
@@ -5803,6 +5865,7 @@ with ‘q’, remove the break line and restart server when finished.
ContribClothing.at_pre_move()
ContribClothing.DoesNotExist
ContribClothing.MultipleObjectsReturned
+ContribClothing.NotUpdated
ContribClothing.path
ContribClothing.typename
@@ -5812,6 +5875,7 @@ with ‘q’, remove the break line and restart server when finished.
ClothedCharacter.get_display_things()
ClothedCharacter.DoesNotExist
ClothedCharacter.MultipleObjectsReturned
+ClothedCharacter.NotUpdated
ClothedCharacter.path
ClothedCharacter.typename
@@ -6188,6 +6252,7 @@ with ‘q’, remove the break line and restart server when finished.
GenderCharacter.msg()
GenderCharacter.DoesNotExist
GenderCharacter.MultipleObjectsReturned
+GenderCharacter.NotUpdated
GenderCharacter.path
GenderCharacter.typename
@@ -6274,6 +6339,7 @@ with ‘q’, remove the break line and restart server when finished.
PuzzleRecipe.save_recipe()
PuzzleRecipe.DoesNotExist
PuzzleRecipe.MultipleObjectsReturned
+PuzzleRecipe.NotUpdated
PuzzleRecipe.path
PuzzleRecipe.typename
@@ -6463,6 +6529,7 @@ with ‘q’, remove the break line and restart server when finished.
TBBasicCharacter.at_pre_move()
TBBasicCharacter.DoesNotExist
TBBasicCharacter.MultipleObjectsReturned
+TBBasicCharacter.NotUpdated
TBBasicCharacter.path
TBBasicCharacter.typename
@@ -6479,6 +6546,7 @@ with ‘q’, remove the break line and restart server when finished.
TBBasicTurnHandler.join_fight()
TBBasicTurnHandler.DoesNotExist
TBBasicTurnHandler.MultipleObjectsReturned
+TBBasicTurnHandler.NotUpdated
TBBasicTurnHandler.path
TBBasicTurnHandler.typename
@@ -6567,6 +6635,7 @@ with ‘q’, remove the break line and restart server when finished.
TBEquipTurnHandler.rules
TBEquipTurnHandler.DoesNotExist
TBEquipTurnHandler.MultipleObjectsReturned
+TBEquipTurnHandler.NotUpdated
TBEquipTurnHandler.path
TBEquipTurnHandler.typename
@@ -6578,6 +6647,7 @@ with ‘q’, remove the break line and restart server when finished.
TBEWeapon.at_give()
TBEWeapon.DoesNotExist
TBEWeapon.MultipleObjectsReturned
+TBEWeapon.NotUpdated
TBEWeapon.path
TBEWeapon.typename
@@ -6590,6 +6660,7 @@ with ‘q’, remove the break line and restart server when finished.
TBEArmor.at_give()
TBEArmor.DoesNotExist
TBEArmor.MultipleObjectsReturned
+TBEArmor.NotUpdated
TBEArmor.path
TBEArmor.typename
@@ -6598,6 +6669,7 @@ with ‘q’, remove the break line and restart server when finished.
TBEquipCharacter.at_object_creation()
TBEquipCharacter.DoesNotExist
TBEquipCharacter.MultipleObjectsReturned
+TBEquipCharacter.NotUpdated
TBEquipCharacter.path
TBEquipCharacter.typename
@@ -6732,6 +6804,7 @@ with ‘q’, remove the break line and restart server when finished.
TBItemsCharacter.at_update()
TBItemsCharacter.DoesNotExist
TBItemsCharacter.MultipleObjectsReturned
+TBItemsCharacter.NotUpdated
TBItemsCharacter.path
TBItemsCharacter.typename
@@ -6740,6 +6813,7 @@ with ‘q’, remove the break line and restart server when finished.
TBItemsCharacterTest.at_object_creation()
TBItemsCharacterTest.DoesNotExist
TBItemsCharacterTest.MultipleObjectsReturned
+TBItemsCharacterTest.NotUpdated
TBItemsCharacterTest.path
TBItemsCharacterTest.typename
@@ -6749,6 +6823,7 @@ with ‘q’, remove the break line and restart server when finished.
TBItemsTurnHandler.next_turn()
TBItemsTurnHandler.DoesNotExist
TBItemsTurnHandler.MultipleObjectsReturned
+TBItemsTurnHandler.NotUpdated
TBItemsTurnHandler.path
TBItemsTurnHandler.typename
@@ -6842,6 +6917,7 @@ with ‘q’, remove the break line and restart server when finished.
TBMagicCharacter.at_object_creation()
TBMagicCharacter.DoesNotExist
TBMagicCharacter.MultipleObjectsReturned
+TBMagicCharacter.NotUpdated
TBMagicCharacter.path
TBMagicCharacter.typename
@@ -6850,6 +6926,7 @@ with ‘q’, remove the break line and restart server when finished.
TBMagicTurnHandler.rules
TBMagicTurnHandler.DoesNotExist
TBMagicTurnHandler.MultipleObjectsReturned
+TBMagicTurnHandler.NotUpdated
TBMagicTurnHandler.path
TBMagicTurnHandler.typename
@@ -6968,6 +7045,7 @@ with ‘q’, remove the break line and restart server when finished.
TBRangeTurnHandler.join_fight()
TBRangeTurnHandler.DoesNotExist
TBRangeTurnHandler.MultipleObjectsReturned
+TBRangeTurnHandler.NotUpdated
TBRangeTurnHandler.path
TBRangeTurnHandler.typename
@@ -6976,6 +7054,7 @@ with ‘q’, remove the break line and restart server when finished.
TBRangeCharacter.rules
TBRangeCharacter.DoesNotExist
TBRangeCharacter.MultipleObjectsReturned
+TBRangeCharacter.NotUpdated
TBRangeCharacter.path
TBRangeCharacter.typename
@@ -6989,6 +7068,7 @@ with ‘q’, remove the break line and restart server when finished.
TBRangeObject.at_give()
TBRangeObject.DoesNotExist
TBRangeObject.MultipleObjectsReturned
+TBRangeObject.NotUpdated
TBRangeObject.path
TBRangeObject.typename
@@ -7199,6 +7279,7 @@ with ‘q’, remove the break line and restart server when finished.
ExtendedRoom.return_detail()
ExtendedRoom.DoesNotExist
ExtendedRoom.MultipleObjectsReturned
+ExtendedRoom.NotUpdated
ExtendedRoom.path
ExtendedRoom.typename
@@ -7351,6 +7432,7 @@ with ‘q’, remove the break line and restart server when finished.
SimpleDoor.at_failed_traverse()
SimpleDoor.DoesNotExist
SimpleDoor.MultipleObjectsReturned
+SimpleDoor.NotUpdated
SimpleDoor.path
SimpleDoor.typename
@@ -7401,6 +7483,7 @@ with ‘q’, remove the break line and restart server when finished.
SlowExit.at_traverse()
SlowExit.DoesNotExist
SlowExit.MultipleObjectsReturned
+SlowExit.NotUpdated
SlowExit.path
SlowExit.typename
@@ -7478,6 +7561,7 @@ with ‘q’, remove the break line and restart server when finished.
WildernessScript.at_post_object_leave()
WildernessScript.DoesNotExist
WildernessScript.MultipleObjectsReturned
+WildernessScript.NotUpdated
WildernessScript.path
WildernessScript.typename
@@ -7493,6 +7577,7 @@ with ‘q’, remove the break line and restart server when finished.
WildernessRoom.get_display_desc()
WildernessRoom.DoesNotExist
WildernessRoom.MultipleObjectsReturned
+WildernessRoom.NotUpdated
WildernessRoom.path
WildernessRoom.typename
@@ -7504,6 +7589,7 @@ with ‘q’, remove the break line and restart server when finished.
WildernessExit.at_traverse()
WildernessExit.DoesNotExist
WildernessExit.MultipleObjectsReturned
+WildernessExit.NotUpdated
WildernessExit.path
WildernessExit.typename
@@ -7866,6 +7952,7 @@ with ‘q’, remove the break line and restart server when finished.
TestXyzRoom.at_object_creation()
TestXyzRoom.DoesNotExist
TestXyzRoom.MultipleObjectsReturned
+TestXyzRoom.NotUpdated
TestXyzRoom.path
TestXyzRoom.typename
@@ -7874,6 +7961,7 @@ with ‘q’, remove the break line and restart server when finished.
TestXyzExit.at_object_creation()
TestXyzExit.DoesNotExist
TestXyzExit.MultipleObjectsReturned
+TestXyzExit.NotUpdated
TestXyzExit.path
TestXyzExit.typename
@@ -8146,6 +8234,7 @@ with ‘q’, remove the break line and restart server when finished.
XYZGrid.spawn()
XYZGrid.DoesNotExist
XYZGrid.MultipleObjectsReturned
+XYZGrid.NotUpdated
XYZGrid.path
XYZGrid.typename
@@ -8182,6 +8271,7 @@ with ‘q’, remove the break line and restart server when finished.
XYZRoom.return_appearance()
XYZRoom.DoesNotExist
XYZRoom.MultipleObjectsReturned
+XYZRoom.NotUpdated
XYZRoom.path
XYZRoom.typename
@@ -8194,6 +8284,7 @@ with ‘q’, remove the break line and restart server when finished.
XYZExit.create()
XYZExit.DoesNotExist
XYZExit.MultipleObjectsReturned
+XYZExit.NotUpdated
XYZExit.path
XYZExit.typename
@@ -8401,6 +8492,7 @@ with ‘q’, remove the break line and restart server when finished.
BuffableObject.at_init()
BuffableObject.DoesNotExist
BuffableObject.MultipleObjectsReturned
+BuffableObject.NotUpdated
BuffableObject.path
BuffableObject.typename
@@ -8460,6 +8552,7 @@ with ‘q’, remove the break line and restart server when finished.
ContribChargenAccount.at_look()
ContribChargenAccount.DoesNotExist
ContribChargenAccount.MultipleObjectsReturned
+ContribChargenAccount.NotUpdated
ContribChargenAccount.path
ContribChargenAccount.typename
@@ -8508,6 +8601,7 @@ with ‘q’, remove the break line and restart server when finished.
TestDice.test_cmddice()
TestDice.test_string_form()
TestDice.test_maxvals()
+TestDice.test_malformed_inputs()
@@ -8569,6 +8663,7 @@ with ‘q’, remove the break line and restart server when finished.
LLMNPC.at_talked_to()
LLMNPC.DoesNotExist
LLMNPC.MultipleObjectsReturned
+LLMNPC.NotUpdated
LLMNPC.path
LLMNPC.typename
@@ -8609,6 +8704,7 @@ with ‘q’, remove the break line and restart server when finished.
LanguageHandler.translate()
LanguageHandler.DoesNotExist
LanguageHandler.MultipleObjectsReturned
+LanguageHandler.NotUpdated
LanguageHandler.path
LanguageHandler.typename
@@ -8729,6 +8825,7 @@ with ‘q’, remove the break line and restart server when finished.
ContribRPObject.get_display_things()
ContribRPObject.DoesNotExist
ContribRPObject.MultipleObjectsReturned
+ContribRPObject.NotUpdated
ContribRPObject.path
ContribRPObject.typename
@@ -8736,6 +8833,7 @@ with ‘q’, remove the break line and restart server when finished.
ContribRPRoom
@@ -8751,6 +8849,7 @@ with ‘q’, remove the break line and restart server when finished.
ContribRPCharacter.process_language()
ContribRPCharacter.DoesNotExist
ContribRPCharacter.MultipleObjectsReturned
+ContribRPCharacter.NotUpdated
ContribRPCharacter.path
ContribRPCharacter.typename
@@ -8893,6 +8992,7 @@ with ‘q’, remove the break line and restart server when finished.
TraitContribTestingChar.HP
TraitContribTestingChar.DoesNotExist
TraitContribTestingChar.MultipleObjectsReturned
+TraitContribTestingChar.NotUpdated
TraitContribTestingChar.path
TraitContribTestingChar.typename
@@ -9009,6 +9109,7 @@ with ‘q’, remove the break line and restart server when finished.
BodyFunctions.send_random_message()
BodyFunctions.DoesNotExist
BodyFunctions.MultipleObjectsReturned
+BodyFunctions.NotUpdated
BodyFunctions.path
BodyFunctions.typename
@@ -9096,6 +9197,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureCharacter.level_up()
EvAdventureCharacter.DoesNotExist
EvAdventureCharacter.MultipleObjectsReturned
+EvAdventureCharacter.NotUpdated
EvAdventureCharacter.path
EvAdventureCharacter.typename
@@ -9162,6 +9264,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureCombatBaseHandler.stop_combat()
EvAdventureCombatBaseHandler.DoesNotExist
EvAdventureCombatBaseHandler.MultipleObjectsReturned
+EvAdventureCombatBaseHandler.NotUpdated
EvAdventureCombatBaseHandler.path
EvAdventureCombatBaseHandler.typename
@@ -9200,6 +9303,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureTurnbasedCombatHandler.at_repeat()
EvAdventureTurnbasedCombatHandler.DoesNotExist
EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+EvAdventureTurnbasedCombatHandler.NotUpdated
EvAdventureTurnbasedCombatHandler.path
EvAdventureTurnbasedCombatHandler.typename
@@ -9253,6 +9357,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureCombatTwitchHandler.stop_combat()
EvAdventureCombatTwitchHandler.DoesNotExist
EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+EvAdventureCombatTwitchHandler.NotUpdated
EvAdventureCombatTwitchHandler.path
EvAdventureCombatTwitchHandler.typename
@@ -9409,6 +9514,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonRoom.get_display_footer()
EvAdventureDungeonRoom.DoesNotExist
EvAdventureDungeonRoom.MultipleObjectsReturned
+EvAdventureDungeonRoom.NotUpdated
EvAdventureDungeonRoom.path
EvAdventureDungeonRoom.typename
@@ -9419,6 +9525,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonExit.at_failed_traverse()
EvAdventureDungeonExit.DoesNotExist
EvAdventureDungeonExit.MultipleObjectsReturned
+EvAdventureDungeonExit.NotUpdated
EvAdventureDungeonExit.path
EvAdventureDungeonExit.typename
@@ -9439,6 +9546,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonBranch.new_room()
EvAdventureDungeonBranch.DoesNotExist
EvAdventureDungeonBranch.MultipleObjectsReturned
+EvAdventureDungeonBranch.NotUpdated
EvAdventureDungeonBranch.path
EvAdventureDungeonBranch.typename
@@ -9448,6 +9556,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonStartRoomExit.at_traverse()
EvAdventureDungeonStartRoomExit.DoesNotExist
EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+EvAdventureDungeonStartRoomExit.NotUpdated
EvAdventureDungeonStartRoomExit.path
EvAdventureDungeonStartRoomExit.typename
@@ -9458,6 +9567,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonBranchDeleter.at_repeat()
EvAdventureDungeonBranchDeleter.DoesNotExist
EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+EvAdventureDungeonBranchDeleter.NotUpdated
EvAdventureDungeonBranchDeleter.path
EvAdventureDungeonBranchDeleter.typename
@@ -9467,6 +9577,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureStartRoomResetter.at_repeat()
EvAdventureStartRoomResetter.DoesNotExist
EvAdventureStartRoomResetter.MultipleObjectsReturned
+EvAdventureStartRoomResetter.NotUpdated
EvAdventureStartRoomResetter.path
EvAdventureStartRoomResetter.typename
@@ -9481,6 +9592,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureDungeonStartRoom.at_object_receive()
EvAdventureDungeonStartRoom.DoesNotExist
EvAdventureDungeonStartRoom.MultipleObjectsReturned
+EvAdventureDungeonStartRoom.NotUpdated
EvAdventureDungeonStartRoom.path
EvAdventureDungeonStartRoom.typename
@@ -9577,6 +9689,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureNPC.ai_next_action()
EvAdventureNPC.DoesNotExist
EvAdventureNPC.MultipleObjectsReturned
+EvAdventureNPC.NotUpdated
EvAdventureNPC.path
EvAdventureNPC.typename
@@ -9590,6 +9703,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureTalkativeNPC.at_talk()
EvAdventureTalkativeNPC.DoesNotExist
EvAdventureTalkativeNPC.MultipleObjectsReturned
+EvAdventureTalkativeNPC.NotUpdated
EvAdventureTalkativeNPC.path
EvAdventureTalkativeNPC.typename
@@ -9598,6 +9712,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureQuestGiver
@@ -9609,6 +9724,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureShopKeeper.at_damage()
EvAdventureShopKeeper.DoesNotExist
EvAdventureShopKeeper.MultipleObjectsReturned
+EvAdventureShopKeeper.NotUpdated
EvAdventureShopKeeper.path
EvAdventureShopKeeper.typename
@@ -9623,6 +9739,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureMob.at_defeat()
EvAdventureMob.DoesNotExist
EvAdventureMob.MultipleObjectsReturned
+EvAdventureMob.NotUpdated
EvAdventureMob.path
EvAdventureMob.typename
@@ -9645,6 +9762,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureObject.at_post_use()
EvAdventureObject.DoesNotExist
EvAdventureObject.MultipleObjectsReturned
+EvAdventureObject.NotUpdated
EvAdventureObject.path
EvAdventureObject.typename
@@ -9654,6 +9772,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureObjectFiller.quality
EvAdventureObjectFiller.DoesNotExist
EvAdventureObjectFiller.MultipleObjectsReturned
+EvAdventureObjectFiller.NotUpdated
EvAdventureObjectFiller.path
EvAdventureObjectFiller.typename
@@ -9663,6 +9782,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureQuestObject.value
EvAdventureQuestObject.DoesNotExist
EvAdventureQuestObject.MultipleObjectsReturned
+EvAdventureQuestObject.NotUpdated
EvAdventureQuestObject.path
EvAdventureQuestObject.typename
@@ -9672,6 +9792,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureTreasure.value
EvAdventureTreasure.DoesNotExist
EvAdventureTreasure.MultipleObjectsReturned
+EvAdventureTreasure.NotUpdated
EvAdventureTreasure.path
EvAdventureTreasure.typename
@@ -9685,6 +9806,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureConsumable.at_post_use()
EvAdventureConsumable.DoesNotExist
EvAdventureConsumable.MultipleObjectsReturned
+EvAdventureConsumable.NotUpdated
EvAdventureConsumable.path
EvAdventureConsumable.typename
@@ -9702,6 +9824,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureWeapon.at_post_use()
EvAdventureWeapon.DoesNotExist
EvAdventureWeapon.MultipleObjectsReturned
+EvAdventureWeapon.NotUpdated
EvAdventureWeapon.path
EvAdventureWeapon.typename
@@ -9713,6 +9836,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureThrowable.damage_roll
EvAdventureThrowable.DoesNotExist
EvAdventureThrowable.MultipleObjectsReturned
+EvAdventureThrowable.NotUpdated
EvAdventureThrowable.path
EvAdventureThrowable.typename
@@ -9728,6 +9852,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureRunestone.refresh()
EvAdventureRunestone.DoesNotExist
EvAdventureRunestone.MultipleObjectsReturned
+EvAdventureRunestone.NotUpdated
EvAdventureRunestone.path
EvAdventureRunestone.typename
@@ -9739,6 +9864,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureArmor.quality
EvAdventureArmor.DoesNotExist
EvAdventureArmor.MultipleObjectsReturned
+EvAdventureArmor.NotUpdated
EvAdventureArmor.path
EvAdventureArmor.typename
@@ -9748,6 +9874,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureShield.inventory_use_slot
EvAdventureShield.DoesNotExist
EvAdventureShield.MultipleObjectsReturned
+EvAdventureShield.NotUpdated
EvAdventureShield.path
EvAdventureShield.typename
@@ -9757,6 +9884,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureHelmet.inventory_use_slot
EvAdventureHelmet.DoesNotExist
EvAdventureHelmet.MultipleObjectsReturned
+EvAdventureHelmet.NotUpdated
EvAdventureHelmet.path
EvAdventureHelmet.typename
@@ -9771,6 +9899,7 @@ with ‘q’, remove the break line and restart server when finished.
WeaponBareHands.quality
WeaponBareHands.DoesNotExist
WeaponBareHands.MultipleObjectsReturned
+WeaponBareHands.NotUpdated
WeaponBareHands.path
WeaponBareHands.typename
@@ -9841,6 +9970,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventureRoom.get_display_header()
EvAdventureRoom.DoesNotExist
EvAdventureRoom.MultipleObjectsReturned
+EvAdventureRoom.NotUpdated
EvAdventureRoom.path
EvAdventureRoom.typename
@@ -9851,6 +9981,7 @@ with ‘q’, remove the break line and restart server when finished.
EvAdventurePvPRoom.get_display_footer()
EvAdventurePvPRoom.DoesNotExist
EvAdventurePvPRoom.MultipleObjectsReturned
+EvAdventurePvPRoom.NotUpdated
EvAdventurePvPRoom.path
EvAdventurePvPRoom.typename
@@ -9974,6 +10105,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialMirror.msg()
TutorialMirror.DoesNotExist
TutorialMirror.MultipleObjectsReturned
+TutorialMirror.NotUpdated
TutorialMirror.path
TutorialMirror.typename
@@ -10100,6 +10232,7 @@ with ‘q’, remove the break line and restart server when finished.
RedButton.break_lamp()
RedButton.DoesNotExist
RedButton.MultipleObjectsReturned
+RedButton.NotUpdated
RedButton.path
RedButton.typename
@@ -10135,6 +10268,7 @@ with ‘q’, remove the break line and restart server when finished.
TalkingNPC.at_object_creation()
TalkingNPC.DoesNotExist
TalkingNPC.MultipleObjectsReturned
+TalkingNPC.NotUpdated
TalkingNPC.path
TalkingNPC.typename
@@ -10223,6 +10357,7 @@ with ‘q’, remove the break line and restart server when finished.
Mob.at_new_arrival()
Mob.DoesNotExist
Mob.MultipleObjectsReturned
+Mob.NotUpdated
Mob.path
Mob.typename
@@ -10235,6 +10370,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialObject.reset()
TutorialObject.DoesNotExist
TutorialObject.MultipleObjectsReturned
+TutorialObject.NotUpdated
TutorialObject.path
TutorialObject.typename
@@ -10258,6 +10394,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialReadable.at_object_creation()
TutorialReadable.DoesNotExist
TutorialReadable.MultipleObjectsReturned
+TutorialReadable.NotUpdated
TutorialReadable.path
TutorialReadable.typename
@@ -10281,6 +10418,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialClimbable.at_object_creation()
TutorialClimbable.DoesNotExist
TutorialClimbable.MultipleObjectsReturned
+TutorialClimbable.NotUpdated
TutorialClimbable.path
TutorialClimbable.typename
@@ -10290,6 +10428,7 @@ with ‘q’, remove the break line and restart server when finished.
Obelisk.return_appearance()
Obelisk.DoesNotExist
Obelisk.MultipleObjectsReturned
+Obelisk.NotUpdated
Obelisk.path
Obelisk.typename
@@ -10317,6 +10456,7 @@ with ‘q’, remove the break line and restart server when finished.
LightSource.light()
LightSource.DoesNotExist
LightSource.MultipleObjectsReturned
+LightSource.NotUpdated
LightSource.path
LightSource.typename
@@ -10359,6 +10499,7 @@ with ‘q’, remove the break line and restart server when finished.
CrumblingWall.reset()
CrumblingWall.DoesNotExist
CrumblingWall.MultipleObjectsReturned
+CrumblingWall.NotUpdated
CrumblingWall.path
CrumblingWall.typename
@@ -10383,6 +10524,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialWeapon.reset()
TutorialWeapon.DoesNotExist
TutorialWeapon.MultipleObjectsReturned
+TutorialWeapon.NotUpdated
TutorialWeapon.path
TutorialWeapon.typename
@@ -10408,6 +10550,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialWeaponRack.produce_weapon()
TutorialWeaponRack.DoesNotExist
TutorialWeaponRack.MultipleObjectsReturned
+TutorialWeaponRack.NotUpdated
TutorialWeaponRack.path
TutorialWeaponRack.typename
@@ -10467,6 +10610,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialRoom.set_detail()
TutorialRoom.DoesNotExist
TutorialRoom.MultipleObjectsReturned
+TutorialRoom.NotUpdated
TutorialRoom.path
TutorialRoom.typename
@@ -10475,6 +10619,7 @@ with ‘q’, remove the break line and restart server when finished.
TutorialStartExit.at_object_creation()
TutorialStartExit.DoesNotExist
TutorialStartExit.MultipleObjectsReturned
+TutorialStartExit.NotUpdated
TutorialStartExit.path
TutorialStartExit.typename
@@ -10484,6 +10629,7 @@ with ‘q’, remove the break line and restart server when finished.
WeatherRoom.update_weather()
WeatherRoom.DoesNotExist
WeatherRoom.MultipleObjectsReturned
+WeatherRoom.NotUpdated
WeatherRoom.path
WeatherRoom.typename
@@ -10508,6 +10654,7 @@ with ‘q’, remove the break line and restart server when finished.
IntroRoom.at_object_receive()
IntroRoom.DoesNotExist
IntroRoom.MultipleObjectsReturned
+IntroRoom.NotUpdated
IntroRoom.path
IntroRoom.typename
@@ -10566,6 +10713,7 @@ with ‘q’, remove the break line and restart server when finished.
BridgeRoom.at_object_leave()
BridgeRoom.DoesNotExist
BridgeRoom.MultipleObjectsReturned
+BridgeRoom.NotUpdated
BridgeRoom.path
BridgeRoom.typename
@@ -10616,6 +10764,7 @@ with ‘q’, remove the break line and restart server when finished.
DarkRoom.at_object_leave()
DarkRoom.DoesNotExist
DarkRoom.MultipleObjectsReturned
+DarkRoom.NotUpdated
DarkRoom.path
DarkRoom.typename
@@ -10625,6 +10774,7 @@ with ‘q’, remove the break line and restart server when finished.
TeleportRoom.at_object_receive()
TeleportRoom.DoesNotExist
TeleportRoom.MultipleObjectsReturned
+TeleportRoom.NotUpdated
TeleportRoom.path
TeleportRoom.typename
@@ -10635,6 +10785,7 @@ with ‘q’, remove the break line and restart server when finished.
OutroRoom.at_object_leave()
OutroRoom.DoesNotExist
OutroRoom.MultipleObjectsReturned
+OutroRoom.NotUpdated
OutroRoom.path
OutroRoom.typename
@@ -10834,6 +10985,7 @@ with ‘q’, remove the break line and restart server when finished.
RandomStringGeneratorScript.at_script_creation()
RandomStringGeneratorScript.DoesNotExist
RandomStringGeneratorScript.MultipleObjectsReturned
+RandomStringGeneratorScript.NotUpdated
RandomStringGeneratorScript.path
RandomStringGeneratorScript.typename
@@ -10983,6 +11135,7 @@ with ‘q’, remove the break line and restart server when finished.
HelpEntry.get_absolute_url()
HelpEntry.DoesNotExist
HelpEntry.MultipleObjectsReturned
+HelpEntry.NotUpdated
HelpEntry.entrytext
HelpEntry.get_next_by_db_date_created()
HelpEntry.get_previous_by_db_date_created()
@@ -10998,6 +11151,7 @@ with ‘q’, remove the break line and restart server when finished.
ContentType
Tag
ObjectDB.at_db_location_postsave()
ObjectDB.DoesNotExist
ObjectDB.MultipleObjectsReturned
+ObjectDB.NotUpdated
ObjectDB.account
ObjectDB.db_account_id
ObjectDB.db_attributes
@@ -11429,6 +11585,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultObject.at_rename()
DefaultObject.DoesNotExist
DefaultObject.MultipleObjectsReturned
+DefaultObject.NotUpdated
DefaultObject.path
DefaultObject.typename
@@ -11450,6 +11607,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultCharacter.connection_time
DefaultCharacter.DoesNotExist
DefaultCharacter.MultipleObjectsReturned
+DefaultCharacter.NotUpdated
DefaultCharacter.path
DefaultCharacter.typename
@@ -11460,6 +11618,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultRoom.basetype_setup()
DefaultRoom.DoesNotExist
DefaultRoom.MultipleObjectsReturned
+DefaultRoom.NotUpdated
DefaultRoom.path
DefaultRoom.typename
@@ -11489,6 +11648,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultExit.get_return_exit()
DefaultExit.DoesNotExist
DefaultExit.MultipleObjectsReturned
+DefaultExit.NotUpdated
DefaultExit.path
DefaultExit.typename
@@ -11544,6 +11704,7 @@ with ‘q’, remove the break line and restart server when finished.
DbPrototype.prototype
DbPrototype.DoesNotExist
DbPrototype.MultipleObjectsReturned
+DbPrototype.NotUpdated
DbPrototype.path
DbPrototype.typename
@@ -11675,6 +11836,7 @@ with ‘q’, remove the break line and restart server when finished.
ScriptDB.object
ScriptDB.DoesNotExist
ScriptDB.MultipleObjectsReturned
+ScriptDB.NotUpdated
ScriptDB.account
ScriptDB.db_account_id
ScriptDB.db_attributes
@@ -11852,6 +12014,7 @@ with ‘q’, remove the break line and restart server when finished.
DefaultScript.at_server_start()
DefaultScript.DoesNotExist
DefaultScript.MultipleObjectsReturned
+DefaultScript.NotUpdated
DefaultScript.path
DefaultScript.typename
@@ -11860,6 +12023,7 @@ with ‘q’, remove the break line and restart server when finished.
DoNothing.at_script_creation()
DoNothing.DoesNotExist
DoNothing.MultipleObjectsReturned
+DoNothing.NotUpdated
DoNothing.path
DoNothing.typename
@@ -11868,6 +12032,7 @@ with ‘q’, remove the break line and restart server when finished.
Store.at_script_creation()
Store.DoesNotExist
Store.MultipleObjectsReturned
+Store.NotUpdated
Store.path
Store.typename
@@ -11939,6 +12104,7 @@ with ‘q’, remove the break line and restart server when finished.
ScriptBase.force_repeat()
ScriptBase.DoesNotExist
ScriptBase.MultipleObjectsReturned
+ScriptBase.NotUpdated
ScriptBase.path
ScriptBase.typename
@@ -11946,6 +12112,7 @@ with ‘q’, remove the break line and restart server when finished.
ScriptDB
ServerConfig.store()
ServerConfig.DoesNotExist
ServerConfig.MultipleObjectsReturned
+ServerConfig.NotUpdated
ServerConfig.id
ServerConfig.path
ServerConfig.typename
@@ -13107,6 +13275,7 @@ with ‘q’, remove the break line and restart server when finished.
Memplot.at_repeat()
Memplot.DoesNotExist
Memplot.MultipleObjectsReturned
+Memplot.NotUpdated
Memplot.path
Memplot.typename
@@ -13197,6 +13366,7 @@ with ‘q’, remove the break line and restart server when finished.
Attribute.value
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -13317,6 +13487,7 @@ with ‘q’, remove the break line and restart server when finished.
Attribute
Tag
Attribute
ContentType
Tag
Tag.db_tagtype
Tag.DoesNotExist
Tag.MultipleObjectsReturned
+Tag.NotUpdated
Tag.accountdb_set
Tag.channeldb_set
Tag.helpentry_set
@@ -13937,6 +14113,7 @@ with ‘q’, remove the break line and restart server when finished.
ContentType
TimeScript.at_repeat()
TimeScript.DoesNotExist
TimeScript.MultipleObjectsReturned
+TimeScript.NotUpdated
TimeScript.path
TimeScript.typename
@@ -14383,6 +14561,7 @@ with ‘q’, remove the break line and restart server when finished.
evennia.utils.logger
Category.name
Category.DoesNotExist
Category.MultipleObjectsReturned
+Category.NotUpdated
Category.article_set
Category.id
Category.path
@@ -14865,6 +15045,7 @@ with ‘q’, remove the break line and restart server when finished.
RegularCategory.name
RegularCategory.DoesNotExist
RegularCategory.MultipleObjectsReturned
+RegularCategory.NotUpdated
RegularCategory.article_set
RegularCategory.id
RegularCategory.objects
@@ -14877,6 +15058,7 @@ with ‘q’, remove the break line and restart server when finished.
Article.category2
Article.DoesNotExist
Article.MultipleObjectsReturned
+Article.NotUpdated
Article.category2_id
Article.category_id
Article.id
@@ -14890,6 +15072,7 @@ with ‘q’, remove the break line and restart server when finished.
RegularArticle.category2
RegularArticle.DoesNotExist
RegularArticle.MultipleObjectsReturned
+RegularArticle.NotUpdated
RegularArticle.category2_id
RegularArticle.category_id
RegularArticle.id
diff --git a/docs/latest/api/evennia.objects.html b/docs/latest/api/evennia.objects.html
index d5708746c2..82506ba0a7 100644
--- a/docs/latest/api/evennia.objects.html
+++ b/docs/latest/api/evennia.objects.html
@@ -158,6 +158,7 @@ objects inherit from classes in this package.
ObjectDB.at_db_location_postsave()
ObjectDB.DoesNotExist
ObjectDB.MultipleObjectsReturned
+ObjectDB.NotUpdated
ObjectDB.account
ObjectDB.db_account_id
ObjectDB.db_attributes
@@ -305,6 +306,7 @@ objects inherit from classes in this package.
DefaultObject.at_rename()
DefaultObject.DoesNotExist
DefaultObject.MultipleObjectsReturned
+DefaultObject.NotUpdated
DefaultObject.path
DefaultObject.typename
@@ -326,6 +328,7 @@ objects inherit from classes in this package.
DefaultCharacter.connection_time
DefaultCharacter.DoesNotExist
DefaultCharacter.MultipleObjectsReturned
+DefaultCharacter.NotUpdated
DefaultCharacter.path
DefaultCharacter.typename
@@ -336,6 +339,7 @@ objects inherit from classes in this package.
DefaultRoom.basetype_setup()
DefaultRoom.DoesNotExist
DefaultRoom.MultipleObjectsReturned
+DefaultRoom.NotUpdated
DefaultRoom.path
DefaultRoom.typename
@@ -365,6 +369,7 @@ objects inherit from classes in this package.
DefaultExit.get_return_exit()
DefaultExit.DoesNotExist
DefaultExit.MultipleObjectsReturned
+DefaultExit.NotUpdated
DefaultExit.path
DefaultExit.typename
diff --git a/docs/latest/api/evennia.objects.models.html b/docs/latest/api/evennia.objects.models.html
index c7db22e1c9..131707c6c7 100644
--- a/docs/latest/api/evennia.objects.models.html
+++ b/docs/latest/api/evennia.objects.models.html
@@ -303,6 +303,12 @@ not.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
property account
@@ -407,7 +413,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -454,7 +460,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -476,7 +482,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -528,7 +534,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -609,6 +615,7 @@ class built by **create_forward_many_to_many_manager()** define
ObjectDB.at_db_location_postsave()
ObjectDB.DoesNotExist
ObjectDB.MultipleObjectsReturned
+ObjectDB.NotUpdated
ObjectDB.account
ObjectDB.db_account_id
ObjectDB.db_attributes
diff --git a/docs/latest/api/evennia.objects.objects.html b/docs/latest/api/evennia.objects.objects.html
index 51c1a4b425..2ab7763308 100644
--- a/docs/latest/api/evennia.objects.objects.html
+++ b/docs/latest/api/evennia.objects.objects.html
@@ -2394,6 +2394,12 @@ if more than one, otherwise same as receiver
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.objects.objects.DefaultObject'
@@ -2609,6 +2615,12 @@ in seconds. Returns nothing if there are no sessions.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.objects.objects.DefaultCharacter'
@@ -2679,6 +2691,12 @@ error strings.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.objects.objects.DefaultRoom'
@@ -2927,6 +2945,12 @@ will be a queryset of all matching exits. Otherwise, it will be the first Exit m
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.objects.objects.DefaultExit'
@@ -3079,6 +3103,7 @@ will be a queryset of all matching exits. Otherwise, it will be the first Exit m
DefaultObject.at_rename()
DefaultObject.DoesNotExist
DefaultObject.MultipleObjectsReturned
+DefaultObject.NotUpdated
DefaultObject.path
DefaultObject.typename
@@ -3100,6 +3125,7 @@ will be a queryset of all matching exits. Otherwise, it will be the first Exit m
DefaultCharacter.connection_time
DefaultCharacter.DoesNotExist
DefaultCharacter.MultipleObjectsReturned
+DefaultCharacter.NotUpdated
DefaultCharacter.path
DefaultCharacter.typename
@@ -3110,6 +3136,7 @@ will be a queryset of all matching exits. Otherwise, it will be the first Exit m
DefaultRoom.basetype_setup()
DefaultRoom.DoesNotExist
DefaultRoom.MultipleObjectsReturned
+DefaultRoom.NotUpdated
DefaultRoom.path
DefaultRoom.typename
@@ -3139,6 +3166,7 @@ will be a queryset of all matching exits. Otherwise, it will be the first Exit m
DefaultExit.get_return_exit()
DefaultExit.DoesNotExist
DefaultExit.MultipleObjectsReturned
+DefaultExit.NotUpdated
DefaultExit.path
DefaultExit.typename
diff --git a/docs/latest/api/evennia.prototypes.html b/docs/latest/api/evennia.prototypes.html
index 06bf9e158f..a01f78698d 100644
--- a/docs/latest/api/evennia.prototypes.html
+++ b/docs/latest/api/evennia.prototypes.html
@@ -96,6 +96,7 @@
DbPrototype.prototype
DbPrototype.DoesNotExist
DbPrototype.MultipleObjectsReturned
+DbPrototype.NotUpdated
DbPrototype.path
DbPrototype.typename
diff --git a/docs/latest/api/evennia.prototypes.prototypes.html b/docs/latest/api/evennia.prototypes.prototypes.html
index abd594e155..2c73eb5801 100644
--- a/docs/latest/api/evennia.prototypes.prototypes.html
+++ b/docs/latest/api/evennia.prototypes.prototypes.html
@@ -181,6 +181,12 @@ first time the cache will be populated and things will be fast.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.prototypes.prototypes.DbPrototype'
@@ -568,6 +574,7 @@ validator (callable, optional): If given, this will be called with the value to<
DbPrototype.prototype
DbPrototype.DoesNotExist
DbPrototype.MultipleObjectsReturned
+DbPrototype.NotUpdated
DbPrototype.path
DbPrototype.typename
diff --git a/docs/latest/api/evennia.scripts.html b/docs/latest/api/evennia.scripts.html
index fcb7a86752..af1ed1a824 100644
--- a/docs/latest/api/evennia.scripts.html
+++ b/docs/latest/api/evennia.scripts.html
@@ -142,6 +142,7 @@ timed effects.
ScriptDB.object
ScriptDB.DoesNotExist
ScriptDB.MultipleObjectsReturned
+ScriptDB.NotUpdated
ScriptDB.account
ScriptDB.db_account_id
ScriptDB.db_attributes
@@ -319,6 +320,7 @@ timed effects.
DefaultScript.at_server_start()
DefaultScript.DoesNotExist
DefaultScript.MultipleObjectsReturned
+DefaultScript.NotUpdated
DefaultScript.path
DefaultScript.typename
@@ -327,6 +329,7 @@ timed effects.
DoNothing.at_script_creation()
DoNothing.DoesNotExist
DoNothing.MultipleObjectsReturned
+DoNothing.NotUpdated
DoNothing.path
DoNothing.typename
@@ -335,6 +338,7 @@ timed effects.
Store.at_script_creation()
Store.DoesNotExist
Store.MultipleObjectsReturned
+Store.NotUpdated
Store.path
Store.typename
@@ -406,6 +410,7 @@ timed effects.
ScriptBase.force_repeat()
ScriptBase.DoesNotExist
ScriptBase.MultipleObjectsReturned
+ScriptBase.NotUpdated
ScriptBase.path
ScriptBase.typename
@@ -413,6 +418,7 @@ timed effects.
ScriptDB
ScriptDB.object
ScriptDB.DoesNotExist
ScriptDB.MultipleObjectsReturned
+ScriptDB.NotUpdated
ScriptDB.account
ScriptDB.db_account_id
ScriptDB.db_attributes
diff --git a/docs/latest/api/evennia.scripts.scripts.html b/docs/latest/api/evennia.scripts.scripts.html
index 480c6e8a0e..a43954a55b 100644
--- a/docs/latest/api/evennia.scripts.scripts.html
+++ b/docs/latest/api/evennia.scripts.scripts.html
@@ -297,6 +297,12 @@ could be used).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.scripts.scripts.DefaultScript'
@@ -332,6 +338,12 @@ could be used).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.scripts.scripts.DoNothing'
@@ -367,6 +379,12 @@ could be used).
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.scripts.scripts.Store'
@@ -1168,6 +1186,12 @@ had fired normally.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.scripts.scripts.ScriptBase'
@@ -1218,6 +1242,12 @@ is_active - bool if script is currently running
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
property account
@@ -1558,6 +1588,7 @@ necessary.
DefaultScript.at_server_start()
DefaultScript.DoesNotExist
DefaultScript.MultipleObjectsReturned
+DefaultScript.NotUpdated
DefaultScript.path
DefaultScript.typename
@@ -1566,6 +1597,7 @@ necessary.
DoNothing.at_script_creation()
DoNothing.DoesNotExist
DoNothing.MultipleObjectsReturned
+DoNothing.NotUpdated
DoNothing.path
DoNothing.typename
@@ -1574,6 +1606,7 @@ necessary.
Store.at_script_creation()
Store.DoesNotExist
Store.MultipleObjectsReturned
+Store.NotUpdated
Store.path
Store.typename
@@ -1645,6 +1678,7 @@ necessary.
ScriptBase.force_repeat()
ScriptBase.DoesNotExist
ScriptBase.MultipleObjectsReturned
+ScriptBase.NotUpdated
ScriptBase.path
ScriptBase.typename
@@ -1652,6 +1686,7 @@ necessary.
ScriptDB
diff --git a/docs/latest/api/evennia.server.models.html b/docs/latest/api/evennia.server.models.html
index 78a5915b5e..e9e32e3624 100644
--- a/docs/latest/api/evennia.server.models.html
+++ b/docs/latest/api/evennia.server.models.html
@@ -122,6 +122,12 @@ object the first time, the query is executed.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
id
@@ -175,6 +181,7 @@ object the first time, the query is executed.
ServerConfig.store()
ServerConfig.DoesNotExist
ServerConfig.MultipleObjectsReturned
+ServerConfig.NotUpdated
ServerConfig.id
ServerConfig.path
ServerConfig.typename
diff --git a/docs/latest/api/evennia.server.profiling.html b/docs/latest/api/evennia.server.profiling.html
index 3b795eb10a..c15371ae64 100644
--- a/docs/latest/api/evennia.server.profiling.html
+++ b/docs/latest/api/evennia.server.profiling.html
@@ -115,6 +115,7 @@
Memplot.at_repeat()
Memplot.DoesNotExist
Memplot.MultipleObjectsReturned
+Memplot.NotUpdated
Memplot.path
Memplot.typename
diff --git a/docs/latest/api/evennia.server.profiling.memplot.html b/docs/latest/api/evennia.server.profiling.memplot.html
index edc340f820..5694de54f4 100644
--- a/docs/latest/api/evennia.server.profiling.memplot.html
+++ b/docs/latest/api/evennia.server.profiling.memplot.html
@@ -83,6 +83,12 @@ the script will append to this file if it already exists.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: NotUpdated
+
+
-
path = 'evennia.server.profiling.memplot.Memplot'
@@ -125,6 +131,7 @@ the script will append to this file if it already exists.
Memplot.at_repeat()
Memplot.DoesNotExist
Memplot.MultipleObjectsReturned
+Memplot.NotUpdated
Memplot.path
Memplot.typename
diff --git a/docs/latest/api/evennia.typeclasses.attributes.html b/docs/latest/api/evennia.typeclasses.attributes.html
index 3d183888e3..9c4b2c3ef6 100644
--- a/docs/latest/api/evennia.typeclasses.attributes.html
+++ b/docs/latest/api/evennia.typeclasses.attributes.html
@@ -393,6 +393,12 @@ The overhead of unpickling seems hard to avoid.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
accountdb_set
@@ -1603,6 +1609,7 @@ with nicks stored on the Account level.
Attribute.value
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
diff --git a/docs/latest/api/evennia.typeclasses.html b/docs/latest/api/evennia.typeclasses.html
index 93484ca91c..8ccb649c74 100644
--- a/docs/latest/api/evennia.typeclasses.html
+++ b/docs/latest/api/evennia.typeclasses.html
@@ -99,6 +99,7 @@ Attribute and Tag models are defined along with their handlers.
Attribute.value
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -219,6 +220,7 @@ Attribute and Tag models are defined along with their handlers.
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -320,6 +322,7 @@ Attribute and Tag models are defined along with their handlers.
Tag
Tag.DoesNotExist
Tag.MultipleObjectsReturned
+Tag.NotUpdated
Tag.accountdb_set
Tag.channeldb_set
Tag.db_category
@@ -417,6 +420,7 @@ Attribute and Tag models are defined along with their handlers.
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -467,6 +471,7 @@ Attribute and Tag models are defined along with their handlers.
ContentType
@@ -1118,6 +1125,12 @@ default search functions of Evennia to allow quick searches by alias.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
accountdb_set
@@ -1621,6 +1634,7 @@ are replaced by the default argument.
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -1722,6 +1736,7 @@ are replaced by the default argument.
Tag
Tag.DoesNotExist
Tag.MultipleObjectsReturned
+Tag.NotUpdated
Tag.accountdb_set
Tag.channeldb_set
Tag.db_category
diff --git a/docs/latest/api/evennia.typeclasses.models.html b/docs/latest/api/evennia.typeclasses.models.html
index 5c5ab84a3c..53381e64bf 100644
--- a/docs/latest/api/evennia.typeclasses.models.html
+++ b/docs/latest/api/evennia.typeclasses.models.html
@@ -773,6 +773,12 @@ developer’s responsibility.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
accountdb_set
@@ -1332,6 +1338,12 @@ bypassing this AttributeProperty entirely and this method is ne
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
app_label
@@ -1378,7 +1390,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -1421,7 +1433,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -2191,6 +2203,12 @@ default search functions of Evennia to allow quick searches by alias.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
accountdb_set
@@ -2848,6 +2866,7 @@ codec.
Attribute
Attribute.DoesNotExist
Attribute.MultipleObjectsReturned
+Attribute.NotUpdated
Attribute.accountdb_set
Attribute.attrtype
Attribute.category
@@ -2898,6 +2917,7 @@ codec.
ContentType
ContentType.DoesNotExist
ContentType.MultipleObjectsReturned
+ContentType.NotUpdated
ContentType.app_label
ContentType.app_labeled_name
ContentType.get_all_objects_for_this_type()
@@ -2994,6 +3014,7 @@ codec.
Tag
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
app_label
@@ -193,7 +199,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -236,7 +242,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -860,6 +866,7 @@ shortcut to having to use the full backend name.
ContentType
diff --git a/docs/latest/api/evennia.utils.html b/docs/latest/api/evennia.utils.html
index ba860dd4fa..e1b96f2627 100644
--- a/docs/latest/api/evennia.utils.html
+++ b/docs/latest/api/evennia.utils.html
@@ -215,6 +215,7 @@ functionality.
ContentType
@@ -661,6 +663,7 @@ functionality.
- evennia.utils.logger
+mask_sensitive_input()
log_info()
info()
log_infomsg()
@@ -1136,6 +1139,7 @@ functionality.
Category.name
Category.DoesNotExist
Category.MultipleObjectsReturned
+Category.NotUpdated
Category.article_set
Category.id
Category.path
@@ -1147,6 +1151,7 @@ functionality.
RegularCategory.name
RegularCategory.DoesNotExist
RegularCategory.MultipleObjectsReturned
+RegularCategory.NotUpdated
RegularCategory.article_set
RegularCategory.id
RegularCategory.objects
@@ -1159,6 +1164,7 @@ functionality.
Article.category2
Article.DoesNotExist
Article.MultipleObjectsReturned
+Article.NotUpdated
Article.category2_id
Article.category_id
Article.id
@@ -1172,6 +1178,7 @@ functionality.
RegularArticle.category2
RegularArticle.DoesNotExist
RegularArticle.MultipleObjectsReturned
+RegularArticle.NotUpdated
RegularArticle.category2_id
RegularArticle.category_id
RegularArticle.id
diff --git a/docs/latest/api/evennia.utils.idmapper.html b/docs/latest/api/evennia.utils.idmapper.html
index bfb6ca7a65..213f8ecf96 100644
--- a/docs/latest/api/evennia.utils.idmapper.html
+++ b/docs/latest/api/evennia.utils.idmapper.html
@@ -102,6 +102,7 @@
Category.name
Category.DoesNotExist
Category.MultipleObjectsReturned
+Category.NotUpdated
Category.article_set
Category.id
Category.path
@@ -113,6 +114,7 @@
RegularCategory.name
RegularCategory.DoesNotExist
RegularCategory.MultipleObjectsReturned
+RegularCategory.NotUpdated
RegularCategory.article_set
RegularCategory.id
RegularCategory.objects
@@ -125,6 +127,7 @@
Article.category2
Article.DoesNotExist
Article.MultipleObjectsReturned
+Article.NotUpdated
Article.category2_id
Article.category_id
Article.id
@@ -138,6 +141,7 @@
RegularArticle.category2
RegularArticle.DoesNotExist
RegularArticle.MultipleObjectsReturned
+RegularArticle.NotUpdated
RegularArticle.category2_id
RegularArticle.category_id
RegularArticle.id
diff --git a/docs/latest/api/evennia.utils.idmapper.tests.html b/docs/latest/api/evennia.utils.idmapper.tests.html
index 6686cc230b..c56758afc1 100644
--- a/docs/latest/api/evennia.utils.idmapper.tests.html
+++ b/docs/latest/api/evennia.utils.idmapper.tests.html
@@ -73,6 +73,12 @@ object the first time, the query is executed.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
article_set
@@ -85,7 +91,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -112,7 +118,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -145,6 +151,12 @@ object the first time, the query is executed.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
article_set
@@ -157,7 +169,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -184,7 +196,7 @@ many-to-one relation.
**Parent.children** is a **ReverseManyToOneDescriptor** instance.
Most of the implementation is delegated to a dynamically defined manager
-class built by **create_forward_many_to_many_manager()** defined below.
+class built by **create_reverse_many_to_one_manager()** defined below.
@@ -238,6 +250,12 @@ one-to-one (via ForwardOneToOneDescriptor subclass) relation.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
category2_id
@@ -316,6 +334,12 @@ one-to-one (via ForwardOneToOneDescriptor subclass) relation.
Bases: MultipleObjectsReturned
+
+-
+exception NotUpdated
+Bases: ObjectNotUpdated, DatabaseError
+
+
-
category2_id
@@ -401,6 +425,7 @@ object the first time, the query is executed.
Category.name
Category.DoesNotExist
Category.MultipleObjectsReturned
+Category.NotUpdated
Category.article_set
Category.id
Category.path
@@ -412,6 +437,7 @@ object the first time, the query is executed.
RegularCategory.name
RegularCategory.DoesNotExist
RegularCategory.MultipleObjectsReturned
+RegularCategory.NotUpdated
RegularCategory.article_set
RegularCategory.id
RegularCategory.objects
@@ -424,6 +450,7 @@ object the first time, the query is executed.
Article.category2
Article.DoesNotExist
Article.MultipleObjectsReturned
+Article.NotUpdated
Article.category2_id
Article.category_id
Article.id
@@ -437,6 +464,7 @@ object the first time, the query is executed.
RegularArticle.category2
RegularArticle.DoesNotExist
RegularArticle.MultipleObjectsReturned
+RegularArticle.NotUpdated
RegularArticle.category2_id
RegularArticle.category_id
RegularArticle.id
diff --git a/docs/latest/api/evennia.utils.logger.html b/docs/latest/api/evennia.utils.logger.html
index c8bed48de5..f1bbb222cc 100644
--- a/docs/latest/api/evennia.utils.logger.html
+++ b/docs/latest/api/evennia.utils.logger.html
@@ -57,6 +57,20 @@ interactive mode) or to $GAME_DIR/server/logs.
arbitrary files in $GAME_DIR/server/logs.
Note: All logging functions have two aliases, log_type() and
log_typemsg(). This is for historical, back-compatible reasons.
+
+-
+evennia.utils.logger.mask_sensitive_input(msg)[source]
+Mask sensitive command arguments in a raw command string.
+
+- Parameters:
+msg (str) – Raw command line.
+
+- Returns:
+str – Same string, with sensitive segments replaced by *****.
+
+
+
+
-
evennia.utils.logger.log_info(msg, **kwargs)[source]
@@ -755,6 +769,7 @@ all if the file is shorter than nlines.
- evennia.utils.logger
+mask_sensitive_input()
log_info()
info()
log_infomsg()
diff --git a/docs/latest/genindex.html b/docs/latest/genindex.html
index b3ced68a26..5523848957 100644
--- a/docs/latest/genindex.html
+++ b/docs/latest/genindex.html
@@ -120,8 +120,6 @@
- (evennia.commands.default.building.EvMore method)
- (evennia.commands.default.building.EvTable method)
-
- - (evennia.commands.default.building.Paginator method)
- (evennia.commands.default.building.Q method)
@@ -757,6 +755,8 @@
- AccountDB.DoesNotExist, [1], [2], [3], [4]
- AccountDB.MultipleObjectsReturned, [1], [2], [3], [4]
+
+ - AccountDB.NotUpdated, [1], [2], [3], [4]
- accountdb_set (evennia.comms.models.Tag attribute)
@@ -2201,6 +2201,8 @@
- Article.DoesNotExist
- Article.MultipleObjectsReturned
+
+ - Article.NotUpdated
- article_set (evennia.utils.idmapper.tests.Category attribute)
@@ -3559,6 +3561,8 @@
- Attribute.DoesNotExist, [1], [2]
- Attribute.MultipleObjectsReturned, [1], [2]
+
+ - Attribute.NotUpdated, [1], [2]
- attribute_category (evennia.contrib.tutorials.evadventure.ai.AIHandler attribute)
@@ -3751,6 +3755,8 @@
- BaseApplicable.DoesNotExist
- BaseApplicable.MultipleObjectsReturned
+
+ - BaseApplicable.NotUpdated
- BaseBuff (class in evennia.contrib.rpg.buffs.buff)
@@ -3761,6 +3767,8 @@
- BaseConsumable.DoesNotExist
- BaseConsumable.MultipleObjectsReturned
+
+ - BaseConsumable.NotUpdated
- BaseEvenniaCommandTest (class in evennia.utils.test_resources)
@@ -3791,6 +3799,8 @@
- BasePositionable.DoesNotExist
- BasePositionable.MultipleObjectsReturned
+
+ - BasePositionable.NotUpdated
- BaseState (class in evennia.contrib.full_systems.evscaperoom.state)
@@ -3913,6 +3923,8 @@
- BodyFunctions.DoesNotExist
- BodyFunctions.MultipleObjectsReturned
+
+ - BodyFunctions.NotUpdated
- Boolean (class in evennia.utils.optionclasses)
@@ -3925,6 +3937,8 @@
- Bot.DoesNotExist
- Bot.MultipleObjectsReturned
+
+ - Bot.NotUpdated
- bot_data_in() (in module evennia.server.inputfuncs)
@@ -3933,6 +3947,8 @@
- BotStarter.DoesNotExist
- BotStarter.MultipleObjectsReturned
+
+ - BotStarter.NotUpdated
- branch_check_time (evennia.contrib.tutorials.evadventure.dungeon.EvAdventureDungeonStartRoom attribute)
@@ -3951,6 +3967,8 @@
- BridgeRoom.DoesNotExist
- BridgeRoom.MultipleObjectsReturned
+
+ - BridgeRoom.NotUpdated
- brightbg_sub (evennia.utils.ansi.ANSIParser attribute)
@@ -3967,6 +3985,8 @@
- BuffableObject.DoesNotExist
- BuffableObject.MultipleObjectsReturned
+
+ - BuffableObject.NotUpdated
- BuffableProperty (class in evennia.contrib.rpg.buffs.buff)
@@ -4177,6 +4197,8 @@
- Category.DoesNotExist
- Category.MultipleObjectsReturned
+
+ - Category.NotUpdated
- category2 (evennia.utils.idmapper.tests.Article attribute)
@@ -4283,6 +4305,8 @@
- ChannelDB.DoesNotExist, [1], [2]
- ChannelDB.MultipleObjectsReturned, [1], [2]
+
+ - ChannelDB.NotUpdated, [1], [2]
- channeldb_set (evennia.comms.models.Tag attribute)
@@ -4407,6 +4431,8 @@
- CharacterWithComponents.DoesNotExist
- CharacterWithComponents.MultipleObjectsReturned
+
+ - CharacterWithComponents.NotUpdated
- charisma (evennia.contrib.tutorials.evadventure.characters.EvAdventureCharacter attribute)
@@ -4419,6 +4445,8 @@
- CharWithSignal.DoesNotExist
- CharWithSignal.MultipleObjectsReturned
+
+ - CharWithSignal.NotUpdated
- chat_memory (evennia.contrib.rpg.llm.llm_npc.LLMNPC attribute)
@@ -4631,6 +4659,8 @@
- CleanupScript.DoesNotExist
- CleanupScript.MultipleObjectsReturned
+
+ - CleanupScript.NotUpdated
- clear() (evennia.accounts.accounts.CmdSetHandler method)
@@ -4755,6 +4785,8 @@
- Climbable.DoesNotExist
- Climbable.MultipleObjectsReturned
+
+ - Climbable.NotUpdated
- close() (evennia.contrib.base_systems.awsstorage.aws_s3_cdn.S3Boto3StorageFile method)
@@ -4773,6 +4805,8 @@
- ClothedCharacter.DoesNotExist
- ClothedCharacter.MultipleObjectsReturned
+
+ - ClothedCharacter.NotUpdated
- ClothedCharacterCmdSet (class in evennia.contrib.game_systems.clothing.clothing)
@@ -5142,10 +5176,10 @@
- CmdOption (class in evennia.commands.default.account)
-
- |
+
- CmdPage (class in evennia.commands.default.comms)
- cmdparser() (in module evennia.commands.cmdparser)
@@ -5569,6 +5603,8 @@
- CodeInput.DoesNotExist
- CodeInput.MultipleObjectsReturned
+
+ - CodeInput.NotUpdated
- coins (evennia.contrib.tutorials.evadventure.characters.EvAdventureCharacter attribute)
@@ -5665,6 +5701,8 @@
- Combinable.DoesNotExist
- Combinable.MultipleObjectsReturned
+
+ - Combinable.NotUpdated
- Command (class in evennia.commands.command)
@@ -5937,12 +5975,16 @@
- ContentType.DoesNotExist, [1], [2]
- ContentType.MultipleObjectsReturned, [1], [2]
+
+ - ContentType.NotUpdated, [1], [2]
- ContribChargenAccount (class in evennia.contrib.rpg.character_creator.character_creator)
- ContribChargenAccount.DoesNotExist
- ContribChargenAccount.MultipleObjectsReturned
+
+ - ContribChargenAccount.NotUpdated
- ContribChargenCmdSet (class in evennia.contrib.rpg.character_creator.character_creator)
@@ -5951,6 +5993,8 @@
- ContribClothing.DoesNotExist
- ContribClothing.MultipleObjectsReturned
+
+ - ContribClothing.NotUpdated
- ContribCmdCharCreate (class in evennia.contrib.rpg.character_creator.character_creator)
@@ -5961,18 +6005,24 @@
- ContribRPCharacter.DoesNotExist
- ContribRPCharacter.MultipleObjectsReturned
+
+ - ContribRPCharacter.NotUpdated
- ContribRPObject (class in evennia.contrib.rpg.rpsystem.rpsystem)
- ContribRPObject.DoesNotExist
- ContribRPObject.MultipleObjectsReturned
+
+ - ContribRPObject.NotUpdated
- ContribRPRoom (class in evennia.contrib.rpg.rpsystem.rpsystem)
- ContribRPRoom.DoesNotExist
- ContribRPRoom.MultipleObjectsReturned
+
+ - ContribRPRoom.NotUpdated
- convert_linebreaks() (evennia.utils.text2html.TextToHTMLparser method)
@@ -6261,6 +6311,8 @@
- CrumblingWall.DoesNotExist
- CrumblingWall.MultipleObjectsReturned
+
+ - CrumblingWall.NotUpdated
- current (evennia.contrib.rpg.traits.traits.CounterTrait property)
@@ -6303,6 +6355,8 @@
- DarkRoom.DoesNotExist
- DarkRoom.MultipleObjectsReturned
+
+ - DarkRoom.NotUpdated
- dashcount() (in module evennia.contrib.utils.tree_select.tree_select)
@@ -7149,6 +7203,8 @@
- DbPrototype.DoesNotExist
- DbPrototype.MultipleObjectsReturned
+
+ - DbPrototype.NotUpdated
- DBPrototypeCache (class in evennia.prototypes.prototypes)
@@ -7368,11 +7424,9 @@
- (evennia.objects.objects.DefaultRoom attribute)
- - default_error_messages (evennia.commands.default.building.Paginator attribute)
+
- default_error_messages (evennia.typeclasses.managers.FloatField attribute)
@@ -7413,6 +7467,8 @@
- DefaultAccount.DoesNotExist
- DefaultAccount.MultipleObjectsReturned
+
+ - DefaultAccount.NotUpdated
- DefaultChannel (class in evennia.commands.default.comms)
@@ -7423,12 +7479,16 @@
- DefaultChannel.DoesNotExist, [1]
- DefaultChannel.MultipleObjectsReturned, [1]
+
+ - DefaultChannel.NotUpdated, [1]
- DefaultCharacter (class in evennia.objects.objects)
- DefaultCharacter.DoesNotExist
- DefaultCharacter.MultipleObjectsReturned
+
+ - DefaultCharacter.NotUpdated
- defaultdict (class in evennia.commands.cmdhandler)
@@ -7443,12 +7503,16 @@
- DefaultExit.DoesNotExist
- DefaultExit.MultipleObjectsReturned
+
+ - DefaultExit.NotUpdated
- DefaultGuest (class in evennia.accounts.accounts)
- DefaultGuest.DoesNotExist
- DefaultGuest.MultipleObjectsReturned
+
+ - DefaultGuest.NotUpdated
- DefaultObject (class in evennia.commands.default.general)
@@ -7459,18 +7523,24 @@
- DefaultObject.DoesNotExist, [1]
- DefaultObject.MultipleObjectsReturned, [1]
+
+ - DefaultObject.NotUpdated, [1]
- DefaultRoom (class in evennia.objects.objects)
- DefaultRoom.DoesNotExist
- DefaultRoom.MultipleObjectsReturned
+
+ - DefaultRoom.NotUpdated
- DefaultScript (class in evennia.scripts.scripts)
- DefaultScript.DoesNotExist
- DefaultScript.MultipleObjectsReturned
+
+ - DefaultScript.NotUpdated
- defeated_combatants (evennia.contrib.tutorials.evadventure.combat_turnbased.EvAdventureTurnbasedCombatHandler attribute)
@@ -7839,6 +7909,8 @@
- DiscordBot.DoesNotExist
- DiscordBot.MultipleObjectsReturned
+
+ - DiscordBot.NotUpdated
- DiscordClient (class in evennia.server.portal.discord)
@@ -8071,6 +8143,8 @@
- DoNothing.DoesNotExist
- DoNothing.MultipleObjectsReturned
+
+ - DoNothing.NotUpdated
- DownMapLink (class in evennia.contrib.grid.xyzgrid.xymap_legend)
@@ -8085,6 +8159,8 @@
- Drinkable.DoesNotExist
- Drinkable.MultipleObjectsReturned
+
+ - Drinkable.NotUpdated
- DummyCharacter (class in evennia.contrib.rpg.traits.tests)
@@ -8147,6 +8223,8 @@
- Edible.DoesNotExist
- Edible.MultipleObjectsReturned
+
+ - Edible.NotUpdated
- edit() (evennia.contrib.base_systems.ingame_python.callbackhandler.CallbackHandler method)
@@ -8167,8 +8245,6 @@
- editor (evennia.utils.eveditor.CmdEditorBase attribute)
- effects (evennia.contrib.rpg.buffs.buff.BuffHandler property)
-
- - ELLIPSIS (evennia.commands.default.building.Paginator attribute)
- Email (class in evennia.utils.optionclasses)
@@ -8325,12 +8401,16 @@
- EvAdventureArmor.DoesNotExist
- EvAdventureArmor.MultipleObjectsReturned
+
+ - EvAdventureArmor.NotUpdated
- EvAdventureCharacter (class in evennia.contrib.tutorials.evadventure.characters)
- EvAdventureCharacter.DoesNotExist
- EvAdventureCharacter.MultipleObjectsReturned
+
+ - EvAdventureCharacter.NotUpdated
- EvAdventureCharacterGenerationTest (class in evennia.contrib.tutorials.evadventure.tests.test_chargen)
@@ -8341,12 +8421,16 @@
- EvAdventureCombatBaseHandler.DoesNotExist
- EvAdventureCombatBaseHandler.MultipleObjectsReturned
+
+ - EvAdventureCombatBaseHandler.NotUpdated
- EvAdventureCombatTwitchHandler (class in evennia.contrib.tutorials.evadventure.combat_twitch)
- EvAdventureCombatTwitchHandler.DoesNotExist
- EvAdventureCombatTwitchHandler.MultipleObjectsReturned
+
+ - EvAdventureCombatTwitchHandler.NotUpdated
- EvAdventureCommand (class in evennia.contrib.tutorials.evadventure.commands)
@@ -8355,48 +8439,64 @@
- EvAdventureConsumable.DoesNotExist
- EvAdventureConsumable.MultipleObjectsReturned
+
+ - EvAdventureConsumable.NotUpdated
- EvAdventureDungeonBranch (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonBranch.DoesNotExist
- EvAdventureDungeonBranch.MultipleObjectsReturned
+
+ - EvAdventureDungeonBranch.NotUpdated
- EvAdventureDungeonBranchDeleter (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonBranchDeleter.DoesNotExist
- EvAdventureDungeonBranchDeleter.MultipleObjectsReturned
+
+ - EvAdventureDungeonBranchDeleter.NotUpdated
- EvAdventureDungeonExit (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonExit.DoesNotExist
- EvAdventureDungeonExit.MultipleObjectsReturned
+
+ - EvAdventureDungeonExit.NotUpdated
- EvAdventureDungeonRoom (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonRoom.DoesNotExist
- EvAdventureDungeonRoom.MultipleObjectsReturned
+
+ - EvAdventureDungeonRoom.NotUpdated
- EvAdventureDungeonStartRoom (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonStartRoom.DoesNotExist
- EvAdventureDungeonStartRoom.MultipleObjectsReturned
+
+ - EvAdventureDungeonStartRoom.NotUpdated
- EvAdventureDungeonStartRoomExit (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureDungeonStartRoomExit.DoesNotExist
- EvAdventureDungeonStartRoomExit.MultipleObjectsReturned
+
+ - EvAdventureDungeonStartRoomExit.NotUpdated
- EvAdventureHelmet (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureHelmet.DoesNotExist
- EvAdventureHelmet.MultipleObjectsReturned
+
+ - EvAdventureHelmet.NotUpdated
- EvAdventureMixin (class in evennia.contrib.tutorials.evadventure.tests.mixins)
@@ -8405,30 +8505,40 @@
- EvAdventureMob.DoesNotExist
- EvAdventureMob.MultipleObjectsReturned
+
+ - EvAdventureMob.NotUpdated
- EvAdventureNPC (class in evennia.contrib.tutorials.evadventure.npcs)
- EvAdventureNPC.DoesNotExist
- EvAdventureNPC.MultipleObjectsReturned
+
+ - EvAdventureNPC.NotUpdated
- EvAdventureObject (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureObject.DoesNotExist
- EvAdventureObject.MultipleObjectsReturned
+
+ - EvAdventureObject.NotUpdated
- EvAdventureObjectFiller (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureObjectFiller.DoesNotExist
- EvAdventureObjectFiller.MultipleObjectsReturned
+
+ - EvAdventureObjectFiller.NotUpdated
- EvAdventurePvPRoom (class in evennia.contrib.tutorials.evadventure.rooms)
- EvAdventurePvPRoom.DoesNotExist
- EvAdventurePvPRoom.MultipleObjectsReturned
+
+ - EvAdventurePvPRoom.NotUpdated
- EvAdventureQuest (class in evennia.contrib.tutorials.evadventure.quests)
@@ -8437,6 +8547,8 @@
- EvAdventureQuestGiver.DoesNotExist
- EvAdventureQuestGiver.MultipleObjectsReturned
+
+ - EvAdventureQuestGiver.NotUpdated
- EvAdventureQuestHandler (class in evennia.contrib.tutorials.evadventure.quests)
@@ -8445,6 +8557,8 @@
- EvAdventureQuestObject.DoesNotExist
- EvAdventureQuestObject.MultipleObjectsReturned
+
+ - EvAdventureQuestObject.NotUpdated
- EvAdventureQuestTest (class in evennia.contrib.tutorials.evadventure.tests.test_quests)
@@ -8457,6 +8571,8 @@
- EvAdventureRoom.DoesNotExist
- EvAdventureRoom.MultipleObjectsReturned
+
+ - EvAdventureRoom.NotUpdated
- EvAdventureRoomTest (class in evennia.contrib.tutorials.evadventure.tests.test_rooms)
@@ -8465,48 +8581,64 @@
- EvAdventureRunestone.DoesNotExist
- EvAdventureRunestone.MultipleObjectsReturned
+
+ - EvAdventureRunestone.NotUpdated
- EvAdventureShield (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureShield.DoesNotExist
- EvAdventureShield.MultipleObjectsReturned
+
+ - EvAdventureShield.NotUpdated
- EvAdventureShopKeeper (class in evennia.contrib.tutorials.evadventure.npcs)
- EvAdventureShopKeeper.DoesNotExist
- EvAdventureShopKeeper.MultipleObjectsReturned
+
+ - EvAdventureShopKeeper.NotUpdated
- EvAdventureStartRoomResetter (class in evennia.contrib.tutorials.evadventure.dungeon)
- EvAdventureStartRoomResetter.DoesNotExist
- EvAdventureStartRoomResetter.MultipleObjectsReturned
+
+ - EvAdventureStartRoomResetter.NotUpdated
- EvAdventureTalkativeNPC (class in evennia.contrib.tutorials.evadventure.npcs)
- EvAdventureTalkativeNPC.DoesNotExist
- EvAdventureTalkativeNPC.MultipleObjectsReturned
+
+ - EvAdventureTalkativeNPC.NotUpdated
- EvAdventureThrowable (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureThrowable.DoesNotExist
- EvAdventureThrowable.MultipleObjectsReturned
+
+ - EvAdventureThrowable.NotUpdated
- EvAdventureTreasure (class in evennia.contrib.tutorials.evadventure.objects)
- EvAdventureTreasure.DoesNotExist
- EvAdventureTreasure.MultipleObjectsReturned
+
+ - EvAdventureTreasure.NotUpdated
- EvAdventureTurnbasedCombatHandler (class in evennia.contrib.tutorials.evadventure.combat_turnbased)
- EvAdventureTurnbasedCombatHandler.DoesNotExist
- EvAdventureTurnbasedCombatHandler.MultipleObjectsReturned
+
+ - EvAdventureTurnbasedCombatHandler.NotUpdated
- EvAdventureTurnbasedCombatHandlerTest (class in evennia.contrib.tutorials.evadventure.tests.test_combat)
@@ -8515,6 +8647,8 @@
- EvAdventureWeapon.DoesNotExist
- EvAdventureWeapon.MultipleObjectsReturned
+
+ - EvAdventureWeapon.NotUpdated
- EvCell (class in evennia.utils.evtable)
@@ -9827,6 +9961,8 @@
- module
+ |
+
-
evennia.contrib.tutorials.bodyfunctions.tests
@@ -9869,8 +10005,6 @@
- module
- |
-
-
evennia.contrib.tutorials.evadventure.chargen
@@ -11514,6 +11648,8 @@
- EventHandler.DoesNotExist
- EventHandler.MultipleObjectsReturned
+
+ - EventHandler.NotUpdated
- EvForm (class in evennia.utils.evform)
@@ -11536,6 +11672,8 @@
- EvscapeRoom.DoesNotExist
- EvscapeRoom.MultipleObjectsReturned
+
+ - EvscapeRoom.NotUpdated
- EvscaperoomMenu (class in evennia.contrib.full_systems.evscaperoom.menu)
@@ -11544,6 +11682,8 @@
- EvscaperoomObject.DoesNotExist
- EvscaperoomObject.MultipleObjectsReturned
+
+ - EvscaperoomObject.NotUpdated
- EvTable (class in evennia.commands.default.building)
@@ -11688,6 +11828,8 @@
- ExtendedRoom.DoesNotExist
- ExtendedRoom.MultipleObjectsReturned
+
+ - ExtendedRoom.NotUpdated
- ExtendedRoomCmdSet (class in evennia.contrib.grid.extended_room.extended_room)
@@ -11762,6 +11904,8 @@
- Feelable.DoesNotExist
- Feelable.MultipleObjectsReturned
+
+ - Feelable.NotUpdated
- field_classes (evennia.web.website.forms.AccountForm.Meta attribute)
@@ -12946,6 +13090,8 @@
- GametimeScript.DoesNotExist
- GametimeScript.MultipleObjectsReturned
+
+ - GametimeScript.NotUpdated
- gateway (evennia.server.portal.discord.DiscordWebsocketServerFactory attribute)
@@ -12958,6 +13104,8 @@
- GenderCharacter.DoesNotExist
- GenderCharacter.MultipleObjectsReturned
+
+ - GenderCharacter.NotUpdated
- general_context() (in module evennia.web.utils.general_context)
@@ -14396,6 +14544,8 @@
- GrapevineBot.DoesNotExist
- GrapevineBot.MultipleObjectsReturned
+
+ - GrapevineBot.NotUpdated
- GrapevineClient (class in evennia.server.portal.grapevine)
@@ -14564,6 +14714,8 @@
- HasButtons.DoesNotExist
- HasButtons.MultipleObjectsReturned
+
+ - HasButtons.NotUpdated
- HEAD (evennia.contrib.tutorials.evadventure.enums.WieldLocation attribute)
@@ -15284,6 +15436,8 @@
- HelpEntry.DoesNotExist, [1]
- HelpEntry.MultipleObjectsReturned, [1]
+
+ - HelpEntry.NotUpdated, [1]
- helpentry_set (evennia.comms.models.Tag attribute)
@@ -15612,6 +15766,8 @@
- IndexReadable.DoesNotExist
- IndexReadable.MultipleObjectsReturned
+
+ - IndexReadable.NotUpdated
- IndexTest (class in evennia.web.website.tests)
@@ -15634,6 +15790,8 @@
- InheritedTCWithComponents.DoesNotExist
- InheritedTCWithComponents.MultipleObjectsReturned
+
+ - InheritedTCWithComponents.NotUpdated
- inherits_from() (in module evennia.commands.cmdset)
@@ -15806,6 +15964,8 @@
- Insertable.DoesNotExist
- Insertable.MultipleObjectsReturned
+
+ - Insertable.NotUpdated
- inside() (in module evennia.locks.lockfuncs)
@@ -15864,6 +16024,8 @@
- IntroRoom.DoesNotExist
- IntroRoom.MultipleObjectsReturned
+
+ - IntroRoom.NotUpdated
- InvalidComponentError
@@ -15900,6 +16062,8 @@
- IRCBot.DoesNotExist
- IRCBot.MultipleObjectsReturned
+
+ - IRCBot.NotUpdated
- IRCBotFactory (class in evennia.server.portal.irc)
@@ -17028,6 +17192,8 @@
- Kneelable.DoesNotExist
- Kneelable.MultipleObjectsReturned
+
+ - Kneelable.NotUpdated
|
@@ -17052,6 +17218,8 @@
- LanguageHandler.DoesNotExist
- LanguageHandler.MultipleObjectsReturned
+
+ - LanguageHandler.NotUpdated
- last() (evennia.accounts.manager.TypeclassManager method)
@@ -17130,6 +17298,8 @@
- Liable.DoesNotExist
- Liable.MultipleObjectsReturned
+
+ - Liable.NotUpdated
- LidClosedCmdSet (class in evennia.contrib.tutorials.red_button.red_button)
@@ -17142,6 +17312,8 @@
- LightSource.DoesNotExist
- LightSource.MultipleObjectsReturned
+
+ - LightSource.NotUpdated
- LimitedSizeOrderedDict (class in evennia.utils.utils)
@@ -17256,6 +17428,8 @@
- Listenable.DoesNotExist
- Listenable.MultipleObjectsReturned
+
+ - Listenable.NotUpdated
- LivingMixin (class in evennia.contrib.tutorials.evadventure.characters)
@@ -17276,6 +17450,8 @@
- LLMNPC.DoesNotExist
- LLMNPC.MultipleObjectsReturned
+
+ - LLMNPC.NotUpdated
- load() (evennia.contrib.base_systems.components.component.Component class method)
@@ -18738,6 +18914,8 @@
- MapTransitionNode (class in evennia.contrib.grid.xyzgrid.xymap_legend)
- mask() (evennia.contrib.utils.auditing.server.AuditedServerSession method)
+
+ - mask_sensitive_input() (in module evennia.utils.logger)
- maskout_protodef() (in module evennia.contrib.game_systems.puzzles.puzzles)
@@ -18906,6 +19084,8 @@
- Memplot.DoesNotExist
- Memplot.MultipleObjectsReturned
+
+ - Memplot.NotUpdated
- menu_edit() (in module evennia.contrib.base_systems.building_menu.building_menu)
@@ -19016,6 +19196,8 @@
- Mixable.DoesNotExist
- Mixable.MultipleObjectsReturned
+
+ - Mixable.NotUpdated
- mixed_in (evennia.contrib.base_systems.components.tests.ComponentTestD attribute)
@@ -19026,6 +19208,8 @@
- Mob.DoesNotExist
- Mob.MultipleObjectsReturned
+
+ - Mob.NotUpdated
- MobCmdSet (class in evennia.contrib.tutorials.tutorial_world.mob)
@@ -20051,6 +20235,8 @@
- Movable.DoesNotExist
- Movable.MultipleObjectsReturned
+
+ - Movable.NotUpdated
- move() (evennia.contrib.base_systems.building_menu.building_menu.BuildingMenu method)
@@ -20131,6 +20317,8 @@
- Msg.DoesNotExist, [1]
- Msg.MultipleObjectsReturned, [1]
+
+ - Msg.NotUpdated, [1]
- msg_all_sessions (evennia.commands.command.Command attribute)
@@ -20799,6 +20987,8 @@
- Obelisk.DoesNotExist
- Obelisk.MultipleObjectsReturned
+
+ - Obelisk.NotUpdated
- obfuscate_language() (in module evennia.contrib.rpg.rpsystem.rplanguage)
@@ -20955,6 +21145,8 @@
- ObjectDB.DoesNotExist, [1], [2]
- ObjectDB.MultipleObjectsReturned, [1], [2]
+
+ - ObjectDB.NotUpdated, [1], [2]
- objectdb_set (evennia.accounts.accounts.AccountDB attribute)
@@ -21201,6 +21393,8 @@
- Openable.DoesNotExist
- Openable.MultipleObjectsReturned
+
+ - Openable.NotUpdated
- opposed_saving_throw() (evennia.contrib.tutorials.evadventure.rules.EvAdventureRollEngine method)
@@ -21305,6 +21499,8 @@
- OutroRoom.DoesNotExist
- OutroRoom.MultipleObjectsReturned
+
+ - OutroRoom.NotUpdated
- owner (evennia.contrib.rpg.buffs.buff.BaseBuff property)
@@ -22335,6 +22531,8 @@
- Positionable.DoesNotExist
- Positionable.MultipleObjectsReturned
+
+ - Positionable.NotUpdated
- positive_integer() (in module evennia.utils.validatorfuncs)
@@ -22589,6 +22787,8 @@
- PuzzleRecipe.DoesNotExist
- PuzzleRecipe.MultipleObjectsReturned
+
+ - PuzzleRecipe.NotUpdated
- PuzzleSystemCmdSet (class in evennia.contrib.game_systems.puzzles.puzzles)
@@ -22771,6 +22971,8 @@
- RandomStringGeneratorScript.DoesNotExist
- RandomStringGeneratorScript.MultipleObjectsReturned
+
+ - RandomStringGeneratorScript.NotUpdated
- RangedCombatRules (class in evennia.contrib.game_systems.turnbattle.tb_range)
@@ -22845,6 +23047,8 @@
- Readable.DoesNotExist
- Readable.MultipleObjectsReturned
+
+ - Readable.NotUpdated
- readline() (evennia.contrib.base_systems.awsstorage.aws_s3_cdn.S3Boto3StorageFile method)
@@ -22953,6 +23157,8 @@
- RedButton.DoesNotExist
- RedButton.MultipleObjectsReturned
+
+ - RedButton.NotUpdated
- reduced_redundancy (evennia.contrib.base_systems.awsstorage.aws_s3_cdn.S3Boto3Storage attribute)
@@ -23035,6 +23241,8 @@
- RegularArticle.DoesNotExist
- RegularArticle.MultipleObjectsReturned
+
+ - RegularArticle.NotUpdated
- regulararticle_set (evennia.utils.idmapper.tests.Category attribute)
@@ -23047,6 +23255,8 @@
- RegularCategory.DoesNotExist
- RegularCategory.MultipleObjectsReturned
+
+ - RegularCategory.NotUpdated
- RejectedRegex
@@ -23274,14 +23484,14 @@
- render_room() (evennia.contrib.grid.ingame_map_display.ingame_map_display.Map method)
+
+ |
-
- repeat_broadcast_message_to_room() (evennia.contrib.grid.extended_room.extended_room.ExtendedRoom method)
- repeats (evennia.commands.default.building.ScriptDB property)
@@ -23639,6 +23849,8 @@
- Rotatable.DoesNotExist
- Rotatable.MultipleObjectsReturned
+
+ - Rotatable.NotUpdated
- rotate() (evennia.utils.dbserialize.deque method)
@@ -23669,6 +23881,8 @@
- RSSBot.DoesNotExist
- RSSBot.MultipleObjectsReturned
+
+ - RSSBot.NotUpdated
- RSSBotFactory (class in evennia.server.portal.rss)
@@ -23971,6 +24185,8 @@
- ScriptBase.DoesNotExist
- ScriptBase.MultipleObjectsReturned
+
+ - ScriptBase.NotUpdated
- ScriptDB (class in evennia.commands.default.building)
@@ -23983,6 +24199,8 @@
- ScriptDB.DoesNotExist, [1], [2]
- ScriptDB.MultipleObjectsReturned, [1], [2]
+
+ - ScriptDB.NotUpdated, [1], [2]
- scriptdb_set (evennia.accounts.accounts.AccountDB attribute)
@@ -25040,12 +25258,12 @@
- (evennia.server.portal.webclient.WebSocketClient method)
- |
- |
+
- sep_keys (evennia.contrib.base_systems.building_menu.building_menu.BuildingMenu attribute)
- separator (evennia.commands.default.building.CmdExamine attribute)
@@ -25121,6 +25339,8 @@
- ServerConfig.DoesNotExist, [1], [2], [3], [4]
- ServerConfig.MultipleObjectsReturned, [1], [2], [3], [4]
+
+ - ServerConfig.NotUpdated, [1], [2], [3], [4]
- ServerConfigAdmin (class in evennia.web.admin.server)
@@ -25557,6 +25777,8 @@
- SimpleDoor.DoesNotExist
- SimpleDoor.MultipleObjectsReturned
+
+ - SimpleDoor.NotUpdated
- SimpleDoorCmdSet (class in evennia.contrib.grid.simpledoor.simpledoor)
@@ -25587,6 +25809,8 @@
- Sittable.DoesNotExist
- Sittable.MultipleObjectsReturned
+
+ - Sittable.NotUpdated
- size (evennia.contrib.base_systems.awsstorage.aws_s3_cdn.S3Boto3StorageFile property)
@@ -25635,6 +25859,8 @@
- SlowExit.DoesNotExist
- SlowExit.MultipleObjectsReturned
+
+ - SlowExit.NotUpdated
- SlowExitCmdSet (class in evennia.contrib.grid.slow_exit.slow_exit)
@@ -25671,6 +25897,8 @@
- Smellable.DoesNotExist
- Smellable.MultipleObjectsReturned
+
+ - Smellable.NotUpdated
- SNOneWayMapLink (class in evennia.contrib.grid.xyzgrid.xymap_legend)
@@ -25969,6 +26197,8 @@
- Store.DoesNotExist
- Store.MultipleObjectsReturned
+
+ - Store.NotUpdated
- STR (evennia.contrib.tutorials.evadventure.enums.Ability attribute)
@@ -26379,6 +26609,8 @@
- Tag.DoesNotExist, [1], [2], [3], [4]
- Tag.MultipleObjectsReturned, [1], [2], [3], [4]
+
+ - Tag.NotUpdated, [1], [2], [3], [4]
- tag_all_characters() (evennia.contrib.full_systems.evscaperoom.room.EvscapeRoom method)
@@ -26483,6 +26715,8 @@
- TalkingNPC.DoesNotExist
- TalkingNPC.MultipleObjectsReturned
+
+ - TalkingNPC.NotUpdated
- target (evennia.contrib.grid.xyzgrid.commands.PathData attribute)
@@ -26529,84 +26763,112 @@
- TBBasicCharacter.DoesNotExist
- TBBasicCharacter.MultipleObjectsReturned
+
+ - TBBasicCharacter.NotUpdated
- TBBasicTurnHandler (class in evennia.contrib.game_systems.turnbattle.tb_basic)
- TBBasicTurnHandler.DoesNotExist
- TBBasicTurnHandler.MultipleObjectsReturned
+
+ - TBBasicTurnHandler.NotUpdated
- TBEArmor (class in evennia.contrib.game_systems.turnbattle.tb_equip)
- TBEArmor.DoesNotExist
- TBEArmor.MultipleObjectsReturned
+
+ - TBEArmor.NotUpdated
- TBEquipCharacter (class in evennia.contrib.game_systems.turnbattle.tb_equip)
- TBEquipCharacter.DoesNotExist
- TBEquipCharacter.MultipleObjectsReturned
+
+ - TBEquipCharacter.NotUpdated
- TBEquipTurnHandler (class in evennia.contrib.game_systems.turnbattle.tb_equip)
- TBEquipTurnHandler.DoesNotExist
- TBEquipTurnHandler.MultipleObjectsReturned
+
+ - TBEquipTurnHandler.NotUpdated
- TBEWeapon (class in evennia.contrib.game_systems.turnbattle.tb_equip)
- TBEWeapon.DoesNotExist
- TBEWeapon.MultipleObjectsReturned
+
+ - TBEWeapon.NotUpdated
- TBItemsCharacter (class in evennia.contrib.game_systems.turnbattle.tb_items)
- TBItemsCharacter.DoesNotExist
- TBItemsCharacter.MultipleObjectsReturned
+
+ - TBItemsCharacter.NotUpdated
- TBItemsCharacterTest (class in evennia.contrib.game_systems.turnbattle.tb_items)
- TBItemsCharacterTest.DoesNotExist
- TBItemsCharacterTest.MultipleObjectsReturned
+
+ - TBItemsCharacterTest.NotUpdated
- TBItemsTurnHandler (class in evennia.contrib.game_systems.turnbattle.tb_items)
- TBItemsTurnHandler.DoesNotExist
- TBItemsTurnHandler.MultipleObjectsReturned
+
+ - TBItemsTurnHandler.NotUpdated
- TBMagicCharacter (class in evennia.contrib.game_systems.turnbattle.tb_magic)
- TBMagicCharacter.DoesNotExist
- TBMagicCharacter.MultipleObjectsReturned
+
+ - TBMagicCharacter.NotUpdated
- TBMagicTurnHandler (class in evennia.contrib.game_systems.turnbattle.tb_magic)
- TBMagicTurnHandler.DoesNotExist
- TBMagicTurnHandler.MultipleObjectsReturned
+
+ - TBMagicTurnHandler.NotUpdated
- TBRangeCharacter (class in evennia.contrib.game_systems.turnbattle.tb_range)
- TBRangeCharacter.DoesNotExist
- TBRangeCharacter.MultipleObjectsReturned
+
+ - TBRangeCharacter.NotUpdated
- TBRangeObject (class in evennia.contrib.game_systems.turnbattle.tb_range)
- TBRangeObject.DoesNotExist
- TBRangeObject.MultipleObjectsReturned
+
+ - TBRangeObject.NotUpdated
- TBRangeTurnHandler (class in evennia.contrib.game_systems.turnbattle.tb_range)
- TBRangeTurnHandler.DoesNotExist
- TBRangeTurnHandler.MultipleObjectsReturned
+
+ - TBRangeTurnHandler.NotUpdated
- tearDown() (evennia.commands.default.tests.TestCmdTasks method)
@@ -26689,6 +26951,8 @@
- TeleportRoom.DoesNotExist
- TeleportRoom.MultipleObjectsReturned
+
+ - TeleportRoom.NotUpdated
- TelnetOOB (class in evennia.server.portal.telnet_oob)
@@ -27761,6 +28025,8 @@
- test_lspuzzlerecipes_lsarmedpuzzles() (evennia.contrib.game_systems.puzzles.tests.TestPuzzles method)
- test_mail() (evennia.contrib.game_systems.mail.tests.TestMail method)
+
+ - test_malformed_inputs() (evennia.contrib.rpg.dice.tests.TestDice method)
- test_map() (evennia.contrib.tutorials.evadventure.tests.test_rooms.EvAdventureRoomTest method)
@@ -28019,6 +28285,8 @@
- test_py() (evennia.commands.default.tests.TestSystem method)
- test_quell() (evennia.commands.default.tests.TestAccount method)
+
+ - test_questhandler_reload_after_restart() (evennia.contrib.tutorials.evadventure.tests.test_quests.EvAdventureQuestTest method)
- test_queue_action() (evennia.contrib.tutorials.evadventure.tests.test_combat.TestEvAdventureTwitchCombatHandler method)
@@ -28155,6 +28423,8 @@
- test_set_obj_alias() (evennia.commands.default.tests.TestBuilding method)
- test_setattr() (evennia.contrib.base_systems.building_menu.tests.TestBuildingMenu method)
+
+ - test_setattr_view_with_category() (evennia.commands.default.tests.TestBuilding method)
- test_setgender() (evennia.contrib.game_systems.gendersub.tests.TestGenderSub method)
@@ -28186,6 +28456,8 @@
- (evennia.contrib.grid.xyzgrid.tests.TestXYZGridTransition attribute)
+ |
+ |
-
- test_shortest_path_00() (evennia.contrib.grid.xyzgrid.tests.TestMap3 method)
- test_shortest_path_01() (evennia.contrib.grid.xyzgrid.tests.TestMap3 method)
@@ -29191,6 +29461,8 @@
- TestXyzExit.DoesNotExist
- TestXyzExit.MultipleObjectsReturned
+
+ - TestXyzExit.NotUpdated
- TestXYZGrid (class in evennia.contrib.grid.xyzgrid.tests)
@@ -29201,6 +29473,8 @@
- TestXyzRoom.DoesNotExist
- TestXyzRoom.MultipleObjectsReturned
+
+ - TestXyzRoom.NotUpdated
- Text (class in evennia.utils.optionclasses)
@@ -29271,6 +29545,8 @@
- TimeEventScript.DoesNotExist
- TimeEventScript.MultipleObjectsReturned
+
+ - TimeEventScript.NotUpdated
- timeformat() (in module evennia.utils.logger)
@@ -29283,6 +29559,8 @@
- TimeScript.DoesNotExist
- TimeScript.MultipleObjectsReturned
+
+ - TimeScript.NotUpdated
- timetrace() (in module evennia.server.profiling.timetrace)
@@ -29389,6 +29667,8 @@
- TradeTimeout.DoesNotExist
- TradeTimeout.MultipleObjectsReturned
+
+ - TradeTimeout.NotUpdated
- Trait (class in evennia.contrib.rpg.traits.traits)
@@ -29407,6 +29687,8 @@
- TraitContribTestingChar.DoesNotExist
- TraitContribTestingChar.MultipleObjectsReturned
+
+ - TraitContribTestingChar.NotUpdated
- TraitException
@@ -29475,6 +29757,8 @@
- TutorialClimbable.DoesNotExist
- TutorialClimbable.MultipleObjectsReturned
+
+ - TutorialClimbable.NotUpdated
- TutorialEvMenu (class in evennia.contrib.tutorials.tutorial_world.intro_menu)
@@ -29483,24 +29767,32 @@
- TutorialMirror.DoesNotExist
- TutorialMirror.MultipleObjectsReturned
+
+ - TutorialMirror.NotUpdated
- TutorialObject (class in evennia.contrib.tutorials.tutorial_world.objects)
- TutorialObject.DoesNotExist
- TutorialObject.MultipleObjectsReturned
+
+ - TutorialObject.NotUpdated
- TutorialReadable (class in evennia.contrib.tutorials.tutorial_world.objects)
- TutorialReadable.DoesNotExist
- TutorialReadable.MultipleObjectsReturned
+
+ - TutorialReadable.NotUpdated
- TutorialRoom (class in evennia.contrib.tutorials.tutorial_world.rooms)
- TutorialRoom.DoesNotExist
- TutorialRoom.MultipleObjectsReturned
+
+ - TutorialRoom.NotUpdated
- TutorialRoomCmdSet (class in evennia.contrib.tutorials.tutorial_world.rooms)
@@ -29509,18 +29801,24 @@
- TutorialStartExit.DoesNotExist
- TutorialStartExit.MultipleObjectsReturned
+
+ - TutorialStartExit.NotUpdated
- TutorialWeapon (class in evennia.contrib.tutorials.tutorial_world.objects)
- TutorialWeapon.DoesNotExist
- TutorialWeapon.MultipleObjectsReturned
+
+ - TutorialWeapon.NotUpdated
- TutorialWeaponRack (class in evennia.contrib.tutorials.tutorial_world.objects)
- TutorialWeaponRack.DoesNotExist
- TutorialWeaponRack.MultipleObjectsReturned
+
+ - TutorialWeaponRack.NotUpdated
- TwitchCombatCmdSet (class in evennia.contrib.tutorials.evadventure.combat_twitch)
@@ -30261,6 +30559,8 @@
- Usable.DoesNotExist
- Usable.MultipleObjectsReturned
+
+ - Usable.NotUpdated
- use() (evennia.contrib.tutorials.evadventure.objects.EvAdventureConsumable method)
@@ -30631,6 +30931,8 @@
- WeaponBareHands.DoesNotExist
- WeaponBareHands.MultipleObjectsReturned
+
+ - WeaponBareHands.NotUpdated
- wear() (evennia.contrib.game_systems.clothing.clothing.ContribClothing method)
@@ -30639,6 +30941,8 @@
- WeatherRoom.DoesNotExist
- WeatherRoom.MultipleObjectsReturned
+
+ - WeatherRoom.NotUpdated
- web_get_admin_url() (evennia.accounts.models.TypedObject method)
@@ -30801,6 +31105,8 @@
- WildernessExit.DoesNotExist
- WildernessExit.MultipleObjectsReturned
+
+ - WildernessExit.NotUpdated
- WildernessMapProvider (class in evennia.contrib.grid.wilderness.wilderness)
@@ -30809,12 +31115,16 @@
- WildernessRoom.DoesNotExist
- WildernessRoom.MultipleObjectsReturned
+
+ - WildernessRoom.NotUpdated
- WildernessScript (class in evennia.contrib.grid.wilderness.wilderness)
- WildernessScript.DoesNotExist
- WildernessScript.MultipleObjectsReturned
+
+ - WildernessScript.NotUpdated
- will_suppress_ga() (evennia.server.portal.suppress_ga.SuppressGA method)
@@ -30906,14 +31216,14 @@
- XYMap (class in evennia.contrib.grid.xyzgrid.xymap)
- |
- |
+ |
diff --git a/docs/latest/index.html b/docs/latest/index.html
index 738fc88170..ce165dfe6e 100644
--- a/docs/latest/index.html
+++ b/docs/latest/index.html
@@ -41,7 +41,7 @@
Evennia Documentation
-This is the manual of Evennia, the open source Python MU* creation system. Use the Search bar on the left to find or discover interesting articles. This manual was last updated January 12, 2026, see the Evennia Changelog. Latest released Evennia version is 5.0.1.
+This is the manual of Evennia, the open source Python MU* creation system. Use the Search bar on the left to find or discover interesting articles. This manual was last updated February 15, 2026, see the Evennia Changelog. Latest released Evennia version is 5.0.1.