Updated HTML docs.

This commit is contained in:
Evennia docbuilder action 2025-03-02 10:09:22 +00:00
parent 59fe09ee6b
commit 61b7ce9594
54 changed files with 1498 additions and 927 deletions

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 2a3dcdbbe70b77788bfd71c5f2115f0c
config: 4cceb786dfe0f9414710db8974f5d63e
tags: 645f666f9bcd5a90fca523b33c5a78b7

View file

@ -203,9 +203,11 @@
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline"></a></h1>
<section id="main-branch">
<h2>Main branch<a class="headerlink" href="#main-branch" title="Permalink to this headline"></a></h2>
<p>Updated dependencies: Twisted &gt;24 (&lt;25). Python 3.10, 3.11, 3.12, 3.13. Will
drop 3.10 support as part of next major release.</p>
<p>Updated dependencies: Django &gt;5.1 (&lt;5,2), Twisted &gt;24 (&lt;25).
Python versions: 3.11, 3.12, 3.13.</p>
<ul class="simple">
<li><p>Feat (backwards incompatible): RUN MIGRATIONS (<code class="docutils literal notranslate"><span class="pre">evennia</span> <span class="pre">migrate</span></code>): Now requiring Django 5.1 (Griatch)</p></li>
<li><p>Feat (backwards incompatible): Drop support and testing for Python 3.10 (Griatch)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3719">Feat</a>: Support Python 3.13. (0xDEADFED5)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3633">Feat</a>: Default objects default descs are now taken from a <code class="docutils literal notranslate"><span class="pre">default_description</span></code>
class variable instead of the <code class="docutils literal notranslate"><span class="pre">desc</span></code> Attribute always being set (count-infinity)</p></li>
@ -214,8 +216,7 @@ class variable instead of the <code class="docutils literal notranslate"><span c
strings instead of <code class="docutils literal notranslate"><span class="pre">None</span></code> if no name is provided, also enforce string type (InspectorCaracal)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3682">Fix</a>: Allow in-game help searching for commands natively starting
with <code class="docutils literal notranslate"><span class="pre">*</span></code> (which is the Lunr search wildcard) (count-infinity)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3684">Fix</a>: Web client stopped auto-focusing the input box after opening
settings (count-infinity)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3684">Fix</a>: Web client stopped auto-focusing the input box after opening settings (count-infinity)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3689">Fix</a>: Partial matching fix in default search, makes sure e.g. <code class="docutils literal notranslate"><span class="pre">b</span> <span class="pre">sw</span></code> uniquely
finds <code class="docutils literal notranslate"><span class="pre">big</span> <span class="pre">sword</span></code> even if another type of sword is around (InspectorCaracal)</p></li>
<li><p><a class="reference external" href="https://github.com/evennia/evennia/pull/3690">Fix</a>: In searches, allow special here and me keywords only be valid queries

View file

@ -107,37 +107,16 @@
<span class="kn">import</span><span class="w"> </span><span class="nn">django</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">global_settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango50Warning</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango60Warning</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">LazyObject</span><span class="p">,</span> <span class="n">empty</span>
<span class="n">ENVIRONMENT_VARIABLE</span> <span class="o">=</span> <span class="s2">&quot;DJANGO_SETTINGS_MODULE&quot;</span>
<span class="n">DEFAULT_STORAGE_ALIAS</span> <span class="o">=</span> <span class="s2">&quot;default&quot;</span>
<span class="n">STATICFILES_STORAGE_ALIAS</span> <span class="o">=</span> <span class="s2">&quot;staticfiles&quot;</span>
<span class="c1"># RemovedInDjango50Warning</span>
<span class="n">USE_DEPRECATED_PYTZ_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The USE_DEPRECATED_PYTZ setting, and support for pytz timezones is &quot;</span>
<span class="s2">&quot;deprecated in favor of the stdlib zoneinfo module. Please update your &quot;</span>
<span class="s2">&quot;code to use zoneinfo and remove the USE_DEPRECATED_PYTZ setting.&quot;</span>
<span class="p">)</span>
<span class="n">USE_L10N_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The USE_L10N setting is deprecated. Starting with Django 5.0, localized &quot;</span>
<span class="s2">&quot;formatting of data will always be enabled. For example Django will &quot;</span>
<span class="s2">&quot;display numbers and dates using the format of the current locale.&quot;</span>
<span class="p">)</span>
<span class="n">CSRF_COOKIE_MASKED_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The CSRF_COOKIE_MASKED transitional setting is deprecated. Support for &quot;</span>
<span class="s2">&quot;it will be removed in Django 5.0.&quot;</span>
<span class="p">)</span>
<span class="n">DEFAULT_FILE_STORAGE_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The DEFAULT_FILE_STORAGE setting is deprecated. Use STORAGES instead.&quot;</span>
<span class="p">)</span>
<span class="n">STATICFILES_STORAGE_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The STATICFILES_STORAGE setting is deprecated. Use STORAGES instead.&quot;</span>
<span class="c1"># RemovedInDjango60Warning.</span>
<span class="n">FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;The FORMS_URLFIELD_ASSUME_HTTPS transitional setting is deprecated.&quot;</span>
<span class="p">)</span>
@ -264,36 +243,6 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">django</span><span class="o">.</span><span class="vm">__file__</span><span class="p">)):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">category</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">USE_L10N</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_show_deprecation_warning</span><span class="p">(</span>
<span class="n">USE_L10N_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="s2">&quot;USE_L10N&quot;</span><span class="p">)</span>
<span class="c1"># RemovedInDjango50Warning.</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_USE_L10N_INTERNAL</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Special hook to avoid checking a traceback in internal use on hot</span>
<span class="c1"># paths.</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="s2">&quot;USE_L10N&quot;</span><span class="p">)</span>
<span class="c1"># RemovedInDjango51Warning.</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">DEFAULT_FILE_STORAGE</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_show_deprecation_warning</span><span class="p">(</span>
<span class="n">DEFAULT_FILE_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="s2">&quot;DEFAULT_FILE_STORAGE&quot;</span><span class="p">)</span>
<span class="c1"># RemovedInDjango51Warning.</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">STATICFILES_STORAGE</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_show_deprecation_warning</span><span class="p">(</span>
<span class="n">STATICFILES_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span>
<span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="s2">&quot;STATICFILES_STORAGE&quot;</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Settings</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">settings_module</span><span class="p">):</span>
@ -328,20 +277,12 @@
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setting</span><span class="p">,</span> <span class="n">setting_value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_explicit_settings</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">setting</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">USE_TZ</span> <span class="ow">is</span> <span class="kc">False</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;USE_TZ&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;FORMS_URLFIELD_ASSUME_HTTPS&quot;</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;The default value of USE_TZ will change from False to True &quot;</span>
<span class="s2">&quot;in Django 5.0. Set USE_TZ to False in your project settings &quot;</span>
<span class="s2">&quot;if you want to keep the current default behavior.&quot;</span><span class="p">,</span>
<span class="n">category</span><span class="o">=</span><span class="n">RemovedInDjango50Warning</span><span class="p">,</span>
<span class="n">FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;USE_DEPRECATED_PYTZ&quot;</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">USE_DEPRECATED_PYTZ_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;CSRF_COOKIE_MASKED&quot;</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">CSRF_COOKIE_MASKED_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">time</span><span class="p">,</span> <span class="s2">&quot;tzset&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">TIME_ZONE</span><span class="p">:</span>
<span class="c1"># When we can, attempt to validate the timezone. If we can&#39;t find</span>
<span class="c1"># this file, no check happens and it&#39;s harmless.</span>
@ -354,43 +295,6 @@
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;TZ&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TIME_ZONE</span>
<span class="n">time</span><span class="o">.</span><span class="n">tzset</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;USE_L10N&quot;</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">USE_L10N_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;DEFAULT_FILE_STORAGE&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;STORAGES&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">&quot;DEFAULT_FILE_STORAGE/STORAGES are mutually exclusive.&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span> <span class="o">=</span> <span class="p">{</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="p">,</span>
<span class="n">DEFAULT_STORAGE_ALIAS</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_FILE_STORAGE</span><span class="p">},</span>
<span class="p">}</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">DEFAULT_FILE_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;STATICFILES_STORAGE&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;STORAGES&quot;</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">ImproperlyConfigured</span><span class="p">(</span>
<span class="s2">&quot;STATICFILES_STORAGE/STORAGES are mutually exclusive.&quot;</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span> <span class="o">=</span> <span class="p">{</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="p">,</span>
<span class="n">STATICFILES_STORAGE_ALIAS</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">STATICFILES_STORAGE</span><span class="p">},</span>
<span class="p">}</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">STATICFILES_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span><span class="p">)</span>
<span class="c1"># RemovedInDjango51Warning.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_overridden</span><span class="p">(</span><span class="s2">&quot;STORAGES&quot;</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;DEFAULT_FILE_STORAGE&quot;</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">DEFAULT_STORAGE_ALIAS</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="s2">&quot;STATICFILES_STORAGE&quot;</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">STATICFILES_STORAGE_ALIAS</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">is_overridden</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setting</span><span class="p">):</span>
<span class="k">return</span> <span class="n">setting</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_explicit_settings</span>
@ -423,47 +327,12 @@
<span class="k">def</span><span class="w"> </span><span class="fm">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deleted</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;USE_L10N&quot;</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">USE_L10N_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;CSRF_COOKIE_MASKED&quot;</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">CSRF_COOKIE_MASKED_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;DEFAULT_FILE_STORAGE&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="p">[</span><span class="n">DEFAULT_STORAGE_ALIAS</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_FILE_STORAGE</span>
<span class="p">}</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">DEFAULT_FILE_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;STATICFILES_STORAGE&quot;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="p">[</span><span class="n">STATICFILES_STORAGE_ALIAS</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">STATICFILES_STORAGE</span>
<span class="p">}</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">STATICFILES_STORAGE_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango51Warning</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;FORMS_URLFIELD_ASSUME_HTTPS&quot;</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="n">FORMS_URLFIELD_ASSUME_HTTPS_DEPRECATED_MSG</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;USE_DEPRECATED_PYTZ&quot;</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">USE_DEPRECATED_PYTZ_DEPRECATED_MSG</span><span class="p">,</span> <span class="n">RemovedInDjango50Warning</span><span class="p">)</span>
<span class="c1"># RemovedInDjango51Warning.</span>
<span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;STORAGES&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">default_file_storage</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">DEFAULT_STORAGE_ALIAS</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span>
<span class="s2">&quot;DEFAULT_FILE_STORAGE&quot;</span><span class="p">,</span> <span class="n">default_file_storage</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span>
<span class="n">DEFAULT_STORAGE_ALIAS</span><span class="p">,</span>
<span class="p">{</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="s2">&quot;django.core.files.storage.FileSystemStorage&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">staticfiles_storage</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">STATICFILES_STORAGE_ALIAS</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span>
<span class="s2">&quot;STATICFILES_STORAGE&quot;</span><span class="p">,</span> <span class="n">staticfiles_storage</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;BACKEND&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">STORAGES</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span>
<span class="n">STATICFILES_STORAGE_ALIAS</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;BACKEND&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;django.contrib.staticfiles.storage.StaticFilesStorage&quot;</span>
<span class="p">),</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__delattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deleted</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>

View file

