evennia/docs/latest/api/evennia.comms.models.html
Evennia docbuilder action 243d596662 Updated HTML docs.
2025-08-15 18:14:21 +00:00

2628 lines
No EOL
228 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>evennia.comms.models &#8212; Evennia latest documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../_static/nature.css?v=279e0f84" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=e4a91a55" />
<script src="../_static/documentation_options.js?v=c6e86fd7"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="evennia.contrib" href="evennia.contrib.html" />
<link rel="prev" title="evennia.comms.managers" href="evennia.comms.managers.html" />
</head><body>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="evennia.contrib.html" title="evennia.contrib"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="evennia.comms.managers.html" title="evennia.comms.managers"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../Evennia-API.html" >API Summary</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="evennia-api.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-3"><a href="evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-4"><a href="evennia.comms.html" accesskey="U">evennia.comms</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.models</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-evennia.comms.models">
<span id="evennia-comms-models"></span><h1>evennia.comms.models<a class="headerlink" href="#module-evennia.comms.models" title="Link to this heading"></a></h1>
<p>Models for the in-game communication system.</p>
<p>The comm system could take the form of channels, but can also be
adopted for storing tells or in-game mail.</p>
<p>The comsystems main component is the Message (Msg), which carries the
actual information between two parties. Msgs are stored in the
database and usually not deleted. A Msg always have one sender (a
user), but can have any number targets, both users and channels.</p>
<p>For non-persistent (and slightly faster) use one can also use the
TempMsg, which mimics the Msg API but without actually saving to the
database.</p>
<p>Channels are central objects that act as targets for Msgs. Accounts can
connect to channels by use of a ChannelConnect object (this object is
necessary to easily be able to delete connections on the fly).</p>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.Msg">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">Msg</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.utils.idmapper.models.html#evennia.utils.idmapper.models.SharedMemoryModel" title="evennia.utils.idmapper.models.SharedMemoryModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SharedMemoryModel</span></code></a></p>
<p>A single message. This model describes all ooc messages
sent in-game, both to channels and between accounts.</p>
<p>The Msg class defines the following database fields (all
accessed via specific handler methods):</p>
<ul class="simple">
<li><p>db_sender_accounts: Account senders</p></li>
<li><p>db_sender_objects: Object senders</p></li>
<li><p>db_sender_scripts: Script senders</p></li>
<li><p>db_sender_external: External sender (defined as string name)</p></li>
<li><p>db_receivers_accounts: Receiving accounts</p></li>
<li><p>db_receivers_objects: Receiving objects</p></li>
<li><p>db_receivers_scripts: Receiveing scripts</p></li>
<li><p>db_receiver_external: External sender (defined as string name)</p></li>
<li><p>db_header: Header text</p></li>
<li><p>db_message: The actual message text</p></li>
<li><p>db_date_created: time message was created / sent</p></li>
<li><p>db_hide_from_sender: bool if message should be hidden from sender</p></li>
<li><p>db_hide_from_receivers: list of receiver objects to hide message from</p></li>
<li><p>db_lock_storage: Internal storage of lock strings.</p></li>
</ul>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_sender_accounts">
<span class="sig-name descname"><span class="pre">db_sender_accounts</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_sender_accounts" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_sender_objects">
<span class="sig-name descname"><span class="pre">db_sender_objects</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_sender_objects" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_sender_scripts">
<span class="sig-name descname"><span class="pre">db_sender_scripts</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_sender_scripts" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_sender_external">
<span class="sig-name descname"><span class="pre">db_sender_external</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_sender_external" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_receivers_accounts">
<span class="sig-name descname"><span class="pre">db_receivers_accounts</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_receivers_accounts" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_receivers_objects">
<span class="sig-name descname"><span class="pre">db_receivers_objects</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_receivers_objects" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_receivers_scripts">
<span class="sig-name descname"><span class="pre">db_receivers_scripts</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_receivers_scripts" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_receiver_external">
<span class="sig-name descname"><span class="pre">db_receiver_external</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_receiver_external" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_header">
<span class="sig-name descname"><span class="pre">db_header</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_header" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_message">
<span class="sig-name descname"><span class="pre">db_message</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_message" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_date_created">
<span class="sig-name descname"><span class="pre">db_date_created</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_date_created" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_lock_storage">
<span class="sig-name descname"><span class="pre">db_lock_storage</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_lock_storage" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_hide_from_accounts">
<span class="sig-name descname"><span class="pre">db_hide_from_accounts</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_hide_from_accounts" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_hide_from_objects">
<span class="sig-name descname"><span class="pre">db_hide_from_objects</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_hide_from_objects" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.db_tags">
<span class="sig-name descname"><span class="pre">db_tags</span></span><a class="headerlink" href="#evennia.comms.models.Msg.db_tags" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.objects">
<span class="sig-name descname"><span class="pre">objects</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;evennia.comms.managers.MsgManager</span> <span class="pre">object&gt;</span></em><a class="headerlink" href="#evennia.comms.models.Msg.objects" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.locks">
<span class="sig-name descname"><span class="pre">locks</span></span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg.locks"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg.locks" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.tags">
<span class="sig-name descname"><span class="pre">tags</span></span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg.tags"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg.tags" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.date_created">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">date_created</span></span><a class="headerlink" href="#evennia.comms.models.Msg.date_created" title="Link to this definition"></a></dt>
<dd><p>Return the field in localized time based on settings.TIME_ZONE.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.senders">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">senders</span></span><a class="headerlink" href="#evennia.comms.models.Msg.senders" title="Link to this definition"></a></dt>
<dd><p>Getter. Allows for value = self.senders</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.remove_sender">
<span class="sig-name descname"><span class="pre">remove_sender</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">senders</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg.remove_sender"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg.remove_sender" title="Link to this definition"></a></dt>
<dd><p>Remove a single sender or a list of senders.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>senders</strong> (<em>Account</em><em>, </em><em>Object</em><em>, </em><em>str</em><em> or </em><em>list</em>) Senders to remove.
If a string, removes the external sender.</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.receivers">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">receivers</span></span><a class="headerlink" href="#evennia.comms.models.Msg.receivers" title="Link to this definition"></a></dt>
<dd><p>Getter. Allows for value = self.receivers.
Returns four lists of receivers: accounts, objects, scripts and</p>
<blockquote>
<div><p>external_receivers.</p>
</div></blockquote>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.remove_receiver">
<span class="sig-name descname"><span class="pre">remove_receiver</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">receivers</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg.remove_receiver"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg.remove_receiver" title="Link to this definition"></a></dt>
<dd><p>Remove a single receiver, a list of receivers, or a single extral receiver.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>receivers</strong> (<em>Account</em><em>, </em><em>Object</em><em>, </em><em>Script</em><em>, </em><em>list</em><em> or </em><em>str</em>) Receiver
to remove. A string removes the external receiver.</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.hide_from">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">hide_from</span></span><a class="headerlink" href="#evennia.comms.models.Msg.hide_from" title="Link to this definition"></a></dt>
<dd><p>Getter. Allows for value = self.hide_from.
Returns two lists of accounts and objects.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.access">
<span class="sig-name descname"><span class="pre">access</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accessing_obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">access_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'read'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#Msg.access"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Msg.access" title="Link to this definition"></a></dt>
<dd><p>Checks lock access.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accessing_obj</strong> (<em>Object</em><em> or </em><em>Account</em>) The object trying to gain access.</p></li>
<li><p><strong>access_type</strong> (<em>str</em><em>, </em><em>optional</em>) The type of lock access to check.</p></li>
<li><p><strong>default</strong> (<em>bool</em>) Fallback to use if <strong>access_type</strong> lock is not defined.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>result (bool)</em> If access was granted or not.</p>
</dd>
</dl>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.DoesNotExist">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DoesNotExist</span></span><a class="headerlink" href="#evennia.comms.models.Msg.DoesNotExist" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.utils.dbserialize.html#evennia.utils.dbserialize.ObjectDoesNotExist" title="django.core.exceptions.ObjectDoesNotExist"><code class="xref py py-class docutils literal notranslate"><span class="pre">ObjectDoesNotExist</span></code></a></p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.MultipleObjectsReturned">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MultipleObjectsReturned</span></span><a class="headerlink" href="#evennia.comms.models.Msg.MultipleObjectsReturned" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">MultipleObjectsReturned</span></code></p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.get_next_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_next_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.Msg.get_next_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.get_previous_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_previous_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.Msg.get_previous_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.header">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">header</span></span><a class="headerlink" href="#evennia.comms.models.Msg.header" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_header</strong>.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.id">
<span class="sig-name descname"><span class="pre">id</span></span><a class="headerlink" href="#evennia.comms.models.Msg.id" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.lock_storage">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">lock_storage</span></span><a class="headerlink" href="#evennia.comms.models.Msg.lock_storage" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_lock_storage</strong>.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.message">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">message</span></span><a class="headerlink" href="#evennia.comms.models.Msg.message" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_message</strong>.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.path">
<span class="sig-name descname"><span class="pre">path</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'evennia.comms.models.Msg'</span></em><a class="headerlink" href="#evennia.comms.models.Msg.path" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.receiver_external">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">receiver_external</span></span><a class="headerlink" href="#evennia.comms.models.Msg.receiver_external" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_receiver_external</strong>.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.sender_external">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">sender_external</span></span><a class="headerlink" href="#evennia.comms.models.Msg.sender_external" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_sender_external</strong>.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Msg.typename">
<span class="sig-name descname"><span class="pre">typename</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SharedMemoryModelBase'</span></em><a class="headerlink" href="#evennia.comms.models.Msg.typename" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">TempMsg</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">senders</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">receivers</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">header</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lockstring</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hide_from</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>This is a non-persistent object for sending temporary messages that will not be stored. It
mimics the “real” Msg object, but doesnt require sender to be given.</p>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">senders</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">receivers</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">message</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">header</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lockstring</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hide_from</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg.__init__" title="Link to this definition"></a></dt>
<dd><p>Creates the temp message.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>senders</strong> (<em>any</em><em> or </em><em>list</em><em>, </em><em>optional</em>) Senders of the message.</p></li>
<li><p><strong>receivers</strong> (<em>Account</em><em>, </em><em>Object</em><em>, </em><em>Script</em><em> or </em><em>list</em><em>, </em><em>optional</em>) Receivers of this message.</p></li>
<li><p><strong>message</strong> (<em>str</em><em>, </em><em>optional</em>) Message to send.</p></li>
<li><p><strong>header</strong> (<em>str</em><em>, </em><em>optional</em>) Header of message.</p></li>
<li><p><strong>type</strong> (<em>str</em><em>, </em><em>optional</em>) Message class, if any.</p></li>
<li><p><strong>lockstring</strong> (<em>str</em><em>, </em><em>optional</em>) Lock for the message.</p></li>
<li><p><strong>hide_from</strong> (<em>Account</em><em>, </em><em>Object</em><em>, or </em><em>list</em><em>, </em><em>optional</em>) Entities to hide this message from.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg.locks">
<span class="sig-name descname"><span class="pre">locks</span></span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg.locks"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg.locks" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg.remove_sender">
<span class="sig-name descname"><span class="pre">remove_sender</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sender</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg.remove_sender"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg.remove_sender" title="Link to this definition"></a></dt>
<dd><p>Remove a sender or a list of senders.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>sender</strong> (<em>Object</em><em>, </em><em>Account</em><em>, </em><em>str</em><em> or </em><em>list</em>) Senders to remove.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg.remove_receiver">
<span class="sig-name descname"><span class="pre">remove_receiver</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">receiver</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg.remove_receiver"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg.remove_receiver" title="Link to this definition"></a></dt>
<dd><p>Remove a receiver or a list of receivers</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>receiver</strong> (<em>Object</em><em>, </em><em>Account</em><em>, </em><em>Script</em><em>, </em><em>str</em><em> or </em><em>list</em>) Receivers to remove.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TempMsg.access">
<span class="sig-name descname"><span class="pre">access</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accessing_obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">access_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'read'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#TempMsg.access"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TempMsg.access" title="Link to this definition"></a></dt>
<dd><p>Checks lock access.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accessing_obj</strong> (<em>Object</em><em> or </em><em>Account</em>) The object trying to gain access.</p></li>
<li><p><strong>access_type</strong> (<em>str</em><em>, </em><em>optional</em>) The type of lock access to check.</p></li>
<li><p><strong>default</strong> (<em>bool</em>) Fallback to use if <strong>access_type</strong> lock is not defined.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>result (bool)</em> If access was granted or not.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">ChannelDB</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#ChannelDB"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.ChannelDB" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.typeclasses.models.html#evennia.typeclasses.models.TypedObject" title="evennia.typeclasses.models.TypedObject"><code class="xref py py-class docutils literal notranslate"><span class="pre">TypedObject</span></code></a></p>
<p>This is the basis of a comm channel, only implementing
the very basics of distributing messages.</p>
<p>The Channel class defines the following database fields
beyond the ones inherited from TypedObject:</p>
<blockquote>
<div><ul class="simple">
<li><p>db_account_subscriptions: The Account subscriptions.</p></li>
<li><p>db_object_subscriptions: The Object subscriptions.</p></li>
</ul>
</div></blockquote>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_account_subscriptions">
<span class="sig-name descname"><span class="pre">db_account_subscriptions</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_account_subscriptions" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_object_subscriptions">
<span class="sig-name descname"><span class="pre">db_object_subscriptions</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_object_subscriptions" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.objects">
<span class="sig-name descname"><span class="pre">objects</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;evennia.comms.managers.ChannelDBManager</span> <span class="pre">object&gt;</span></em><a class="headerlink" href="#evennia.comms.models.ChannelDB.objects" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.DoesNotExist">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DoesNotExist</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.DoesNotExist" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.utils.dbserialize.html#evennia.utils.dbserialize.ObjectDoesNotExist" title="django.core.exceptions.ObjectDoesNotExist"><code class="xref py py-class docutils literal notranslate"><span class="pre">ObjectDoesNotExist</span></code></a></p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.MultipleObjectsReturned">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MultipleObjectsReturned</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.MultipleObjectsReturned" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">MultipleObjectsReturned</span></code></p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_attributes">
<span class="sig-name descname"><span class="pre">db_attributes</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_attributes" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_date_created">
<span class="sig-name descname"><span class="pre">db_date_created</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_date_created" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_key">
<span class="sig-name descname"><span class="pre">db_key</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_key" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_lock_storage">
<span class="sig-name descname"><span class="pre">db_lock_storage</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_lock_storage" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_tags">
<span class="sig-name descname"><span class="pre">db_tags</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_tags" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.db_typeclass_path">
<span class="sig-name descname"><span class="pre">db_typeclass_path</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.db_typeclass_path" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.get_next_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_next_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.ChannelDB.get_next_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.get_previous_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_previous_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.ChannelDB.get_previous_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.id">
<span class="sig-name descname"><span class="pre">id</span></span><a class="headerlink" href="#evennia.comms.models.ChannelDB.id" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.path">
<span class="sig-name descname"><span class="pre">path</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'evennia.comms.models.ChannelDB'</span></em><a class="headerlink" href="#evennia.comms.models.ChannelDB.path" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.typename">
<span class="sig-name descname"><span class="pre">typename</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SharedMemoryModelBase'</span></em><a class="headerlink" href="#evennia.comms.models.ChannelDB.typename" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.ChannelDB.subscriptions">
<span class="sig-name descname"><span class="pre">subscriptions</span></span><a class="reference internal" href="../_modules/evennia/comms/models.html#ChannelDB.subscriptions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.ChannelDB.subscriptions" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">SubscriptionHandler</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>This handler manages subscriptions to the
channel and hides away which type of entity is
subscribing (Account or Object)</p>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.__init__" title="Link to this definition"></a></dt>
<dd><p>Initialize the handler</p>
<dl class="simple">
<dt>Attr:</dt><dd><p>obj (ChannelDB): The channel the handler sits on.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.has">
<span class="sig-name descname"><span class="pre">has</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">entity</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.has"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.has" title="Link to this definition"></a></dt>
<dd><p>Check if the given entity subscribe to this channel</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>entity</strong> (<em>str</em><em>, </em><em>Account</em><em> or </em><em>Object</em>) The entity to return. If
a string, it assumed to be the key or the #dbref
of the entity.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>subscriber (Account, Object or None)</em> </p>
<dl class="simple">
<dt>The given</dt><dd><p>subscriber.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.add">
<span class="sig-name descname"><span class="pre">add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">entity</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.add" title="Link to this definition"></a></dt>
<dd><p>Subscribe an entity to this channel.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>entity</strong> (<em>Account</em><em>, </em><em>Object</em><em> or </em><em>list</em>) The entity or
list of entities to subscribe to this channel.</p>
</dd>
</dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<dl class="simple">
<dt>No access-checking is done here, this must have</dt><dd><p>been done before calling this method. Also
no hooks will be called.</p>
</dd>
</dl>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.remove">
<span class="sig-name descname"><span class="pre">remove</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">entity</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.remove"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.remove" title="Link to this definition"></a></dt>
<dd><p>Remove a subscriber from the channel.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>entity</strong> (<em>Account</em><em>, </em><em>Object</em><em> or </em><em>list</em>) The entity or
entities to un-subscribe from the channel.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.all">
<span class="sig-name descname"><span class="pre">all</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.all"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.all" title="Link to this definition"></a></dt>
<dd><p>Get all subscriptions to this channel.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><p><em>subscribers (list)</em> </p>
<dl class="simple">
<dt>The subscribers. This</dt><dd><p>may be a mix of Accounts and Objects!</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.get">
<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.get" title="Link to this definition"></a></dt>
<dd><p>Get all subscriptions to this channel.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><p><em>subscribers (list)</em> </p>
<dl class="simple">
<dt>The subscribers. This</dt><dd><p>may be a mix of Accounts and Objects!</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.online">
<span class="sig-name descname"><span class="pre">online</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.online"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.online" title="Link to this definition"></a></dt>
<dd><p>Get all online accounts from our cache
:returns: <em>subscribers (list)</em> </p>
<blockquote>
<div><dl class="simple">
<dt>Subscribers who are online or</dt><dd><p>are puppeted by an online account.</p>
</dd>
</dl>
</div></blockquote>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SubscriptionHandler.clear">
<span class="sig-name descname"><span class="pre">clear</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/comms/models.html#SubscriptionHandler.clear"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SubscriptionHandler.clear" title="Link to this definition"></a></dt>
<dd><p>Remove all subscribers from channel.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">LockHandler</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>This handler should be attached to all objects implementing
permission checks, under the property lockhandler.</p>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.__init__" title="Link to this definition"></a></dt>
<dd><p>Loads and pre-caches all relevant locks and their functions.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>obj</strong> (<em>object</em>) The object on which the lockhandler is</p></li>
<li><p><strong>defined.</strong></p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.add">
<span class="sig-name descname"><span class="pre">add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">lockstring</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">validate_only</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.add" title="Link to this definition"></a></dt>
<dd><p>Add a new lockstring to handler.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>lockstring</strong> (<em>str</em><em> or </em><em>list</em>) A string on the form
<strong>&lt;access_type&gt;:&lt;functions&gt;</strong>. Multiple access types
should be separated by semicolon (<strong>;</strong>). Alternatively,
a list with lockstrings.</p></li>
<li><p><strong>validate_only</strong> (<em>bool</em><em>, </em><em>optional</em>) If True, validate the lockstring but
dont actually store it.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>success (bool)</em> </p>
<dl class="simple">
<dt>The outcome of the addition, <strong>False</strong> on</dt><dd><p>error. If <strong>validate_only</strong> is True, this will be a tuple
(bool, error), for pass/fail and a string error.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.all">
<span class="sig-name descname"><span class="pre">all</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.all"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.all" title="Link to this definition"></a></dt>
<dd><p>Return all lockstrings</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>lockstrings (list)</em> All separate lockstrings</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.append">
<span class="sig-name descname"><span class="pre">append</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">access_type</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lockstring</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">op</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'or'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.append"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.append" title="Link to this definition"></a></dt>
<dd><p>Append a lock definition to access_type if it doesnt already exist.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>access_type</strong> (<em>str</em>) Access type.</p></li>
<li><p><strong>lockstring</strong> (<em>str</em>) A valid lockstring, without the operator to
link it to an eventual existing lockstring.</p></li>
<li><p><strong>op</strong> (<em>str</em>) An operator and, or, and not, or not used
for appending the lockstring to an existing access-type.</p></li>
</ul>
</dd>
</dl>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The most common use of this method is for use in commands where
the user can specify their own lockstrings. This method allows
the system to auto-add things like Admin-override access.</p>
</div>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.cache_lock_bypass">
<span class="sig-name descname"><span class="pre">cache_lock_bypass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.cache_lock_bypass"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.cache_lock_bypass" title="Link to this definition"></a></dt>
<dd><p>We cache superuser bypass checks here for efficiency. This
needs to be re-run when an account is assigned to a character.
We need to grant access to superusers. We need to check both
directly on the object (accounts), through obj.account and using
the get_account() method (this sits on serversessions, in some
rare cases where a check is done before the login process has
yet been fully finalized)</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>obj</strong> (<em>object</em>) This is checked for the <strong>is_superuser</strong> property.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.check">
<span class="sig-name descname"><span class="pre">check</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accessing_obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">access_type</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">no_superuser_bypass</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.check"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.check" title="Link to this definition"></a></dt>
<dd><p>Checks a lock of the correct type by passing execution off to
the lock function(s).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accessing_obj</strong> (<em>object</em>) The object seeking access.</p></li>
<li><p><strong>access_type</strong> (<em>str</em>) The type of access wanted.</p></li>
<li><p><strong>default</strong> (<em>bool</em><em>, </em><em>optional</em>) If no suitable lock type is
found, default to this result.</p></li>
<li><p><strong>no_superuser_bypass</strong> (<em>bool</em>) Dont use this unless you
really, really need to, it makes supersusers susceptible
to the lock check.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>A lock is executed in the follwoing way:</p>
<p>Parsing the lockstring, we (during cache) extract the valid
lock functions and store their function objects in the right
order along with their args/kwargs. These are now executed in
sequence, creating a list of True/False values. This is put
into the evalstring, which is a string of AND/OR/NOT entries
separated by placeholders where each function result should
go. We just put those results in and evaluate the string to
get a final, combined True/False value for the lockstring.</p>
<p>The important bit with this solution is that the full
lockstring is never blindly evaluated, and thus there (should
be) no way to sneak in malign code in it. Only “safe” lock
functions (as defined by your settings) are executed.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.check_lockstring">
<span class="sig-name descname"><span class="pre">check_lockstring</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accessing_obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lockstring</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">no_superuser_bypass</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">access_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.check_lockstring"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.check_lockstring" title="Link to this definition"></a></dt>
<dd><p>Do a direct check against a lockstring (atype:func()..),
without any intermediary storage on the accessed object.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accessing_obj</strong> (<em>object</em><em> or </em><em>None</em>) The object seeking access.
Importantly, this can be left unset if the lock functions
dont access it, no updating or storage of locks are made
against this object in this method.</p></li>
<li><p><strong>lockstring</strong> (<em>str</em>) Lock string to check, on the form
<strong>“access_type:lock_definition”</strong> where the <strong>access_type</strong>
part can potentially be set to a dummy value to just check
a lock condition.</p></li>
<li><p><strong>no_superuser_bypass</strong> (<em>bool</em><em>, </em><em>optional</em>) Force superusers to heed lock.</p></li>
<li><p><strong>default</strong> (<em>bool</em><em>, </em><em>optional</em>) Fallback result to use if <strong>access_type</strong> is set
but no such <strong>access_type</strong> is found in the given <strong>lockstring</strong>.</p></li>
<li><p><strong>access_type</strong> (<em>str</em><em>, </em><em>bool</em>) If set, only this access_type will be looked up
among the locks defined by <strong>lockstring</strong>.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>access (bool)</em> If check is passed or not.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.clear">
<span class="sig-name descname"><span class="pre">clear</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.clear"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.clear" title="Link to this definition"></a></dt>
<dd><p>Remove all locks in the handler.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.delete">
<span class="sig-name descname"><span class="pre">delete</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">access_type</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.LockHandler.delete" title="Link to this definition"></a></dt>
<dd><p>Remove a particular lock from the handler</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>access_type</strong> (<em>str</em>) The type of lock to remove.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>success (bool)</em> </p>
<dl class="simple">
<dt>If the access_type was not found</dt><dd><p>in the lock, this returns <strong>False</strong>.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.get">
<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">access_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.get"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.get" title="Link to this definition"></a></dt>
<dd><p>Get the full lockstring or the lockstring of a particular
access type.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>access_type</strong> (<em>str</em><em>, </em><em>optional</em>)</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>lockstring (str)</em> </p>
<dl class="simple">
<dt>The matched lockstring, or the full</dt><dd><p>lockstring if no access_type was given.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.remove">
<span class="sig-name descname"><span class="pre">remove</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">access_type</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.remove"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.remove" title="Link to this definition"></a></dt>
<dd><p>Remove a particular lock from the handler</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>access_type</strong> (<em>str</em>) The type of lock to remove.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>success (bool)</em> </p>
<dl class="simple">
<dt>If the access_type was not found</dt><dd><p>in the lock, this returns <strong>False</strong>.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.replace">
<span class="sig-name descname"><span class="pre">replace</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">lockstring</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.replace"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.replace" title="Link to this definition"></a></dt>
<dd><p>Replaces the lockstring entirely.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>lockstring</strong> (<em>str</em>) The new lock definition.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>success (bool)</em> False if an error occurred.</p>
</dd>
<dt class="field-odd">Raises<span class="colon">:</span></dt>
<dd class="field-odd"><p><a class="reference internal" href="evennia.commands.default.building.html#evennia.commands.default.building.LockException" title="evennia.commands.default.building.LockException"><strong>LockException</strong></a> If a critical error occurred.
If so, the old string is recovered.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.reset">
<span class="sig-name descname"><span class="pre">reset</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.reset"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.reset" title="Link to this definition"></a></dt>
<dd><p>Set the reset flag, so the the lock will be re-cached at next
checking. This is usually called by &#64;reload.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.LockHandler.validate">
<span class="sig-name descname"><span class="pre">validate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">lockstring</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/locks/lockhandler.html#LockHandler.validate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.LockHandler.validate" title="Link to this definition"></a></dt>
<dd><p>Validate lockstring syntactically, without saving it.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>lockstring</strong> (<em>str</em>) Lockstring to validate.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>valid (bool)</em> If validation passed or not.</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">SharedMemoryModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></p>
<p>Base class for idmapped objects. Inherit from <strong>this</strong>.</p>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.Meta">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Meta</span></span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.Meta"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.Meta" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.Meta.abstract">
<span class="sig-name descname"><span class="pre">abstract</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.Meta.abstract" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.at_idmapper_flush">
<span class="sig-name descname"><span class="pre">at_idmapper_flush</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.at_idmapper_flush"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.at_idmapper_flush" title="Link to this definition"></a></dt>
<dd><p>This is called when the idmapper cache is flushed and
allows customized actions when this happens.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><p><em>do_flush (bool)</em> </p>
<dl class="simple">
<dt>If True, flush this object as normal. If</dt><dd><p>False, dont flush and expect this object to handle
the flushing on its own.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.cache_instance">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">cache_instance</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">instance</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">new</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.cache_instance"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.cache_instance" title="Link to this definition"></a></dt>
<dd><p>Method to store an instance in the cache.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>instance</strong> (<em>Class instance</em>) the instance to cache.</p></li>
<li><p><strong>new</strong> (<em>bool</em><em>, </em><em>optional</em>) this is the first time this instance is
cached (i.e. this is not an update operation like after a
db save).</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.delete">
<span class="sig-name descname"><span class="pre">delete</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.delete"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.delete" title="Link to this definition"></a></dt>
<dd><p>Delete the object, clearing cache.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.flush_cached_instance">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">flush_cached_instance</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">instance</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">force</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.flush_cached_instance"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.flush_cached_instance" title="Link to this definition"></a></dt>
<dd><p>Method to flush an instance from the cache. The instance will
always be flushed from the cache, since this is most likely
called from delete(), and we want to make sure we dont cache
dead objects.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.flush_from_cache">
<span class="sig-name descname"><span class="pre">flush_from_cache</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">force</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.flush_from_cache"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.flush_from_cache" title="Link to this definition"></a></dt>
<dd><p>Flush this instance from the instance cache. Use
<strong>force</strong> to override the result of at_idmapper_flush() for the object.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.flush_instance_cache">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">flush_instance_cache</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">force</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.flush_instance_cache"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.flush_instance_cache" title="Link to this definition"></a></dt>
<dd><p>This will clean safe objects from the cache. Use <strong>force</strong>
keyword to remove all objects, safe or not.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.get_all_cached_instances">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">get_all_cached_instances</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.get_all_cached_instances"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.get_all_cached_instances" title="Link to this definition"></a></dt>
<dd><p>Return the objects so far cached by idmapper for this class.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.get_cached_instance">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">get_cached_instance</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.get_cached_instance"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.get_cached_instance" title="Link to this definition"></a></dt>
<dd><p>Method to retrieve a cached instance by pk value. Returns None
when not found (which will always be the case when caching is
disabled for this class). Please note that the lookup will be
done even when instance caching is disabled.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.objects">
<span class="sig-name descname"><span class="pre">objects</span></span><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.objects" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.path">
<span class="sig-name descname"><span class="pre">path</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'evennia.utils.idmapper.models.SharedMemoryModel'</span></em><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.path" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.save">
<span class="sig-name descname"><span class="pre">save</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/idmapper/models.html#SharedMemoryModel.save"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.save" title="Link to this definition"></a></dt>
<dd><p>Central database save operation.</p>
<p class="rubric">Notes</p>
<p>Arguments as per Django documentation.
Calls <strong>self.at_&lt;fieldname&gt;_postsave(new)</strong>
(this is a wrapper set by oobhandler:
self._oob_at_&lt;fieldname&gt;_postsave())</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.SharedMemoryModel.typename">
<span class="sig-name descname"><span class="pre">typename</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SharedMemoryModelBase'</span></em><a class="headerlink" href="#evennia.comms.models.SharedMemoryModel.typename" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.Tag">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">Tag</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#Tag"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.Tag" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></p>
<p>Tags are quick markers for objects in-game. An typeobject can have
any number of tags, stored via its db_tags property. Tagging
similar objects will make it easier to quickly locate the group
later (such as when implementing zones). The main advantage of
tagging as opposed to using tags is speed; a tag is very
limited in what data it can hold, and the tag key+category is
indexed for efficient lookup in the database. Tags are shared
between objects - a new tag is only created if the key+category
combination did not previously exist, making them unsuitable for
storing object-related data (for this a regular Attribute should be
used).</p>
<p>The db_data field is intended as a documentation field for the
tag itself, such as to document what this tag+category stands for
and display that in a web interface or similar.</p>
<p>The main default use for Tags is to implement Aliases for objects.
this uses the aliases tag category, which is also checked by the
default search functions of Evennia to allow quick searches by alias.</p>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.DoesNotExist">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DoesNotExist</span></span><a class="headerlink" href="#evennia.comms.models.Tag.DoesNotExist" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.utils.dbserialize.html#evennia.utils.dbserialize.ObjectDoesNotExist" title="django.core.exceptions.ObjectDoesNotExist"><code class="xref py py-class docutils literal notranslate"><span class="pre">ObjectDoesNotExist</span></code></a></p>
</dd></dl>
<dl class="py exception">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.MultipleObjectsReturned">
<em class="property"><span class="k"><span class="pre">exception</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MultipleObjectsReturned</span></span><a class="headerlink" href="#evennia.comms.models.Tag.MultipleObjectsReturned" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">MultipleObjectsReturned</span></code></p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.accountdb_set">
<span class="sig-name descname"><span class="pre">accountdb_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.accountdb_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.channeldb_set">
<span class="sig-name descname"><span class="pre">channeldb_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.channeldb_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.db_category">
<span class="sig-name descname"><span class="pre">db_category</span></span><a class="headerlink" href="#evennia.comms.models.Tag.db_category" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.db_data">
<span class="sig-name descname"><span class="pre">db_data</span></span><a class="headerlink" href="#evennia.comms.models.Tag.db_data" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.db_key">
<span class="sig-name descname"><span class="pre">db_key</span></span><a class="headerlink" href="#evennia.comms.models.Tag.db_key" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.db_model">
<span class="sig-name descname"><span class="pre">db_model</span></span><a class="headerlink" href="#evennia.comms.models.Tag.db_model" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.db_tagtype">
<span class="sig-name descname"><span class="pre">db_tagtype</span></span><a class="headerlink" href="#evennia.comms.models.Tag.db_tagtype" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.helpentry_set">
<span class="sig-name descname"><span class="pre">helpentry_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.helpentry_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.id">
<span class="sig-name descname"><span class="pre">id</span></span><a class="headerlink" href="#evennia.comms.models.Tag.id" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.msg_set">
<span class="sig-name descname"><span class="pre">msg_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.msg_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.objectdb_set">
<span class="sig-name descname"><span class="pre">objectdb_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.objectdb_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.objects">
<span class="sig-name descname"><span class="pre">objects</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;django.db.models.manager.Manager</span> <span class="pre">object&gt;</span></em><a class="headerlink" href="#evennia.comms.models.Tag.objects" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.Tag.scriptdb_set">
<span class="sig-name descname"><span class="pre">scriptdb_set</span></span><a class="headerlink" href="#evennia.comms.models.Tag.scriptdb_set" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">TagHandler</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Generic tag-handler. Accessed via TypedObject.tags.</p>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.__init__" title="Link to this definition"></a></dt>
<dd><p>Tags are stored internally in the TypedObject.db_tags m2m
field with an tag.db_model based on the obj the taghandler is
stored on and with a tagtype given by self.handlertype</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>obj</strong> (<em>object</em>) The object on which the handler is set.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.add">
<span class="sig-name descname"><span class="pre">add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.add" title="Link to this definition"></a></dt>
<dd><p>Add a new tag to the handler.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>list</em>) The name of the tag to add. If a list,
add several Tags.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) Category of Tag. <strong>None</strong> is the default category.</p></li>
<li><p><strong>data</strong> (<em>str</em><em>, </em><em>optional</em>) Info text about the tag(s) added.
This can not be used to store object-unique info but only
eventual info about the tag itself.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>If the tag + category combination matches an already
existing Tag object, this will be re-used and no new Tag
will be created.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.all">
<span class="sig-name descname"><span class="pre">all</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">return_key_and_category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_objs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.all"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.all" title="Link to this definition"></a></dt>
<dd><p>Get all tags in this handler, regardless of category.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>return_key_and_category</strong> (<em>bool</em><em>, </em><em>optional</em>) Return a list of
tuples <strong>[(key, category), …]</strong>.</p></li>
<li><p><strong>return_objs</strong> (<em>bool</em><em>, </em><em>optional</em>) Return tag objects.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>tags (list)</em> </p>
<dl class="simple">
<dt>A list of tag keys <strong>[tagkey, tagkey, …]</strong> or</dt><dd><p>a list of tuples <strong>[(key, category), …]</strong> if
<strong>return_key_and_category</strong> is set.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.batch_add">
<span class="sig-name descname"><span class="pre">batch_add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.batch_add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.batch_add" title="Link to this definition"></a></dt>
<dd><p>Batch-add tags from a list of tuples.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>*args</strong> (<em>tuple</em><em> or </em><em>str</em>) Each argument should be a <strong>tagstr</strong> keys or tuple
<strong>(keystr, category)</strong> or <strong>(keystr, category, data)</strong>. Its possible to mix input
types.</p>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>This will generate a mimimal number of self.add calls,
based on the number of categories involved (including
<strong>None</strong>) (data is not unique and may be overwritten by the content
of a latter tuple with the same category).</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.batch_remove">
<span class="sig-name descname"><span class="pre">batch_remove</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.batch_remove"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.batch_remove" title="Link to this definition"></a></dt>
<dd><p>Batch-remove tags from a list of tuples.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>*args</strong> (<em>tuple</em><em> or </em><em>str</em>) Each argument should be a <strong>tagstr</strong> keys or tuple
<strong>(keystr, category)</strong> or <strong>(keystr, category, data)</strong> (the <strong>data</strong> field is ignored,
only <strong>keystr</strong>/<strong>category</strong> matters). Its possible to mix input types.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.clear">
<span class="sig-name descname"><span class="pre">clear</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.clear"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.clear" title="Link to this definition"></a></dt>
<dd><p>Remove all tags from the handler.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The Tag category to limit the
request to. Note that <strong>None</strong> is the valid, default
category.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.get">
<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_tagobj</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_list</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">raise_exception</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.get"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.get" title="Link to this definition"></a></dt>
<dd><p>Get the tag for the given key, category or combination of the two.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>list</em><em>, </em><em>optional</em>) The tag or tags to retrieve.</p></li>
<li><p><strong>default</strong> (<em>any</em><em>, </em><em>optional</em>) The value to return in case of no match.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The Tag category to limit the
request to. Note that <strong>None</strong> is the valid, default
category. If no <strong>key</strong> is given, all tags of this category will be
returned.</p></li>
<li><p><strong>return_tagobj</strong> (<em>bool</em><em>, </em><em>optional</em>) Return the Tag object itself
instead of a string representation of the Tag.</p></li>
<li><p><strong>return_list</strong> (<em>bool</em><em>, </em><em>optional</em>) Always return a list, regardless
of number of matches.</p></li>
<li><p><strong>raise_exception</strong> (<em>bool</em><em>, </em><em>optional</em>) Raise AttributeError if no matches
are found.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>tags (list)</em> </p>
<dl class="simple">
<dt>The matches, either string</dt><dd><p>representations of the tags or the Tag objects themselves
depending on <strong>return_tagobj</strong>. If default is set, this
will be a list with the default value as its only element.</p>
</dd>
</dl>
</p>
</dd>
<dt class="field-odd">Raises<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>AttributeError</strong> If finding no matches and <strong>raise_exception</strong> is True.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.has">
<span class="sig-name descname"><span class="pre">has</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">return_list</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.has"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.has" title="Link to this definition"></a></dt>
<dd><p>Checks if the given Tag (or list of Tags) exists on the object.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>iterable</em>) The Tag key or tags to check for.
If <strong>None</strong>, search by category.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) Limit the check to Tags with this
category (note, that <strong>None</strong> is the default category).</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>has_tag (bool or list)</em> </p>
<dl class="simple">
<dt>If the Tag exists on this object or not.</dt><dd><p>If <strong>tag</strong> was given as an iterable then the return is a list of booleans.</p>
</dd>
</dl>
</p>
</dd>
<dt class="field-odd">Raises<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>ValueError</strong> If neither <strong>tag</strong> nor <strong>category</strong> is given.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.remove">
<span class="sig-name descname"><span class="pre">remove</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">category</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.remove"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.remove" title="Link to this definition"></a></dt>
<dd><p>Remove a tag from the handler based ond key and/or category.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>list</em><em>, </em><em>optional</em>) The tag or tags to retrieve.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The Tag category to limit the
request to. Note that <strong>None</strong> is the valid, default
category</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>If neither key nor category is specified, this acts
as .clear().</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TagHandler.reset_cache">
<span class="sig-name descname"><span class="pre">reset_cache</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/tags.html#TagHandler.reset_cache"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TagHandler.reset_cache" title="Link to this definition"></a></dt>
<dd><p>Reset the cache from the outside.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">TypedObject</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject" title="Link to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="evennia.utils.idmapper.models.html#evennia.utils.idmapper.models.SharedMemoryModel" title="evennia.utils.idmapper.models.SharedMemoryModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">SharedMemoryModel</span></code></a></p>
<p>Abstract Django model.</p>
<p>This is the basis for a typed object. It also contains all the
mechanics for managing connected attributes.</p>
<p>The TypedObject has the following properties:</p>
<ul class="simple">
<li><p>key - main name</p></li>
<li><p>name - alias for key</p></li>
<li><p>typeclass_path - the path to the decorating typeclass</p></li>
<li><p>typeclass - auto-linked typeclass</p></li>
<li><p>date_created - time stamp of object creation</p></li>
<li><p>permissions - perm strings</p></li>
<li><p>dbref - #id of object</p></li>
<li><p>db - persistent attribute storage</p></li>
<li><p>ndb - non-persistent attribute storage</p></li>
</ul>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.Meta">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Meta</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.Meta"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.Meta" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Django setup info.</p>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.Meta.abstract">
<span class="sig-name descname"><span class="pre">abstract</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#evennia.comms.models.TypedObject.Meta.abstract" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.Meta.ordering">
<span class="sig-name descname"><span class="pre">ordering</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">['-db_date_created',</span> <span class="pre">'id',</span> <span class="pre">'db_typeclass_path',</span> <span class="pre">'db_key']</span></em><a class="headerlink" href="#evennia.comms.models.TypedObject.Meta.ordering" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.Meta.verbose_name">
<span class="sig-name descname"><span class="pre">verbose_name</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'Evennia</span> <span class="pre">Database</span> <span class="pre">Object'</span></em><a class="headerlink" href="#evennia.comms.models.TypedObject.Meta.verbose_name" title="Link to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.__init__" title="Link to this definition"></a></dt>
<dd><p>The <strong>__init__</strong> method of typeclasses is the core operational
code of the typeclass system, where it dynamically re-applies
a class based on the db_typeclass_path database field rather
than use the one in the model.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>parent.</strong> (<em>Passed through to</em>)</p>
</dd>
<dt class="field-even">Keyword Arguments<span class="colon">:</span></dt>
<dd class="field-even"><p><strong>parent.</strong> (<em>Passed through to</em>)</p>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>The loading mechanism will attempt the following steps:</p>
<ol class="arabic simple">
<li><p>Attempt to load typeclass given on command line</p></li>
<li><p>Attempt to load typeclass stored in db_typeclass_path</p></li>
<li><p>Attempt to load <strong>__settingsclasspath__</strong>, which is by the
default classes defined to be the respective user-set
base typeclass settings, like <strong>BASE_OBJECT_TYPECLASS</strong>.</p></li>
<li><p>Attempt to load <strong>__defaultclasspath__</strong>, which is the
base classes in the library, like DefaultObject etc.</p></li>
<li><p>If everything else fails, use the database model.</p></li>
</ol>
<p>Normal operation is to load successfully at either step 1
or 2 depending on how the class was called. Tracebacks
will be logged for every step the loader must take beyond
2.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.access">
<span class="sig-name descname"><span class="pre">access</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">accessing_obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">access_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'read'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">no_superuser_bypass</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.access"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.access" title="Link to this definition"></a></dt>
<dd><p>Determines if another object has permission to access this one.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>accessing_obj</strong> (<em>str</em>) Object trying to access this one.</p></li>
<li><p><strong>access_type</strong> (<em>str</em><em>, </em><em>optional</em>) Type of access sought.</p></li>
<li><p><strong>default</strong> (<em>bool</em><em>, </em><em>optional</em>) What to return if no lock of
access_type was found</p></li>
<li><p><strong>no_superuser_bypass</strong> (<em>bool</em><em>, </em><em>optional</em>) Turn off the
superuser lock bypass (be careful with this one).</p></li>
</ul>
</dd>
<dt class="field-even">Keyword Arguments<span class="colon">:</span></dt>
<dd class="field-even"><p><strong>kwar</strong> (<em>any</em>) Ignored, but is there to make the api
consistent with the object-typeclass method access, which
use it to feed to its hook methods.</p>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.aliases">
<span class="sig-name descname"><span class="pre">aliases</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.aliases"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.aliases" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.at_idmapper_flush">
<span class="sig-name descname"><span class="pre">at_idmapper_flush</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.at_idmapper_flush"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.at_idmapper_flush" title="Link to this definition"></a></dt>
<dd><p>This is called when the idmapper cache is flushed and
allows customized actions when this happens.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><p><em>do_flush (bool)</em> </p>
<dl class="simple">
<dt>If True, flush this object as normal. If</dt><dd><p>False, dont flush and expect this object to handle
the flushing on its own.</p>
</dd>
</dl>
</p>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>The default implementation relies on being able to clear
Djangos Foreignkey cache on objects not affected by the
flush (notably objects with an NAttribute stored). We rely
on this cache being stored on the format “_&lt;fieldname&gt;_cache”.
If Django were to change this name internally, we need to
update here (unlikely, but marking just in case).</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.at_init">
<span class="sig-name descname"><span class="pre">at_init</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.at_init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.at_init" title="Link to this definition"></a></dt>
<dd><p>Called when this object is loaded into cache. This is more reliable
than to override <strong>__init__</strong>.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.at_rename">
<span class="sig-name descname"><span class="pre">at_rename</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">oldname</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">newname</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.at_rename"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.at_rename" title="Link to this definition"></a></dt>
<dd><p>This Hook is called by &#64;name on a successful rename.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>oldname</strong> (<em>str</em>) The instances original name.</p></li>
<li><p><strong>newname</strong> (<em>str</em>) The new name for the instance.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.attributes">
<span class="sig-name descname"><span class="pre">attributes</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.attributes"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.attributes" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.check_permstring">
<span class="sig-name descname"><span class="pre">check_permstring</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">permstring</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.check_permstring"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.check_permstring" title="Link to this definition"></a></dt>
<dd><p>This explicitly checks if we hold particular permission
without involving any locks.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>permstring</strong> (<em>str</em>) The permission string to check against.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>result (bool)</em> If the permstring is passed or not.</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.date_created">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">date_created</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.date_created" title="Link to this definition"></a></dt>
<dd><p>Get the localized date created, based on settings.TIME_ZONE.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">db</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db" title="Link to this definition"></a></dt>
<dd><p>Attribute handler wrapper. Allows for the syntax</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">attrname</span> <span class="o">=</span> <span class="n">value</span>
<span class="c1"># and</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">attrname</span>
<span class="c1"># and</span>
<span class="k">del</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">attrname</span>
<span class="c1"># and</span>
<span class="n">all_attr</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="c1"># (unless there is an attribute</span>
<span class="c1"># named &#39;all&#39;, in which case that will be returned instead).</span>
</pre></div>
</div>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_attributes">
<span class="sig-name descname"><span class="pre">db_attributes</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_attributes" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_date_created">
<span class="sig-name descname"><span class="pre">db_date_created</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_date_created" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_key">
<span class="sig-name descname"><span class="pre">db_key</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_key" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_lock_storage">
<span class="sig-name descname"><span class="pre">db_lock_storage</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_lock_storage" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_tags">
<span class="sig-name descname"><span class="pre">db_tags</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_tags" title="Link to this definition"></a></dt>
<dd><p>Accessor to the related objects manager on the forward and reverse sides of
a many-to-many relation.</p>
<p>In the example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Pizza</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
<span class="n">toppings</span> <span class="o">=</span> <span class="n">ManyToManyField</span><span class="p">(</span><span class="n">Topping</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">&#39;pizzas&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p><strong>**Pizza.toppings**</strong> and <strong>**Topping.pizzas**</strong> are <strong>**ManyToManyDescriptor**</strong>
instances.</p>
<p>Most of the implementation is delegated to a dynamically defined manager
class built by <strong>**create_forward_many_to_many_manager()**</strong> defined below.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.db_typeclass_path">
<span class="sig-name descname"><span class="pre">db_typeclass_path</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.db_typeclass_path" title="Link to this definition"></a></dt>
<dd><p>A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.dbid">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">dbid</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.dbid" title="Link to this definition"></a></dt>
<dd><p>Caches and returns the unique id of the object.
Use this instead of self.id, which is not cached.</p>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.dbref">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">dbref</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.dbref" title="Link to this definition"></a></dt>
<dd><p>Returns the objects dbref on the form #NN.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.delete">
<span class="sig-name descname"><span class="pre">delete</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.delete"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.delete" title="Link to this definition"></a></dt>
<dd><p>Cleaning up handlers on the typeclass level</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.get_absolute_url">
<span class="sig-name descname"><span class="pre">get_absolute_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.TypedObject.get_absolute_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to view details for
this object.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>path (str)</em> URI path to object detail page, if defined.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Oscar</span> <span class="p">(</span><span class="n">Character</span><span class="p">)</span> <span class="o">=</span> <span class="s1">&#39;/characters/oscar/1/&#39;</span>
</pre></div>
</div>
<p>For this to work, the developer must have defined a named view somewhere
in urls.py that follows the format modelname-action, so in this case
a named view of character-detail would be referenced by this method.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;characters/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/$&#39;</span><span class="p">,</span>
<span class="n">CharDetailView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;character-detail&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>If no View has been created and defined in urls.py, returns an
HTML anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can view this object is the
developers responsibility.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.get_display_name">
<span class="sig-name descname"><span class="pre">get_display_name</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">looker</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.get_display_name"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.get_display_name" title="Link to this definition"></a></dt>
<dd><p>Displays the name of the object in a viewer-aware manner.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>looker</strong> (<a class="reference internal" href="#evennia.comms.models.TypedObject" title="evennia.comms.models.TypedObject"><em>TypedObject</em></a><em>, </em><em>optional</em>) The object or account that is looking
at/getting inforamtion for this object. If not given, some
safe minimum level should be returned.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>name (str)</em> </p>
<dl class="simple">
<dt>A string containing the name of the object,</dt><dd><p>including the DBREF if this user is privileged to control
said object.</p>
</dd>
</dl>
</p>
</dd>
</dl>
<p class="rubric">Notes</p>
<p>This function could be extended to change how object names
appear to users in character, but be wary. This function
does not change an objects keys or aliases when
searching, and is expected to produce something useful for
builders.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.get_extra_info">
<span class="sig-name descname"><span class="pre">get_extra_info</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">looker</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.get_extra_info"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.get_extra_info" title="Link to this definition"></a></dt>
<dd><p>Used when an object is in a list of ambiguous objects as an
additional information tag.</p>
<p>For instance, if you had potions which could have varying
levels of liquid left in them, you might want to display how
many drinks are left in each when selecting which to drop, but
not in your normal inventory listing.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>looker</strong> (<a class="reference internal" href="#evennia.comms.models.TypedObject" title="evennia.comms.models.TypedObject"><em>TypedObject</em></a>) The object or account that is looking
at/getting information for this object.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>info (str)</em> </p>
<dl class="simple">
<dt>A string with disambiguating information,</dt><dd><p>conventionally with a leading space.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.get_next_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_next_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.TypedObject.get_next_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.get_previous_by_db_date_created">
<span class="sig-name descname"><span class="pre">get_previous_by_db_date_created</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">*</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">field=&lt;django.db.models.fields.DateTimeField:</span> <span class="pre">db_date_created&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_next=False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">**kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.comms.models.TypedObject.get_previous_by_db_date_created" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.init_evennia_properties">
<span class="sig-name descname"><span class="pre">init_evennia_properties</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.init_evennia_properties"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.init_evennia_properties" title="Link to this definition"></a></dt>
<dd><p>Called by creation methods; makes sure to initialize Attribute/TagProperties
by fetching them once.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.is_typeclass">
<span class="sig-name descname"><span class="pre">is_typeclass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">typeclass</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exact</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.is_typeclass"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.is_typeclass" title="Link to this definition"></a></dt>
<dd><p>Returns true if this object has this type OR has a typeclass
which is an subclass of the given typeclass. This operates on
the actually loaded typeclass (this is important since a
failing typeclass may instead have its default currently
loaded) typeclass - can be a class object or the python path
to such an object to match against.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>class</em>) A class or the full python path
to the class to check.</p></li>
<li><p><strong>exact</strong> (<em>bool</em><em>, </em><em>optional</em>) Returns true only if the objects
type is exactly this typeclass, ignoring parents.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>is_typeclass (bool)</em> </p>
<dl class="simple">
<dt>If this typeclass matches the given</dt><dd><p>typeclass.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.key">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">key</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.key" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.lock_storage">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">lock_storage</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.lock_storage" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_lock_storage</strong>.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.locks">
<span class="sig-name descname"><span class="pre">locks</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.locks"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.locks" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.name">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">name</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.name" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.nattributes">
<span class="sig-name descname"><span class="pre">nattributes</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.nattributes"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.nattributes" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.ndb">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ndb</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.ndb" title="Link to this definition"></a></dt>
<dd><p>NonDataBase). Everything stored
to this is guaranteed to be cleared when a server is shutdown.
Syntax is same as for the _get_db_holder() method and
property, e.g. obj.ndb.attr = value etc.</p>
<dl class="field-list simple">
<dt class="field-odd">Type<span class="colon">:</span></dt>
<dd class="field-odd"><p>A non-attr_obj store (ndb</p>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.objects">
<span class="sig-name descname"><span class="pre">objects</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.objects" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.path">
<span class="sig-name descname"><span class="pre">path</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'evennia.typeclasses.models.TypedObject'</span></em><a class="headerlink" href="#evennia.comms.models.TypedObject.path" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.permissions">
<span class="sig-name descname"><span class="pre">permissions</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.permissions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.permissions" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.search">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">query</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.search" title="Link to this definition"></a></dt>
<dd><p>Overridden by class children. This implements a common API.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>query</strong> (<em>str</em>) A search query.</p></li>
<li><p><strong>**kwargs</strong> Other search parameters.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>list</em> A list of 0, 1 or more matches, only of this typeclass.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.set_class_from_typeclass">
<span class="sig-name descname"><span class="pre">set_class_from_typeclass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">typeclass_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.set_class_from_typeclass"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.set_class_from_typeclass" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.swap_typeclass">
<span class="sig-name descname"><span class="pre">swap_typeclass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">new_typeclass</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">clean_attributes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">run_start_hooks</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'all'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">no_default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">clean_cmdsets</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.swap_typeclass"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.swap_typeclass" title="Link to this definition"></a></dt>
<dd><p>This performs an in-situ swap of the typeclass. This means
that in-game, this object will suddenly be something else.
Account will not be affected. To move an account to a different
object entirely (while retaining this objects type), use
self.account.swap_object().</p>
<p>Note that this might be an error prone operation if the
old/new typeclass was heavily customized - your code
might expect one and not the other, so be careful to
bug test your code if using this feature! Often its easiest
to create a new object and just swap the account over to
that one instead.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>new_typeclass</strong> (<em>str</em><em> or </em><em>classobj</em>) Type to switch to.</p></li>
<li><p><strong>clean_attributes</strong> (<em>bool</em><em> or </em><em>list</em><em>, </em><em>optional</em>) Will delete all
attributes stored on this object (but not any of the
database fields such as name or location). You cant get
attributes back, but this is often the safest bet to make
sure nothing in the new typeclass clashes with the old
one. If you supply a list, only those named attributes
will be cleared.</p></li>
<li><p><strong>run_start_hooks</strong> (<em>str</em><em> or </em><em>None</em><em>, </em><em>optional</em>) This is either None,
to not run any hooks, “all” to run all hooks defined by
at_first_start, or a string with space-separated hook-names to run
(for example at_object_creation). This will
always be called without arguments.</p></li>
<li><p><strong>no_default</strong> (<em>bool</em><em>, </em><em>optiona</em>) If set, the swapper will not
allow for swapping to a default typeclass in case the
given one fails for some reason. Instead the old one will
be preserved.</p></li>
<li><p><strong>clean_cmdsets</strong> (<em>bool</em><em>, </em><em>optional</em>) Delete all cmdsets on the object.</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.tags">
<span class="sig-name descname"><span class="pre">tags</span></span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.tags"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.tags" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py property">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.typeclass_path">
<em class="property"><span class="k"><span class="pre">property</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">typeclass_path</span></span><a class="headerlink" href="#evennia.comms.models.TypedObject.typeclass_path" title="Link to this definition"></a></dt>
<dd><p>A wrapper for getting database field <strong>db_typeclass_path</strong>.</p>
</dd></dl>
<dl class="py attribute">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.typename">
<span class="sig-name descname"><span class="pre">typename</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'SharedMemoryModelBase'</span></em><a class="headerlink" href="#evennia.comms.models.TypedObject.typename" title="Link to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_admin_url">
<span class="sig-name descname"><span class="pre">web_get_admin_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_admin_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_admin_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for the Django Admin page for this object.</p>
<p>ex. Account#1 = /admin/accounts/accountdb/1/change/</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>path (str)</em> URI path to Django Admin page for object.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_create_url">
<em class="property"><span class="k"><span class="pre">classmethod</span></span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">web_get_create_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_create_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_create_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to create new
instances of this object.</p>
<p>ex. Chargen = /characters/create/</p>
<p>For this to work, the developer must have defined a named view somewhere
in urls.py that follows the format modelname-action, so in this case
a named view of character-create would be referenced by this method.</p>
<p>ex.
url(rcharacters/create/, ChargenView.as_view(), name=character-create)</p>
<p>If no View has been created and defined in urls.py, returns an
HTML anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can create new objects is the
developers responsibility.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>path (str)</em> URI path to object creation page, if defined.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_delete_url">
<span class="sig-name descname"><span class="pre">web_get_delete_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_delete_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_delete_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to delete this object.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>path (str)</em> URI path to object deletion page, if defined.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Oscar</span> <span class="p">(</span><span class="n">Character</span><span class="p">)</span> <span class="o">=</span> <span class="s1">&#39;/characters/oscar/1/delete/&#39;</span>
</pre></div>
</div>
<p>For this to work, the developer must have defined a named view
somewhere in urls.py that follows the format modelname-action, so
in this case a named view of character-detail would be referenced
by this method.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;characters/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/delete/$&#39;</span><span class="p">,</span>
<span class="n">CharDeleteView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;character-delete&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>If no View has been created and defined in urls.py, returns an HTML
anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can delete this object is the
developers responsibility.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_detail_url">
<span class="sig-name descname"><span class="pre">web_get_detail_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_detail_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_detail_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to view details for
this object.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>path (str)</em> URI path to object detail page, if defined.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Oscar</span> <span class="p">(</span><span class="n">Character</span><span class="p">)</span> <span class="o">=</span> <span class="s1">&#39;/characters/oscar/1/&#39;</span>
</pre></div>
</div>
<p>For this to work, the developer must have defined a named view somewhere
in urls.py that follows the format modelname-action, so in this case
a named view of character-detail would be referenced by this method.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;characters/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/$&#39;</span><span class="p">,</span>
<span class="n">CharDetailView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;character-detail&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>If no View has been created and defined in urls.py, returns an
HTML anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can view this object is the
developers responsibility.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_puppet_url">
<span class="sig-name descname"><span class="pre">web_get_puppet_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_puppet_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_puppet_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to puppet a specific
object.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>str</em> URI path to object puppet page, if defined.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Oscar</span> <span class="p">(</span><span class="n">Character</span><span class="p">)</span> <span class="o">=</span> <span class="s1">&#39;/characters/oscar/1/puppet/&#39;</span>
</pre></div>
</div>
<p>For this to work, the developer must have defined a named view somewhere
in urls.py that follows the format modelname-action, so in this case
a named view of character-puppet would be referenced by this method.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;characters/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/puppet/$&#39;</span><span class="p">,</span>
<span class="n">CharPuppetView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;character-puppet&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>If no View has been created and defined in urls.py, returns an
HTML anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can view this object is the developers
responsibility.</p>
</dd></dl>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.TypedObject.web_get_update_url">
<span class="sig-name descname"><span class="pre">web_get_update_url</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/typeclasses/models.html#TypedObject.web_get_update_url"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.TypedObject.web_get_update_url" title="Link to this definition"></a></dt>
<dd><p>Returns the URI path for a View that allows users to update this
object.</p>
<dl class="field-list simple">
<dt class="field-odd">Returns<span class="colon">:</span></dt>
<dd class="field-odd"><p><em>str</em> URI path to object update page, if defined.</p>
</dd>
</dl>
<p class="rubric">Examples</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Oscar</span> <span class="p">(</span><span class="n">Character</span><span class="p">)</span> <span class="o">=</span> <span class="s1">&#39;/characters/oscar/1/change/&#39;</span>
</pre></div>
</div>
<p>For this to work, the developer must have defined a named view somewhere
in urls.py that follows the format modelname-action, so in this case
a named view of character-update would be referenced by this method.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;characters/(?P&lt;slug&gt;[\w\d\-]+)/(?P&lt;pk&gt;[0-9]+)/change/$&#39;</span><span class="p">,</span>
<span class="n">CharUpdateView</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;character-update&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>If no View has been created and defined in urls.py, returns an
HTML anchor.</p>
<p>This method is naive and simply returns a path. Securing access to
the actual view and limiting who can modify objects is the developers
responsibility.</p>
</dd></dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="evennia.comms.models.crop">
<span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">crop</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">text</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">width</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">suffix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'[...]'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#crop"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.crop" title="Link to this definition"></a></dt>
<dd><p>Crop text to a certain width, throwing away text from too-long
lines.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>text</strong> (<em>str</em>) Text to crop.</p></li>
<li><p><strong>width</strong> (<em>int</em><em>, </em><em>optional</em>) Width of line to crop, in characters.</p></li>
<li><p><strong>suffix</strong> (<em>str</em><em>, </em><em>optional</em>) This is appended to the end of cropped
lines to show that the line actually continues. Cropping
will be done so that the suffix will also fit within the
given width. If width is too small to fit both crop and
suffix, the suffix will be dropped.</p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><em>text (str)</em> The cropped text.</p>
</dd>
</dl>
</dd></dl>
<dl class="py class">
<dt class="sig sig-object py" id="evennia.comms.models.lazy_property">
<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">lazy_property</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">...</span></span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">TProp</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">doc</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#lazy_property"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.lazy_property" title="Link to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Generic</span></code>[<code class="xref py py-obj docutils literal notranslate"><span class="pre">TProp</span></code>]</p>
<p>Delays loading of property until first access. Credit goes to the
Implementation in the werkzeug suite:
<a class="reference external" href="http://werkzeug.pocoo.org/docs/utils/#werkzeug.utils.cached_property">http://werkzeug.pocoo.org/docs/utils/#werkzeug.utils.cached_property</a></p>
<p>This should be used as a decorator in a class and in Evennia is
mainly used to lazy-load handlers:</p>
<blockquote>
<div><div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nd">@lazy_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">attributes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">AttributeHandler</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
</div></blockquote>
<p>Once initialized, the <strong>AttributeHandler</strong> will be available as a
property “attributes” on the object. This is read-only since
this functionality is pretty much exclusively used by handlers.</p>
<dl class="py method">
<dt class="sig sig-object py" id="evennia.comms.models.lazy_property.__init__">
<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Callable</span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">[</span></span><span class="p"><span class="pre">...</span></span><span class="p"><span class="pre">]</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="pre">TProp</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">doc</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#lazy_property.__init__"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.lazy_property.__init__" title="Link to this definition"></a></dt>
<dd><p>Store all properties for now</p>
</dd></dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="evennia.comms.models.make_iter">
<span class="sig-prename descclassname"><span class="pre">evennia.comms.models.</span></span><span class="sig-name descname"><span class="pre">make_iter</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/utils.html#make_iter"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#evennia.comms.models.make_iter" title="Link to this definition"></a></dt>
<dd><p>Makes sure that the object is always iterable.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>obj</strong> (<em>any</em>) Object to make iterable.</p>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p><p><em>iterable (list or iterable)</em> </p>
<dl class="simple">
<dt>The same object</dt><dd><p>passed-through or made iterable.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/evennia_logo.png" alt="Logo of Evennia"/>
</a></p>
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script>
<h3><a href="../index.html">Table of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">evennia.comms.models</a><ul>
<li><a class="reference internal" href="#evennia.comms.models.Msg"><code class="docutils literal notranslate"><span class="pre">Msg</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_sender_accounts"><code class="docutils literal notranslate"><span class="pre">Msg.db_sender_accounts</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_sender_objects"><code class="docutils literal notranslate"><span class="pre">Msg.db_sender_objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_sender_scripts"><code class="docutils literal notranslate"><span class="pre">Msg.db_sender_scripts</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_sender_external"><code class="docutils literal notranslate"><span class="pre">Msg.db_sender_external</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_receivers_accounts"><code class="docutils literal notranslate"><span class="pre">Msg.db_receivers_accounts</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_receivers_objects"><code class="docutils literal notranslate"><span class="pre">Msg.db_receivers_objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_receivers_scripts"><code class="docutils literal notranslate"><span class="pre">Msg.db_receivers_scripts</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_receiver_external"><code class="docutils literal notranslate"><span class="pre">Msg.db_receiver_external</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_header"><code class="docutils literal notranslate"><span class="pre">Msg.db_header</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_message"><code class="docutils literal notranslate"><span class="pre">Msg.db_message</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_date_created"><code class="docutils literal notranslate"><span class="pre">Msg.db_date_created</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_lock_storage"><code class="docutils literal notranslate"><span class="pre">Msg.db_lock_storage</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_hide_from_accounts"><code class="docutils literal notranslate"><span class="pre">Msg.db_hide_from_accounts</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_hide_from_objects"><code class="docutils literal notranslate"><span class="pre">Msg.db_hide_from_objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.db_tags"><code class="docutils literal notranslate"><span class="pre">Msg.db_tags</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.objects"><code class="docutils literal notranslate"><span class="pre">Msg.objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.locks"><code class="docutils literal notranslate"><span class="pre">Msg.locks</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.tags"><code class="docutils literal notranslate"><span class="pre">Msg.tags</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.date_created"><code class="docutils literal notranslate"><span class="pre">Msg.date_created</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.senders"><code class="docutils literal notranslate"><span class="pre">Msg.senders</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.remove_sender"><code class="docutils literal notranslate"><span class="pre">Msg.remove_sender()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.receivers"><code class="docutils literal notranslate"><span class="pre">Msg.receivers</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.remove_receiver"><code class="docutils literal notranslate"><span class="pre">Msg.remove_receiver()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.hide_from"><code class="docutils literal notranslate"><span class="pre">Msg.hide_from</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.access"><code class="docutils literal notranslate"><span class="pre">Msg.access()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.DoesNotExist"><code class="docutils literal notranslate"><span class="pre">Msg.DoesNotExist</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.MultipleObjectsReturned"><code class="docutils literal notranslate"><span class="pre">Msg.MultipleObjectsReturned</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.get_next_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">Msg.get_next_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.get_previous_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">Msg.get_previous_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.header"><code class="docutils literal notranslate"><span class="pre">Msg.header</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.id"><code class="docutils literal notranslate"><span class="pre">Msg.id</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.lock_storage"><code class="docutils literal notranslate"><span class="pre">Msg.lock_storage</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.message"><code class="docutils literal notranslate"><span class="pre">Msg.message</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.path"><code class="docutils literal notranslate"><span class="pre">Msg.path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.receiver_external"><code class="docutils literal notranslate"><span class="pre">Msg.receiver_external</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.sender_external"><code class="docutils literal notranslate"><span class="pre">Msg.sender_external</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Msg.typename"><code class="docutils literal notranslate"><span class="pre">Msg.typename</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg"><code class="docutils literal notranslate"><span class="pre">TempMsg</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg.__init__"><code class="docutils literal notranslate"><span class="pre">TempMsg.__init__()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg.locks"><code class="docutils literal notranslate"><span class="pre">TempMsg.locks</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg.remove_sender"><code class="docutils literal notranslate"><span class="pre">TempMsg.remove_sender()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg.remove_receiver"><code class="docutils literal notranslate"><span class="pre">TempMsg.remove_receiver()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TempMsg.access"><code class="docutils literal notranslate"><span class="pre">TempMsg.access()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB"><code class="docutils literal notranslate"><span class="pre">ChannelDB</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_account_subscriptions"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_account_subscriptions</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_object_subscriptions"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_object_subscriptions</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.objects"><code class="docutils literal notranslate"><span class="pre">ChannelDB.objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.DoesNotExist"><code class="docutils literal notranslate"><span class="pre">ChannelDB.DoesNotExist</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.MultipleObjectsReturned"><code class="docutils literal notranslate"><span class="pre">ChannelDB.MultipleObjectsReturned</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_attributes"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_attributes</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_date_created"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_date_created</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_key"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_key</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_lock_storage"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_lock_storage</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_tags"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_tags</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.db_typeclass_path"><code class="docutils literal notranslate"><span class="pre">ChannelDB.db_typeclass_path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.get_next_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">ChannelDB.get_next_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.get_previous_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">ChannelDB.get_previous_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.id"><code class="docutils literal notranslate"><span class="pre">ChannelDB.id</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.path"><code class="docutils literal notranslate"><span class="pre">ChannelDB.path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.typename"><code class="docutils literal notranslate"><span class="pre">ChannelDB.typename</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.ChannelDB.subscriptions"><code class="docutils literal notranslate"><span class="pre">ChannelDB.subscriptions</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.__init__"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.__init__()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.has"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.has()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.add"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.add()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.remove"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.remove()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.all"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.all()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.get"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.get()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.online"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.online()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SubscriptionHandler.clear"><code class="docutils literal notranslate"><span class="pre">SubscriptionHandler.clear()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler"><code class="docutils literal notranslate"><span class="pre">LockHandler</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.__init__"><code class="docutils literal notranslate"><span class="pre">LockHandler.__init__()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.add"><code class="docutils literal notranslate"><span class="pre">LockHandler.add()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.all"><code class="docutils literal notranslate"><span class="pre">LockHandler.all()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.append"><code class="docutils literal notranslate"><span class="pre">LockHandler.append()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.cache_lock_bypass"><code class="docutils literal notranslate"><span class="pre">LockHandler.cache_lock_bypass()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.check"><code class="docutils literal notranslate"><span class="pre">LockHandler.check()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.check_lockstring"><code class="docutils literal notranslate"><span class="pre">LockHandler.check_lockstring()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.clear"><code class="docutils literal notranslate"><span class="pre">LockHandler.clear()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.delete"><code class="docutils literal notranslate"><span class="pre">LockHandler.delete()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.get"><code class="docutils literal notranslate"><span class="pre">LockHandler.get()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.remove"><code class="docutils literal notranslate"><span class="pre">LockHandler.remove()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.replace"><code class="docutils literal notranslate"><span class="pre">LockHandler.replace()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.reset"><code class="docutils literal notranslate"><span class="pre">LockHandler.reset()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.LockHandler.validate"><code class="docutils literal notranslate"><span class="pre">LockHandler.validate()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.Meta"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.Meta</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.Meta.abstract"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.Meta.abstract</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.at_idmapper_flush"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.at_idmapper_flush()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.cache_instance"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.cache_instance()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.delete"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.delete()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.flush_cached_instance"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.flush_cached_instance()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.flush_from_cache"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.flush_from_cache()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.flush_instance_cache"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.flush_instance_cache()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.get_all_cached_instances"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.get_all_cached_instances()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.get_cached_instance"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.get_cached_instance()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.objects"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.path"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.save"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.save()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.SharedMemoryModel.typename"><code class="docutils literal notranslate"><span class="pre">SharedMemoryModel.typename</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.Tag"><code class="docutils literal notranslate"><span class="pre">Tag</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.Tag.DoesNotExist"><code class="docutils literal notranslate"><span class="pre">Tag.DoesNotExist</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.MultipleObjectsReturned"><code class="docutils literal notranslate"><span class="pre">Tag.MultipleObjectsReturned</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.accountdb_set"><code class="docutils literal notranslate"><span class="pre">Tag.accountdb_set</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.channeldb_set"><code class="docutils literal notranslate"><span class="pre">Tag.channeldb_set</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.db_category"><code class="docutils literal notranslate"><span class="pre">Tag.db_category</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.db_data"><code class="docutils literal notranslate"><span class="pre">Tag.db_data</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.db_key"><code class="docutils literal notranslate"><span class="pre">Tag.db_key</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.db_model"><code class="docutils literal notranslate"><span class="pre">Tag.db_model</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.db_tagtype"><code class="docutils literal notranslate"><span class="pre">Tag.db_tagtype</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.helpentry_set"><code class="docutils literal notranslate"><span class="pre">Tag.helpentry_set</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.id"><code class="docutils literal notranslate"><span class="pre">Tag.id</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.msg_set"><code class="docutils literal notranslate"><span class="pre">Tag.msg_set</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.objectdb_set"><code class="docutils literal notranslate"><span class="pre">Tag.objectdb_set</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.objects"><code class="docutils literal notranslate"><span class="pre">Tag.objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.Tag.scriptdb_set"><code class="docutils literal notranslate"><span class="pre">Tag.scriptdb_set</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler"><code class="docutils literal notranslate"><span class="pre">TagHandler</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.__init__"><code class="docutils literal notranslate"><span class="pre">TagHandler.__init__()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.add"><code class="docutils literal notranslate"><span class="pre">TagHandler.add()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.all"><code class="docutils literal notranslate"><span class="pre">TagHandler.all()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.batch_add"><code class="docutils literal notranslate"><span class="pre">TagHandler.batch_add()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.batch_remove"><code class="docutils literal notranslate"><span class="pre">TagHandler.batch_remove()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.clear"><code class="docutils literal notranslate"><span class="pre">TagHandler.clear()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.get"><code class="docutils literal notranslate"><span class="pre">TagHandler.get()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.has"><code class="docutils literal notranslate"><span class="pre">TagHandler.has()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.remove"><code class="docutils literal notranslate"><span class="pre">TagHandler.remove()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TagHandler.reset_cache"><code class="docutils literal notranslate"><span class="pre">TagHandler.reset_cache()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject"><code class="docutils literal notranslate"><span class="pre">TypedObject</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.Meta"><code class="docutils literal notranslate"><span class="pre">TypedObject.Meta</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.Meta.abstract"><code class="docutils literal notranslate"><span class="pre">TypedObject.Meta.abstract</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.Meta.ordering"><code class="docutils literal notranslate"><span class="pre">TypedObject.Meta.ordering</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.Meta.verbose_name"><code class="docutils literal notranslate"><span class="pre">TypedObject.Meta.verbose_name</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.__init__"><code class="docutils literal notranslate"><span class="pre">TypedObject.__init__()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.access"><code class="docutils literal notranslate"><span class="pre">TypedObject.access()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.aliases"><code class="docutils literal notranslate"><span class="pre">TypedObject.aliases</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.at_idmapper_flush"><code class="docutils literal notranslate"><span class="pre">TypedObject.at_idmapper_flush()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.at_init"><code class="docutils literal notranslate"><span class="pre">TypedObject.at_init()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.at_rename"><code class="docutils literal notranslate"><span class="pre">TypedObject.at_rename()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.attributes"><code class="docutils literal notranslate"><span class="pre">TypedObject.attributes</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.check_permstring"><code class="docutils literal notranslate"><span class="pre">TypedObject.check_permstring()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.date_created"><code class="docutils literal notranslate"><span class="pre">TypedObject.date_created</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db"><code class="docutils literal notranslate"><span class="pre">TypedObject.db</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_attributes"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_attributes</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_date_created"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_date_created</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_key"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_key</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_lock_storage"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_lock_storage</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_tags"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_tags</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.db_typeclass_path"><code class="docutils literal notranslate"><span class="pre">TypedObject.db_typeclass_path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.dbid"><code class="docutils literal notranslate"><span class="pre">TypedObject.dbid</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.dbref"><code class="docutils literal notranslate"><span class="pre">TypedObject.dbref</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.delete"><code class="docutils literal notranslate"><span class="pre">TypedObject.delete()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.get_absolute_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.get_absolute_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.get_display_name"><code class="docutils literal notranslate"><span class="pre">TypedObject.get_display_name()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.get_extra_info"><code class="docutils literal notranslate"><span class="pre">TypedObject.get_extra_info()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.get_next_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">TypedObject.get_next_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.get_previous_by_db_date_created"><code class="docutils literal notranslate"><span class="pre">TypedObject.get_previous_by_db_date_created()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.init_evennia_properties"><code class="docutils literal notranslate"><span class="pre">TypedObject.init_evennia_properties()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.is_typeclass"><code class="docutils literal notranslate"><span class="pre">TypedObject.is_typeclass()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.key"><code class="docutils literal notranslate"><span class="pre">TypedObject.key</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.lock_storage"><code class="docutils literal notranslate"><span class="pre">TypedObject.lock_storage</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.locks"><code class="docutils literal notranslate"><span class="pre">TypedObject.locks</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.name"><code class="docutils literal notranslate"><span class="pre">TypedObject.name</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.nattributes"><code class="docutils literal notranslate"><span class="pre">TypedObject.nattributes</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.ndb"><code class="docutils literal notranslate"><span class="pre">TypedObject.ndb</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.objects"><code class="docutils literal notranslate"><span class="pre">TypedObject.objects</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.path"><code class="docutils literal notranslate"><span class="pre">TypedObject.path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.permissions"><code class="docutils literal notranslate"><span class="pre">TypedObject.permissions</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.search"><code class="docutils literal notranslate"><span class="pre">TypedObject.search()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.set_class_from_typeclass"><code class="docutils literal notranslate"><span class="pre">TypedObject.set_class_from_typeclass()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.swap_typeclass"><code class="docutils literal notranslate"><span class="pre">TypedObject.swap_typeclass()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.tags"><code class="docutils literal notranslate"><span class="pre">TypedObject.tags</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.typeclass_path"><code class="docutils literal notranslate"><span class="pre">TypedObject.typeclass_path</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.typename"><code class="docutils literal notranslate"><span class="pre">TypedObject.typename</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_admin_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_admin_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_create_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_create_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_delete_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_delete_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_detail_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_detail_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_puppet_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_puppet_url()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.TypedObject.web_get_update_url"><code class="docutils literal notranslate"><span class="pre">TypedObject.web_get_update_url()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.crop"><code class="docutils literal notranslate"><span class="pre">crop()</span></code></a></li>
<li><a class="reference internal" href="#evennia.comms.models.lazy_property"><code class="docutils literal notranslate"><span class="pre">lazy_property</span></code></a><ul>
<li><a class="reference internal" href="#evennia.comms.models.lazy_property.__init__"><code class="docutils literal notranslate"><span class="pre">lazy_property.__init__()</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#evennia.comms.models.make_iter"><code class="docutils literal notranslate"><span class="pre">make_iter()</span></code></a></li>
</ul>
</li>
</ul>
<div>
<h4>Previous topic</h4>
<p class="topless"><a href="evennia.comms.managers.html"
title="previous chapter">evennia.comms.managers</a></p>
</div>
<div>
<h4>Next topic</h4>
<p class="topless"><a href="evennia.contrib.html"
title="next chapter">evennia.contrib</a></p>
</div>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../_sources/api/evennia.comms.models.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
<h3>Doc Versions</h3>
<ul>
<li>
<a href="https://www.evennia.com/docs/latest/index.html">latest (main branch)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/5.x/index.html">v5.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/4.x/index.html">v4.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/3.x/index.html">v3.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/2.x/index.html">v2.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/1.x/index.html">v1.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/0.x/index.html">v0.9.5 branch (outdated)</a>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="evennia.contrib.html" title="evennia.contrib"
>next</a> |</li>
<li class="right" >
<a href="evennia.comms.managers.html" title="evennia.comms.managers"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../Evennia-API.html" >API Summary</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="evennia-api.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-3"><a href="evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-4"><a href="evennia.comms.html" >evennia.comms</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.comms.models</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>