mirror of
https://github.com/evennia/evennia.git
synced 2026-03-27 02:06:32 +01:00
737 lines
No EOL
90 KiB
HTML
737 lines
No EOL
90 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>django.contrib.auth.forms — Evennia latest documentation</title>
|
||
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
|
||
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
|
||
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=d75fae25" />
|
||
<link rel="stylesheet" type="text/css" href="../../../../_static/nature.css?v=245aff17" />
|
||
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
|
||
<script src="../../../../_static/documentation_options.js?v=c6e86fd7"></script>
|
||
<script src="../../../../_static/doctools.js?v=9bcbadda"></script>
|
||
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
<link rel="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> »</li>
|
||
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="../auth.html" accesskey="U">django.contrib.auth</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">django.contrib.auth.forms</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
|
||
<div class="documentwrapper">
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<search id="searchbox" style="display: none" role="search">
|
||
<h3 id="searchlabel">Quick search</h3>
|
||
<div class="searchformwrapper">
|
||
<form class="search" action="../../../../search.html" method="get">
|
||
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||
<input type="submit" value="Go" />
|
||
</form>
|
||
</div>
|
||
</search>
|
||
<script>document.getElementById('searchbox').style.display = "block"</script><h3>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>
|
||
</div>
|
||
</div>
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<h1>Source code for django.contrib.auth.forms</h1><div class="highlight"><pre>
|
||
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">unicodedata</span>
|
||
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django</span><span class="w"> </span><span class="kn">import</span> <span class="n">forms</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth</span><span class="w"> </span><span class="kn">import</span> <span class="n">authenticate</span><span class="p">,</span> <span class="n">get_user_model</span><span class="p">,</span> <span class="n">password_validation</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth.hashers</span><span class="w"> </span><span class="kn">import</span> <span class="n">UNUSABLE_PASSWORD_PREFIX</span><span class="p">,</span> <span class="n">identify_hasher</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">User</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.auth.tokens</span><span class="w"> </span><span class="kn">import</span> <span class="n">default_token_generator</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.sites.shortcuts</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_current_site</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">ValidationError</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.core.mail</span><span class="w"> </span><span class="kn">import</span> <span class="n">EmailMultiAlternatives</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.template</span><span class="w"> </span><span class="kn">import</span> <span class="n">loader</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.encoding</span><span class="w"> </span><span class="kn">import</span> <span class="n">force_bytes</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.http</span><span class="w"> </span><span class="kn">import</span> <span class="n">urlsafe_base64_encode</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.text</span><span class="w"> </span><span class="kn">import</span> <span class="n">capfirst</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.translation</span><span class="w"> </span><span class="kn">import</span> <span class="n">gettext</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.translation</span><span class="w"> </span><span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">django.views.decorators.debug</span><span class="w"> </span><span class="kn">import</span> <span class="n">sensitive_variables</span>
|
||
|
||
<span class="n">UserModel</span> <span class="o">=</span> <span class="n">get_user_model</span><span class="p">()</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">"django.contrib.auth"</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_unicode_ci_compare</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Perform case-insensitive comparison of two identifiers, using the</span>
|
||
<span class="sd"> recommended algorithm from Unicode Technical Report 36, section</span>
|
||
<span class="sd"> 2.11.2(B)(2).</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="n">unicodedata</span><span class="o">.</span><span class="n">normalize</span><span class="p">(</span><span class="s2">"NFKC"</span><span class="p">,</span> <span class="n">s1</span><span class="p">)</span><span class="o">.</span><span class="n">casefold</span><span class="p">()</span>
|
||
<span class="o">==</span> <span class="n">unicodedata</span><span class="o">.</span><span class="n">normalize</span><span class="p">(</span><span class="s2">"NFKC"</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span><span class="o">.</span><span class="n">casefold</span><span class="p">()</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ReadOnlyPasswordHashWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Widget</span><span class="p">):</span>
|
||
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">"auth/widgets/read_only_password_hash.html"</span>
|
||
<span class="n">read_only</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_context</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="n">attrs</span><span class="p">):</span>
|
||
<span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_context</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="n">attrs</span><span class="p">)</span>
|
||
<span class="n">usable_password</span> <span class="o">=</span> <span class="n">value</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">value</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">UNUSABLE_PASSWORD_PREFIX</span><span class="p">)</span>
|
||
<span class="n">summary</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="k">if</span> <span class="n">usable_password</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">hasher</span> <span class="o">=</span> <span class="n">identify_hasher</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||
<span class="n">summary</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
||
<span class="p">{</span>
|
||
<span class="s2">"label"</span><span class="p">:</span> <span class="n">gettext</span><span class="p">(</span>
|
||
<span class="s2">"Invalid password format or unknown hashing algorithm."</span>
|
||
<span class="p">)</span>
|
||
<span class="p">}</span>
|
||
<span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value_</span> <span class="ow">in</span> <span class="n">hasher</span><span class="o">.</span><span class="n">safe_summary</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||
<span class="n">summary</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"label"</span><span class="p">:</span> <span class="n">gettext</span><span class="p">(</span><span class="n">key</span><span class="p">),</span> <span class="s2">"value"</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">summary</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"label"</span><span class="p">:</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">"No password set."</span><span class="p">)})</span>
|
||
<span class="n">context</span><span class="p">[</span><span class="s2">"summary"</span><span class="p">]</span> <span class="o">=</span> <span class="n">summary</span>
|
||
<span class="n">context</span><span class="p">[</span><span class="s2">"button_label"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="n">_</span><span class="p">(</span><span class="s2">"Reset password"</span><span class="p">)</span> <span class="k">if</span> <span class="n">usable_password</span> <span class="k">else</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Set password"</span><span class="p">)</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">context</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">id_for_label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">id_</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">ReadOnlyPasswordHashField</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Field</span><span class="p">):</span>
|
||
<span class="n">widget</span> <span class="o">=</span> <span class="n">ReadOnlyPasswordHashWidget</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="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">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"required"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
||
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"disabled"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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 class="viewcode-block" id="UsernameField">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.website.forms.html#evennia.web.admin.accounts.UsernameField">[docs]</a>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">UsernameField</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">):</span>
|
||
<div class="viewcode-block" id="UsernameField.to_python">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.website.forms.html#evennia.web.admin.accounts.UsernameField.to_python">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
||
<span class="n">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">:</span>
|
||
<span class="c1"># Normalization can increase the string length (e.g.</span>
|
||
<span class="c1"># "ff" -> "ff", "½" -> "1⁄2") but cannot reduce it, so there is no</span>
|
||
<span class="c1"># point in normalizing invalid data. Moreover, Unicode</span>
|
||
<span class="c1"># normalization is very slow on Windows and can be a DoS attack</span>
|
||
<span class="c1"># vector.</span>
|
||
<span class="k">return</span> <span class="n">value</span>
|
||
<span class="k">return</span> <span class="n">unicodedata</span><span class="o">.</span><span class="n">normalize</span><span class="p">(</span><span class="s2">"NFKC"</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="UsernameField.widget_attrs">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.website.forms.html#evennia.web.admin.accounts.UsernameField.widget_attrs">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">widget_attrs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widget</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="p">{</span>
|
||
<span class="o">**</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">widget_attrs</span><span class="p">(</span><span class="n">widget</span><span class="p">),</span>
|
||
<span class="s2">"autocapitalize"</span><span class="p">:</span> <span class="s2">"none"</span><span class="p">,</span>
|
||
<span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"username"</span><span class="p">,</span>
|
||
<span class="p">}</span></div>
|
||
</div>
|
||
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">SetPasswordMixin</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Form mixin that validates and sets a password for a user.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">error_messages</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s2">"password_mismatch"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"The two password fields didn’t match."</span><span class="p">),</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="nd">@staticmethod</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">create_password_fields</span><span class="p">(</span><span class="n">label1</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Password"</span><span class="p">),</span> <span class="n">label2</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Password confirmation"</span><span class="p">)):</span>
|
||
<span class="n">password1</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="n">label1</span><span class="p">,</span>
|
||
<span class="n">required</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
||
<span class="n">strip</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">PasswordInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"new-password"</span><span class="p">}),</span>
|
||
<span class="n">help_text</span><span class="o">=</span><span class="n">password_validation</span><span class="o">.</span><span class="n">password_validators_help_text_html</span><span class="p">(),</span>
|
||
<span class="p">)</span>
|
||
<span class="n">password2</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="n">label2</span><span class="p">,</span>
|
||
<span class="n">required</span><span class="o">=</span><span class="kc">True</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">PasswordInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"new-password"</span><span class="p">}),</span>
|
||
<span class="n">strip</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="n">_</span><span class="p">(</span><span class="s2">"Enter the same password as before, for verification."</span><span class="p">),</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">password1</span><span class="p">,</span> <span class="n">password2</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">validate_passwords</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">password1_field_name</span><span class="o">=</span><span class="s2">"password1"</span><span class="p">,</span>
|
||
<span class="n">password2_field_name</span><span class="o">=</span><span class="s2">"password2"</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="n">password1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">password1_field_name</span><span class="p">)</span>
|
||
<span class="n">password2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">password2_field_name</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="n">password1</span> <span class="ow">and</span> <span class="n">password2</span> <span class="ow">and</span> <span class="n">password1</span> <span class="o">!=</span> <span class="n">password2</span><span class="p">:</span>
|
||
<span class="n">error</span> <span class="o">=</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"password_mismatch"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"password_mismatch"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="n">password2_field_name</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">validate_password_for_user</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password_field_name</span><span class="o">=</span><span class="s2">"password2"</span><span class="p">):</span>
|
||
<span class="n">password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">password_field_name</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">password</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">password_validation</span><span class="o">.</span><span class="n">validate_password</span><span class="p">(</span><span class="n">password</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="n">password_field_name</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">set_password_and_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password_field_name</span><span class="o">=</span><span class="s2">"password1"</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="n">set_password</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="n">password_field_name</span><span class="p">])</span>
|
||
<span class="k">if</span> <span class="n">commit</span><span class="p">:</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">user</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">SetUnusablePasswordMixin</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Form mixin that allows setting an unusable password for a user.</span>
|
||
|
||
<span class="sd"> This mixin should be used in combination with `SetPasswordMixin`.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">usable_password_help_text</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
|
||
<span class="s2">"Whether the user will be able to authenticate using a password or not. "</span>
|
||
<span class="s2">"If disabled, they may still be able to authenticate using other backends, "</span>
|
||
<span class="s2">"such as Single Sign-On or LDAP."</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="nd">@staticmethod</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">create_usable_password_field</span><span class="p">(</span><span class="n">help_text</span><span class="o">=</span><span class="n">usable_password_help_text</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">forms</span><span class="o">.</span><span class="n">ChoiceField</span><span class="p">(</span>
|
||
<span class="n">label</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Password-based authentication"</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">initial</span><span class="o">=</span><span class="s2">"true"</span><span class="p">,</span>
|
||
<span class="n">choices</span><span class="o">=</span><span class="p">{</span><span class="s2">"true"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Enabled"</span><span class="p">),</span> <span class="s2">"false"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Disabled"</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">RadioSelect</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"class"</span><span class="p">:</span> <span class="s2">"radiolist inline"</span><span class="p">}),</span>
|
||
<span class="n">help_text</span><span class="o">=</span><span class="n">help_text</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="nd">@sensitive_variables</span><span class="p">(</span><span class="s2">"password1"</span><span class="p">,</span> <span class="s2">"password2"</span><span class="p">)</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">validate_passwords</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">password1_field_name</span><span class="o">=</span><span class="s2">"password1"</span><span class="p">,</span>
|
||
<span class="n">password2_field_name</span><span class="o">=</span><span class="s2">"password2"</span><span class="p">,</span>
|
||
<span class="n">usable_password_field_name</span><span class="o">=</span><span class="s2">"usable_password"</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="n">usable_password</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">usable_password_field_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">"false"</span>
|
||
<span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">"set_usable_password"</span><span class="p">]</span> <span class="o">=</span> <span class="n">usable_password</span>
|
||
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">usable_password</span><span class="p">:</span>
|
||
<span class="k">return</span>
|
||
|
||
<span class="n">password1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">password1_field_name</span><span class="p">)</span>
|
||
<span class="n">password2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">password2_field_name</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">password1</span> <span class="ow">and</span> <span class="n">password1_field_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">:</span>
|
||
<span class="n">error</span> <span class="o">=</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="n">password1_field_name</span><span class="p">]</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"required"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"required"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="n">password1_field_name</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">password2</span> <span class="ow">and</span> <span class="n">password2_field_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">:</span>
|
||
<span class="n">error</span> <span class="o">=</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="n">password2_field_name</span><span class="p">]</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"required"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"required"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">add_error</span><span class="p">(</span><span class="n">password2_field_name</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span>
|
||
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate_passwords</span><span class="p">(</span><span class="n">password1_field_name</span><span class="p">,</span> <span class="n">password2_field_name</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">validate_password_for_user</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</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="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">"set_usable_password"</span><span class="p">]:</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validate_password_for_user</span><span class="p">(</span><span class="n">user</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">set_password_and_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="kc">True</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="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="p">[</span><span class="s2">"set_usable_password"</span><span class="p">]:</span>
|
||
<span class="n">user</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">set_password_and_save</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="n">commit</span><span class="p">)</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="n">set_unusable_password</span><span class="p">()</span>
|
||
<span class="k">if</span> <span class="n">commit</span><span class="p">:</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">user</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">BaseUserCreationForm</span><span class="p">(</span><span class="n">SetPasswordMixin</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="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> A form that creates a user, with no privileges, from the given username and</span>
|
||
<span class="sd"> password.</span>
|
||
|
||
<span class="sd"> This is the documented base class for customizing the user creation form.</span>
|
||
<span class="sd"> It should be kept mostly unchanged to ensure consistency and compatibility.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">password1</span><span class="p">,</span> <span class="n">password2</span> <span class="o">=</span> <span class="n">SetPasswordMixin</span><span class="o">.</span><span class="n">create_password_fields</span><span class="p">()</span>
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Meta</span><span class="p">:</span>
|
||
<span class="n">model</span> <span class="o">=</span> <span class="n">User</span>
|
||
<span class="n">fields</span> <span class="o">=</span> <span class="p">(</span><span class="s2">"username"</span><span class="p">,)</span>
|
||
<span class="n">field_classes</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"username"</span><span class="p">:</span> <span class="n">UsernameField</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="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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">USERNAME_FIELD</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">USERNAME_FIELD</span><span class="p">]</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span>
|
||
<span class="s2">"autofocus"</span>
|
||
<span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">clean</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">validate_passwords</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">clean</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">_post_clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">_post_clean</span><span class="p">()</span>
|
||
<span class="c1"># Validate the password after self.instance is updated with form data</span>
|
||
<span class="c1"># by super().</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">validate_password_for_user</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="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||
<span class="n">user</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">commit</span><span class="o">=</span><span class="kc">False</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">set_password_and_save</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="n">commit</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">commit</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"save_m2m"</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">save_m2m</span><span class="p">()</span>
|
||
<span class="k">return</span> <span class="n">user</span>
|
||
|
||
|
||
<div class="viewcode-block" id="UserCreationForm">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.website.forms.html#evennia.web.admin.accounts.UserCreationForm">[docs]</a>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">UserCreationForm</span><span class="p">(</span><span class="n">BaseUserCreationForm</span><span class="p">):</span>
|
||
<div class="viewcode-block" id="UserCreationForm.clean_username">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.website.forms.html#evennia.web.admin.accounts.UserCreationForm.clean_username">[docs]</a>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">clean_username</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Reject usernames that differ only in case."""</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="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"username"</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="p">(</span>
|
||
<span class="n">username</span>
|
||
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</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="o">.</span><span class="n">exists</span><span class="p">()</span>
|
||
<span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_update_errors</span><span class="p">(</span>
|
||
<span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="p">{</span>
|
||
<span class="s2">"username"</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">unique_error_message</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="p">[</span><span class="s2">"username"</span><span class="p">]</span>
|
||
<span class="p">)</span>
|
||
<span class="p">}</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">username</span></div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="viewcode-block" id="UserChangeForm">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.UserChangeForm">[docs]</a>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">UserChangeForm</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="n">password</span> <span class="o">=</span> <span class="n">ReadOnlyPasswordHashField</span><span class="p">(</span>
|
||
<span class="n">label</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Password"</span><span class="p">),</span>
|
||
<span class="n">help_text</span><span class="o">=</span><span class="n">_</span><span class="p">(</span>
|
||
<span class="s2">"Raw passwords are not stored, so there is no way to see "</span>
|
||
<span class="s2">"the user’s password."</span>
|
||
<span class="p">),</span>
|
||
<span class="p">)</span>
|
||
|
||
<div class="viewcode-block" id="UserChangeForm.Meta">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.UserChangeForm.Meta">[docs]</a>
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">Meta</span><span class="p">:</span>
|
||
<span class="n">model</span> <span class="o">=</span> <span class="n">User</span>
|
||
<span class="n">fields</span> <span class="o">=</span> <span class="s2">"__all__"</span>
|
||
<span class="n">field_classes</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"username"</span><span class="p">:</span> <span class="n">UsernameField</span><span class="p">}</span></div>
|
||
|
||
|
||
<div class="viewcode-block" id="UserChangeForm.__init__">
|
||
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.UserChangeForm.__init__">[docs]</a>
|
||
<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="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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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">password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"password"</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">password</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">has_usable_password</span><span class="p">():</span>
|
||
<span class="n">password</span><span class="o">.</span><span class="n">help_text</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span>
|
||
<span class="s2">"Enable password-based authentication for this user by setting a "</span>
|
||
<span class="s2">"password."</span>
|
||
<span class="p">)</span>
|
||
<span class="n">user_permissions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"user_permissions"</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">user_permissions</span><span class="p">:</span>
|
||
<span class="n">user_permissions</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="n">user_permissions</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">select_related</span><span class="p">(</span>
|
||
<span class="s2">"content_type"</span>
|
||
<span class="p">)</span></div>
|
||
</div>
|
||
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">AuthenticationForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Base class for authenticating users. Extend this to get a form that accepts</span>
|
||
<span class="sd"> username/password logins.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">username</span> <span class="o">=</span> <span class="n">UsernameField</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">"autofocus"</span><span class="p">:</span> <span class="kc">True</span><span class="p">}))</span>
|
||
<span class="n">password</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="n">_</span><span class="p">(</span><span class="s2">"Password"</span><span class="p">),</span>
|
||
<span class="n">strip</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">PasswordInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"current-password"</span><span class="p">}),</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="n">error_messages</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s2">"invalid_login"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
||
<span class="s2">"Please enter a correct </span><span class="si">%(username)s</span><span class="s2"> and password. Note that both "</span>
|
||
<span class="s2">"fields may be case-sensitive."</span>
|
||
<span class="p">),</span>
|
||
<span class="s2">"inactive"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"This account is inactive."</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">request</span><span class="o">=</span><span class="kc">None</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">"""</span>
|
||
<span class="sd"> The 'request' parameter is set for custom auth use by subclasses.</span>
|
||
<span class="sd"> The form data comes in via the standard 'data' kwarg.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">user_cache</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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="c1"># Set the max length and label for the "username" field.</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">username_field</span> <span class="o">=</span> <span class="n">UserModel</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">UserModel</span><span class="o">.</span><span class="n">USERNAME_FIELD</span><span class="p">)</span>
|
||
<span class="n">username_max_length</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">username_field</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">or</span> <span class="mi">254</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"username"</span><span class="p">]</span><span class="o">.</span><span class="n">max_length</span> <span class="o">=</span> <span class="n">username_max_length</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"username"</span><span class="p">]</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s2">"maxlength"</span><span class="p">]</span> <span class="o">=</span> <span class="n">username_max_length</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"username"</span><span class="p">]</span><span class="o">.</span><span class="n">label</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"username"</span><span class="p">]</span><span class="o">.</span><span class="n">label</span> <span class="o">=</span> <span class="n">capfirst</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">username_field</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</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="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"username"</span><span class="p">)</span>
|
||
<span class="n">password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"password"</span><span class="p">)</span>
|
||
|
||
<span class="k">if</span> <span class="n">username</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">password</span><span class="p">:</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">user_cache</span> <span class="o">=</span> <span class="n">authenticate</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">password</span>
|
||
<span class="p">)</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">user_cache</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">get_invalid_login_error</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">confirm_login_allowed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user_cache</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="k">def</span><span class="w"> </span><span class="nf">confirm_login_allowed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Controls whether the given User may log in. This is a policy setting,</span>
|
||
<span class="sd"> independent of end-user authentication. This default behavior is to</span>
|
||
<span class="sd"> allow login by active users, and reject login by inactive users.</span>
|
||
|
||
<span class="sd"> If the given user cannot log in, this method should raise a</span>
|
||
<span class="sd"> ``ValidationError``.</span>
|
||
|
||
<span class="sd"> If the given user may log in, this method should return None.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">is_active</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"inactive"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"inactive"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_user</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">user_cache</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_invalid_login_error</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"invalid_login"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_login"</span><span class="p">,</span>
|
||
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"username"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">username_field</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">},</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">PasswordResetForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
|
||
<span class="n">email</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">EmailField</span><span class="p">(</span>
|
||
<span class="n">label</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"Email"</span><span class="p">),</span>
|
||
<span class="n">max_length</span><span class="o">=</span><span class="mi">254</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">EmailInput</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"email"</span><span class="p">}),</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">send_mail</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">subject_template_name</span><span class="p">,</span>
|
||
<span class="n">email_template_name</span><span class="p">,</span>
|
||
<span class="n">context</span><span class="p">,</span>
|
||
<span class="n">from_email</span><span class="p">,</span>
|
||
<span class="n">to_email</span><span class="p">,</span>
|
||
<span class="n">html_email_template_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Send a django.core.mail.EmailMultiAlternatives to `to_email`.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">subject</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">render_to_string</span><span class="p">(</span><span class="n">subject_template_name</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
||
<span class="c1"># Email subject *must not* contain newlines</span>
|
||
<span class="n">subject</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">subject</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
|
||
<span class="n">body</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">render_to_string</span><span class="p">(</span><span class="n">email_template_name</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
||
|
||
<span class="n">email_message</span> <span class="o">=</span> <span class="n">EmailMultiAlternatives</span><span class="p">(</span><span class="n">subject</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">from_email</span><span class="p">,</span> <span class="p">[</span><span class="n">to_email</span><span class="p">])</span>
|
||
<span class="k">if</span> <span class="n">html_email_template_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">html_email</span> <span class="o">=</span> <span class="n">loader</span><span class="o">.</span><span class="n">render_to_string</span><span class="p">(</span><span class="n">html_email_template_name</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
|
||
<span class="n">email_message</span><span class="o">.</span><span class="n">attach_alternative</span><span class="p">(</span><span class="n">html_email</span><span class="p">,</span> <span class="s2">"text/html"</span><span class="p">)</span>
|
||
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">email_message</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
||
<span class="n">logger</span><span class="o">.</span><span class="n">exception</span><span class="p">(</span>
|
||
<span class="s2">"Failed to send password reset email to </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">context</span><span class="p">[</span><span class="s2">"user"</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">get_users</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">email</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Given an email, return matching user(s) who should receive a reset.</span>
|
||
|
||
<span class="sd"> This allows subclasses to more easily customize the default policies</span>
|
||
<span class="sd"> that prevent inactive users and users with unusable passwords from</span>
|
||
<span class="sd"> resetting their password.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">email_field_name</span> <span class="o">=</span> <span class="n">UserModel</span><span class="o">.</span><span class="n">get_email_field_name</span><span class="p">()</span>
|
||
<span class="n">active_users</span> <span class="o">=</span> <span class="n">UserModel</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
|
||
<span class="o">**</span><span class="p">{</span>
|
||
<span class="s2">"</span><span class="si">%s</span><span class="s2">__iexact"</span> <span class="o">%</span> <span class="n">email_field_name</span><span class="p">:</span> <span class="n">email</span><span class="p">,</span>
|
||
<span class="s2">"is_active"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
||
<span class="p">}</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="n">u</span>
|
||
<span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">active_users</span>
|
||
<span class="k">if</span> <span class="n">u</span><span class="o">.</span><span class="n">has_usable_password</span><span class="p">()</span>
|
||
<span class="ow">and</span> <span class="n">_unicode_ci_compare</span><span class="p">(</span><span class="n">email</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">email_field_name</span><span class="p">))</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="p">,</span>
|
||
<span class="n">domain_override</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">subject_template_name</span><span class="o">=</span><span class="s2">"registration/password_reset_subject.txt"</span><span class="p">,</span>
|
||
<span class="n">email_template_name</span><span class="o">=</span><span class="s2">"registration/password_reset_email.html"</span><span class="p">,</span>
|
||
<span class="n">use_https</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
||
<span class="n">token_generator</span><span class="o">=</span><span class="n">default_token_generator</span><span class="p">,</span>
|
||
<span class="n">from_email</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">html_email_template_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="n">extra_email_context</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
||
<span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Generate a one-use only link for resetting password and send it to the</span>
|
||
<span class="sd"> user.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">email</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">"email"</span><span class="p">]</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">domain_override</span><span class="p">:</span>
|
||
<span class="n">current_site</span> <span class="o">=</span> <span class="n">get_current_site</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="n">site_name</span> <span class="o">=</span> <span class="n">current_site</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="n">domain</span> <span class="o">=</span> <span class="n">current_site</span><span class="o">.</span><span class="n">domain</span>
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="n">site_name</span> <span class="o">=</span> <span class="n">domain</span> <span class="o">=</span> <span class="n">domain_override</span>
|
||
<span class="n">email_field_name</span> <span class="o">=</span> <span class="n">UserModel</span><span class="o">.</span><span class="n">get_email_field_name</span><span class="p">()</span>
|
||
<span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_users</span><span class="p">(</span><span class="n">email</span><span class="p">):</span>
|
||
<span class="n">user_email</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">email_field_name</span><span class="p">)</span>
|
||
<span class="n">context</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="s2">"email"</span><span class="p">:</span> <span class="n">user_email</span><span class="p">,</span>
|
||
<span class="s2">"domain"</span><span class="p">:</span> <span class="n">domain</span><span class="p">,</span>
|
||
<span class="s2">"site_name"</span><span class="p">:</span> <span class="n">site_name</span><span class="p">,</span>
|
||
<span class="s2">"uid"</span><span class="p">:</span> <span class="n">urlsafe_base64_encode</span><span class="p">(</span><span class="n">force_bytes</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="s2">"user"</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span>
|
||
<span class="s2">"token"</span><span class="p">:</span> <span class="n">token_generator</span><span class="o">.</span><span class="n">make_token</span><span class="p">(</span><span class="n">user</span><span class="p">),</span>
|
||
<span class="s2">"protocol"</span><span class="p">:</span> <span class="s2">"https"</span> <span class="k">if</span> <span class="n">use_https</span> <span class="k">else</span> <span class="s2">"http"</span><span class="p">,</span>
|
||
<span class="o">**</span><span class="p">(</span><span class="n">extra_email_context</span> <span class="ow">or</span> <span class="p">{}),</span>
|
||
<span class="p">}</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">send_mail</span><span class="p">(</span>
|
||
<span class="n">subject_template_name</span><span class="p">,</span>
|
||
<span class="n">email_template_name</span><span class="p">,</span>
|
||
<span class="n">context</span><span class="p">,</span>
|
||
<span class="n">from_email</span><span class="p">,</span>
|
||
<span class="n">user_email</span><span class="p">,</span>
|
||
<span class="n">html_email_template_name</span><span class="o">=</span><span class="n">html_email_template_name</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">SetPasswordForm</span><span class="p">(</span><span class="n">SetPasswordMixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> A form that lets a user set their password without entering the old</span>
|
||
<span class="sd"> password</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">new_password1</span><span class="p">,</span> <span class="n">new_password2</span> <span class="o">=</span> <span class="n">SetPasswordMixin</span><span class="o">.</span><span class="n">create_password_fields</span><span class="p">(</span>
|
||
<span class="n">label1</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"New password"</span><span class="p">),</span> <span class="n">label2</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">"New password confirmation"</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">user</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="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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">clean</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">validate_passwords</span><span class="p">(</span><span class="s2">"new_password1"</span><span class="p">,</span> <span class="s2">"new_password2"</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">validate_password_for_user</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">"new_password2"</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">clean</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_password_and_save</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="s2">"new_password1"</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="n">commit</span><span class="p">)</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">PasswordChangeForm</span><span class="p">(</span><span class="n">SetPasswordForm</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> A form that lets a user change their password by entering their old</span>
|
||
<span class="sd"> password.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">error_messages</span> <span class="o">=</span> <span class="p">{</span>
|
||
<span class="o">**</span><span class="n">SetPasswordForm</span><span class="o">.</span><span class="n">error_messages</span><span class="p">,</span>
|
||
<span class="s2">"password_incorrect"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
||
<span class="s2">"Your old password was entered incorrectly. Please enter it again."</span>
|
||
<span class="p">),</span>
|
||
<span class="p">}</span>
|
||
<span class="n">old_password</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="n">_</span><span class="p">(</span><span class="s2">"Old password"</span><span class="p">),</span>
|
||
<span class="n">strip</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">PasswordInput</span><span class="p">(</span>
|
||
<span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">"autocomplete"</span><span class="p">:</span> <span class="s2">"current-password"</span><span class="p">,</span> <span class="s2">"autofocus"</span><span class="p">:</span> <span class="kc">True</span><span class="p">}</span>
|
||
<span class="p">),</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"old_password"</span><span class="p">,</span> <span class="s2">"new_password1"</span><span class="p">,</span> <span class="s2">"new_password2"</span><span class="p">]</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">clean_old_password</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> Validate that the old_password field is correct.</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">old_password</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">"old_password"</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">user</span><span class="o">.</span><span class="n">check_password</span><span class="p">(</span><span class="n">old_password</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">"password_incorrect"</span><span class="p">],</span>
|
||
<span class="n">code</span><span class="o">=</span><span class="s2">"password_incorrect"</span><span class="p">,</span>
|
||
<span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">old_password</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">AdminPasswordChangeForm</span><span class="p">(</span><span class="n">SetUnusablePasswordMixin</span><span class="p">,</span> <span class="n">SetPasswordMixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> A form used to change the password of a user in the admin interface.</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="n">required_css_class</span> <span class="o">=</span> <span class="s2">"required"</span>
|
||
<span class="n">usable_password_help_text</span> <span class="o">=</span> <span class="n">SetUnusablePasswordMixin</span><span class="o">.</span><span class="n">usable_password_help_text</span> <span class="o">+</span> <span class="p">(</span>
|
||
<span class="s1">'<ul id="id_unusable_warning" class="messagelist"><li class="warning">'</span>
|
||
<span class="s2">"If disabled, the current password for this user will be lost.</li></ul>"</span>
|
||
<span class="p">)</span>
|
||
<span class="n">password1</span><span class="p">,</span> <span class="n">password2</span> <span class="o">=</span> <span class="n">SetPasswordMixin</span><span class="o">.</span><span class="n">create_password_fields</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">user</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="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
|
||
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"password1"</span><span class="p">]</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s2">"autofocus"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">has_usable_password</span><span class="p">():</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"password1"</span><span class="p">]</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"password2"</span><span class="p">]</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"usable_password"</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="n">SetUnusablePasswordMixin</span><span class="o">.</span><span class="n">create_usable_password_field</span><span class="p">(</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">usable_password_help_text</span>
|
||
<span class="p">)</span>
|
||
<span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">clean</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">validate_passwords</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">validate_password_for_user</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</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">clean</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""Save the new password."""</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_password_and_save</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="n">commit</span><span class="o">=</span><span class="n">commit</span><span class="p">)</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">changed_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="n">data</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">changed_data</span>
|
||
<span class="k">if</span> <span class="s2">"set_usable_password"</span> <span class="ow">in</span> <span class="n">data</span> <span class="ow">or</span> <span class="s2">"password1"</span> <span class="ow">in</span> <span class="n">data</span> <span class="ow">and</span> <span class="s2">"password2"</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="p">[</span><span class="s2">"password"</span><span class="p">]</span>
|
||
<span class="k">return</span> <span class="p">[]</span>
|
||
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">AdminUserCreationForm</span><span class="p">(</span><span class="n">SetUnusablePasswordMixin</span><span class="p">,</span> <span class="n">UserCreationForm</span><span class="p">):</span>
|
||
|
||
<span class="n">usable_password</span> <span class="o">=</span> <span class="n">SetUnusablePasswordMixin</span><span class="o">.</span><span class="n">create_usable_password_field</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="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="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"password1"</span><span class="p">]</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="s2">"password2"</span><span class="p">]</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="kc">False</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> »</li>
|
||
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="../auth.html" >django.contrib.auth</a> »</li>
|
||
<li class="nav-item nav-item-this"><a href="">django.contrib.auth.forms</a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="footer" role="contentinfo">
|
||
© Copyright 2024, The Evennia developer community.
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
||
</div>
|
||
</body>
|
||
</html> |