@ -154,6 +154,8 @@
<span class="sd"> ``ReverseManyToManyDescriptor``, use ``ManyToManyDescriptor`` instead.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">asgiref.sync</span><span class="w"> </span><span class="kn">import</span> <span class="n">sync_to_async</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">FieldError</span>
@ -164,12 +166,13 @@
<span class="n">router</span><span class="p">,</span>
<span class="n">transaction</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Q</span><span class="p">,</span> <span class="n">Window</span><span class="p">,</span> <span class="n">signals</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">Manager</span><span class="p">,</span> <span class="n">Q</span><span class="p">,</span> <span class="n">Window</span><span class="p">,</span> <span class="n">signals</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.functions</span><span class="w"> </span><span class="kn">import</span> <span class="n">RowNumber</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.lookups</span><span class="w"> </span><span class="kn">import</span> <span class="n">GreaterThan</span><span class="p">,</span> <span class="n">LessThanOrEqual</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.query</span><span class="w"> </span><span class="kn">import</span> <span class="n">QuerySet</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.query_utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">DeferredAttribute</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">AltersData</span><span class="p">,</span> <span class="n">resolve_callables</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango60Warning</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">cached_property</span>
@ -244,8 +247,23 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">hints</span><span class="o">=</span><span class="n">hints</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() &quot;</span>
<span class="s2">&quot;instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="p">[</span><span class="n">queryset</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_querysets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">querysets</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">querysets</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">querysets</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;querysets argument of get_prefetch_querysets() should have a length &quot;</span>
<span class="s2">&quot;of 1.&quot;</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">querysets</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">rel_obj_attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_foreign_related_value</span>
@ -260,7 +278,7 @@
<span class="c1"># (related_name ends with a &#39;+&#39;). Refs #21410.</span>
<span class="c1"># The check for len(...) == 1 is a special case that allows the query</span>
<span class="c1"># to be join-less and smaller. Refs #21760.</span>
<span class="k">if</span> <span class="n">remote_field</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">()</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">if</span> <span class="n">remote_field</span><span class="o">.</span><span class="n">hidden</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">foreign_related_fields</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">query</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__in&quot;</span>
<span class="o">%</span> <span class="n">related_field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="p">{</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">}</span>
@ -268,6 +286,9 @@
<span class="k">else</span><span class="p">:</span>
<span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__in&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">():</span> <span class="n">instances</span><span class="p">}</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">query</span><span class="p">)</span>
<span class="c1"># There can be only one object prefetched for each instance so clear</span>
<span class="c1"># ordering if the query allows it without side effects.</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">clear_ordering</span><span class="p">()</span>
<span class="c1"># Since we&#39;re going to assign directly in the cache,</span>
<span class="c1"># we must manage the reverse relation cache manually.</span>
@ -280,7 +301,7 @@
<span class="n">rel_obj_attr</span><span class="p">,</span>
<span class="n">instance_attr</span><span class="p">,</span>
<span class="kc">True</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span>
<span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
@ -518,8 +539,23 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">hints</span><span class="o">=</span><span class="n">hints</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() &quot;</span>
<span class="s2">&quot;instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="p">[</span><span class="n">queryset</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_querysets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">querysets</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">querysets</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">querysets</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;querysets argument of get_prefetch_querysets() should have a length &quot;</span>
<span class="s2">&quot;of 1.&quot;</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">querysets</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">rel_obj_attr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">get_local_related_value</span>
@ -527,6 +563,9 @@
<span class="n">instances_dict</span> <span class="o">=</span> <span class="p">{</span><span class="n">instance_attr</span><span class="p">(</span><span class="n">inst</span><span class="p">):</span> <span class="n">inst</span> <span class="k">for</span> <span class="n">inst</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">}</span>
<span class="n">query</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__in&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">instances</span><span class="p">}</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">query</span><span class="p">)</span>
<span class="c1"># There can be only one object prefetched for each instance so clear</span>
<span class="c1"># ordering if the query allows it without side effects.</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">clear_ordering</span><span class="p">()</span>
<span class="c1"># Since we&#39;re going to assign directly in the cache,</span>
<span class="c1"># we must manage the reverse relation cache manually.</span>
@ -538,7 +577,7 @@
<span class="n">rel_obj_attr</span><span class="p">,</span>
<span class="n">instance_attr</span><span class="p">,</span>
<span class="kc">True</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">cache_name</span><span class="p">,</span>
<span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
@ -582,7 +621,7 @@
<span class="k">if</span> <span class="n">rel_obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">RelatedObjectDoesNotExist</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> has no </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">())</span>
<span class="o">%</span> <span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">accessor_name</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">rel_obj</span>
@ -622,7 +661,7 @@
<span class="o">%</span> <span class="p">(</span>
<span class="n">value</span><span class="p">,</span>
<span class="n">instance</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">accessor_name</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">related</span><span class="o">.</span><span class="n">related_model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
@ -710,7 +749,7 @@
<span class="k">def</span><span class="w"> </span><span class="nf">_get_set_deprecation_msg_params</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span>
<span class="s2">&quot;reverse side of a related set&quot;</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">accessor_name</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
@ -796,7 +835,7 @@
<span class="k">def</span><span class="w"> </span><span class="nf">_remove_prefetched_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">cache_name</span>
<span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
<span class="k">pass</span> <span class="c1"># nothing to clear from cache</span>
@ -812,16 +851,30 @@
<span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="p">[</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">cache_name</span>
<span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_rel_filters</span><span class="p">(</span><span class="n">queryset</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() &quot;</span>
<span class="s2">&quot;instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="p">[</span><span class="n">queryset</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_querysets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">querysets</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">querysets</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">querysets</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;querysets argument of get_prefetch_querysets() should have a &quot;</span>
<span class="s2">&quot;length of 1.&quot;</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">querysets</span> <span class="k">else</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">queryset</span><span class="o">.</span><span class="n">_db</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="p">)</span>
@ -836,7 +889,7 @@
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">is_cached</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">):</span>
<span class="n">instance</span> <span class="o">=</span> <span class="n">instances_dict</span><span class="p">[</span><span class="n">rel_obj_attr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">)]</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">instance</span><span class="p">)</span>
<span class="n">cache_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">get_cache_name</span><span class="p">()</span>
<span class="n">cache_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">cache_name</span>
<span class="k">return</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">rel_obj_attr</span><span class="p">,</span> <span class="n">instance_attr</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="n">cache_name</span><span class="p">,</span> <span class="kc">False</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">,</span> <span class="n">bulk</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
@ -885,6 +938,7 @@
<span class="k">def</span><span class="w"> </span><span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_fk_val</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_remove_prefetched_objects</span><span class="p">()</span>
<span class="n">kwargs</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">RelatedManager</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">))</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
@ -1062,7 +1116,7 @@
<span class="k">return</span> <span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> side of a many-to-many set&quot;</span>
<span class="o">%</span> <span class="p">(</span><span class="s2">&quot;reverse&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="k">else</span> <span class="s2">&quot;forward&quot;</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_accessor_name</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">accessor_name</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reverse</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="p">)</span>
@ -1164,6 +1218,12 @@
<span class="n">queryset</span><span class="o">.</span><span class="n">_defer_next_filter</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">queryset</span><span class="o">.</span><span class="n">_next_is_sticky</span><span class="p">()</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">core_filters</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_remove_prefetched_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">)</span>
@ -1171,16 +1231,30 @@
<span class="k">pass</span> <span class="c1"># nothing to clear from cache</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">prefetch_cache_name</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">KeyError</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">cache</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_cache</span><span class="p">())</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">cache</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_rel_filters</span><span class="p">(</span><span class="n">queryset</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;get_prefetch_queryset() is deprecated. Use get_prefetch_querysets() &quot;</span>
<span class="s2">&quot;instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">queryset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="p">[</span><span class="n">queryset</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetch_querysets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instances</span><span class="p">,</span> <span class="n">querysets</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">querysets</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">querysets</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;querysets argument of get_prefetch_querysets() should have a &quot;</span>
<span class="s2">&quot;length of 1.&quot;</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">querysets</span> <span class="k">else</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">()</span>
<span class="n">queryset</span><span class="o">.</span><span class="n">_add_hints</span><span class="p">(</span><span class="n">instance</span><span class="o">=</span><span class="n">instances</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">queryset</span><span class="o">.</span><span class="n">_db</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_db</span><span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">_filter_prefetch_queryset</span><span class="p">(</span>
@ -1209,7 +1283,10 @@
<span class="k">return</span> <span class="p">(</span>
<span class="n">queryset</span><span class="p">,</span>
<span class="k">lambda</span> <span class="n">result</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s2">&quot;_prefetch_related_val_</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="n">f</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;_prefetch_related_val_</span><span class="si">{</span><span class="n">f</span><span class="o">.</span><span class="n">attname</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">),</span>
<span class="n">connection</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fk</span><span class="o">.</span><span class="n">local_related_fields</span>
<span class="p">),</span>
<span class="k">lambda</span> <span class="n">inst</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">(</span>
@ -1221,6 +1298,45 @@
<span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">constrained_target</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># If the through relation&#39;s target field&#39;s foreign integrity is</span>
<span class="c1"># enforced, the query can be performed solely against the through</span>
<span class="c1"># table as the INNER JOIN&#39;ing against target table is unnecessary.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">db_constraint</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_foreign_keys</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">hints</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;instance&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">}</span>
<span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="o">.</span><span class="n">_base_manager</span><span class="o">.</span><span class="n">db_manager</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="n">hints</span><span class="o">=</span><span class="n">hints</span><span class="p">)</span>
<span class="n">filters</span> <span class="o">=</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">source_field_name</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">}</span>
<span class="c1"># Nullable target rows must be excluded as well as they would have</span>
<span class="c1"># been filtered out from an INNER JOIN.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="n">filters</span><span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">__isnull&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">target_field_name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">return</span> <span class="n">manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="n">filters</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">exists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">superclass</span> <span class="ow">is</span> <span class="n">Manager</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_cache</span><span class="p">()</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="p">(</span><span class="n">constrained_target</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">constrained_target</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="k">return</span> <span class="n">constrained_target</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">superclass</span> <span class="ow">is</span> <span class="n">Manager</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prefetch_cache</span><span class="p">()</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">and</span> <span class="p">(</span><span class="n">constrained_target</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">constrained_target</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="k">return</span> <span class="n">constrained_target</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">objs</span><span class="p">,</span> <span class="n">through_defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_remove_prefetched_objects</span><span class="p">()</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">router</span><span class="o">.</span><span class="n">db_for_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">through</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">)</span>

View file

@ -124,7 +124,7 @@
<span class="n">resolve_callables</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">timezone</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango50Warning</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango60Warning</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">cached_property</span><span class="p">,</span> <span class="n">partition</span>
<span class="c1"># The maximum number of results to fetch in a get() query.</span>
@ -200,9 +200,11 @@
<span class="n">related_objs</span><span class="p">,</span>
<span class="n">operator</span><span class="o">.</span><span class="n">attrgetter</span><span class="p">(</span>
<span class="o">*</span><span class="p">[</span>
<span class="n">field</span><span class="o">.</span><span class="n">attname</span>
<span class="k">if</span> <span class="n">from_field</span> <span class="o">==</span> <span class="s2">&quot;self&quot;</span>
<span class="k">else</span> <span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">from_field</span><span class="p">)</span><span class="o">.</span><span class="n">attname</span>
<span class="p">(</span>
<span class="n">field</span><span class="o">.</span><span class="n">attname</span>
<span class="k">if</span> <span class="n">from_field</span> <span class="o">==</span> <span class="s2">&quot;self&quot;</span>
<span class="k">else</span> <span class="n">queryset</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">from_field</span><span class="p">)</span><span class="o">.</span><span class="n">attname</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">from_field</span> <span class="ow">in</span> <span class="n">field</span><span class="o">.</span><span class="n">from_fields</span>
<span class="p">]</span>
<span class="p">),</span>
@ -620,16 +622,9 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">chunk_size</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefetch_related_lookups</span><span class="p">:</span>
<span class="c1"># When the deprecation ends, replace with:</span>
<span class="c1"># raise ValueError(</span>
<span class="c1"># &#39;chunk_size must be provided when using &#39;</span>
<span class="c1"># &#39;QuerySet.iterator() after prefetch_related().&#39;</span>
<span class="c1"># )</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Using QuerySet.iterator() after prefetch_related() &quot;</span>
<span class="s2">&quot;without specifying chunk_size is deprecated.&quot;</span><span class="p">,</span>
<span class="n">category</span><span class="o">=</span><span class="n">RemovedInDjango50Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;chunk_size must be provided when using QuerySet.iterator() after &quot;</span>
<span class="s2">&quot;prefetch_related().&quot;</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">chunk_size</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Chunk size must be strictly positive.&quot;</span><span class="p">)</span>
@ -643,19 +638,36 @@
<span class="sd"> An asynchronous iterator over the results from applying this QuerySet</span>
<span class="sd"> to the database.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefetch_related_lookups</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span>
<span class="s2">&quot;Using QuerySet.aiterator() after prefetch_related() is not supported.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">chunk_size</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Chunk size must be strictly positive.&quot;</span><span class="p">)</span>
<span class="n">use_chunked_fetch</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">connections</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">]</span><span class="o">.</span><span class="n">settings_dict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;DISABLE_SERVER_SIDE_CURSORS&quot;</span>
<span class="p">)</span>
<span class="k">async</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iterable_class</span><span class="p">(</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iterable_class</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">chunked_fetch</span><span class="o">=</span><span class="n">use_chunked_fetch</span><span class="p">,</span> <span class="n">chunk_size</span><span class="o">=</span><span class="n">chunk_size</span>
<span class="p">):</span>
<span class="k">yield</span> <span class="n">item</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_prefetch_related_lookups</span><span class="p">:</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">async</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">chunk_size</span><span class="p">:</span>
<span class="k">await</span> <span class="n">aprefetch_related_objects</span><span class="p">(</span>
<span class="n">results</span><span class="p">,</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_prefetch_related_lookups</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">result</span>
<span class="n">results</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="k">if</span> <span class="n">results</span><span class="p">:</span>
<span class="k">await</span> <span class="n">aprefetch_related_objects</span><span class="p">(</span>
<span class="n">results</span><span class="p">,</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_prefetch_related_lookups</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">result</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">async</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
<span class="k">yield</span> <span class="n">item</span>
<span class="k">def</span><span class="w"> </span><span class="nf">aggregate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
@ -744,6 +756,15 @@
<span class="sd"> Create a new object with the given kwargs, saving it to the database</span>
<span class="sd"> and returning the created object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">reverse_one_to_one_fields</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">_reverse_one_to_one_field_names</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">reverse_one_to_one_fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;The following fields do not exist in this model: </span><span class="si">%s</span><span class="s2">&quot;</span>
<span class="o">%</span> <span class="s2">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">reverse_one_to_one_fields</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_for_write</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">force_insert</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
@ -753,10 +774,21 @@
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">create</span><span class="p">)(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_prepare_for_bulk_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objs</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">DatabaseDefault</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">]</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">objs</span><span class="p">:</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">pk</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Populate new PK values.</span>
<span class="n">obj</span><span class="o">.</span><span class="n">pk</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">get_pk_value_on_save</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_default_keyword_in_bulk_insert</span><span class="p">:</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">DatabaseDefault</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">db_default</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_prepare_related_fields_for_save</span><span class="p">(</span><span class="n">operation_name</span><span class="o">=</span><span class="s2">&quot;bulk_create&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_bulk_create_options</span><span class="p">(</span>
@ -847,7 +879,7 @@
<span class="c1"># model to detect the inheritance pattern ConcreteGrandParent -&gt;</span>
<span class="c1"># MultiTableParent -&gt; ProxyChild. Simply checking self.model._meta.proxy</span>
<span class="c1"># would not identify that case as involving multiple tables.</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_parent_list</span><span class="p">():</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parent</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Can&#39;t bulk create a multi-table inherited model&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">objs</span><span class="p">:</span>
@ -868,7 +900,7 @@
<span class="n">unique_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_for_write</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">fields</span> <span class="o">=</span> <span class="n">opts</span><span class="o">.</span><span class="n">concrete_fields</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">concrete_fields</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">f</span><span class="o">.</span><span class="n">generated</span><span class="p">]</span>
<span class="n">objs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prepare_for_bulk_create</span><span class="p">(</span><span class="n">objs</span><span class="p">)</span>
<span class="k">with</span> <span class="n">transaction</span><span class="o">.</span><span class="n">atomic</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">,</span> <span class="n">savepoint</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
@ -1025,25 +1057,32 @@
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">update_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">update_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">create_defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Look up an object with the given kwargs, updating one with defaults</span>
<span class="sd"> if it exists, otherwise create a new one.</span>
<span class="sd"> if it exists, otherwise create a new one. Optionally, an object can</span>
<span class="sd"> be created with different values than defaults by using</span>
<span class="sd"> create_defaults.</span>
<span class="sd"> Return a tuple (object, created), where created is a boolean</span>
<span class="sd"> specifying whether an object was created.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="n">defaults</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">update_defaults</span> <span class="o">=</span> <span class="n">defaults</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">create_defaults</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">create_defaults</span> <span class="o">=</span> <span class="n">update_defaults</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_for_write</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">with</span> <span class="n">transaction</span><span class="o">.</span><span class="n">atomic</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">):</span>
<span class="c1"># Lock the row so that a concurrent update is blocked until</span>
<span class="c1"># update_or_create() has performed its save.</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">select_for_update</span><span class="p">()</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="n">defaults</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">obj</span><span class="p">,</span> <span class="n">created</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">select_for_update</span><span class="p">()</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
<span class="n">create_defaults</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">created</span><span class="p">:</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="n">created</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">resolve_callables</span><span class="p">(</span><span class="n">defaults</span><span class="p">):</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">resolve_callables</span><span class="p">(</span><span class="n">update_defaults</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="n">update_fields</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span>
<span class="n">update_fields</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">update_defaults</span><span class="p">)</span>
<span class="n">concrete_field_names</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">_non_pk_concrete_field_names</span>
<span class="c1"># update_fields does not support non-concrete fields.</span>
<span class="k">if</span> <span class="n">concrete_field_names</span><span class="o">.</span><span class="n">issuperset</span><span class="p">(</span><span class="n">update_fields</span><span class="p">):</span>
@ -1063,9 +1102,10 @@
<span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="p">,</span> <span class="kc">False</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">aupdate_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">aupdate_or_create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">create_defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">update_or_create</span><span class="p">)(</span>
<span class="n">defaults</span><span class="o">=</span><span class="n">defaults</span><span class="p">,</span>
<span class="n">create_defaults</span><span class="o">=</span><span class="n">create_defaults</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span>
@ -1199,9 +1239,9 @@
<span class="n">qs</span> <span class="o">=</span> <span class="p">()</span>
<span class="k">for</span> <span class="n">offset</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">id_list</span><span class="p">),</span> <span class="n">batch_size</span><span class="p">):</span>
<span class="n">batch</span> <span class="o">=</span> <span class="n">id_list</span><span class="p">[</span><span class="n">offset</span> <span class="p">:</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">batch_size</span><span class="p">]</span>
<span class="n">qs</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">filter_key</span><span class="p">:</span> <span class="n">batch</span><span class="p">})</span><span class="o">.</span><span class="n">order_by</span><span class="p">())</span>
<span class="n">qs</span> <span class="o">+=</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">filter_key</span><span class="p">:</span> <span class="n">batch</span><span class="p">}))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">filter_key</span><span class="p">:</span> <span class="n">id_list</span><span class="p">})</span><span class="o">.</span><span class="n">order_by</span><span class="p">()</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">filter_key</span><span class="p">:</span> <span class="n">id_list</span><span class="p">})</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">qs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_chain</span><span class="p">()</span>
<span class="k">return</span> <span class="p">{</span><span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span> <span class="n">obj</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">qs</span><span class="p">}</span>
@ -1217,8 +1257,8 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_not_support_combined_queries</span><span class="p">(</span><span class="s2">&quot;delete&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">is_sliced</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Cannot use &#39;limit&#39; or &#39;offset&#39; with delete().&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">distinct</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">distinct_fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Cannot call delete() after .distinct().&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">distinct_fields</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Cannot call delete() after .distinct(*fields).&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fields</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Cannot call delete() after .values() or .values_list()&quot;</span><span class="p">)</span>
@ -1236,11 +1276,11 @@
<span class="n">collector</span> <span class="o">=</span> <span class="n">Collector</span><span class="p">(</span><span class="n">using</span><span class="o">=</span><span class="n">del_query</span><span class="o">.</span><span class="n">db</span><span class="p">,</span> <span class="n">origin</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="n">collector</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="n">del_query</span><span class="p">)</span>
<span class="n">deleted</span><span class="p">,</span> <span class="n">_rows_count</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="n">num_deleted</span><span class="p">,</span> <span class="n">num_deleted_per_model</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="c1"># Clear the result cache, in case this QuerySet gets reused.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_result_cache</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">deleted</span><span class="p">,</span> <span class="n">_rows_count</span>
<span class="k">return</span> <span class="n">num_deleted</span><span class="p">,</span> <span class="n">num_deleted_per_model</span>
<span class="n">delete</span><span class="o">.</span><span class="n">alters_data</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">delete</span><span class="o">.</span><span class="n">queryset_only</span> <span class="o">=</span> <span class="kc">True</span>
@ -1281,11 +1321,18 @@
<span class="c1"># Inline annotations in order_by(), if possible.</span>
<span class="n">new_order_by</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">order_by</span><span class="p">:</span>
<span class="k">if</span> <span class="n">annotation</span> <span class="o">:=</span> <span class="n">query</span><span class="o">.</span><span class="n">annotations</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">col</span><span class="p">):</span>
<span class="n">alias</span> <span class="o">=</span> <span class="n">col</span>
<span class="n">descending</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">alias</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">):</span>
<span class="n">alias</span> <span class="o">=</span> <span class="n">alias</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">)</span>
<span class="n">descending</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">annotation</span> <span class="o">:=</span> <span class="n">query</span><span class="o">.</span><span class="n">annotations</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">alias</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">annotation</span><span class="p">,</span> <span class="s2">&quot;contains_aggregate&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">FieldError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Cannot update when ordering by an aggregate: </span><span class="si">{</span><span class="n">annotation</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">descending</span><span class="p">:</span>
<span class="n">annotation</span> <span class="o">=</span> <span class="n">annotation</span><span class="o">.</span><span class="n">desc</span><span class="p">()</span>
<span class="n">new_order_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">annotation</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_order_by</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">col</span><span class="p">)</span>
@ -1437,9 +1484,7 @@
<span class="n">clone</span><span class="o">.</span><span class="n">_iterable_class</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">NamedValuesListIterable</span>
<span class="k">if</span> <span class="n">named</span>
<span class="k">else</span> <span class="n">FlatValuesListIterable</span>
<span class="k">if</span> <span class="n">flat</span>
<span class="k">else</span> <span class="n">ValuesListIterable</span>
<span class="k">else</span> <span class="n">FlatValuesListIterable</span> <span class="k">if</span> <span class="n">flat</span> <span class="k">else</span> <span class="n">ValuesListIterable</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">clone</span>
@ -1463,11 +1508,7 @@
<span class="o">.</span><span class="n">order_by</span><span class="p">((</span><span class="s2">&quot;-&quot;</span> <span class="k">if</span> <span class="n">order</span> <span class="o">==</span> <span class="s2">&quot;DESC&quot;</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;datefield&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="c1"># RemovedInDjango50Warning: when the deprecation ends, remove is_dst</span>
<span class="c1"># argument.</span>
<span class="k">def</span><span class="w"> </span><span class="nf">datetimes</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="s2">&quot;ASC&quot;</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">is_dst</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">NOT_PASSED</span>
<span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">datetimes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="s2">&quot;ASC&quot;</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a list of datetime objects representing all available</span>
<span class="sd"> datetimes for the given field_name, scoped to &#39;kind&#39;.</span>
@ -1491,7 +1532,6 @@
<span class="n">kind</span><span class="p">,</span>
<span class="n">output_field</span><span class="o">=</span><span class="n">DateTimeField</span><span class="p">(),</span>
<span class="n">tzinfo</span><span class="o">=</span><span class="n">tzinfo</span><span class="p">,</span>
<span class="n">is_dst</span><span class="o">=</span><span class="n">is_dst</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">plain_field</span><span class="o">=</span><span class="n">F</span><span class="p">(</span><span class="n">field_name</span><span class="p">),</span>
<span class="p">)</span>
@ -1710,9 +1750,11 @@
<span class="k">if</span> <span class="n">names</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span>
<span class="n">chain</span><span class="o">.</span><span class="n">from_iterable</span><span class="p">(</span>
<span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;attname&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,)</span>
<span class="p">(</span>
<span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;attname&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,)</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_fields</span><span class="p">()</span>
<span class="p">)</span>
<span class="p">)</span>
@ -1917,12 +1959,17 @@
<span class="n">inserted_rows</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">bulk_return</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">can_return_rows_from_bulk_insert</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="p">[</span><span class="n">objs</span><span class="p">[</span><span class="n">i</span> <span class="p">:</span> <span class="n">i</span> <span class="o">+</span> <span class="n">batch_size</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">objs</span><span class="p">),</span> <span class="n">batch_size</span><span class="p">)]:</span>
<span class="k">if</span> <span class="n">bulk_return</span> <span class="ow">and</span> <span class="n">on_conflict</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">bulk_return</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">on_conflict</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">on_conflict</span> <span class="o">==</span> <span class="n">OnConflict</span><span class="o">.</span><span class="n">UPDATE</span>
<span class="p">):</span>
<span class="n">inserted_rows</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_insert</span><span class="p">(</span>
<span class="n">item</span><span class="p">,</span>
<span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span>
<span class="n">using</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">,</span>
<span class="n">on_conflict</span><span class="o">=</span><span class="n">on_conflict</span><span class="p">,</span>
<span class="n">update_fields</span><span class="o">=</span><span class="n">update_fields</span><span class="p">,</span>
<span class="n">unique_fields</span><span class="o">=</span><span class="n">unique_fields</span><span class="p">,</span>
<span class="n">returning_fields</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_returning_fields</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
@ -2230,8 +2277,7 @@
<span class="n">converter</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">]</span><span class="o">.</span><span class="n">introspection</span><span class="o">.</span><span class="n">identifier_converter</span>
<span class="n">model_fields</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="n">name</span><span class="p">,</span> <span class="n">column</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">get_attname_column</span><span class="p">()</span>
<span class="n">model_fields</span><span class="p">[</span><span class="n">converter</span><span class="p">(</span><span class="n">column</span><span class="p">)]</span> <span class="o">=</span> <span class="n">field</span>
<span class="n">model_fields</span><span class="p">[</span><span class="n">converter</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">column</span><span class="p">)]</span> <span class="o">=</span> <span class="n">field</span>
<span class="k">return</span> <span class="n">model_fields</span>
@ -2283,8 +2329,21 @@
<span class="k">return</span> <span class="n">to_attr</span><span class="p">,</span> <span class="n">as_attr</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_current_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_current_prefetch_to</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefetch_to</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Prefetch.get_current_queryset() is deprecated. Use &quot;</span>
<span class="s2">&quot;get_current_querysets() instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">querysets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_current_querysets</span><span class="p">(</span><span class="n">level</span><span class="p">)</span>
<span class="k">return</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">querysets</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_current_querysets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">get_current_prefetch_to</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefetch_to</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="p">]</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
@ -2462,23 +2521,42 @@
<span class="n">obj_list</span> <span class="o">=</span> <span class="n">new_obj_list</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">aprefetch_related_objects</span><span class="p">(</span><span class="n">model_instances</span><span class="p">,</span> <span class="o">*</span><span class="n">related_lookups</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;See prefetch_related_objects().&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="k">await</span> <span class="n">sync_to_async</span><span class="p">(</span><span class="n">prefetch_related_objects</span><span class="p">)(</span>
<span class="n">model_instances</span><span class="p">,</span> <span class="o">*</span><span class="n">related_lookups</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prefetcher</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">through_attr</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> For the attribute &#39;through_attr&#39; on the given instance, find</span>
<span class="sd"> an object that has a get_prefetch_queryset().</span>
<span class="sd"> an object that has a get_prefetch_querysets().</span>
<span class="sd"> Return a 4 tuple containing:</span>
<span class="sd"> (the object with get_prefetch_queryset (or None),</span>
<span class="sd"> (the object with get_prefetch_querysets (or None),</span>
<span class="sd"> the descriptor object representing this relationship (or None),</span>
<span class="sd"> a boolean that is False if the attribute was not found at all,</span>
<span class="sd"> a function that takes an instance and returns a boolean that is True if</span>
<span class="sd"> the attribute has already been fetched for that instance)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_to_attr_attribute</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">is_to_attr_fetched</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">):</span>
<span class="c1"># Special case cached_property instances because hasattr() triggers</span>
<span class="c1"># attribute computation and assignment.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">cached_property</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_cached_property</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="n">to_attr</span> <span class="ow">in</span> <span class="n">instance</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="k">return</span> <span class="n">has_cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_to_attr_attribute</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">has_to_attr_attribute</span>
<span class="n">prefetcher</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">is_fetched</span> <span class="o">=</span> <span class="n">has_to_attr_attribute</span>
<span class="n">is_fetched</span> <span class="o">=</span> <span class="n">is_to_attr_fetched</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">)</span>
<span class="c1"># For singly related objects, we have to avoid getting the attribute</span>
<span class="c1"># from the object, as this will trigger the query. So we first try</span>
@ -2490,29 +2568,31 @@
<span class="n">attr_found</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">rel_obj_descriptor</span><span class="p">:</span>
<span class="c1"># singly related object, descriptor object has the</span>
<span class="c1"># get_prefetch_queryset() method.</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj_descriptor</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_queryset&quot;</span><span class="p">):</span>
<span class="c1"># get_prefetch_querysets() method.</span>
<span class="k">if</span> <span class="p">(</span>
<span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj_descriptor</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_querysets&quot;</span><span class="p">)</span>
<span class="c1"># RemovedInDjango60Warning.</span>
<span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj_descriptor</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_queryset&quot;</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">prefetcher</span> <span class="o">=</span> <span class="n">rel_obj_descriptor</span>
<span class="n">is_fetched</span> <span class="o">=</span> <span class="n">rel_obj_descriptor</span><span class="o">.</span><span class="n">is_cached</span>
<span class="c1"># If to_attr is set, check if the value has already been set,</span>
<span class="c1"># which is done with has_to_attr_attribute(). Do not use the</span>
<span class="c1"># method from the descriptor, as the cache_name it defines</span>
<span class="c1"># checks the field name, not the to_attr value.</span>
<span class="k">if</span> <span class="n">through_attr</span> <span class="o">==</span> <span class="n">to_attr</span><span class="p">:</span>
<span class="n">is_fetched</span> <span class="o">=</span> <span class="n">rel_obj_descriptor</span><span class="o">.</span><span class="n">is_cached</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># descriptor doesn&#39;t support prefetching, so we go ahead and get</span>
<span class="c1"># the attribute on the instance rather than the class to</span>
<span class="c1"># support many related managers</span>
<span class="n">rel_obj</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">through_attr</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_queryset&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_querysets&quot;</span><span class="p">)</span>
<span class="c1"># RemovedInDjango60Warning.</span>
<span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rel_obj</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_queryset&quot;</span><span class="p">)</span>
<span class="p">):</span>
<span class="n">prefetcher</span> <span class="o">=</span> <span class="n">rel_obj</span>
<span class="k">if</span> <span class="n">through_attr</span> <span class="o">!=</span> <span class="n">to_attr</span><span class="p">:</span>
<span class="c1"># Special case cached_property instances because hasattr</span>
<span class="c1"># triggers attribute computation and assignment.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">to_attr</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span> <span class="n">cached_property</span>
<span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_cached_property</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="n">to_attr</span> <span class="ow">in</span> <span class="n">instance</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="n">is_fetched</span> <span class="o">=</span> <span class="n">has_cached_property</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">through_attr</span> <span class="o">==</span> <span class="n">to_attr</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">in_prefetched_cache</span><span class="p">(</span><span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="n">through_attr</span> <span class="ow">in</span> <span class="n">instance</span><span class="o">.</span><span class="n">_prefetched_objects_cache</span>
@ -2531,7 +2611,7 @@
<span class="sd"> Return the prefetched objects along with any additional prefetches that</span>
<span class="sd"> must be done due to prefetch_related lookups found from default managers.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># prefetcher must have a method get_prefetch_queryset() which takes a list</span>
<span class="c1"># prefetcher must have a method get_prefetch_querysets() which takes a list</span>
<span class="c1"># of instances, and returns a tuple:</span>
<span class="c1"># (queryset of instances of self.model that are related to passed in instances,</span>
@ -2544,14 +2624,35 @@
<span class="c1"># The &#39;values to be matched&#39; must be hashable as they will be used</span>
<span class="c1"># in a dictionary.</span>
<span class="p">(</span>
<span class="n">rel_qs</span><span class="p">,</span>
<span class="n">rel_obj_attr</span><span class="p">,</span>
<span class="n">instance_attr</span><span class="p">,</span>
<span class="n">single</span><span class="p">,</span>
<span class="n">cache_name</span><span class="p">,</span>
<span class="n">is_descriptor</span><span class="p">,</span>
<span class="p">)</span> <span class="o">=</span> <span class="n">prefetcher</span><span class="o">.</span><span class="n">get_prefetch_queryset</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="n">lookup</span><span class="o">.</span><span class="n">get_current_queryset</span><span class="p">(</span><span class="n">level</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">prefetcher</span><span class="p">,</span> <span class="s2">&quot;get_prefetch_querysets&quot;</span><span class="p">):</span>
<span class="p">(</span>
<span class="n">rel_qs</span><span class="p">,</span>
<span class="n">rel_obj_attr</span><span class="p">,</span>
<span class="n">instance_attr</span><span class="p">,</span>
<span class="n">single</span><span class="p">,</span>
<span class="n">cache_name</span><span class="p">,</span>
<span class="n">is_descriptor</span><span class="p">,</span>
<span class="p">)</span> <span class="o">=</span> <span class="n">prefetcher</span><span class="o">.</span><span class="n">get_prefetch_querysets</span><span class="p">(</span>
<span class="n">instances</span><span class="p">,</span> <span class="n">lookup</span><span class="o">.</span><span class="n">get_current_querysets</span><span class="p">(</span><span class="n">level</span><span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;The usage of get_prefetch_queryset() in prefetch_related_objects() is &quot;</span>
<span class="s2">&quot;deprecated. Implement get_prefetch_querysets() instead.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango60Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">querysets</span> <span class="o">:=</span> <span class="n">lookup</span><span class="o">.</span><span class="n">get_current_querysets</span><span class="p">(</span><span class="n">level</span><span class="p">):</span>
<span class="n">queryset</span> <span class="o">=</span> <span class="n">querysets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="p">(</span>
<span class="n">rel_qs</span><span class="p">,</span>
<span class="n">rel_obj_attr</span><span class="p">,</span>
<span class="n">instance_attr</span><span class="p">,</span>
<span class="n">single</span><span class="p">,</span>
<span class="n">cache_name</span><span class="p">,</span>
<span class="n">is_descriptor</span><span class="p">,</span>
<span class="p">)</span> <span class="o">=</span> <span class="n">prefetcher</span><span class="o">.</span><span class="n">get_prefetch_queryset</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="n">queryset</span><span class="p">)</span>
<span class="c1"># We have to handle the possibility that the QuerySet we just got back</span>
<span class="c1"># contains some prefetch_related lookups. We don&#39;t want to trigger the</span>
<span class="c1"># prefetch_related functionality by evaluating the query. Rather, we need</span>

View file

@ -96,6 +96,7 @@
<span class="sd">large and/or so that they can be used by other modules without getting into</span>
<span class="sd">circular import difficulties.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">functools</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
@ -105,6 +106,8 @@
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">DEFAULT_DB_ALIAS</span><span class="p">,</span> <span class="n">DatabaseError</span><span class="p">,</span> <span class="n">connections</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">LOOKUP_SEP</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">tree</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">cached_property</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.hashable</span><span class="w"> </span><span class="kn">import</span> <span class="n">make_hashable</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
@ -242,6 +245,40 @@
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;_negated&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">identity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="n">identity</span> <span class="o">=</span> <span class="p">[</span><span class="n">path</span><span class="p">,</span> <span class="o">*</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
<span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="n">arg</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">child</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">make_hashable</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">identity</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">arg</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">identity</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">child</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">identity</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Q</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="k">return</span> <span class="n">other</span><span class="o">.</span><span class="n">identity</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">identity</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">identity</span><span class="p">)</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">referenced_base_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieve all base fields referenced directly or through F expressions</span>
<span class="sd"> excluding any fields referenced through joins.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Avoid circular imports.</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.sql</span><span class="w"> </span><span class="kn">import</span> <span class="n">query</span>
<span class="k">return</span> <span class="p">{</span>
<span class="n">child</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">LOOKUP_SEP</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">query</span><span class="o">.</span><span class="n">get_children_from_q</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">class</span><span class="w"> </span><span class="nc">DeferredAttribute</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
@ -266,6 +303,10 @@
<span class="c1"># might be able to reuse the already loaded value. Refs #18343.</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_parent_chain</span><span class="p">(</span><span class="n">instance</span><span class="p">)</span>
<span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">instance</span><span class="o">.</span><span class="n">pk</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">generated</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
<span class="s2">&quot;Cannot read a generated field from an unsaved model.&quot;</span>
<span class="p">)</span>
<span class="n">instance</span><span class="o">.</span><span class="n">refresh_from_db</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="n">field_name</span><span class="p">])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">data</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
@ -304,7 +345,7 @@
<span class="k">def</span><span class="w"> </span><span class="nf">_get_lookup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lookup_name</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_lookups</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lookup_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="nd">@functools</span><span class="o">.</span><span class="n">lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="nd">@functools</span><span class="o">.</span><span class="n">cache</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_class_lookups</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="n">class_lookups</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">parent</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;class_lookups&quot;</span><span class="p">,</span> <span class="p">{})</span> <span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmro</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
@ -403,38 +444,37 @@
<span class="n">_unregister_class_lookup</span> <span class="o">=</span> <span class="nb">classmethod</span><span class="p">(</span><span class="n">_unregister_class_lookup</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">select_related_descend</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">restricted</span><span class="p">,</span> <span class="n">requested</span><span class="p">,</span> <span class="n">select_mask</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">select_related_descend</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">restricted</span><span class="p">,</span> <span class="n">requested</span><span class="p">,</span> <span class="n">select_mask</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return True if this field should be used to descend deeper for</span>
<span class="sd"> select_related() purposes. Used by both the query construction code</span>
<span class="sd"> (compiler.get_related_selections()) and the model instance creation code</span>
<span class="sd"> (compiler.klass_info).</span>
<span class="sd"> Return whether `field` should be used to descend deeper for</span>
<span class="sd"> `select_related()` purposes.</span>
<span class="sd"> Arguments:</span>
<span class="sd"> * field - the field to be checked</span>
<span class="sd"> * restricted - a boolean field, indicating if the field list has been</span>
<span class="sd"> manually restricted using a requested clause)</span>
<span class="sd"> * requested - The select_related() dictionary.</span>
<span class="sd"> * select_mask - the dictionary of selected fields.</span>
<span class="sd"> * reverse - boolean, True if we are checking a reverse select related</span>
<span class="sd"> * `field` - the field to be checked. Can be either a `Field` or</span>
<span class="sd"> `ForeignObjectRel` instance.</span>
<span class="sd"> * `restricted` - a boolean field, indicating if the field list has been</span>
<span class="sd"> manually restricted using a select_related() clause.</span>
<span class="sd"> * `requested` - the select_related() dictionary.</span>
<span class="sd"> * `select_mask` - the dictionary of selected fields.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Only relationships can be descended.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">parent_link</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">reverse</span><span class="p">:</span>
<span class="c1"># Forward MTI parent links should not be explicitly descended as they are</span>
<span class="c1"># always JOIN&#39;ed against (unless excluded by `select_mask`).</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="s2">&quot;parent_link&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">restricted</span><span class="p">:</span>
<span class="k">if</span> <span class="n">reverse</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">related_query_name</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">requested</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">reverse</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">requested</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">restricted</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="c1"># When `select_related()` is used without a `*requested` mask all</span>
<span class="c1"># relationships are descended unless they are nullable.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">restricted</span><span class="p">:</span>
<span class="k">return</span> <span class="ow">not</span> <span class="n">field</span><span class="o">.</span><span class="n">null</span>
<span class="c1"># When `select_related(*requested)` is used only fields that are part of</span>
<span class="c1"># `requested` should be descended.</span>
<span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">requested</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">restricted</span>
<span class="ow">and</span> <span class="n">select_mask</span>
<span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="n">requested</span>
<span class="ow">and</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">select_mask</span>
<span class="p">):</span>
<span class="c1"># Prevent invalid usages of `select_related()` and `only()`/`defer()` such</span>
<span class="c1"># as `select_related(&quot;a&quot;).only(&quot;b&quot;)` and `select_related(&quot;a&quot;).defer(&quot;a&quot;)`.</span>
<span class="k">if</span> <span class="n">select_mask</span> <span class="ow">and</span> <span class="n">field</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">select_mask</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">FieldError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Field </span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> cannot be both &quot;</span>
<span class="s2">&quot;deferred and traversed using select_related at the same time.&quot;</span>
@ -466,8 +506,8 @@
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="n">opts</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">concrete_model</span> <span class="o">==</span> <span class="n">opts</span><span class="o">.</span><span class="n">concrete_model</span>
<span class="ow">or</span> <span class="n">opts</span><span class="o">.</span><span class="n">concrete_model</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_parent_list</span><span class="p">()</span>
<span class="ow">or</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">get_parent_list</span><span class="p">()</span>
<span class="ow">or</span> <span class="n">opts</span><span class="o">.</span><span class="n">concrete_model</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">all_parents</span>
<span class="ow">or</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">opts</span><span class="o">.</span><span class="n">all_parents</span>
<span class="p">)</span>
<span class="c1"># If the field is a primary key, then doing a query against the field&#39;s</span>
@ -494,8 +534,11 @@
<span class="bp">self</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="n">Q</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;condition argument must be a Q() instance.&quot;</span><span class="p">)</span>
<span class="c1"># .condition and .resolved_condition have to be stored independently</span>
<span class="c1"># as the former must remain unchanged for Join.__eq__ to remain stable</span>
<span class="c1"># and reusable even once their .filtered_relation are resolved.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">condition</span> <span class="o">=</span> <span class="n">condition</span>
<span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resolved_condition</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span>
@ -509,21 +552,29 @@
<span class="k">def</span><span class="w"> </span><span class="nf">clone</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">clone</span> <span class="o">=</span> <span class="n">FilteredRelation</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">relation_name</span><span class="p">,</span> <span class="n">condition</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">)</span>
<span class="n">clone</span><span class="o">.</span><span class="n">alias</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">alias</span>
<span class="n">clone</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">[:]</span>
<span class="k">if</span> <span class="p">(</span><span class="n">resolved_condition</span> <span class="o">:=</span> <span class="bp">self</span><span class="o">.</span><span class="n">resolved_condition</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">clone</span><span class="o">.</span><span class="n">resolved_condition</span> <span class="o">=</span> <span class="n">resolved_condition</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
<span class="k">return</span> <span class="n">clone</span>
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> QuerySet.annotate() only accepts expression-like arguments</span>
<span class="sd"> (with a resolve_expression() method).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;FilteredRelation.resolve_expression() is unused.&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">relabeled_clone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">change_map</span><span class="p">):</span>
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
<span class="k">if</span> <span class="n">resolved_condition</span> <span class="o">:=</span> <span class="n">clone</span><span class="o">.</span><span class="n">resolved_condition</span><span class="p">:</span>
<span class="n">clone</span><span class="o">.</span><span class="n">resolved_condition</span> <span class="o">=</span> <span class="n">resolved_condition</span><span class="o">.</span><span class="n">relabeled_clone</span><span class="p">(</span><span class="n">change_map</span><span class="p">)</span>
<span class="k">return</span> <span class="n">clone</span>
<span class="k">def</span><span class="w"> </span><span class="nf">resolve_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">reuse</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">clone</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">clone</span><span class="p">()</span>
<span class="n">clone</span><span class="o">.</span><span class="n">resolved_condition</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">build_filter</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">,</span>
<span class="n">can_reuse</span><span class="o">=</span><span class="n">reuse</span><span class="p">,</span>
<span class="n">allow_joins</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">split_subq</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">update_join_types</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="n">clone</span>
<span class="k">def</span><span class="w"> </span><span class="nf">as_sql</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="c1"># Resolve the condition in Join.filtered_relation.</span>
<span class="n">query</span> <span class="o">=</span> <span class="n">compiler</span><span class="o">.</span><span class="n">query</span>
<span class="n">where</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">build_filtered_relation_q</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">condition</span><span class="p">,</span> <span class="n">reuse</span><span class="o">=</span><span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">))</span>
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">where</span><span class="p">)</span>
<span class="k">return</span> <span class="n">compiler</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">resolved_condition</span><span class="p">)</span>
</pre></div>
</div>

