evennia/docs/1.0-dev/_modules/evennia/accounts/admin.html
2020-07-31 18:18:01 +02:00

458 lines
No EOL
49 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>evennia.accounts.admin &#8212; Evennia 1.0-dev 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 1.0-dev</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.accounts.admin</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.accounts.admin</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># This sets up how models are displayed</span>
<span class="c1"># in the web admin interface.</span>
<span class="c1">#</span>
<span class="kn">from</span> <span class="nn">django</span> <span class="k">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="k">import</span> <span class="n">admin</span><span class="p">,</span> <span class="n">messages</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.options</span> <span class="k">import</span> <span class="n">IS_POPUP_VAR</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.admin</span> <span class="k">import</span> <span class="n">UserAdmin</span> <span class="k">as</span> <span class="n">BaseUserAdmin</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.forms</span> <span class="k">import</span> <span class="n">UserChangeForm</span><span class="p">,</span> <span class="n">UserCreationForm</span>
<span class="kn">from</span> <span class="nn">django.contrib.admin.utils</span> <span class="k">import</span> <span class="n">unquote</span>
<span class="kn">from</span> <span class="nn">django.template.response</span> <span class="k">import</span> <span class="n">TemplateResponse</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">Http404</span><span class="p">,</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="k">import</span> <span class="n">PermissionDenied</span>
<span class="kn">from</span> <span class="nn">django.views.decorators.debug</span> <span class="k">import</span> <span class="n">sensitive_post_parameters</span>
<span class="kn">from</span> <span class="nn">django.utils.decorators</span> <span class="k">import</span> <span class="n">method_decorator</span>
<span class="kn">from</span> <span class="nn">django.utils.html</span> <span class="k">import</span> <span class="n">escape</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="k">import</span> <span class="n">path</span><span class="p">,</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="k">import</span> <span class="n">update_session_auth_hash</span>
<span class="kn">from</span> <span class="nn">evennia.accounts.models</span> <span class="k">import</span> <span class="n">AccountDB</span>
<span class="kn">from</span> <span class="nn">evennia.typeclasses.admin</span> <span class="k">import</span> <span class="n">AttributeInline</span><span class="p">,</span> <span class="n">TagInline</span>
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="k">import</span> <span class="n">create</span>
<span class="n">sensitive_post_parameters_m</span> <span class="o">=</span> <span class="n">method_decorator</span><span class="p">(</span><span class="n">sensitive_post_parameters</span><span class="p">())</span>
<span class="c1"># handle the custom User editor</span>
<div class="viewcode-block" id="AccountDBChangeForm"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBChangeForm">[docs]</a><span class="k">class</span> <span class="nc">AccountDBChangeForm</span><span class="p">(</span><span class="n">UserChangeForm</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Modify the accountdb class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="AccountDBChangeForm.Meta"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBChangeForm.Meta">[docs]</a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span></div>
<span class="n">username</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">RegexField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Username&quot;</span><span class="p">,</span>
<span class="n">max_length</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
<span class="n">regex</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;^[\w. @+-]+$&quot;</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">}),</span>
<span class="n">error_messages</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="s2">&quot;This value may contain only letters, spaces, numbers &quot;</span>
<span class="s2">&quot;and @/./+/-/_ characters.&quot;</span>
<span class="p">},</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;30 characters or fewer. Letters, spaces, digits and &quot;</span> <span class="s2">&quot;@/./+/-/_ only.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<div class="viewcode-block" id="AccountDBChangeForm.clean_username"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBChangeForm.clean_username">[docs]</a> <span class="k">def</span> <span class="nf">clean_username</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Clean the username and check its existence.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">username</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">username</span><span class="o">.</span><span class="n">upper</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="o">.</span><span class="n">username</span><span class="o">.</span><span class="n">upper</span><span class="p">():</span>
<span class="k">return</span> <span class="n">username</span>
<span class="k">elif</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">username__iexact</span><span class="o">=</span><span class="n">username</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="s2">&quot;An account with that name &quot;</span> <span class="s2">&quot;already exists.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span></div></div>
<div class="viewcode-block" id="AccountDBCreationForm"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBCreationForm">[docs]</a><span class="k">class</span> <span class="nc">AccountDBCreationForm</span><span class="p">(</span><span class="n">UserCreationForm</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a new AccountDB instance.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="AccountDBCreationForm.Meta"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBCreationForm.Meta">[docs]</a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span></div>
<span class="n">username</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">RegexField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Username&quot;</span><span class="p">,</span>
<span class="n">max_length</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
<span class="n">regex</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;^[\w. @+-]+$&quot;</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">}),</span>
<span class="n">error_messages</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="s2">&quot;This value may contain only letters, spaces, numbers &quot;</span>
<span class="s2">&quot;and @/./+/-/_ characters.&quot;</span>
<span class="p">},</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;30 characters or fewer. Letters, spaces, digits and &quot;</span> <span class="s2">&quot;@/./+/-/_ only.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<div class="viewcode-block" id="AccountDBCreationForm.clean_username"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBCreationForm.clean_username">[docs]</a> <span class="k">def</span> <span class="nf">clean_username</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Cleanup username.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">username</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span>
<span class="k">if</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">username__iexact</span><span class="o">=</span><span class="n">username</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">forms</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="s2">&quot;An account with that name already &quot;</span> <span class="s2">&quot;exists.&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">username</span></div></div>
<div class="viewcode-block" id="AccountForm"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountForm">[docs]</a><span class="k">class</span> <span class="nc">AccountForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Defines how to display Accounts</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="AccountForm.Meta"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountForm.Meta">[docs]</a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">fields</span> <span class="o">=</span> <span class="s2">&quot;__all__&quot;</span>
<span class="n">app_label</span> <span class="o">=</span> <span class="s2">&quot;accounts&quot;</span></div>
<span class="n">db_key</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">RegexField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Username&quot;</span><span class="p">,</span>
<span class="n">initial</span><span class="o">=</span><span class="s2">&quot;AccountDummy&quot;</span><span class="p">,</span>
<span class="n">max_length</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
<span class="n">regex</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;^[\w. @+-]+$&quot;</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">}),</span>
<span class="n">error_messages</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="s2">&quot;This value may contain only letters, spaces, numbers&quot;</span>
<span class="s2">&quot; and @/./+/-/_ characters.&quot;</span>
<span class="p">},</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;This should be the same as the connected Account&#39;s key &quot;</span>
<span class="s2">&quot;name. 30 characters or fewer. Letters, spaces, digits and &quot;</span>
<span class="s2">&quot;@/./+/-/_ only.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">db_typeclass_path</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Typeclass&quot;</span><span class="p">,</span>
<span class="n">initial</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_ACCOUNT_TYPECLASS</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;78&quot;</span><span class="p">}),</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;Required. Defines what &#39;type&#39; of entity this is. This &quot;</span>
<span class="s2">&quot;variable holds a Python path to a module with a valid &quot;</span>
<span class="s2">&quot;Evennia Typeclass. Defaults to &quot;</span>
<span class="s2">&quot;settings.BASE_ACCOUNT_TYPECLASS.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">db_permissions</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Permissions&quot;</span><span class="p">,</span>
<span class="n">initial</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">PERMISSION_ACCOUNT_DEFAULT</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;78&quot;</span><span class="p">}),</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;In-game permissions. A comma-separated list of text &quot;</span>
<span class="s2">&quot;strings checked by certain locks. They are often used for &quot;</span>
<span class="s2">&quot;hierarchies, such as letting an Account have permission &quot;</span>
<span class="s2">&quot;&#39;Admin&#39;, &#39;Builder&#39; etc. An Account permission can be &quot;</span>
<span class="s2">&quot;overloaded by the permissions of a controlled Character. &quot;</span>
<span class="s2">&quot;Normal accounts use &#39;Accounts&#39; by default.&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">db_lock_storage</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;Locks&quot;</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">Textarea</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;cols&quot;</span><span class="p">:</span> <span class="s2">&quot;100&quot;</span><span class="p">,</span> <span class="s2">&quot;rows&quot;</span><span class="p">:</span> <span class="s2">&quot;2&quot;</span><span class="p">}),</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;In-game lock definition string. If not given, defaults &quot;</span>
<span class="s2">&quot;will be used. This string should be on the form &quot;</span>
<span class="s2">&quot;&lt;i&gt;type:lockfunction(args);type2:lockfunction2(args);...&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">db_cmdset_storage</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
<span class="n">label</span><span class="o">=</span><span class="s2">&quot;cmdset&quot;</span><span class="p">,</span>
<span class="n">initial</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">CMDSET_ACCOUNT</span><span class="p">,</span>
<span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;78&quot;</span><span class="p">}),</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;python path to account cmdset class (set in &quot;</span>
<span class="s2">&quot;settings.CMDSET_ACCOUNT by default)&quot;</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="AccountInline"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountInline">[docs]</a><span class="k">class</span> <span class="nc">AccountInline</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">StackedInline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inline creation of Account</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span>
<span class="n">template</span> <span class="o">=</span> <span class="s2">&quot;admin/accounts/stacked.html&quot;</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">AccountForm</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span>
<span class="s2">&quot;In-game Permissions and Locks&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;db_lock_storage&quot;</span><span class="p">,),</span>
<span class="c1"># {&#39;fields&#39;: (&#39;db_permissions&#39;, &#39;db_lock_storage&#39;),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These are permissions/locks for in-game use. &quot;</span>
<span class="s2">&quot;They are unrelated to website access rights.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">(</span>
<span class="s2">&quot;In-game Account data&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">,</span> <span class="s2">&quot;db_cmdset_storage&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These fields define in-game-specific properties &quot;</span>
<span class="s2">&quot;for the Account object in-game.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="n">extra</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">max_num</span> <span class="o">=</span> <span class="mi">1</span></div>
<div class="viewcode-block" id="AccountTagInline"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountTagInline">[docs]</a><span class="k">class</span> <span class="nc">AccountTagInline</span><span class="p">(</span><span class="n">TagInline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inline Account Tags.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">db_tags</span><span class="o">.</span><span class="n">through</span>
<span class="n">related_field</span> <span class="o">=</span> <span class="s2">&quot;accountdb&quot;</span></div>
<div class="viewcode-block" id="AccountAttributeInline"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountAttributeInline">[docs]</a><span class="k">class</span> <span class="nc">AccountAttributeInline</span><span class="p">(</span><span class="n">AttributeInline</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Inline Account Attributes.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">AccountDB</span><span class="o">.</span><span class="n">db_attributes</span><span class="o">.</span><span class="n">through</span>
<span class="n">related_field</span> <span class="o">=</span> <span class="s2">&quot;accountdb&quot;</span></div>
<div class="viewcode-block" id="AccountDBAdmin"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin">[docs]</a><span class="k">class</span> <span class="nc">AccountDBAdmin</span><span class="p">(</span><span class="n">BaseUserAdmin</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is the main creation screen for Users/accounts</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="s2">&quot;email&quot;</span><span class="p">,</span> <span class="s2">&quot;is_staff&quot;</span><span class="p">,</span> <span class="s2">&quot;is_superuser&quot;</span><span class="p">)</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">AccountDBChangeForm</span>
<span class="n">add_form</span> <span class="o">=</span> <span class="n">AccountDBCreationForm</span>
<span class="n">inlines</span> <span class="o">=</span> <span class="p">[</span><span class="n">AccountTagInline</span><span class="p">,</span> <span class="n">AccountAttributeInline</span><span class="p">]</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="s2">&quot;password&quot;</span><span class="p">,</span> <span class="s2">&quot;email&quot;</span><span class="p">)}),</span>
<span class="p">(</span>
<span class="s2">&quot;Website profile&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;first_name&quot;</span><span class="p">,</span> <span class="s2">&quot;last_name&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These are not used &quot;</span> <span class="s2">&quot;in the default system.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">(</span>
<span class="s2">&quot;Website dates&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;last_login&quot;</span><span class="p">,</span> <span class="s2">&quot;date_joined&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;Relevant only to the website.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">(</span>
<span class="s2">&quot;Website Permissions&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;is_active&quot;</span><span class="p">,</span> <span class="s2">&quot;is_staff&quot;</span><span class="p">,</span> <span class="s2">&quot;is_superuser&quot;</span><span class="p">,</span> <span class="s2">&quot;user_permissions&quot;</span><span class="p">,</span> <span class="s2">&quot;groups&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These are permissions/permission groups for &quot;</span>
<span class="s2">&quot;accessing the admin site. They are unrelated to &quot;</span>
<span class="s2">&quot;in-game access rights.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">(</span>
<span class="s2">&quot;Game Options&quot;</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;db_typeclass_path&quot;</span><span class="p">,</span> <span class="s2">&quot;db_cmdset_storage&quot;</span><span class="p">,</span> <span class="s2">&quot;db_lock_storage&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These are attributes that are more relevant &quot;</span> <span class="s2">&quot;to gameplay.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="c1"># (&#39;Game Options&#39;, {&#39;fields&#39;: (</span>
<span class="c1"># &#39;db_typeclass_path&#39;, &#39;db_cmdset_storage&#39;,</span>
<span class="c1"># &#39;db_permissions&#39;, &#39;db_lock_storage&#39;),</span>
<span class="c1"># &#39;description&#39;: &#39;&lt;i&gt;These are attributes that are &#39;</span>
<span class="c1"># &#39;more relevant to gameplay.&lt;/i&gt;&#39;}))</span>
<span class="n">add_fieldsets</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span>
<span class="kc">None</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">(</span><span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="s2">&quot;password1&quot;</span><span class="p">,</span> <span class="s2">&quot;password2&quot;</span><span class="p">,</span> <span class="s2">&quot;email&quot;</span><span class="p">),</span>
<span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;i&gt;These account details are shared by the admin &quot;</span>
<span class="s2">&quot;system and the game.&lt;/i&gt;&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">),</span>
<span class="p">)</span>
<div class="viewcode-block" id="AccountDBAdmin.user_change_password"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.user_change_password">[docs]</a> <span class="nd">@sensitive_post_parameters_m</span>
<span class="k">def</span> <span class="nf">user_change_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">form_url</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
<span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">unquote</span><span class="p">(</span><span class="nb">id</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_change_permission</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">PermissionDenied</span>
<span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http404</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(name)s</span><span class="s2"> object with primary key </span><span class="si">%(key)r</span><span class="s2"> does not exist.&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</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">verbose_name</span><span class="p">,</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="n">escape</span><span class="p">(</span><span class="nb">id</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">:</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">is_valid</span><span class="p">():</span>
<span class="n">form</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">change_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">construct_change_message</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">log_change</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">change_message</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Password changed successfully.&quot;</span>
<span class="n">messages</span><span class="o">.</span><span class="n">success</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="n">update_session_auth_hash</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">form</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span>
<span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s</span><span class="s2">_change&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">user</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
<span class="c1"># the model_name is something we need to hardcode</span>
<span class="c1"># since our accountdb is a proxy:</span>
<span class="s2">&quot;accountdb&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">pk</span><span class="p">,),</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">form</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">change_password_form</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
<span class="n">fieldsets</span> <span class="o">=</span> <span class="p">[(</span><span class="kc">None</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">form</span><span class="o">.</span><span class="n">base_fields</span><span class="p">)})]</span>
<span class="n">adminForm</span> <span class="o">=</span> <span class="n">admin</span><span class="o">.</span><span class="n">helpers</span><span class="o">.</span><span class="n">AdminForm</span><span class="p">(</span><span class="n">form</span><span class="p">,</span> <span class="n">fieldsets</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;Change password: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">escape</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">get_username</span><span class="p">()),</span>
<span class="s2">&quot;adminForm&quot;</span><span class="p">:</span> <span class="n">adminForm</span><span class="p">,</span>
<span class="s2">&quot;form_url&quot;</span><span class="p">:</span> <span class="n">form_url</span><span class="p">,</span>
<span class="s2">&quot;form&quot;</span><span class="p">:</span> <span class="n">form</span><span class="p">,</span>
<span class="s2">&quot;is_popup&quot;</span><span class="p">:</span> <span class="p">(</span><span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">POST</span> <span class="ow">or</span> <span class="n">IS_POPUP_VAR</span> <span class="ow">in</span> <span class="n">request</span><span class="o">.</span><span class="n">GET</span><span class="p">),</span>
<span class="s2">&quot;add&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;change&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_delete_permission&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;has_change_permission&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;has_absolute_url&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;opts&quot;</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="p">,</span>
<span class="s2">&quot;original&quot;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
<span class="s2">&quot;save_as&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;show_save&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">each_context</span><span class="p">(</span><span class="n">request</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">request</span><span class="o">.</span><span class="n">current_app</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">name</span>
<span class="k">return</span> <span class="n">TemplateResponse</span><span class="p">(</span>
<span class="n">request</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">change_user_password_template</span> <span class="ow">or</span> <span class="s2">&quot;admin/auth/user/change_password.html&quot;</span><span class="p">,</span>
<span class="n">context</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="AccountDBAdmin.save_model"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.save_model">[docs]</a> <span class="k">def</span> <span class="nf">save_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">form</span><span class="p">,</span> <span class="n">change</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom save actions.</span>
<span class="sd"> Args:</span>
<span class="sd"> request (Request): Incoming request.</span>
<span class="sd"> obj (Object): Object to save.</span>
<span class="sd"> form (Form): Related form instance.</span>
<span class="sd"> change (bool): False if this is a new save and not an update.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">obj</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">change</span><span class="p">:</span>
<span class="c1"># calling hooks for new account</span>
<span class="n">obj</span><span class="o">.</span><span class="n">set_class_from_typeclass</span><span class="p">(</span><span class="n">typeclass_path</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_ACCOUNT_TYPECLASS</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">basetype_setup</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">at_account_creation</span><span class="p">()</span></div>
<div class="viewcode-block" id="AccountDBAdmin.response_add"><a class="viewcode-back" href="../../../api/evennia.accounts.admin.html#evennia.accounts.admin.AccountDBAdmin.response_add">[docs]</a> <span class="k">def</span> <span class="nf">response_add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">post_url_continue</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">django.http</span> <span class="k">import</span> <span class="n">HttpResponseRedirect</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="k">import</span> <span class="n">reverse</span>
<span class="k">return</span> <span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;admin:accounts_accountdb_change&quot;</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="n">id</span><span class="p">]))</span></div></div>
<span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">AccountDB</span><span class="p">,</span> <span class="n">AccountDBAdmin</span><span class="p">)</span>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<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>Versions</h3>
<ul>
<li><a href="admin.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../0.9.1/index.html">0.9.1 (master branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></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 1.0-dev</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.accounts.admin</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.1.1.
</div>
</body>
</html>