View file

@ -92,8 +92,7 @@
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">itertools</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">operator</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">total_ordering</span><span class="p">,</span> <span class="n">wraps</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">wraps</span>
<span class="k">class</span><span class="w"> </span><span class="nc">cached_property</span><span class="p">:</span>
@ -114,16 +113,7 @@
<span class="s2">&quot;__set_name__() on it.&quot;</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.deprecation</span><span class="w"> </span><span class="kn">import</span> <span class="n">RemovedInDjango50Warning</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;The name argument is deprecated as it&#39;s unnecessary as of &quot;</span>
<span class="s2">&quot;Python 3.6.&quot;</span><span class="p">,</span>
<span class="n">RemovedInDjango50Warning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">real_func</span> <span class="o">=</span> <span class="n">func</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="s2">&quot;__doc__&quot;</span><span class="p">)</span>
@ -183,7 +173,6 @@
<span class="sd"> function is evaluated on every access.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@total_ordering</span>
<span class="k">class</span><span class="w"> </span><span class="nc">__proxy__</span><span class="p">(</span><span class="n">Promise</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Encapsulate a function call and act as a proxy for methods that are</span>
@ -191,103 +180,16 @@
<span class="sd"> until one of the methods on the result is called.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">__prepared</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kw</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__args</span> <span class="o">=</span> <span class="n">args</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__kw</span> <span class="o">=</span> <span class="n">kw</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__prepared</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__prepare_class__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">__prepared</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_args</span> <span class="o">=</span> <span class="n">args</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_kw</span> <span class="o">=</span> <span class="n">kw</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">_lazy_proxy_unpickle</span><span class="p">,</span>
<span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">)</span> <span class="o">+</span> <span class="n">resultclasses</span><span class="p">,</span>
<span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_args</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_kw</span><span class="p">)</span> <span class="o">+</span> <span class="n">resultclasses</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__prepare_class__</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">for</span> <span class="n">resultclass</span> <span class="ow">in</span> <span class="n">resultclasses</span><span class="p">:</span>
<span class="k">for</span> <span class="n">type_</span> <span class="ow">in</span> <span class="n">resultclass</span><span class="o">.</span><span class="n">mro</span><span class="p">():</span>
<span class="k">for</span> <span class="n">method_name</span> <span class="ow">in</span> <span class="n">type_</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
<span class="c1"># All __promise__ return the same wrapper method, they</span>
<span class="c1"># look up the correct implementation when called.</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">method_name</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">meth</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__promise__</span><span class="p">(</span><span class="n">method_name</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="n">meth</span><span class="p">)</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_bytes</span> <span class="o">=</span> <span class="nb">bytes</span> <span class="ow">in</span> <span class="n">resultclasses</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_text</span> <span class="o">=</span> <span class="nb">str</span> <span class="ow">in</span> <span class="n">resultclasses</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_bytes</span> <span class="ow">and</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_text</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Cannot call lazy() with both bytes and text return types.&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_text</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="fm">__str__</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__text_cast</span>
<span class="k">elif</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_delegate_bytes</span><span class="p">:</span>
<span class="bp">cls</span><span class="o">.</span><span class="fm">__bytes__</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__bytes_cast</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__promise__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">method_name</span><span class="p">):</span>
<span class="c1"># Builds a wrapper around some magic method</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__wrapper__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="c1"># Automatically triggers the evaluation of a lazy value and</span>
<span class="c1"># applies the given magic method of the result type.</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">method_name</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="k">return</span> <span class="n">__wrapper__</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__text_cast</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__bytes_cast</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__bytes_cast_encoded</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__cast</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delegate_bytes</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__bytes_cast</span><span class="p">()</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delegate_text</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__text_cast</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">__args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">__kw</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># object defines __str__(), so __prepare_class__() won&#39;t overload</span>
<span class="c1"># a __str__() method from the proxied class.</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">==</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__mod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rhs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delegate_text</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">%</span> <span class="n">rhs</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">%</span> <span class="n">rhs</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">+</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="n">other</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
<span class="c1"># Instances of this class are effectively immutable. It&#39;s just a</span>
<span class="c1"># collection of functions. So we don&#39;t need to do anything</span>
@ -295,6 +197,89 @@
<span class="n">memo</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)]</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__cast</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_kw</span><span class="p">)</span>
<span class="c1"># Explicitly wrap methods which are defined on object and hence would</span>
<span class="c1"># not have been overloaded by the loop over resultclasses below.</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">==</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">!=</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__le__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">&lt;=</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__ge__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__format__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">format_spec</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">(),</span> <span class="n">format_spec</span><span class="p">)</span>
<span class="c1"># Explicitly wrap methods which are required for certain operations on</span>
<span class="c1"># int/str objects to function correctly.</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">+</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__radd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="n">other</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__mod__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">%</span> <span class="n">other</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__cast</span><span class="p">()</span> <span class="o">*</span> <span class="n">other</span>
<span class="c1"># Add wrappers for all methods from resultclasses which haven&#39;t been</span>
<span class="c1"># wrapped explicitly above.</span>
<span class="k">for</span> <span class="n">resultclass</span> <span class="ow">in</span> <span class="n">resultclasses</span><span class="p">:</span>
<span class="k">for</span> <span class="n">type_</span> <span class="ow">in</span> <span class="n">resultclass</span><span class="o">.</span><span class="n">mro</span><span class="p">():</span>
<span class="k">for</span> <span class="n">method_name</span> <span class="ow">in</span> <span class="n">type_</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
<span class="c1"># All __promise__ return the same wrapper method, they look up</span>
<span class="c1"># the correct implementation when called.</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">__proxy__</span><span class="p">,</span> <span class="n">method_name</span><span class="p">):</span>
<span class="k">continue</span>
<span class="c1"># Builds a wrapper around some method. Pass method_name to</span>
<span class="c1"># avoid issues due to late binding.</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__wrapper__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">__method_name</span><span class="o">=</span><span class="n">method_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="c1"># Automatically triggers the evaluation of a lazy value and</span>
<span class="c1"># applies the given method of the result type.</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_kw</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">__method_name</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">__proxy__</span><span class="p">,</span> <span class="n">method_name</span><span class="p">,</span> <span class="n">__wrapper__</span><span class="p">)</span>
<span class="nd">@wraps</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__wrapper__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="c1"># Creates the proxy object, instead of the actual value.</span>

View file

@ -100,7 +100,7 @@
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">ImproperlyConfigured</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.files.base</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentFile</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.test</span><span class="w"> </span><span class="kn">import</span> <span class="n">TestCase</span><span class="p">,</span> <span class="n">override_settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.timezone</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_aware</span><span class="p">,</span> <span class="n">utc</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.timezone</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_aware</span>
<span class="n">_SKIP</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">try</span><span class="p">:</span>
@ -625,7 +625,7 @@
<span class="k">def</span><span class="w"> </span><span class="nf">_test_storage_mtime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_tz</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">bucket</span><span class="o">.</span><span class="n">Object</span><span class="o">.</span><span class="n">return_value</span>
<span class="n">obj</span><span class="o">.</span><span class="n">last_modified</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">utc</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">last_modified</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;file.txt&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span>

View file

@ -1576,69 +1576,78 @@
<div class="viewcode-block" id="check_database"><a class="viewcode-back" href="../../../api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.check_database">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">check_database</span><span class="p">(</span><span class="n">always_return</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check so the database exists.</span>
<span class="sd"> Check if the database exists and has basic tables. This is only run by the launcher.</span>
<span class="sd"> Args:</span>
<span class="sd"> always_return (bool, optional): If set, will always return True/False</span>
<span class="sd"> also on critical errors. No output will be printed.</span>
<span class="sd"> always_return (bool, optional): If True, will not raise exceptions on errors.</span>
<span class="sd"> Returns:</span>
<span class="sd"> exists (bool): `True` if the database exists, otherwise `False`.</span>
<span class="sd"> exists (bool): `True` if database exists and seems set up, `False` otherwise.</span>
<span class="sd"> If `always_return` is `False`, this will raise exceptions instead of</span>
<span class="sd"> returning `False`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Check so a database exists and is accessible</span>
<span class="c1"># Check if database exists</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">connection</span>
<span class="n">tables</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">introspection</span><span class="o">.</span><span class="n">get_table_list</span><span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">())</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">tables</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tables</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="nb">str</span><span class="p">):</span> <span class="c1"># django 1.8+</span>
<span class="n">tables</span> <span class="o">=</span> <span class="p">[</span><span class="n">tableinfo</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">tableinfo</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">]</span>
<span class="k">if</span> <span class="n">tables</span> <span class="ow">and</span> <span class="s2">&quot;accounts_accountdb&quot;</span> <span class="ow">in</span> <span class="n">tables</span><span class="p">:</span>
<span class="c1"># database exists and seems set up. Initialize evennia.</span>
<span class="n">evennia</span><span class="o">.</span><span class="n">_init</span><span class="p">()</span>
<span class="c1"># Try to get Account#1</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.accounts.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">AccountDB</span>
<span class="n">tables_to_check</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;accounts_accountdb&quot;</span><span class="p">,</span> <span class="c1"># base account table</span>
<span class="s2">&quot;objects_objectdb&quot;</span><span class="p">,</span> <span class="c1"># base object table</span>
<span class="s2">&quot;scripts_scriptdb&quot;</span><span class="p">,</span> <span class="c1"># base script table</span>
<span class="s2">&quot;typeclasses_tag&quot;</span><span class="p">,</span> <span class="c1"># base tag table</span>
<span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="n">django</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">always_return</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="nb">print</span><span class="p">(</span><span class="n">ERROR_DATABASE</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">traceback</span><span class="o">=</span><span class="n">e</span><span class="p">))</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">except</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
<span class="c1"># no superuser yet. We need to create it.</span>
<span class="k">with</span> <span class="n">connection</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span> <span class="k">as</span> <span class="n">cursor</span><span class="p">:</span>
<span class="c1"># Get all table names in the database</span>
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">vendor</span> <span class="o">==</span> <span class="s2">&quot;postgresql&quot;</span><span class="p">:</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SELECT tablename FROM pg_tables</span>
<span class="sd"> WHERE schemaname = &#39;public&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">connection</span><span class="o">.</span><span class="n">vendor</span> <span class="o">==</span> <span class="s2">&quot;mysql&quot;</span><span class="p">:</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SELECT table_name FROM information_schema.tables</span>
<span class="sd"> WHERE table_schema = %s</span>
<span class="sd"> &quot;&quot;&quot;</span><span class="p">,</span>
<span class="p">[</span><span class="n">settings</span><span class="o">.</span><span class="n">DATABASES</span><span class="p">[</span><span class="s2">&quot;default&quot;</span><span class="p">][</span><span class="s2">&quot;NAME&quot;</span><span class="p">]],</span>
<span class="p">)</span>
<span class="k">elif</span> <span class="n">connection</span><span class="o">.</span><span class="n">vendor</span> <span class="o">==</span> <span class="s2">&quot;sqlite&quot;</span><span class="p">:</span>
<span class="n">cursor</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SELECT name FROM sqlite_master</span>
<span class="sd"> WHERE type=&#39;table&#39; AND name NOT LIKE &#39;sqlite_%&#39;</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">always_return</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported database vendor: </span><span class="si">{</span><span class="n">connection</span><span class="o">.</span><span class="n">vendor</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">other_superuser</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">is_superuser</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">other_superuser</span><span class="p">:</span>
<span class="c1"># Another superuser was found, but not with id=1. This may</span>
<span class="c1"># happen if using flush (the auto-id starts at a higher</span>
<span class="c1"># value). Wwe copy this superuser into id=1. To do</span>
<span class="c1"># this we must deepcopy it, delete it then save the copy</span>
<span class="c1"># with the new id. This allows us to avoid the UNIQUE</span>
<span class="c1"># constraint on usernames.</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">other_superuser</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">other_id</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">id</span>
<span class="n">other_key</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">username</span>
<span class="nb">print</span><span class="p">(</span><span class="n">WARNING_MOVING_SUPERUSER</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">other_key</span><span class="o">=</span><span class="n">other_key</span><span class="p">,</span> <span class="n">other_id</span><span class="o">=</span><span class="n">other_id</span><span class="p">))</span>
<span class="n">res</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="k">while</span> <span class="n">res</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&quot;Y&quot;</span><span class="p">:</span>
<span class="c1"># ask for permission</span>
<span class="n">res</span> <span class="o">=</span> <span class="nb">eval</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">&quot;Continue [Y]/N: &quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">res</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;N&quot;</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">res</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1"># continue with the</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">copy</span><span class="w"> </span><span class="kn">import</span> <span class="n">deepcopy</span>
<span class="n">existing_tables</span> <span class="o">=</span> <span class="p">{</span><span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">cursor</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()}</span>
<span class="n">new</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="n">other</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="n">new</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">new</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">create_superuser</span><span class="p">()</span>
<span class="n">check_database</span><span class="p">(</span><span class="n">always_return</span><span class="o">=</span><span class="n">always_return</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span></div>
<span class="c1"># Check if essential tables exist</span>
<span class="n">missing_tables</span> <span class="o">=</span> <span class="p">[</span><span class="n">table</span> <span class="k">for</span> <span class="n">table</span> <span class="ow">in</span> <span class="n">tables_to_check</span> <span class="k">if</span> <span class="n">table</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">existing_tables</span><span class="p">]</span>
<span class="k">if</span> <span class="n">missing_tables</span><span class="p">:</span>
<span class="k">if</span> <span class="n">always_return</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Database tables missing: </span><span class="si">{</span><span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">missing_tables</span><span class="p">)</span><span class="si">}</span><span class="s2">. &quot;</span>
<span class="s2">&quot;Did you remember to run migrations?&quot;</span>
<span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">always_return</span><span class="p">:</span>
<span class="k">raise</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="getenv"><a class="viewcode-back" href="../../../api/evennia.server.evennia_launcher.html#evennia.server.evennia_launcher.getenv">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">getenv</span><span class="p">():</span>

View file

@ -106,7 +106,6 @@
<span class="kn">from</span><span class="w"> </span><span class="nn">django.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.locks.lockfuncs</span><span class="w"> </span><span class="kn">import</span> <span class="n">perm</span> <span class="k">as</span> <span class="n">perm_lockfunc</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.utils.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">to_str</span>
@ -171,9 +170,10 @@
<span class="k">class</span><span class="w"> </span><span class="nc">Meta</span><span class="p">:</span>
<span class="s2">&quot;Define Django meta options&quot;</span>
<span class="n">verbose_name</span> <span class="o">=</span> <span class="s2">&quot;Tag&quot;</span>
<span class="n">unique_together</span> <span class="o">=</span> <span class="p">((</span><span class="s2">&quot;db_key&quot;</span><span class="p">,</span> <span class="s2">&quot;db_category&quot;</span><span class="p">,</span> <span class="s2">&quot;db_tagtype&quot;</span><span class="p">,</span> <span class="s2">&quot;db_model&quot;</span><span class="p">),)</span>
<span class="n">index_together</span> <span class="o">=</span> <span class="p">((</span><span class="s2">&quot;db_key&quot;</span><span class="p">,</span> <span class="s2">&quot;db_category&quot;</span><span class="p">,</span> <span class="s2">&quot;db_tagtype&quot;</span><span class="p">,</span> <span class="s2">&quot;db_model&quot;</span><span class="p">),)</span>
<span class="n">indexes</span> <span class="o">=</span> <span class="p">[</span><span class="n">models</span><span class="o">.</span><span class="n">Index</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;db_key&quot;</span><span class="p">,</span> <span class="s2">&quot;db_category&quot;</span><span class="p">,</span> <span class="s2">&quot;db_tagtype&quot;</span><span class="p">,</span> <span class="s2">&quot;db_model&quot;</span><span class="p">])]</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nb">str</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>

View file

@ -0,0 +1,404 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.create &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<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="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.create</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div 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" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><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="create.html">latest (main branch)</a></li>
<li><a href="../4.x/index.html">v4.0.0 branch (outdated)</a></li>
<li><a href="../3.x/index.html">v3.0.0 branch (outdated)</a></li>
<li><a href="../2.x/index.html">v2.0.0 branch (outdated)</a></li>
<li><a href="../1.x/index.html">v1.0.0 branch (outdated)</a></li>
<li><a href="../0.x/index.html">v0.9.5 branch (outdated)</a></li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.utils.create</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This module gathers all the essential database-creation functions for the game</span>
<span class="sd">engine&#39;s various object types.</span>
<span class="sd">Only objects created &#39;stand-alone&#39; are in here. E.g. object Attributes are</span>
<span class="sd">always created through their respective objects handlers.</span>
<span class="sd">Each `creation_*` function also has an alias named for the entity being created,</span>
<span class="sd">such as create_object() and object(). This is for consistency with the</span>
<span class="sd">utils.search module and allows you to do the shorter `create.object()`.</span>
<span class="sd">The respective object managers hold more methods for manipulating and searching</span>
<span class="sd">objects already existing in the database.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimpleLazyObject</span>
<span class="c1"># limit symbol import from API</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;create_object&quot;</span><span class="p">,</span>
<span class="s2">&quot;create_script&quot;</span><span class="p">,</span>
<span class="s2">&quot;create_help_entry&quot;</span><span class="p">,</span>
<span class="s2">&quot;create_message&quot;</span><span class="p">,</span>
<span class="s2">&quot;create_channel&quot;</span><span class="p">,</span>
<span class="s2">&quot;create_account&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">_GA</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span>
<span class="c1"># Lazy-loaded model classes</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_objectdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;objects&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;objectdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_scriptdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;scripts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;scriptdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_accountdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;accounts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;accountdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_msg</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;msg&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_channeldb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;channeldb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_helpentry</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;help&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;helpentry&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_tag</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;typeclasses&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;tag&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="c1"># Lazy model instances</span>
<span class="n">ObjectDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_objectdb</span><span class="p">)</span>
<span class="n">ScriptDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_scriptdb</span><span class="p">)</span>
<span class="n">AccountDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_accountdb</span><span class="p">)</span>
<span class="n">Msg</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_msg</span><span class="p">)</span>
<span class="n">ChannelDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_channeldb</span><span class="p">)</span>
<span class="n">HelpEntry</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_helpentry</span><span class="p">)</span>
<span class="n">Tag</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_tag</span><span class="p">)</span>
<div class="viewcode-block" id="create_object"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_object">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new in-game object.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> typeclass (class or str): Class or python path to a typeclass.</span>
<span class="sd"> key (str): Name of the new object. If not set, a name of</span>
<span class="sd"> `#dbref` will be set.</span>
<span class="sd"> location (Object or str): Obj or #dbref to use as the location of the new object.</span>
<span class="sd"> home (Object or str): Obj or #dbref to use as the object&#39;s home location.</span>
<span class="sd"> permissions (list): A list of permission strings or tuples (permstring, category).</span>
<span class="sd"> locks (str): one or more lockstrings, separated by semicolons.</span>
<span class="sd"> aliases (list): A list of alternative keys or tuples (aliasstring, category).</span>
<span class="sd"> tags (list): List of tag keys or tuples (tagkey, category) or (tagkey, category, data).</span>
<span class="sd"> destination (Object or str): Obj or #dbref to use as an Exit&#39;s target.</span>
<span class="sd"> report_to (Object): The object to return error messages to.</span>
<span class="sd"> nohome (bool): This allows the creation of objects without a</span>
<span class="sd"> default home location; only used when creating the default</span>
<span class="sd"> location itself or during unittests.</span>
<span class="sd"> attributes (list): Tuples on the form (key, value) or (key, value, category),</span>
<span class="sd"> (key, value, lockstring) or (key, value, lockstring, default_access).</span>
<span class="sd"> to set as Attributes on the new object.</span>
<span class="sd"> nattributes (list): Non-persistent tuples on the form (key, value). Note that</span>
<span class="sd"> adding this rarely makes sense since this data will not survive a reload.</span>
<span class="sd"> Returns:</span>
<span class="sd"> object (Object): A newly created object of the given typeclass.</span>
<span class="sd"> Raises:</span>
<span class="sd"> ObjectDB.DoesNotExist: If trying to create an Object with</span>
<span class="sd"> `location` or `home` that can&#39;t be found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="create_script"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_script">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_script</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new script. All scripts are a combination of a database</span>
<span class="sd"> object that communicates with the database, and an typeclass that</span>
<span class="sd"> &#39;decorates&#39; the database object into being different types of</span>
<span class="sd"> scripts. It&#39;s behaviour is similar to the game objects except</span>
<span class="sd"> scripts has a time component and are more limited in scope.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> typeclass (class or str): Class or python path to a typeclass.</span>
<span class="sd"> key (str): Name of the new object. If not set, a name of</span>
<span class="sd"> #dbref will be set.</span>
<span class="sd"> obj (Object): The entity on which this Script sits. If this</span>
<span class="sd"> is `None`, we are creating a &quot;global&quot; script.</span>
<span class="sd"> account (Account): The account on which this Script sits. It is</span>
<span class="sd"> exclusiv to `obj`.</span>
<span class="sd"> locks (str): one or more lockstrings, separated by semicolons.</span>
<span class="sd"> interval (int): The triggering interval for this Script, in</span>
<span class="sd"> seconds. If unset, the Script will not have a timing</span>
<span class="sd"> component.</span>
<span class="sd"> start_delay (bool): If `True`, will wait `interval` seconds</span>
<span class="sd"> before triggering the first time.</span>
<span class="sd"> repeats (int): The number of times to trigger before stopping.</span>
<span class="sd"> If unset, will repeat indefinitely.</span>
<span class="sd"> persistent (bool): If this Script survives a server shutdown</span>
<span class="sd"> or not (all Scripts will survive a reload).</span>
<span class="sd"> autostart (bool): If this Script will start immediately when</span>
<span class="sd"> created or if the `start` method must be called explicitly.</span>
<span class="sd"> report_to (Object): The object to return error messages to.</span>
<span class="sd"> desc (str): Optional description of script</span>
<span class="sd"> tags (list): List of tags or tuples (tag, category).</span>
<span class="sd"> attributes (list): List if tuples (key, value) or (key, value, category)</span>
<span class="sd"> (key, value, lockstring) or (key, value, lockstring, default_access).</span>
<span class="sd"> Returns:</span>
<span class="sd"> script (obj): An instance of the script created</span>
<span class="sd"> See evennia.scripts.manager for methods to manipulate existing</span>
<span class="sd"> scripts in the database.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_script</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="create_help_entry"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_help_entry">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_help_entry</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a static help entry in the help database. Note that Command</span>
<span class="sd"> help entries are dynamic and directly taken from the __doc__</span>
<span class="sd"> entries of the command. The database-stored help entries are</span>
<span class="sd"> intended for more general help on the game, more extensive info,</span>
<span class="sd"> in-game setting information and so on.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): The name of the help entry.</span>
<span class="sd"> entrytext (str): The body of te help entry</span>
<span class="sd"> category (str, optional): The help category of the entry.</span>
<span class="sd"> locks (str, optional): A lockstring to restrict access.</span>
<span class="sd"> aliases (list of str, optional): List of alternative (likely shorter) keynames.</span>
<span class="sd"> tags (lst, optional): List of tags or tuples `(tag, category)`.</span>
<span class="sd"> Returns:</span>
<span class="sd"> help (HelpEntry): A newly created help entry.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">HelpEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_help</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="create_message"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_message">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_message</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new communication Msg. Msgs represent a unit of</span>
<span class="sd"> database-persistent communication between entites.</span>
<span class="sd"> Args:</span>
<span class="sd"> senderobj (Object, Account, Script, str or list): The entity (or</span>
<span class="sd"> entities) sending the Msg. If a `str`, this is the id-string</span>
<span class="sd"> for an external sender type.</span>
<span class="sd"> message (str): Text with the message. Eventual headers, titles</span>
<span class="sd"> etc should all be included in this text string. Formatting</span>
<span class="sd"> will be retained.</span>
<span class="sd"> receivers (Object, Account, Script, str or list): An Account/Object to send</span>
<span class="sd"> to, or a list of them. If a string, it&#39;s an identifier for an external</span>
<span class="sd"> receiver.</span>
<span class="sd"> locks (str): Lock definition string.</span>
<span class="sd"> tags (list): A list of tags or tuples `(tag, category)`.</span>
<span class="sd"> header (str): Mime-type or other optional information for the message</span>
<span class="sd"> Notes:</span>
<span class="sd"> The Comm system is created to be very open-ended, so it&#39;s fully</span>
<span class="sd"> possible to let a message both go several receivers at the same time,</span>
<span class="sd"> it&#39;s up to the command definitions to limit this as desired.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">Msg</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_message</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="create_channel"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_channel">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_channel</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create A communication Channel. A Channel serves as a central hub</span>
<span class="sd"> for distributing Msgs to groups of people without specifying the</span>
<span class="sd"> receivers explicitly. Instead accounts may &#39;connect&#39; to the channel</span>
<span class="sd"> and follow the flow of messages. By default the channel allows</span>
<span class="sd"> access to all old messages, but this can be turned off with the</span>
<span class="sd"> keep_log switch.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): This must be unique.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> aliases (list of str): List of alternative (likely shorter) keynames.</span>
<span class="sd"> desc (str): A description of the channel, for use in listings.</span>
<span class="sd"> locks (str): Lockstring.</span>
<span class="sd"> keep_log (bool): Log channel throughput.</span>
<span class="sd"> typeclass (str or class): The typeclass of the Channel (not</span>
<span class="sd"> often used).</span>
<span class="sd"> tags (list): A list of tags or tuples `(tag[,category[,data]])`.</span>
<span class="sd"> attrs (list): List of attributes on form `(name, value[,category[,lockstring]])`</span>
<span class="sd"> Returns:</span>
<span class="sd"> channel (Channel): A newly created channel.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_channel</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="create_account"><a class="viewcode-back" href="../../../api/evennia.utils.create.html#evennia.utils.create.create_account">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">create_account</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This creates a new account.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str): The account&#39;s name. This should be unique.</span>
<span class="sd"> email (str or None): Email on valid addr@addr.domain form. If</span>
<span class="sd"> the empty string, will be set to None.</span>
<span class="sd"> password (str): Password in cleartext.</span>
<span class="sd"> Keyword Args:</span>
<span class="sd"> typeclass (str): The typeclass to use for the account.</span>
<span class="sd"> is_superuser (bool): Whether or not this account is to be a superuser</span>
<span class="sd"> locks (str): Lockstring.</span>
<span class="sd"> permission (list): List of permission strings.</span>
<span class="sd"> tags (list): List of Tags on form `(key, category[, data])`</span>
<span class="sd"> attributes (list): List of Attributes on form</span>
<span class="sd"> `(key, value [, category, [,lockstring [, default_pass]]])`</span>
<span class="sd"> report_to (Object): An object with a msg() method to report</span>
<span class="sd"> errors to. If not given, errors will be logged.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Account: The newly created Account.</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If `key` already exists in database.</span>
<span class="sd"> Notes:</span>
<span class="sd"> Usually only the server admin should need to be superuser, all</span>
<span class="sd"> other access levels can be handled with more fine-grained</span>
<span class="sd"> permissions or groups. A superuser bypasses all lock checking</span>
<span class="sd"> operations and is thus not suitable for play-testing the game.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_account</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="c1"># Aliases for the creation functions</span>
<span class="nb">object</span> <span class="o">=</span> <span class="n">create_object</span>
<span class="n">script</span> <span class="o">=</span> <span class="n">create_script</span>
<span class="n">help_entry</span> <span class="o">=</span> <span class="n">create_help_entry</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">create_message</span>
<span class="n">channel</span> <span class="o">=</span> <span class="n">create_channel</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">create_account</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<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="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.create</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> 3.2.1.
</div>
</body>
</html>

View file

@ -113,13 +113,9 @@
<span class="sd">&gt; from evennia.objects.models import ObjectDB</span>
<span class="sd">&gt; match = Object.objects.get_object_with_account(...)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="c1"># Import the manager methods to be wrapped</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimpleLazyObject</span>
<span class="c1"># limit symbol import from API</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">(</span>
@ -137,180 +133,265 @@
<span class="p">)</span>
<span class="c1"># import objects this way to avoid circular import problems</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ObjectDB</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;objects&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;objectdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">AccountDB</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;accounts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;accountdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">ScriptDB</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;scripts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;scriptdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">Msg</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;msg&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">ChannelDB</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;channeldb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">HelpEntry</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;help&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;helpentry&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="n">Tag</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;typeclasses&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;tag&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">except</span> <span class="p">(</span><span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span><span class="p">):</span>
<span class="c1"># this is a fallback used during tests/doc building</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Database not available yet - using temporary fallback for search managers.&quot;</span><span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.accounts.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">AccountDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.comms.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ChannelDB</span><span class="p">,</span> <span class="n">Msg</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.help.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">HelpEntry</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.objects.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ObjectDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.scripts.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ScriptDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">evennia.typeclasses.tags</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tag</span> <span class="c1"># noqa</span>
<span class="c1"># Lazy-loaded model classes</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_objectdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;objects&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;objectdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_accountdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;accounts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;accountdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_scriptdb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;scripts&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;scriptdb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_msg</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;msg&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_channeldb</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;comms&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;channeldb&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_helpentry</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;help&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;helpentry&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_tag</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.contenttypes.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContentType</span>
<span class="k">return</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">app_label</span><span class="o">=</span><span class="s2">&quot;typeclasses&quot;</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="s2">&quot;tag&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
<span class="c1"># Lazy model instances</span>
<span class="n">ObjectDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_objectdb</span><span class="p">)</span>
<span class="n">AccountDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_accountdb</span><span class="p">)</span>
<span class="n">ScriptDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_scriptdb</span><span class="p">)</span>
<span class="n">Msg</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_msg</span><span class="p">)</span>
<span class="n">ChannelDB</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_channeldb</span><span class="p">)</span>
<span class="n">HelpEntry</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_helpentry</span><span class="p">)</span>
<span class="n">Tag</span> <span class="o">=</span> <span class="n">SimpleLazyObject</span><span class="p">(</span><span class="n">_get_tag</span><span class="p">)</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1"># Search manager-wrappers</span>
<span class="c1"># -------------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Search objects as a character</span>
<span class="c1">#</span>
<span class="c1"># NOTE: A more powerful wrapper of this method</span>
<span class="c1"># is reachable from within each command class</span>
<span class="c1"># by using self.caller.search()!</span>
<span class="c1">#</span>
<span class="c1"># def object_search(self, ostring=None,</span>
<span class="c1"># attribute_name=None,</span>
<span class="c1"># typeclass=None,</span>
<span class="c1"># candidates=None,</span>
<span class="c1"># exact=True):</span>
<span class="c1">#</span>
<span class="c1"># Search globally or in a list of candidates and return results.</span>
<span class="c1"># The result is always a list of Objects (or the empty list)</span>
<span class="c1">#</span>
<span class="c1"># Arguments:</span>
<span class="c1"># ostring: (str) The string to compare names against. By default (if</span>
<span class="c1"># not attribute_name is set), this will search object.key</span>
<span class="c1"># and object.aliases in order. Can also be on the form #dbref,</span>
<span class="c1"># which will, if exact=True be matched against primary key.</span>
<span class="c1"># attribute_name: (str): Use this named ObjectAttribute to match ostring</span>
<span class="c1"># against, instead of the defaults.</span>
<span class="c1"># typeclass (str or TypeClass): restrict matches to objects having</span>
<span class="c1"># this typeclass. This will help speed up global searches.</span>
<span class="c1"># candidates (list obj ObjectDBs): If supplied, search will only be</span>
<span class="c1"># performed among the candidates in this list. A common list</span>
<span class="c1"># of candidates is the contents of the current location.</span>
<span class="c1"># exact (bool): Match names/aliases exactly or partially. Partial</span>
<span class="c1"># matching matches the beginning of words in the names/aliases,</span>
<span class="c1"># using a matching routine to separate multiple matches in</span>
<span class="c1"># names with multiple components (so &quot;bi sw&quot; will match</span>
<span class="c1"># &quot;Big sword&quot;). Since this is more expensive than exact</span>
<span class="c1"># matching, it is recommended to be used together with</span>
<span class="c1"># the objlist keyword to limit the number of possibilities.</span>
<span class="c1"># This keyword has no meaning if attribute_name is set.</span>
<span class="c1">#</span>
<span class="c1"># Returns:</span>
<span class="c1"># A list of matching objects (or a list with one unique match)</span>
<span class="c1"># def object_search(self, ostring, caller=None,</span>
<span class="c1"># candidates=None,</span>
<span class="c1"># attribute_name=None):</span>
<span class="c1">#</span>
<span class="n">search_object</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_object</span>
<div class="viewcode-block" id="search_object"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_object">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for objects in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str or int): Object key or dbref to search for. This can also</span>
<span class="sd"> be a list of keys/dbrefs. `None` (default) returns all objects.</span>
<span class="sd"> exact (bool): Only valid for string keys. If True, requires exact</span>
<span class="sd"> key match, otherwise also match key with case-insensitive and</span>
<span class="sd"> partial matching. Default is True.</span>
<span class="sd"> candidates (list): Only search among these object candidates,</span>
<span class="sd"> if given. Default is to search all objects.</span>
<span class="sd"> attribute_name (str): If set, search by objects with this attribute_name</span>
<span class="sd"> defined on them, with the value specified by `attribute_value`.</span>
<span class="sd"> attribute_value (any): What value the given attribute_name must have.</span>
<span class="sd"> location (Object): Filter by objects at this location.</span>
<span class="sd"> typeclass (str or TypeClass): Filter by objects having this typeclass.</span>
<span class="sd"> This can also be a list of typeclasses.</span>
<span class="sd"> tags (str or list): Filter by objects having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> nofetch (bool): Don&#39;t fetch typeclass and perms data from db.</span>
<span class="sd"> This is faster but gives less info.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Objects matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="n">search_objects</span> <span class="o">=</span> <span class="n">search_object</span>
<span class="n">object_search</span> <span class="o">=</span> <span class="n">search_object</span>
<span class="n">objects</span> <span class="o">=</span> <span class="n">search_objects</span>
<span class="c1">#</span>
<span class="c1"># Search for accounts</span>
<span class="c1">#</span>
<span class="c1"># account_search(self, ostring)</span>
<span class="c1"># Searches for a particular account by name or</span>
<span class="c1"># database id.</span>
<span class="c1">#</span>
<span class="c1"># ostring = a string or database id.</span>
<span class="c1">#</span>
<div class="viewcode-block" id="search_account"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_account">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_account</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for accounts in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str or int): Account key or dbref to search for. This can also</span>
<span class="sd"> be a list of keys/dbrefs. `None` (default) returns all accounts.</span>
<span class="sd"> exact (bool): Only valid for string keys. If True, requires exact</span>
<span class="sd"> key match, otherwise also match key with case-insensitive and</span>
<span class="sd"> partial matching. Default is True.</span>
<span class="sd"> candidates (list): Only search among these account candidates,</span>
<span class="sd"> if given. Default is to search all accounts.</span>
<span class="sd"> attribute_name (str): If set, search by accounts with this attribute_name</span>
<span class="sd"> defined on them, with the value specified by `attribute_value`.</span>
<span class="sd"> attribute_value (any): What value the given attribute_name must have.</span>
<span class="sd"> tags (str or list): Filter by accounts having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> nofetch (bool): Don&#39;t fetch typeclass and perms data from db.</span>
<span class="sd"> This is faster but gives less info.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Accounts matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_account</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="n">search_account</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_account</span>
<span class="n">search_accounts</span> <span class="o">=</span> <span class="n">search_account</span>
<span class="n">account_search</span> <span class="o">=</span> <span class="n">search_account</span>
<span class="n">accounts</span> <span class="o">=</span> <span class="n">search_accounts</span>
<span class="c1">#</span>
<span class="c1"># Searching for scripts</span>
<span class="c1">#</span>
<span class="c1"># script_search(self, ostring, obj=None, only_timed=False)</span>
<span class="c1">#</span>
<span class="c1"># Search for a particular script.</span>
<span class="c1">#</span>
<span class="c1"># ostring - search criterion - a script ID or key</span>
<span class="c1"># obj - limit search to scripts defined on this object</span>
<span class="c1"># only_timed - limit search only to scripts that run</span>
<span class="c1"># on a timer.</span>
<span class="c1">#</span>
<span class="n">search_script</span> <span class="o">=</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_script</span>
<div class="viewcode-block" id="search_script"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_script">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_script</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for scripts in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str or int): Script key or dbref to search for. This can also</span>
<span class="sd"> be a list of keys/dbrefs. `None` (default) returns all scripts.</span>
<span class="sd"> exact (bool): Only valid for string keys. If True, requires exact</span>
<span class="sd"> key match, otherwise also match key with case-insensitive and</span>
<span class="sd"> partial matching. Default is True.</span>
<span class="sd"> candidates (list): Only search among these script candidates,</span>
<span class="sd"> if given. Default is to search all scripts.</span>
<span class="sd"> attribute_name (str): If set, search by scripts with this attribute_name</span>
<span class="sd"> defined on them, with the value specified by `attribute_value`.</span>
<span class="sd"> attribute_value (any): What value the given attribute_name must have.</span>
<span class="sd"> obj (Object): Filter by scripts defined on this object.</span>
<span class="sd"> account (Account): Filter by scripts defined on this account.</span>
<span class="sd"> typeclass (str or TypeClass): Filter by scripts having this typeclass.</span>
<span class="sd"> This can also be a list of typeclasses.</span>
<span class="sd"> tags (str or list): Filter by scripts having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> nofetch (bool): Don&#39;t fetch typeclass and perms data from db.</span>
<span class="sd"> This is faster but gives less info.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Scripts matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_script</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="n">search_scripts</span> <span class="o">=</span> <span class="n">search_script</span>
<span class="n">script_search</span> <span class="o">=</span> <span class="n">search_script</span>
<span class="n">scripts</span> <span class="o">=</span> <span class="n">search_scripts</span>
<span class="c1">#</span>
<span class="c1"># Searching for communication messages</span>
<span class="c1">#</span>
<span class="c1">#</span>
<span class="c1"># message_search(self, sender=None, receiver=None, channel=None, freetext=None)</span>
<span class="c1">#</span>
<span class="c1"># Search the message database for particular messages. At least one</span>
<span class="c1"># of the arguments must be given to do a search.</span>
<span class="c1">#</span>
<span class="c1"># sender - get messages sent by a particular account</span>
<span class="c1"># receiver - get messages received by a certain account</span>
<span class="c1"># channel - get messages sent to a particular channel</span>
<span class="c1"># freetext - Search for a text string in a message.</span>
<span class="c1"># NOTE: This can potentially be slow, so make sure to supply</span>
<span class="c1"># one of the other arguments to limit the search.</span>
<span class="c1">#</span>
<span class="n">search_message</span> <span class="o">=</span> <span class="n">Msg</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_message</span>
<div class="viewcode-block" id="search_message"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_message">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_message</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for messages in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> sender (Object, Account or str): Filter by messages sent by this entity.</span>
<span class="sd"> If a string, this is an external sender name.</span>
<span class="sd"> receiver (Object, Account or str): Filter by messages received by this entity.</span>
<span class="sd"> If a string, this is an external receiver name.</span>
<span class="sd"> channel (Channel): Filter by messages sent to this channel.</span>
<span class="sd"> date (datetime): Filter by messages sent on this date.</span>
<span class="sd"> type (str): Filter by messages of this type.</span>
<span class="sd"> tags (str or list): Filter by messages having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> exclude_tags (str or list): Exclude messages with these tags.</span>
<span class="sd"> search_text (str): Search for text in message content.</span>
<span class="sd"> exact (bool): If True, require exact text match. Default False.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Messages matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">Msg</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_message</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="n">search_messages</span> <span class="o">=</span> <span class="n">search_message</span>
<span class="n">message_search</span> <span class="o">=</span> <span class="n">search_message</span>
<span class="n">messages</span> <span class="o">=</span> <span class="n">search_messages</span>
<span class="c1">#</span>
<span class="c1"># Search for Communication Channels</span>
<span class="c1">#</span>
<span class="c1"># channel_search(self, ostring)</span>
<span class="c1">#</span>
<span class="c1"># Search the channel database for a particular channel.</span>
<span class="c1">#</span>
<span class="c1"># ostring - the key or database id of the channel.</span>
<span class="c1"># exact - requires an exact ostring match (not case sensitive)</span>
<span class="c1">#</span>
<span class="n">search_channel</span> <span class="o">=</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_channel</span>
<div class="viewcode-block" id="search_channel"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_channel">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_channel</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for channels in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str or int): Channel key or dbref to search for. This can also</span>
<span class="sd"> be a list of keys/dbrefs. `None` (default) returns all channels.</span>
<span class="sd"> exact (bool): Only valid for string keys. If True, requires exact</span>
<span class="sd"> key match, otherwise also match key with case-insensitive and</span>
<span class="sd"> partial matching. Default is True.</span>
<span class="sd"> candidates (list): Only search among these channel candidates,</span>
<span class="sd"> if given. Default is to search all channels.</span>
<span class="sd"> attribute_name (str): If set, search by channels with this attribute_name</span>
<span class="sd"> defined on them, with the value specified by `attribute_value`.</span>
<span class="sd"> attribute_value (any): What value the given attribute_name must have.</span>
<span class="sd"> typeclass (str or TypeClass): Filter by channels having this typeclass.</span>
<span class="sd"> This can also be a list of typeclasses.</span>
<span class="sd"> tags (str or list): Filter by channels having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> nofetch (bool): Don&#39;t fetch typeclass and perms data from db.</span>
<span class="sd"> This is faster but gives less info.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Channels matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_channel</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="n">search_channels</span> <span class="o">=</span> <span class="n">search_channel</span>
<span class="n">channel_search</span> <span class="o">=</span> <span class="n">search_channel</span>
<span class="n">channels</span> <span class="o">=</span> <span class="n">search_channels</span>
<span class="c1">#</span>
<span class="c1"># Find help entry objects.</span>
<span class="c1">#</span>
<span class="c1"># search_help(self, ostring, help_category=None)</span>
<span class="c1">#</span>
<span class="c1"># Retrieve a search entry object.</span>
<span class="c1">#</span>
<span class="c1"># ostring - the help topic to look for</span>
<span class="c1"># category - limit the search to a particular help topic</span>
<span class="c1">#</span>
<span class="n">search_help</span> <span class="o">=</span> <span class="n">HelpEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_help</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_help</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for help entries in the database.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str or int): Help entry key or dbref to search for. This can also</span>
<span class="sd"> be a list of keys/dbrefs. `None` (default) returns all help entries.</span>
<span class="sd"> exact (bool): Only valid for string keys. If True, requires exact</span>
<span class="sd"> key match, otherwise also match key with case-insensitive and</span>
<span class="sd"> partial matching. Default is True.</span>
<span class="sd"> category (str): Filter by help entries in this category.</span>
<span class="sd"> tags (str or list): Filter by help entries having one or more Tags.</span>
<span class="sd"> This can be a single tag key, a list of tag keys, or a list of</span>
<span class="sd"> tuples (tag_key, tag_category).</span>
<span class="sd"> locks (str): Filter by help entries with these locks.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of HelpEntries matching the search criteria.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">HelpEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">search_help</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">search_help_entry</span> <span class="o">=</span> <span class="n">search_help</span>
<span class="n">search_help_entries</span> <span class="o">=</span> <span class="n">search_help</span>
<span class="n">help_entry_search</span> <span class="o">=</span> <span class="n">search_help</span>
<span class="n">help_entries</span> <span class="o">=</span> <span class="n">search_help</span>
<span class="c1"># Locate Attributes</span>
<span class="c1"># search_object_attribute(key, category, value, strvalue) (also search_attribute works)</span>
<span class="c1"># search_account_attribute(key, category, value, strvalue) (also search_attribute works)</span>
<span class="c1"># search_script_attribute(key, category, value, strvalue) (also search_attribute works)</span>
<span class="c1"># search_channel_attribute(key, category, value, strvalue) (also search_attribute works)</span>
<span class="c1"># Note that these return the object attached to the Attribute,</span>
<span class="c1"># not the attribute object itself (this is usually what you want)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_object_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for objects by their attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="n">strvalue</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="n">attrtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
@ -319,6 +400,9 @@
<span class="k">def</span><span class="w"> </span><span class="nf">search_account_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for accounts by their attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="n">strvalue</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="n">attrtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
@ -327,6 +411,9 @@
<span class="k">def</span><span class="w"> </span><span class="nf">search_script_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for scripts by their attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="n">strvalue</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="n">attrtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
@ -335,23 +422,20 @@
<span class="k">def</span><span class="w"> </span><span class="nf">search_channel_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for channels by their attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_attribute</span><span class="p">(</span>
<span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">,</span> <span class="n">strvalue</span><span class="o">=</span><span class="n">strvalue</span><span class="p">,</span> <span class="n">attrtype</span><span class="o">=</span><span class="n">attrtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">)</span>
<span class="c1"># search for attribute objects</span>
<span class="n">search_attribute_object</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_attribute</span>
<span class="c1"># Locate Tags</span>
<span class="c1"># search_object_tag(key=None, category=None) (also search_tag works)</span>
<span class="c1"># search_account_tag(key=None, category=None)</span>
<span class="c1"># search_script_tag(key=None, category=None)</span>
<span class="c1"># search_channel_tag(key=None, category=None)</span>
<span class="c1"># Note that this returns the object attached to the tag, not the tag</span>
<span class="c1"># object itself (this is usually what you want)</span>
<span class="c1"># Replace direct assignments with functions</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_attribute_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for attribute objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_attribute</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_object_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
@ -373,7 +457,6 @@
<span class="sd"> matches (list): List of Objects with tags matching</span>
<span class="sd"> the search criteria, or an empty list if no</span>
<span class="sd"> matches were found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="n">tagtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
@ -384,23 +467,6 @@
<div class="viewcode-block" id="search_account_tag"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_account_tag">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_account_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Find account based on tag or category.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): The tag key to search for.</span>
<span class="sd"> category (str, optional): The category of tag</span>
<span class="sd"> to search for. If not set, uncategorized</span>
<span class="sd"> tags will be searched.</span>
<span class="sd"> tagtype (str, optional): &#39;type&#39; of Tag, by default</span>
<span class="sd"> this is either `None` (a normal Tag), `alias` or</span>
<span class="sd"> `permission`. This always apply to all queried tags.</span>
<span class="sd"> kwargs (any): Other optional parameter that may be supported</span>
<span class="sd"> by the manager method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Accounts with tags matching</span>
<span class="sd"> the search criteria, or an empty list if no</span>
<span class="sd"> matches were found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="n">tagtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
@ -408,23 +474,6 @@
<div class="viewcode-block" id="search_script_tag"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_script_tag">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_script_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Find script based on tag or category.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): The tag key to search for.</span>
<span class="sd"> category (str, optional): The category of tag</span>
<span class="sd"> to search for. If not set, uncategorized</span>
<span class="sd"> tags will be searched.</span>
<span class="sd"> tagtype (str, optional): &#39;type&#39; of Tag, by default</span>
<span class="sd"> this is either `None` (a normal Tag), `alias` or</span>
<span class="sd"> `permission`. This always apply to all queried tags.</span>
<span class="sd"> kwargs (any): Other optional parameter that may be supported</span>
<span class="sd"> by the manager method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Scripts with tags matching</span>
<span class="sd"> the search criteria, or an empty list if no</span>
<span class="sd"> matches were found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ScriptDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="n">tagtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
@ -432,35 +481,16 @@
<div class="viewcode-block" id="search_channel_tag"><a class="viewcode-back" href="../../../api/evennia.utils.search.html#evennia.utils.search.search_channel_tag">[docs]</a><span class="k">def</span><span class="w"> </span><span class="nf">search_channel_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Find channel based on tag or category.</span>
<span class="sd"> Args:</span>
<span class="sd"> key (str, optional): The tag key to search for.</span>
<span class="sd"> category (str, optional): The category of tag</span>
<span class="sd"> to search for. If not set, uncategorized</span>
<span class="sd"> tags will be searched.</span>
<span class="sd"> tagtype (str, optional): &#39;type&#39; of Tag, by default</span>
<span class="sd"> this is either `None` (a normal Tag), `alias` or</span>
<span class="sd"> `permission`. This always apply to all queried tags.</span>
<span class="sd"> kwargs (any): Other optional parameter that may be supported</span>
<span class="sd"> by the manager method.</span>
<span class="sd"> Returns:</span>
<span class="sd"> matches (list): List of Channels with tags matching</span>
<span class="sd"> the search criteria, or an empty list if no</span>
<span class="sd"> matches were found.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ChannelDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_by_tag</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="n">category</span><span class="p">,</span> <span class="n">tagtype</span><span class="o">=</span><span class="n">tagtype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<span class="c1"># search for tag objects (not the objects they are attached to</span>
<span class="n">search_tag_object</span> <span class="o">=</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_tag</span>
<span class="c1"># Locate Objects by Typeclass</span>
<span class="c1"># search_objects_by_typeclass(typeclass=&quot;&quot;, include_children=False, include_parents=False) (also search_typeclass works)</span>
<span class="c1"># This returns the objects of the given typeclass</span>
<span class="c1"># Replace direct assignment with function</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_tag_object</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Search for tag objects.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">ObjectDB</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_tag</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_objects_by_typeclass</span><span class="p">(</span><span class="n">typeclass</span><span class="p">,</span> <span class="n">include_children</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">include_parents</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>

View file

@ -187,7 +187,21 @@
<div class="viewcode-block" id="LogoutTest"><a class="viewcode-back" href="../../../../api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">LogoutTest</span><span class="p">(</span><span class="n">EvenniaWebTest</span><span class="p">):</span>
<span class="n">url_name</span> <span class="o">=</span> <span class="s2">&quot;logout&quot;</span></div>
<span class="n">url_name</span> <span class="o">=</span> <span class="s2">&quot;logout&quot;</span>
<div class="viewcode-block" id="LogoutTest.test_get"><a class="viewcode-back" href="../../../../api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_get">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">test_get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Since Django 5.0, logout is no longer supported with GET requests&quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="LogoutTest.test_post"><a class="viewcode-back" href="../../../../api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_post">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">test_post</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Do the logout test with a POST request&quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url_name</span><span class="p">),</span> <span class="n">follow</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span></div>
<div class="viewcode-block" id="LogoutTest.test_get_authenticated"><a class="viewcode-back" href="../../../../api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_get_authenticated">[docs]</a> <span class="k">def</span><span class="w"> </span><span class="nf">test_get_authenticated</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Do the logout test with a POST instead of GET&quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url_name</span><span class="p">),</span> <span class="n">follow</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="PasswordResetTest"><a class="viewcode-back" href="../../../../api/evennia.web.website.tests.html#evennia.web.website.tests.PasswordResetTest">[docs]</a><span class="k">class</span><span class="w"> </span><span class="nc">PasswordResetTest</span><span class="p">(</span><span class="n">EvenniaWebTest</span><span class="p">):</span>

View file

@ -351,6 +351,7 @@
<li><a href="evennia/utils/ansi.html">evennia.utils.ansi</a></li>
<li><a href="evennia/utils/batchprocessors.html">evennia.utils.batchprocessors</a></li>
<li><a href="evennia/utils/containers.html">evennia.utils.containers</a></li>
<li><a href="evennia/utils/create.html">evennia.utils.create</a></li>
<li><a href="evennia/utils/dbserialize.html">evennia.utils.dbserialize</a></li>
<li><a href="evennia/utils/eveditor.html">evennia.utils.eveditor</a></li>
<li><a href="evennia/utils/evform.html">evennia.utils.evform</a></li>

View file

@ -2,9 +2,11 @@
## Main branch
Updated dependencies: Twisted >24 (<25). Python 3.10, 3.11, 3.12, 3.13. Will
drop 3.10 support as part of next major release.
Updated dependencies: Django >5.1 (<5,2), Twisted >24 (<25).
Python versions: 3.11, 3.12, 3.13.
- Feat (backwards incompatible): RUN MIGRATIONS (`evennia migrate`): Now requiring Django 5.1 (Griatch)
- Feat (backwards incompatible): Drop support and testing for Python 3.10 (Griatch)
- [Feat][pull3719]: Support Python 3.13. (0xDEADFED5)
- [Feat][pull3633]: Default object's default descs are now taken from a `default_description`
class variable instead of the `desc` Attribute always being set (count-infinity)
@ -13,8 +15,7 @@ drop 3.10 support as part of next major release.
strings instead of `None` if no name is provided, also enforce string type (InspectorCaracal)
- [Fix][pull3682]: Allow in-game help searching for commands natively starting
with `*` (which is the Lunr search wildcard) (count-infinity)
- [Fix][pull3684]: Web client stopped auto-focusing the input box after opening
settings (count-infinity)
- [Fix][pull3684]: Web client stopped auto-focusing the input box after opening settings (count-infinity)
- [Fix][pull3689]: Partial matching fix in default search, makes sure e.g. `b sw` uniquely
finds `big sword` even if another type of sword is around (InspectorCaracal)
- [Fix][pull3690]: In searches, allow special 'here' and 'me' keywords only be valid queries
@ -37,7 +38,6 @@ drop 3.10 support as part of next major release.
used as the task's category (Griatch)
- [Docs]: Fixes from InspectorCaracal, Griatch, ChrisLR
[pull3633]: https://github.com/evennia/evennia/pull/3633
[pull3677]: https://github.com/evennia/evennia/pull/3677
[pull3682]: https://github.com/evennia/evennia/pull/3682

View file

@ -152,7 +152,7 @@ skipping, reloading etc.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.batchprocess.CmdBatchCommands.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['batchcommand', 'batchcmd']</em><a class="headerlink" href="#evennia.commands.default.batchprocess.CmdBatchCommands.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['batchcmd', 'batchcommand']</em><a class="headerlink" href="#evennia.commands.default.batchprocess.CmdBatchCommands.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -183,7 +183,7 @@ skipping, reloading etc.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.batchprocess.CmdBatchCommands.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] &lt;python.path.to.file&gt;\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}</em><a class="headerlink" href="#evennia.commands.default.batchprocess.CmdBatchCommands.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] &lt;python.path.to.file&gt;\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}</em><a class="headerlink" href="#evennia.commands.default.batchprocess.CmdBatchCommands.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -1419,7 +1419,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;update', '&#64;type', '&#64;parent', '&#64;swap', '&#64;typeclasses']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;parent', '&#64;update', '&#64;swap', '&#64;type', '&#64;typeclasses']</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1450,7 +1450,7 @@ server settings.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdTypeclass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;update &#64;type &#64;parent &#64;swap &#64;typeclasses', 'category': 'building', 'key': '&#64;typeclass', 'no_prefix': 'typeclass update type parent swap typeclasses', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;parent &#64;update &#64;swap &#64;type &#64;typeclasses', 'category': 'building', 'key': '&#64;typeclass', 'no_prefix': 'typeclass parent update swap type typeclasses', 'tags': '', 'text': &quot;\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] &lt;object&gt; [= typeclass.path]\n typeclass/prototype &lt;object&gt; = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.building.CmdTypeclass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1605,7 +1605,7 @@ If object is not specified, the current location is examined.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;exam', '&#64;ex']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;ex', '&#64;exam']</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1878,7 +1878,7 @@ the cases, see the module doc.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdExamine.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;exam &#64;ex', 'category': 'building', 'key': '&#64;examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;ex &#64;exam', 'category': 'building', 'key': '&#64;examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [&lt;object&gt;[/attrname]]\n examine [*&lt;account&gt;[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdExamine.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -1912,7 +1912,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;locate', '&#64;search']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;search', '&#64;locate']</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1943,7 +1943,7 @@ one is given.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.building.CmdFind.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;locate &#64;search', 'category': 'building', 'key': '&#64;find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;search &#64;locate', 'category': 'building', 'key': '&#64;find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] &lt;name or dbref or *account&gt; [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}</em><a class="headerlink" href="#evennia.commands.default.building.CmdFind.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

File diff suppressed because one or more lines are too long

View file

@ -282,7 +282,7 @@ for everyone to use, you need build privileges and the alias command.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdNick.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['nickname', 'nicks']</em><a class="headerlink" href="#evennia.commands.default.general.CmdNick.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['nicks', 'nickname']</em><a class="headerlink" href="#evennia.commands.default.general.CmdNick.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -314,7 +314,7 @@ for everyone to use, you need build privileges and the alias command.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdNick.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] &lt;string&gt; [= [replacement_string]]\n nick[/switches] &lt;template&gt; = &lt;replacement_template&gt;\n nick/delete &lt;string&gt; or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also &quot;nicks&quot; works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side &lt;string&gt;:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\\\= - escape literal \'=\' you want in your &lt;string&gt;\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdNick.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] &lt;string&gt; [= [replacement_string]]\n nick[/switches] &lt;template&gt; = &lt;replacement_template&gt;\n nick/delete &lt;string&gt; or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also &quot;nicks&quot; works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side &lt;string&gt;:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\\\= - escape literal \'=\' you want in your &lt;string&gt;\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdNick.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -337,7 +337,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdInventory.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'i']</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv']</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -368,7 +368,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdInventory.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.commands.default.general.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -722,7 +722,7 @@ automatically begin with your name.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdPose.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [':', 'emote']</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['emote', ':']</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -763,7 +763,7 @@ space.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.general.CmdPose.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': &quot;\n strike a pose\n\n Usage:\n pose &lt;pose text&gt;\n pose's &lt;pose text&gt;\n\n Example:\n pose is standing by the wall, smiling.\n -&gt; others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': &quot;\n strike a pose\n\n Usage:\n pose &lt;pose text&gt;\n pose's &lt;pose text&gt;\n\n Example:\n pose is standing by the wall, smiling.\n -&gt; others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n &quot;}</em><a class="headerlink" href="#evennia.commands.default.general.CmdPose.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -985,7 +985,7 @@ main test suite started with</p>
<p>Test the batch processor.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.tests.TestBatchProcess.red_button">
<code class="sig-name descname">red_button</code><em class="property"> = &lt;module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp5jf4_6kl/4269745d3ef8708761098cfcb9310d86e44e31c1/evennia/contrib/tutorials/red_button/red_button.py'&gt;</em><a class="headerlink" href="#evennia.commands.default.tests.TestBatchProcess.red_button" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">red_button</code><em class="property"> = &lt;module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp6kehfgj8/0f28eb1ac38eef3e8b4c6fcc82c35ec25a53eda0/evennia/contrib/tutorials/red_button/red_button.py'&gt;</em><a class="headerlink" href="#evennia.commands.default.tests.TestBatchProcess.red_button" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">

View file

@ -136,7 +136,7 @@ connect “account name” “pass word”</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['conn', 'co', 'con']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -171,7 +171,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect &quot;account name&quot; &quot;pass word&quot;\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -306,7 +306,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -332,7 +332,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -381,7 +381,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.commands.default.unloggedin.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -153,7 +153,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['con', 'conn', 'co']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['conn', 'co', 'con']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -183,7 +183,7 @@ there is no object yet before the account has logged in)</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'con conn co', 'category': 'general', 'key': 'connect', 'no_prefix': ' con conn co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect &lt;email&gt; &lt;password&gt;\n\n Use the create command to first create an account before logging in.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedConnect.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -311,7 +311,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['look', 'l']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'look']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -337,7 +337,7 @@ All it does is display the connect screen.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -381,7 +381,7 @@ for simplicity. It shows a pane of info.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.email_login.email_login.CmdUnconnectedHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -130,7 +130,7 @@
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.ingame_python.commands.CmdCallback.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;callbacks', '&#64;callback', '&#64;calls']</em><a class="headerlink" href="#evennia.contrib.base_systems.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;calls', '&#64;callback', '&#64;callbacks']</em><a class="headerlink" href="#evennia.contrib.base_systems.ingame_python.commands.CmdCallback.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -211,7 +211,7 @@ on user permission.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.ingame_python.commands.CmdCallback.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;callbacks &#64;callback &#64;calls', 'category': 'building', 'key': '&#64;call', 'no_prefix': 'call callbacks callback calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;calls &#64;callback &#64;callbacks', 'category': 'building', 'key': '&#64;call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.ingame_python.commands.CmdCallback.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -174,7 +174,7 @@ aliases to an already joined channel.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['chanalias', 'aliaschan']</em><a class="headerlink" href="#evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['aliaschan', 'chanalias']</em><a class="headerlink" href="#evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -205,7 +205,7 @@ aliases to an already joined channel.</p>
<dl class="py attribute">
<dt id="evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] &lt;channel&gt;\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] &lt;channel&gt;\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}</em><a class="headerlink" href="#evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.CmdAddCom.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -225,7 +225,7 @@ the operation will be general or on the room.</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['quit', 'q', 'chicken out', 'abort']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['quit', 'abort', 'q', 'chicken out']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -249,7 +249,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'quit q chicken out abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit q chicken out abort', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'quit abort q chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit abort q chicken out', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGiveUp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -385,7 +385,7 @@ shout</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['whisper', 'shout', ';']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['shout', ';', 'whisper']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -414,7 +414,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'whisper shout ;', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper shout ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say &lt;text&gt;\n whisper\n shout\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shout ; whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' shout ; whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say &lt;text&gt;\n whisper\n shout\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdSpeak.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -442,7 +442,7 @@ emote /me points to /box and /lever.</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['pose', ':']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':', 'pose']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -481,7 +481,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use &quot;...&quot; to enact speech.\n\n Usage:\n emote &lt;emote&gt;\n :&lt;emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use &quot;...&quot; to enact speech.\n\n Usage:\n emote &lt;emote&gt;\n :&lt;emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdEmote.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -504,7 +504,7 @@ looks and what actions is available.</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['examine', 'e', 'ex', 'unfocus']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['unfocus', 'ex', 'examine', 'e']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -533,7 +533,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'examine e ex unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine e ex unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus &lt;obj&gt;\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'unfocus ex examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus ex examine e', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus &lt;obj&gt;\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdFocus.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -595,7 +595,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdGet.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'inventory', 'give', 'i']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGet.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv', 'give', 'inventory']</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGet.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -619,7 +619,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.full_systems.evscaperoom.commands.CmdGet.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv inventory give i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv inventory give i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGet.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i inv give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}</em><a class="headerlink" href="#evennia.contrib.full_systems.evscaperoom.commands.CmdGet.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -759,7 +759,7 @@ try to influence the other part in the deal.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.barter.barter.CmdStatus.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['offers', 'deal']</em><a class="headerlink" href="#evennia.contrib.game_systems.barter.barter.CmdStatus.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['deal', 'offers']</em><a class="headerlink" href="#evennia.contrib.game_systems.barter.barter.CmdStatus.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -785,7 +785,7 @@ try to influence the other part in the deal.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.barter.barter.CmdStatus.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': &quot;\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.game_systems.barter.barter.CmdStatus.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': &quot;\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.game_systems.barter.barter.CmdStatus.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -636,7 +636,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.clothing.clothing.CmdInventory.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'i']</em><a class="headerlink" href="#evennia.contrib.game_systems.clothing.clothing.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv']</em><a class="headerlink" href="#evennia.contrib.game_systems.clothing.clothing.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -667,7 +667,7 @@ inv</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.clothing.clothing.CmdInventory.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.clothing.clothing.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.clothing.clothing.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -686,7 +686,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['wait', 'hold']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['hold', 'wait']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -712,7 +712,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_basic.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -581,7 +581,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['wait', 'hold']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['hold', 'wait']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -601,7 +601,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_equip.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -704,7 +704,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['wait', 'hold']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['hold', 'wait']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -724,7 +724,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_items.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -483,7 +483,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['wait', 'hold']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['hold', 'wait']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -503,7 +503,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_magic.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -943,7 +943,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['wait', 'hold']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['hold', 'wait']</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -963,7 +963,7 @@ if there are still any actions you can take.</p>
<dl class="py attribute">
<dt id="evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}</em><a class="headerlink" href="#evennia.contrib.game_systems.turnbattle.tb_range.CmdPass.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -340,7 +340,7 @@ everyone but the person rolling.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpg.dice.dice.CmdDice.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['&#64;dice', 'roll']</em><a class="headerlink" href="#evennia.contrib.rpg.dice.dice.CmdDice.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['roll', '&#64;dice']</em><a class="headerlink" href="#evennia.contrib.rpg.dice.dice.CmdDice.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -366,7 +366,7 @@ everyone but the person rolling.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpg.dice.dice.CmdDice.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '&#64;dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': &quot;\n roll dice\n\n Usage:\n dice[/switch] &lt;nr&gt;d&lt;sides&gt; [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 &lt; 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (&lt;,&gt;,&lt;=,&gt;=,==,!=). So e.g. 2d6 + 3 &gt; 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.rpg.dice.dice.CmdDice.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'roll &#64;dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': &quot;\n roll dice\n\n Usage:\n dice[/switch] &lt;nr&gt;d&lt;sides&gt; [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 &lt; 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (&lt;,&gt;,&lt;=,&gt;=,==,!=). So e.g. 2d6 + 3 &gt; 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n &quot;}</em><a class="headerlink" href="#evennia.contrib.rpg.dice.dice.CmdDice.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -908,7 +908,7 @@ Using the command without arguments will list all current recogs.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['recognize', 'forget']</em><a class="headerlink" href="#evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['forget', 'recognize']</em><a class="headerlink" href="#evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -935,7 +935,7 @@ Using the command without arguments will list all current recogs.</p>
<dl class="py attribute">
<dt id="evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}</em><a class="headerlink" href="#evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}</em><a class="headerlink" href="#evennia.contrib.rpg.rpsystem.rpsystem.CmdRecog.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -480,7 +480,7 @@ turn of combat, performing everyones actions in random order.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['hit', 'turnbased combat']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['turnbased combat', 'hit']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -526,7 +526,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'hit turnbased combat', 'category': 'general', 'key': 'attack', 'no_prefix': ' hit turnbased combat', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [&lt;target&gt;]\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'turnbased combat hit', 'category': 'general', 'key': 'attack', 'no_prefix': ' turnbased combat hit', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [&lt;target&gt;]\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_turnbased.CmdTurnAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -491,7 +491,7 @@ boost INT Wizard Goblin</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['boost', 'foil']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['foil', 'boost']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -525,7 +525,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'boost foil', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' boost foil', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] &lt;recipient&gt; &lt;target&gt;\n foil [ability] &lt;recipient&gt; &lt;target&gt;\n boost [ability] &lt;target&gt; (same as boost me &lt;target&gt;)\n foil [ability] &lt;target&gt; (same as foil &lt;target&gt; me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'foil boost', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' foil boost', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] &lt;recipient&gt; &lt;target&gt;\n foil [ability] &lt;recipient&gt; &lt;target&gt;\n boost [ability] &lt;target&gt; (same as boost me &lt;target&gt;)\n foil [ability] &lt;target&gt; (same as foil &lt;target&gt; me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.combat_twitch.CmdStunt.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -206,7 +206,7 @@ self.args).</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.commands.CmdInventory.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['inv', 'i']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.commands.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['i', 'inv']</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.commands.CmdInventory.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -230,7 +230,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.evadventure.commands.CmdInventory.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.commands.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.evadventure.commands.CmdInventory.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -167,7 +167,7 @@ such as when closing the lid and un-blinding a character.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push', 'press', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'press', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -196,7 +196,7 @@ check if the lid is open or closed.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidClosed.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -393,7 +393,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push', 'press', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'press', 'push']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -422,7 +422,7 @@ set in self.parse())</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push press press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdPushLidOpen.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -520,7 +520,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['examine', 'listen', 'l', 'feel', 'ex', 'get']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'feel', 'get', 'listen', 'examine', 'ex']</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -546,7 +546,7 @@ be mutually exclusive.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'examine listen l feel ex get', 'category': 'general', 'key': 'look', 'no_prefix': ' examine listen l feel ex get', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l feel get listen examine ex', 'category': 'general', 'key': 'look', 'no_prefix': ' l feel get listen examine ex', 'tags': '', 'text': &quot;\n Looking around in darkness\n\n Usage:\n look &lt;obj&gt;\n\n ... not that there's much to see in the dark.\n\n &quot;}</em><a class="headerlink" href="#evennia.contrib.tutorials.red_button.red_button.CmdBlindLook.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -570,7 +570,7 @@ shift green root up/down</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['shiftroot', 'push', 'pull', 'move']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['move', 'pull', 'push', 'shiftroot']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -606,7 +606,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'shiftroot push pull move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot push pull move', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'move pull push shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move pull push shiftroot', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdShiftRoot.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -623,7 +623,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['push button', 'button', 'press button']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['press button', 'push button', 'button']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -649,7 +649,7 @@ yellow/green - horizontal roots</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button button press button', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdPressButton.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -793,7 +793,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['kill', 'defend', 'slash', 'parry', 'bash', 'fight', 'stab', 'pierce', 'chop', 'hit', 'thrust']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['bash', 'defend', 'slash', 'pierce', 'thrust', 'hit', 'chop', 'parry', 'fight', 'stab', 'kill']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'kill defend slash parry bash fight stab pierce chop hit thrust', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' kill defend slash parry bash fight stab pierce chop hit thrust', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'bash defend slash pierce thrust hit chop parry fight stab kill', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash defend slash pierce thrust hit chop parry fight stab kill', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab &lt;enemy&gt;\n slash &lt;enemy&gt;\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.objects.CmdAttack.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -830,7 +830,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['?', 'h']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['h', '?']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -856,7 +856,7 @@ if they fall off the bridge.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdBridgeHelp.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>
@ -982,7 +982,7 @@ to find something.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['feel around', 'l', 'feel', 'fiddle', 'search']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['l', 'feel', 'feel around', 'search', 'fiddle']</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.</p>
<dl class="py attribute">
<dt id="evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'feel around l feel fiddle search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around l feel fiddle search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'l feel feel around search fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l feel feel around search fiddle', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}</em><a class="headerlink" href="#evennia.contrib.tutorials.tutorial_world.rooms.CmdLookDark.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -222,7 +222,7 @@ git evennia pull - Pull the latest evennia code.</p>
<dl class="py attribute">
<dt id="evennia.contrib.utils.git_integration.git_integration.CmdGitEvennia.directory">
<code class="sig-name descname">directory</code><em class="property"> = '/tmp/tmp5jf4_6kl/4269745d3ef8708761098cfcb9310d86e44e31c1/evennia'</em><a class="headerlink" href="#evennia.contrib.utils.git_integration.git_integration.CmdGitEvennia.directory" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">directory</code><em class="property"> = '/tmp/tmp6kehfgj8/0f28eb1ac38eef3e8b4c6fcc82c35ec25a53eda0/evennia'</em><a class="headerlink" href="#evennia.contrib.utils.git_integration.git_integration.CmdGitEvennia.directory" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.</p>
<dl class="py attribute">
<dt id="evennia.contrib.utils.git_integration.git_integration.CmdGit.directory">
<code class="sig-name descname">directory</code><em class="property"> = '/tmp/tmp5jf4_6kl/4269745d3ef8708761098cfcb9310d86e44e31c1/evennia/game_template'</em><a class="headerlink" href="#evennia.contrib.utils.git_integration.git_integration.CmdGit.directory" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">directory</code><em class="property"> = '/tmp/tmp6kehfgj8/0f28eb1ac38eef3e8b4c6fcc82c35ec25a53eda0/evennia/game_template'</em><a class="headerlink" href="#evennia.contrib.utils.git_integration.git_integration.CmdGit.directory" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">

View file

@ -443,14 +443,19 @@ template directory from evennias root.</p>
<dl class="py function">
<dt id="evennia.server.evennia_launcher.check_database">
<code class="sig-prename descclassname">evennia.server.evennia_launcher.</code><code class="sig-name descname">check_database</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">always_return</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/evennia_launcher.html#check_database"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.evennia_launcher.check_database" title="Permalink to this definition"></a></dt>
<dd><p>Check so the database exists.</p>
<dd><p>Check if the database exists and has basic tables. This is only run by the launcher.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>always_return</strong> (<em>bool</em><em>, </em><em>optional</em>) If set, will always return True/False
also on critical errors. No output will be printed.</p>
<dd class="field-odd"><p><strong>always_return</strong> (<em>bool</em><em>, </em><em>optional</em>) If True, will not raise exceptions on errors.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>exists (bool)</em> <strong>True</strong> if the database exists, otherwise <strong>False</strong>.</p>
<dd class="field-even"><p><p><em>exists (bool)</em> </p>
<dl class="simple">
<dt><strong>True</strong> if database exists and seems set up, <strong>False</strong> otherwise.</dt><dd><p>If <strong>always_return</strong> is <strong>False</strong>, this will raise exceptions instead of
returning <strong>False</strong>.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>

View file

@ -126,7 +126,7 @@ utils.search module and allows you to do the shorter <strong>create.object()</st
objects already existing in the database.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_object">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_object</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">key</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">location</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">home</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">permissions</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">destination</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">report_to</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">nohome</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">attributes</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">nattributes</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_object" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_object</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_object" title="Permalink to this definition"></a></dt>
<dd><p>Create a new in-game object.</p>
<dl class="field-list simple">
<dt class="field-odd">Keyword Arguments</dt>
@ -164,7 +164,7 @@ adding this rarely makes sense since this data will not survive a reload.</p></l
<dl class="py function">
<dt id="evennia.utils.create.create_script">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_script</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">key</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">obj</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">account</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">interval</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">start_delay</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">repeats</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">persistent</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">autostart</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">report_to</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">desc</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">attributes</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_script" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_script</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_script"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_script" title="Permalink to this definition"></a></dt>
<dd><p>Create a new script. All scripts are a combination of a database
object that communicates with the database, and an typeclass that
decorates the database object into being different types of
@ -209,7 +209,7 @@ scripts in the database.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_help_entry">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">entrytext</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">'General'</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_help_entry" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_help_entry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_help_entry" title="Permalink to this definition"></a></dt>
<dd><p>Create a static help entry in the help database. Note that Command
help entries are dynamic and directly taken from the __doc__
entries of the command. The database-stored help entries are
@ -234,7 +234,7 @@ in-game setting information and so on.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_message">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">senderobj</span></em>, <em class="sig-param"><span class="n">message</span></em>, <em class="sig-param"><span class="n">receivers</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">header</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_message" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_message"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_message" title="Permalink to this definition"></a></dt>
<dd><p>Create a new communication Msg. Msgs represent a unit of
database-persistent communication between entites.</p>
<dl class="field-list simple">
@ -250,7 +250,7 @@ will be retained.</p></li>
to, or a list of them. If a string, its an identifier for an external
receiver.</p></li>
<li><p><strong>locks</strong> (<em>str</em>) Lock definition string.</p></li>
<li><p><strong>tags</strong> (<em>list</em>) A list of tags or tuples <strong>(tag[,category[,data]])</strong>.</p></li>
<li><p><strong>tags</strong> (<em>list</em>) A list of tags or tuples <strong>(tag, category)</strong>.</p></li>
<li><p><strong>header</strong> (<em>str</em>) Mime-type or other optional information for the message</p></li>
</ul>
</dd>
@ -263,7 +263,7 @@ its up to the command definitions to limit this as desired.</p>
<dl class="py function">
<dt id="evennia.utils.create.create_channel">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">aliases</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">desc</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">keep_log</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">attrs</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_channel" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_channel"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_channel" title="Permalink to this definition"></a></dt>
<dd><p>Create A communication Channel. A Channel serves as a central hub
for distributing Msgs to groups of people without specifying the
receivers explicitly. Instead accounts may connect to the channel
@ -294,7 +294,7 @@ often used).</p></li>
<dl class="py function">
<dt id="evennia.utils.create.create_account">
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_account</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">email</span></em>, <em class="sig-param"><span class="n">password</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">is_superuser</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">locks</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">permissions</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">attributes</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">report_to</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.create.create_account" title="Permalink to this definition"></a></dt>
<code class="sig-prename descclassname">evennia.utils.create.</code><code class="sig-name descname">create_account</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/create.html#create_account"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.create.create_account" title="Permalink to this definition"></a></dt>
<dd><p>This creates a new account.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>

View file

@ -356,7 +356,7 @@ indentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = [':r', ':i', ':w', '::', ':f', ':&lt;', ':UU', ':&gt;', ':::', ':S', ':x', ':echo', ':fi', ':y', ':dw', ':q', ':u', ':=', ':A', ':DD', ':p', ':I', ':fd', ':dd', ':h', ':j', ':q!', ':wq', ':s', ':!', ':', ':uu']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = [':fi', '::', ':h', ':p', ':dw', ':y', ':i', ':UU', ':q', ':::', ':I', ':=', ':x', ':wq', ':', ':!', ':s', ':dd', ':uu', ':u', ':S', ':&gt;', ':&lt;', ':w', ':echo', ':A', ':DD', ':r', ':q!', ':f', ':fd', ':j']</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -384,7 +384,7 @@ efficient presentation.</p>
<dl class="py attribute">
<dt id="evennia.utils.eveditor.CmdEditorGroup.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':r :i :w :: :f :&lt; :UU :&gt; ::: :S :x :echo :fi :y :dw :q :u := :A :DD :p :I :fd :dd :h :j :q! :wq :s :! : :uu', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :r :i :w :: :f :&lt; :UU :&gt; ::: :S :x :echo :fi :y :dw :q :u := :A :DD :p :I :fd :dd :h :j :q! :wq :s :! : :uu', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': ':fi :: :h :p :dw :y :i :UU :q ::: :I := :x :wq : :! :s :dd :uu :u :S :&gt; :&lt; :w :echo :A :DD :r :q! :f :fd :j', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :fi :: :h :p :dw :y :i :UU :q ::: :I := :x :wq : :! :s :dd :uu :u :S :&gt; :&lt; :w :echo :A :DD :r :q! :f :fd :j', 'tags': '', 'text': '\n Commands for the editor\n '}</em><a class="headerlink" href="#evennia.utils.eveditor.CmdEditorGroup.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -955,7 +955,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['abort', 'yes', 'a', '__nomatch_command', 'no', 'y', 'n']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['abort', '__nomatch_command', 'yes', 'a', 'no', 'n', 'y']</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -981,7 +981,7 @@ single question.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'abort yes a __nomatch_command no y n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort yes a __nomatch_command no y n', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'abort __nomatch_command yes a no n y', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort __nomatch_command yes a no n y', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}</em><a class="headerlink" href="#evennia.utils.evmenu.CmdYesNoQuestion.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -151,7 +151,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.aliases">
<code class="sig-name descname">aliases</code><em class="property"> = ['t', 'abort', 'top', 'e', 'end', 'quit', 'a', 'previous', 'q', 'p', 'next', 'n']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">aliases</code><em class="property"> = ['next', 'previous', 'abort', 'p', 't', 'end', 'e', 'a', 'top', 'q', 'n', 'quit']</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.aliases" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
@ -177,7 +177,7 @@ the <strong>caller.msg()</strong> construct every time the page is updated.</p>
<dl class="py attribute">
<dt id="evennia.utils.evmore.CmdMore.search_index_entry">
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 't abort top e end quit a previous q p next n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t abort top e end quit a previous q p next n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<code class="sig-name descname">search_index_entry</code><em class="property"> = {'aliases': 'next previous abort p t end e a top q n quit', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' next previous abort p t end e a top q n quit', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}</em><a class="headerlink" href="#evennia.utils.evmore.CmdMore.search_index_entry" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
</dd></dl>

View file

@ -134,151 +134,182 @@ there is only one match) unless noted otherwise.</p>
&gt; match = Object.objects.get_object_with_account(…)</p>
<dl class="py function">
<dt id="evennia.utils.search.search_object">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_object</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">searchdata</span></em>, <em class="sig-param"><span class="n">attribute_name</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">candidates</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">exact</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">use_dbref</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">tags</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_object" title="Permalink to this definition"></a></dt>
<dd><p>Search as an object globally or in a list of candidates and
return results. Always returns a QuerySet of Objects.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_object</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_object" title="Permalink to this definition"></a></dt>
<dd><p>Search for objects in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>searchdata</strong> (<em>str</em><em> or </em><em>Object</em>) The entity to match for. This is
usually a key string but may also be an object itself.
By default (if no <strong>attribute_name</strong> is set), this will
search <strong>object.key</strong> and <strong>object.aliases</strong>.
Can also be on the form #dbref, which will (if
<strong>exact=True</strong>) be matched against primary key.</p></li>
<li><p><strong>attribute_name</strong> (<em>str</em>) Use this named Attribute to
match searchdata against, instead of the defaults. If
this is the name of a database field (with or without
the <strong>db_</strong> prefix), that will be matched too.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>TypeClass</em>) restrict matches to objects
having this typeclass. This will help speed up global
searches.</p></li>
<li><p><strong>candidates</strong> (<em>list</em>) If supplied, search will
only be performed among the candidates in this list. A
common list of candidates is the contents of the
current location searched.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Match names/aliases exactly or partially.
Partial matching matches the beginning of words in the
names/aliases, using a matching routine to separate
multiple matches in names with multiple components (so
“bi sw” will match “Big sword”). Since this is more
expensive than exact matching, it is recommended to be
used together with the <strong>candidates</strong> keyword to limit the
number of possibilities. This value has no meaning if
searching for attributes/properties.</p></li>
<li><p><strong>use_dbref</strong> (<em>bool</em>) If False, bypass direct lookup of a string
on the form #dbref and treat it like any string.</p></li>
<li><p><strong>tags</strong> (<em>list</em>) A list of tuples <strong>(tagkey, tagcategory)</strong> where the
matched object must have _all_ tags in order to be considered
a match.</p></li>
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>int</em>) Object key or dbref to search for. This can also
be a list of keys/dbrefs. <strong>None</strong> (default) returns all objects.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Only valid for string keys. If True, requires exact
key match, otherwise also match key with case-insensitive and
partial matching. Default is True.</p></li>
<li><p><strong>candidates</strong> (<em>list</em>) Only search among these object candidates,
if given. Default is to search all objects.</p></li>
<li><p><strong>attribute_name</strong> (<em>str</em>) If set, search by objects with this attribute_name
defined on them, with the value specified by <strong>attribute_value</strong>.</p></li>
<li><p><strong>attribute_value</strong> (<em>any</em>) What value the given attribute_name must have.</p></li>
<li><p><strong>location</strong> (<em>Object</em>) Filter by objects at this location.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>TypeClass</em>) Filter by objects having this typeclass.
This can also be a list of typeclasses.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by objects having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>nofetch</strong> (<em>bool</em>) Dont fetch typeclass and perms data from db.
This is faster but gives less info.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>matches (QuerySet)</em> Matching objects</p>
<dd class="field-even"><p><em>matches (list)</em> List of Objects matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_account">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_account</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ostring</span></em>, <em class="sig-param"><span class="n">exact</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_account" title="Permalink to this definition"></a></dt>
<dd><p>Searches for a particular account by name or
database id.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_account</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_account"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_account" title="Permalink to this definition"></a></dt>
<dd><p>Search for accounts in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>ostring</strong> (<em>str</em><em> or </em><em>int</em>) A key string or database id.</p></li>
<li><p><strong>exact</strong> (<em>bool</em><em>, </em><em>optional</em>) Only valid for string matches. If
<strong>True</strong>, requires exact (non-case-sensitive) match,
otherwise also match also keys containing the <strong>ostring</strong>
(non-case-sensitive fuzzy match).</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>Typeclass</em><em>, </em><em>optional</em>) Limit the search only to
accounts of this typeclass.</p></li>
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>int</em>) Account key or dbref to search for. This can also
be a list of keys/dbrefs. <strong>None</strong> (default) returns all accounts.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Only valid for string keys. If True, requires exact
key match, otherwise also match key with case-insensitive and
partial matching. Default is True.</p></li>
<li><p><strong>candidates</strong> (<em>list</em>) Only search among these account candidates,
if given. Default is to search all accounts.</p></li>
<li><p><strong>attribute_name</strong> (<em>str</em>) If set, search by accounts with this attribute_name
defined on them, with the value specified by <strong>attribute_value</strong>.</p></li>
<li><p><strong>attribute_value</strong> (<em>any</em>) What value the given attribute_name must have.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by accounts having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>nofetch</strong> (<em>bool</em>) Dont fetch typeclass and perms data from db.
This is faster but gives less info.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Queryset</em> A queryset (an iterable) with 0, 1 or more matches.</p>
<dd class="field-even"><p><em>matches (list)</em> List of Accounts matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_script">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_script</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ostring</span></em>, <em class="sig-param"><span class="n">obj</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">only_timed</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">typeclass</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_script" title="Permalink to this definition"></a></dt>
<dd><p>Search for a particular script.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_script</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_script"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_script" title="Permalink to this definition"></a></dt>
<dd><p>Search for scripts in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>ostring</strong> (<em>str</em>) Search criterion - a script dbef or key.</p></li>
<li><p><strong>obj</strong> (<em>Object</em><em>, </em><em>optional</em>) Limit search to scripts defined on
this object</p></li>
<li><p><strong>only_timed</strong> (<em>bool</em>) Limit search only to scripts that run
on a timer.</p></li>
<li><p><strong>typeclass</strong> (<em>class</em><em> or </em><em>str</em>) Typeclass or path to typeclass.</p></li>
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>int</em>) Script key or dbref to search for. This can also
be a list of keys/dbrefs. <strong>None</strong> (default) returns all scripts.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Only valid for string keys. If True, requires exact
key match, otherwise also match key with case-insensitive and
partial matching. Default is True.</p></li>
<li><p><strong>candidates</strong> (<em>list</em>) Only search among these script candidates,
if given. Default is to search all scripts.</p></li>
<li><p><strong>attribute_name</strong> (<em>str</em>) If set, search by scripts with this attribute_name
defined on them, with the value specified by <strong>attribute_value</strong>.</p></li>
<li><p><strong>attribute_value</strong> (<em>any</em>) What value the given attribute_name must have.</p></li>
<li><p><strong>obj</strong> (<em>Object</em>) Filter by scripts defined on this object.</p></li>
<li><p><strong>account</strong> (<em>Account</em>) Filter by scripts defined on this account.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>TypeClass</em>) Filter by scripts having this typeclass.
This can also be a list of typeclasses.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by scripts having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>nofetch</strong> (<em>bool</em>) Dont fetch typeclass and perms data from db.
This is faster but gives less info.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Queryset</em> An iterable with 0, 1 or more results.</p>
<dd class="field-even"><p><em>matches (list)</em> List of Scripts matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_message">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sender</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">receiver</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">freetext</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">dbref</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_message" title="Permalink to this definition"></a></dt>
<dd><p>Search the message database for particular messages. At least
one of the arguments must be given to do a search.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_message</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_message"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_message" title="Permalink to this definition"></a></dt>
<dd><p>Search for messages in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>sender</strong> (<em>Object</em><em>, </em><em>Account</em><em> or </em><em>Script</em><em>, </em><em>optional</em>) Get messages sent by a particular sender.</p></li>
<li><p><strong>receiver</strong> (<em>Object</em><em>, </em><em>Account</em><em> or </em><em>Channel</em><em>, </em><em>optional</em>) Get messages
received by a certain account,object or channel</p></li>
<li><p><strong>freetext</strong> (<em>str</em>) Search for a text string in a message. NOTE:
This can potentially be slow, so make sure to supply one of
the other arguments to limit the search.</p></li>
<li><p><strong>dbref</strong> (<em>int</em>) The exact database id of the message. This will override
all other search criteria since its unique and
always gives only one match.</p></li>
<li><p><strong>sender</strong> (<em>Object</em><em>, </em><em>Account</em><em> or </em><em>str</em>) Filter by messages sent by this entity.
If a string, this is an external sender name.</p></li>
<li><p><strong>receiver</strong> (<em>Object</em><em>, </em><em>Account</em><em> or </em><em>str</em>) Filter by messages received by this entity.
If a string, this is an external receiver name.</p></li>
<li><p><strong>channel</strong> (<em>Channel</em>) Filter by messages sent to this channel.</p></li>
<li><p><strong>date</strong> (<em>datetime</em>) Filter by messages sent on this date.</p></li>
<li><p><strong>type</strong> (<em>str</em>) Filter by messages of this type.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by messages having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>exclude_tags</strong> (<em>str</em><em> or </em><em>list</em>) Exclude messages with these tags.</p></li>
<li><p><strong>search_text</strong> (<em>str</em>) Search for text in message content.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) If True, require exact text match. Default False.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Queryset</em> Iterable with 0, 1 or more matches.</p>
<dd class="field-even"><p><em>matches (list)</em> List of Messages matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_channel">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ostring</span></em>, <em class="sig-param"><span class="n">exact</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_channel" title="Permalink to this definition"></a></dt>
<dd><p>Search the channel database for a particular channel.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_channel</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_channel"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_channel" title="Permalink to this definition"></a></dt>
<dd><p>Search for channels in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>ostring</strong> (<em>str</em>) The key or database id of the channel.</p></li>
<li><p><strong>exact</strong> (<em>bool</em><em>, </em><em>optional</em>) Require an exact (but not
case sensitive) match.</p></li>
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>int</em>) Channel key or dbref to search for. This can also
be a list of keys/dbrefs. <strong>None</strong> (default) returns all channels.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Only valid for string keys. If True, requires exact
key match, otherwise also match key with case-insensitive and
partial matching. Default is True.</p></li>
<li><p><strong>candidates</strong> (<em>list</em>) Only search among these channel candidates,
if given. Default is to search all channels.</p></li>
<li><p><strong>attribute_name</strong> (<em>str</em>) If set, search by channels with this attribute_name
defined on them, with the value specified by <strong>attribute_value</strong>.</p></li>
<li><p><strong>attribute_value</strong> (<em>any</em>) What value the given attribute_name must have.</p></li>
<li><p><strong>typeclass</strong> (<em>str</em><em> or </em><em>TypeClass</em>) Filter by channels having this typeclass.
This can also be a list of typeclasses.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by channels having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>nofetch</strong> (<em>bool</em>) Dont fetch typeclass and perms data from db.
This is faster but gives less info.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Queryset</em> Iterable with 0, 1 or more matches.</p>
<dd class="field-even"><p><em>matches (list)</em> List of Channels matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_help_entry">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ostring</span></em>, <em class="sig-param"><span class="n">help_category</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_help_entry" title="Permalink to this definition"></a></dt>
<dd><p>Retrieve a search entry object.</p>
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_help_entry</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#evennia.utils.search.search_help_entry" title="Permalink to this definition"></a></dt>
<dd><p>Search for help entries in the database.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>ostring</strong> (<em>str</em>) The help topic to look for.</p></li>
<li><p><strong>category</strong> (<em>str</em>) Limit the search to a particular help topic</p></li>
<li><p><strong>key</strong> (<em>str</em><em> or </em><em>int</em>) Help entry key or dbref to search for. This can also
be a list of keys/dbrefs. <strong>None</strong> (default) returns all help entries.</p></li>
<li><p><strong>exact</strong> (<em>bool</em>) Only valid for string keys. If True, requires exact
key match, otherwise also match key with case-insensitive and
partial matching. Default is True.</p></li>
<li><p><strong>category</strong> (<em>str</em>) Filter by help entries in this category.</p></li>
<li><p><strong>tags</strong> (<em>str</em><em> or </em><em>list</em>) Filter by help entries having one or more Tags.
This can be a single tag key, a list of tag keys, or a list of
tuples (tag_key, tag_category).</p></li>
<li><p><strong>locks</strong> (<em>str</em>) Filter by help entries with these locks.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><em>Queryset</em> An iterable with 0, 1 or more matches.</p>
<dd class="field-even"><p><em>matches (list)</em> List of HelpEntries matching the search criteria.</p>
</dd>
</dl>
</dd></dl>
@ -317,90 +348,18 @@ matches were found.</p>
<dt id="evennia.utils.search.search_script_tag">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_script_tag</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tagtype</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_script_tag"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_script_tag" title="Permalink to this definition"></a></dt>
<dd><p>Find script based on tag or category.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em>, </em><em>optional</em>) The tag key to search for.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The category of tag
to search for. If not set, uncategorized
tags will be searched.</p></li>
<li><p><strong>tagtype</strong> (<em>str</em><em>, </em><em>optional</em>) type of Tag, by default
this is either <strong>None</strong> (a normal Tag), <strong>alias</strong> or
<strong>permission</strong>. This always apply to all queried tags.</p></li>
<li><p><strong>kwargs</strong> (<em>any</em>) Other optional parameter that may be supported
by the manager method.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>matches (list)</em> </p>
<dl class="simple">
<dt>List of Scripts with tags matching</dt><dd><p>the search criteria, or an empty list if no
matches were found.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_account_tag">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_account_tag</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tagtype</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_account_tag"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_account_tag" title="Permalink to this definition"></a></dt>
<dd><p>Find account based on tag or category.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em>, </em><em>optional</em>) The tag key to search for.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The category of tag
to search for. If not set, uncategorized
tags will be searched.</p></li>
<li><p><strong>tagtype</strong> (<em>str</em><em>, </em><em>optional</em>) type of Tag, by default
this is either <strong>None</strong> (a normal Tag), <strong>alias</strong> or
<strong>permission</strong>. This always apply to all queried tags.</p></li>
<li><p><strong>kwargs</strong> (<em>any</em>) Other optional parameter that may be supported
by the manager method.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>matches (list)</em> </p>
<dl class="simple">
<dt>List of Accounts with tags matching</dt><dd><p>the search criteria, or an empty list if no
matches were found.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt id="evennia.utils.search.search_channel_tag">
<code class="sig-prename descclassname">evennia.utils.search.</code><code class="sig-name descname">search_channel_tag</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">category</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">tagtype</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/utils/search.html#search_channel_tag"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.utils.search.search_channel_tag" title="Permalink to this definition"></a></dt>
<dd><p>Find channel based on tag or category.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>key</strong> (<em>str</em><em>, </em><em>optional</em>) The tag key to search for.</p></li>
<li><p><strong>category</strong> (<em>str</em><em>, </em><em>optional</em>) The category of tag
to search for. If not set, uncategorized
tags will be searched.</p></li>
<li><p><strong>tagtype</strong> (<em>str</em><em>, </em><em>optional</em>) type of Tag, by default
this is either <strong>None</strong> (a normal Tag), <strong>alias</strong> or
<strong>permission</strong>. This always apply to all queried tags.</p></li>
<li><p><strong>kwargs</strong> (<em>any</em>) Other optional parameter that may be supported
by the manager method.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>matches (list)</em> </p>
<dl class="simple">
<dt>List of Channels with tags matching</dt><dd><p>the search criteria, or an empty list if no
matches were found.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">

View file

@ -262,6 +262,24 @@
<code class="sig-name descname">url_name</code><em class="property"> = 'logout'</em><a class="headerlink" href="#evennia.web.website.tests.LogoutTest.url_name" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.web.website.tests.LogoutTest.test_get">
<code class="sig-name descname">test_get</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/tests.html#LogoutTest.test_get"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.tests.LogoutTest.test_get" title="Permalink to this definition"></a></dt>
<dd><p>Since Django 5.0, logout is no longer supported with GET requests</p>
</dd></dl>
<dl class="py method">
<dt id="evennia.web.website.tests.LogoutTest.test_post">
<code class="sig-name descname">test_post</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/tests.html#LogoutTest.test_post"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.tests.LogoutTest.test_post" title="Permalink to this definition"></a></dt>
<dd><p>Do the logout test with a POST request</p>
</dd></dl>
<dl class="py method">
<dt id="evennia.web.website.tests.LogoutTest.test_get_authenticated">
<code class="sig-name descname">test_get_authenticated</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/tests.html#LogoutTest.test_get_authenticated"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.tests.LogoutTest.test_get_authenticated" title="Permalink to this definition"></a></dt>
<dd><p>Do the logout test with a POST instead of GET</p>
</dd></dl>
</dd></dl>
<dl class="py class">

View file

@ -303,7 +303,7 @@ list of all characters the user may access.</p>
<dl class="py class">
<dt id="evennia.web.website.views.characters.CharacterDeleteView">
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.characters.</code><code class="sig-name descname">CharacterDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/characters.html#CharacterDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.characters.CharacterDeleteView" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.characters.</code><code class="sig-name descname">CharacterDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/characters.html#CharacterDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.characters.CharacterDeleteView" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <a class="reference internal" href="#evennia.web.website.views.characters.CharacterMixin" title="evennia.web.website.views.characters.CharacterMixin"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.web.website.views.characters.CharacterMixin</span></code></a>, <a class="reference internal" href="evennia.web.website.views.objects.html#evennia.web.website.views.objects.ObjectDeleteView" title="evennia.web.website.views.objects.ObjectDeleteView"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.web.website.views.objects.ObjectDeleteView</span></code></a></p>
<p>This view provides a mechanism by which a logged-in player (enforced by
ObjectDeleteView) can delete a character they own.</p>

View file

@ -180,7 +180,7 @@ otherwise.</p>
<dl class="py class">
<dt id="evennia.web.website.views.mixins.EvenniaDeleteView">
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.mixins.</code><code class="sig-name descname">EvenniaDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/mixins.html#EvenniaDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.mixins.EvenniaDeleteView" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.mixins.</code><code class="sig-name descname">EvenniaDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/mixins.html#EvenniaDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.mixins.EvenniaDeleteView" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">django.views.generic.edit.DeleteView</span></code>, <a class="reference internal" href="#evennia.web.website.views.mixins.TypeclassMixin" title="evennia.web.website.views.mixins.TypeclassMixin"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.web.website.views.mixins.TypeclassMixin</span></code></a></p>
<p>This view extends Djangos default DeleteView.</p>
<p>DeleteView is used for deleting objects, be they Accounts, Characters or

View file

@ -187,7 +187,7 @@ default title for the page.</p>
<dl class="py class">
<dt id="evennia.web.website.views.objects.ObjectDeleteView">
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.objects.</code><code class="sig-name descname">ObjectDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/objects.html#ObjectDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.objects.ObjectDeleteView" title="Permalink to this definition"></a></dt>
<em class="property">class </em><code class="sig-prename descclassname">evennia.web.website.views.objects.</code><code class="sig-name descname">ObjectDeleteView</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/web/website/views/objects.html#ObjectDeleteView"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.web.website.views.objects.ObjectDeleteView" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">django.contrib.auth.mixins.LoginRequiredMixin</span></code>, <a class="reference internal" href="#evennia.web.website.views.objects.ObjectDetailView" title="evennia.web.website.views.objects.ObjectDetailView"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.web.website.views.objects.ObjectDetailView</span></code></a>, <a class="reference internal" href="evennia.web.website.views.mixins.html#evennia.web.website.views.mixins.EvenniaDeleteView" title="evennia.web.website.views.mixins.EvenniaDeleteView"><code class="xref py py-class docutils literal notranslate"><span class="pre">evennia.web.website.views.mixins.EvenniaDeleteView</span></code></a></p>
<p>This is an important view for obvious reasons!</p>
<p>Any view you write that deals with deleting a specific object will want to

View file

@ -22272,13 +22272,19 @@
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.EvenniaWebTest.test_get">test_get() (evennia.web.website.tests.EvenniaWebTest method)</a>
<ul>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_get">(evennia.web.website.tests.LogoutTest method)</a>
</li>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.WebclientTest.test_get">(evennia.web.website.tests.WebclientTest method)</a>
</li>
</ul></li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestGeneral.test_get_and_drop">test_get_and_drop() (evennia.commands.default.tests.TestGeneral method)</a>
</li>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.EvenniaWebTest.test_get_authenticated">test_get_authenticated() (evennia.web.website.tests.EvenniaWebTest method)</a>
<ul>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_get_authenticated">(evennia.web.website.tests.LogoutTest method)</a>
</li>
</ul></li>
<li><a href="api/evennia.contrib.tutorials.evadventure.tests.test_combat.html#evennia.contrib.tutorials.evadventure.tests.test_combat.TestEvAdventureCombatBaseHandler.test_get_combat_summary">test_get_combat_summary() (evennia.contrib.tutorials.evadventure.tests.test_combat.TestEvAdventureCombatBaseHandler method)</a>
</li>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.WebclientTest.test_get_disabled">test_get_disabled() (evennia.web.website.tests.WebclientTest method)</a>
@ -22832,6 +22838,8 @@
<li><a href="api/evennia.contrib.rpg.rpsystem.tests.html#evennia.contrib.rpg.rpsystem.tests.TestRPSystem.test_posed_contents">test_posed_contents() (evennia.contrib.rpg.rpsystem.tests.TestRPSystem method)</a>
</li>
<li><a href="api/evennia.contrib.rpg.rpsystem.tests.html#evennia.contrib.rpg.rpsystem.tests.TestRPSystem.test_possessive_selfref">test_possessive_selfref() (evennia.contrib.rpg.rpsystem.tests.TestRPSystem method)</a>
</li>
<li><a href="api/evennia.web.website.tests.html#evennia.web.website.tests.LogoutTest.test_post">test_post() (evennia.web.website.tests.LogoutTest method)</a>
</li>
<li><a href="api/evennia.contrib.game_systems.crafting.tests.html#evennia.contrib.game_systems.crafting.tests.TestCraftingRecipeBase.test_pre_craft">test_pre_craft() (evennia.contrib.game_systems.crafting.tests.TestCraftingRecipeBase method)</a>
</li>
@ -22977,12 +22985,12 @@
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestSystem.test_server_load">test_server_load() (evennia.commands.default.tests.TestSystem method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestAccount.test_sessions">test_sessions() (evennia.commands.default.tests.TestAccount method)</a>
</li>
<li><a href="api/evennia.web.api.tests.html#evennia.web.api.tests.TestEvenniaRESTApi.test_set_attribute">test_set_attribute() (evennia.web.api.tests.TestEvenniaRESTApi method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="api/evennia.contrib.full_systems.evscaperoom.tests.html#evennia.contrib.full_systems.evscaperoom.tests.TestEvscaperoomCommands.test_set_focus">test_set_focus() (evennia.contrib.full_systems.evscaperoom.tests.TestEvscaperoomCommands method)</a>
</li>
<li><a href="api/evennia.commands.default.tests.html#evennia.commands.default.tests.TestHelp.test_set_help">test_set_help() (evennia.commands.default.tests.TestHelp method)</a>

Binary file not shown.

File diff suppressed because one or more lines are too long