evennia/docs/5.x/_modules/django/contrib/admin/widgets.html
2025-07-01 10:01:48 +02:00

735 lines
No EOL
93 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.admin.widgets &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<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> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">django.contrib.admin.widgets</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.admin.widgets</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Form Widget classes specific to the Django admin site.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">json</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.conf</span><span class="w"> </span><span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.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.validators</span><span class="w"> </span><span class="kn">import</span> <span class="n">URLValidator</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">CASCADE</span><span class="p">,</span> <span class="n">UUIDField</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.urls</span><span class="w"> </span><span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.urls.exceptions</span><span class="w"> </span><span class="kn">import</span> <span class="n">NoReverseMatch</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.html</span><span class="w"> </span><span class="kn">import</span> <span class="n">smart_urlquote</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">urlencode</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">Truncator</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">get_language</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="k">as</span> <span class="n">_</span>
<div class="viewcode-block" id="FilteredSelectMultiple">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.FilteredSelectMultiple">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">FilteredSelectMultiple</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">SelectMultiple</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A SelectMultiple with a JavaScript filter interface.</span>
<span class="sd"> Note that the resulting JavaScript assumes that the jsi18n</span>
<span class="sd"> catalog has been loaded in the page</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="FilteredSelectMultiple.Media">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.FilteredSelectMultiple.Media">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;admin/js/core.js&quot;</span><span class="p">,</span>
<span class="s2">&quot;admin/js/SelectBox.js&quot;</span><span class="p">,</span>
<span class="s2">&quot;admin/js/SelectFilter2.js&quot;</span><span class="p">,</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="FilteredSelectMultiple.__init__">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.FilteredSelectMultiple.__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="n">verbose_name</span><span class="p">,</span> <span class="n">is_stacked</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">()):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">verbose_name</span> <span class="o">=</span> <span class="n">verbose_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">is_stacked</span> <span class="o">=</span> <span class="n">is_stacked</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="n">attrs</span><span class="p">,</span> <span class="n">choices</span><span class="p">)</span></div>
<div class="viewcode-block" id="FilteredSelectMultiple.get_context">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.accounts.html#evennia.web.admin.accounts.FilteredSelectMultiple.get_context">[docs]</a>
<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">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">][</span><span class="s2">&quot;class&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;selectfilter&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_stacked</span><span class="p">:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">][</span><span class="s2">&quot;class&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">&quot;stacked&quot;</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">][</span><span class="s2">&quot;data-field-name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose_name</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">][</span><span class="s2">&quot;data-is-stacked&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">is_stacked</span><span class="p">)</span>
<span class="k">return</span> <span class="n">context</span></div>
</div>
<span class="k">class</span><span class="w"> </span><span class="nc">BaseAdminDateWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">DateInput</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;admin/js/calendar.js&quot;</span><span class="p">,</span>
<span class="s2">&quot;admin/js/admin/DateTimeShortcuts.js&quot;</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">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vDateField&quot;</span><span class="p">,</span> <span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;10&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</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="n">attrs</span><span class="o">=</span><span class="n">attrs</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminDateWidget</span><span class="p">(</span><span class="n">BaseAdminDateWidget</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/date.html&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">BaseAdminTimeWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">TimeInput</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Media</span><span class="p">:</span>
<span class="n">js</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;admin/js/calendar.js&quot;</span><span class="p">,</span>
<span class="s2">&quot;admin/js/admin/DateTimeShortcuts.js&quot;</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">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vTimeField&quot;</span><span class="p">,</span> <span class="s2">&quot;size&quot;</span><span class="p">:</span> <span class="s2">&quot;8&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</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="n">attrs</span><span class="o">=</span><span class="n">attrs</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="nb">format</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminTimeWidget</span><span class="p">(</span><span class="n">BaseAdminTimeWidget</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/time.html&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminSplitDateTime</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">SplitDateTimeWidget</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A SplitDateTime Widget that has some admin-specific styling.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/split_datetime.html&quot;</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">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">widgets</span> <span class="o">=</span> <span class="p">[</span><span class="n">BaseAdminDateWidget</span><span class="p">,</span> <span class="n">BaseAdminTimeWidget</span><span class="p">]</span>
<span class="c1"># Note that we&#39;re calling MultiWidget, not SplitDateTimeWidget, because</span>
<span class="c1"># we want to define widgets.</span>
<span class="n">forms</span><span class="o">.</span><span class="n">MultiWidget</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">widgets</span><span class="p">,</span> <span class="n">attrs</span><span class="p">)</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">context</span><span class="p">[</span><span class="s2">&quot;date_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Date:&quot;</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;time_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Time:&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">context</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminRadioSelect</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">RadioSelect</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/radio.html&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminFileWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ClearableFileInput</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/clearable_file_input.html&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">url_params_from_lookup_dict</span><span class="p">(</span><span class="n">lookups</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Convert the type of lookups specified in a ForeignKey limit_choices_to</span>
<span class="sd"> attribute to a dictionary of query parameters</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">if</span> <span class="n">lookups</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">lookups</span><span class="p">,</span> <span class="s2">&quot;items&quot;</span><span class="p">):</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">lookups</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">v</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
<span class="n">v</span> <span class="o">=</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;0&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">)[</span><span class="n">v</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">v</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
<span class="k">return</span> <span class="n">params</span>
<div class="viewcode-block" id="ForeignKeyRawIdWidget">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">ForeignKeyRawIdWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A Widget for displaying ForeignKeys in the &quot;raw_id&quot; interface rather than</span>
<span class="sd"> in a &lt;select&gt; box.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/foreign_key_raw_id.html&quot;</span>
<div class="viewcode-block" id="ForeignKeyRawIdWidget.__init__">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget.__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="n">rel</span><span class="p">,</span> <span class="n">admin_site</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">using</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span> <span class="o">=</span> <span class="n">admin_site</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">using</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="n">attrs</span><span class="p">)</span></div>
<div class="viewcode-block" id="ForeignKeyRawIdWidget.get_context">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget.get_context">[docs]</a>
<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">rel_to</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">is_registered</span><span class="p">(</span><span class="n">rel_to</span><span class="p">):</span>
<span class="c1"># The related object is registered with the same AdminSite</span>
<span class="n">related_url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;admin:</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s</span><span class="s2">_changelist&quot;</span>
<span class="o">%</span> <span class="p">(</span>
<span class="n">rel_to</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="n">rel_to</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span>
<span class="p">),</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="p">,</span>
<span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_parameters</span><span class="p">()</span>
<span class="k">if</span> <span class="n">params</span><span class="p">:</span>
<span class="n">related_url</span> <span class="o">+=</span> <span class="s2">&quot;?&quot;</span> <span class="o">+</span> <span class="n">urlencode</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;related_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">related_url</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;link_title&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Lookup&quot;</span><span class="p">)</span>
<span class="c1"># The JavaScript code looks for this class.</span>
<span class="n">css_class</span> <span class="o">=</span> <span class="s2">&quot;vForeignKeyRawIdAdminField&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">(),</span> <span class="n">UUIDField</span><span class="p">):</span>
<span class="n">css_class</span> <span class="o">+=</span> <span class="s2">&quot; vUUIDField&quot;</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;class&quot;</span><span class="p">,</span> <span class="n">css_class</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;related_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;value&quot;</span><span class="p">]:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;link_label&quot;</span><span class="p">],</span> <span class="n">context</span><span class="p">[</span><span class="s2">&quot;link_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">label_and_url_for_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">context</span><span class="p">[</span><span class="s2">&quot;link_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">context</span></div>
<div class="viewcode-block" id="ForeignKeyRawIdWidget.base_url_parameters">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget.base_url_parameters">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">base_url_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">limit_choices_to</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">limit_choices_to</span><span class="p">):</span>
<span class="n">limit_choices_to</span> <span class="o">=</span> <span class="n">limit_choices_to</span><span class="p">()</span>
<span class="k">return</span> <span class="n">url_params_from_lookup_dict</span><span class="p">(</span><span class="n">limit_choices_to</span><span class="p">)</span></div>
<div class="viewcode-block" id="ForeignKeyRawIdWidget.url_parameters">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget.url_parameters">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">url_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.contrib.admin.views.main</span><span class="w"> </span><span class="kn">import</span> <span class="n">TO_FIELD_VAR</span>
<span class="n">params</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_url_parameters</span><span class="p">()</span>
<span class="n">params</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">TO_FIELD_VAR</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">()</span><span class="o">.</span><span class="n">name</span><span class="p">})</span>
<span class="k">return</span> <span class="n">params</span></div>
<div class="viewcode-block" id="ForeignKeyRawIdWidget.label_and_url_for_value">
<a class="viewcode-back" href="../../../../api/evennia.web.admin.objects.html#evennia.web.admin.accounts.ForeignKeyRawIdWidget.label_and_url_for_value">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">label_and_url_for_value</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">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">()</span><span class="o">.</span><span class="n">name</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">,</span> <span class="n">ValidationError</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">url</span> <span class="o">=</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">obj</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="n">obj</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</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">obj</span><span class="o">.</span><span class="n">pk</span><span class="p">,),</span>
<span class="p">)</span>
<span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
<span class="n">url</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="c1"># Admin not registered for target model.</span>
<span class="k">return</span> <span class="n">Truncator</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="n">words</span><span class="p">(</span><span class="mi">14</span><span class="p">),</span> <span class="n">url</span></div>
</div>
<span class="k">class</span><span class="w"> </span><span class="nc">ManyToManyRawIdWidget</span><span class="p">(</span><span class="n">ForeignKeyRawIdWidget</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A Widget for displaying ManyToMany ids in the &quot;raw_id&quot; interface rather than</span>
<span class="sd"> in a &lt;select multiple&gt; box.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/many_to_many_raw_id.html&quot;</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span><span class="o">.</span><span class="n">is_registered</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="c1"># The related object is registered with the same AdminSite</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;attrs&quot;</span><span class="p">][</span><span class="s2">&quot;class&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;vManyToManyRawIdAdminField&quot;</span>
<span class="k">return</span> <span class="n">context</span>
<span class="k">def</span><span class="w"> </span><span class="nf">url_parameters</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">base_url_parameters</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">label_and_url_for_value</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="k">return</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_from_datadict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format_value</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="k">return</span> <span class="s2">&quot;,&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">)</span> <span class="k">if</span> <span class="n">value</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">RelatedFieldWidgetWrapper</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="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This class is a wrapper to a given widget to add the add icon for the</span>
<span class="sd"> admin interface.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/related_widget_wrapper.html&quot;</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">widget</span><span class="p">,</span>
<span class="n">rel</span><span class="p">,</span>
<span class="n">admin_site</span><span class="p">,</span>
<span class="n">can_add_related</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">can_change_related</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">can_delete_related</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">can_view_related</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">needs_multipart_form</span> <span class="o">=</span> <span class="n">widget</span><span class="o">.</span><span class="n">needs_multipart_form</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attrs</span> <span class="o">=</span> <span class="n">widget</span><span class="o">.</span><span class="n">attrs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">widget</span> <span class="o">=</span> <span class="n">widget</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rel</span> <span class="o">=</span> <span class="n">rel</span>
<span class="c1"># Backwards compatible check for whether a user can add related</span>
<span class="c1"># objects.</span>
<span class="k">if</span> <span class="n">can_add_related</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">can_add_related</span> <span class="o">=</span> <span class="n">admin_site</span><span class="o">.</span><span class="n">is_registered</span><span class="p">(</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_add_related</span> <span class="o">=</span> <span class="n">can_add_related</span>
<span class="c1"># XXX: The UX does not support multiple selected values.</span>
<span class="n">multiple</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">widget</span><span class="p">,</span> <span class="s2">&quot;allow_multiple_selected&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">widget</span><span class="p">,</span> <span class="n">AutocompleteMixin</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;data-context&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;available-source&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_change_related</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">multiple</span> <span class="ow">and</span> <span class="n">can_change_related</span>
<span class="c1"># XXX: The deletion UX can be confusing when dealing with cascading deletion.</span>
<span class="n">cascade</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">rel</span><span class="p">,</span> <span class="s2">&quot;on_delete&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="n">CASCADE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_delete_related</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">multiple</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">cascade</span> <span class="ow">and</span> <span class="n">can_delete_related</span>
<span class="bp">self</span><span class="o">.</span><span class="n">can_view_related</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">multiple</span> <span class="ow">and</span> <span class="n">can_view_related</span>
<span class="c1"># so we can check if the related object is registered with this AdminSite</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span> <span class="o">=</span> <span class="n">admin_site</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">widget</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="p">,</span> <span class="n">memo</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">attrs</span>
<span class="n">memo</span><span class="p">[</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">)]</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">is_hidden</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">widget</span><span class="o">.</span><span class="n">is_hidden</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">media</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">widget</span><span class="o">.</span><span class="n">media</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">choices</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">widget</span><span class="o">.</span><span class="n">choices</span>
<span class="nd">@choices</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span><span class="w"> </span><span class="nf">choices</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="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">choices</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_related_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">info</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span>
<span class="s2">&quot;admin:</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">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">info</span> <span class="o">+</span> <span class="p">(</span><span class="n">action</span><span class="p">,)),</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="p">,</span>
<span class="n">args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
<span class="p">)</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="kn">from</span><span class="w"> </span><span class="nn">django.contrib.admin.views.main</span><span class="w"> </span><span class="kn">import</span> <span class="n">IS_POPUP_VAR</span><span class="p">,</span> <span class="n">TO_FIELD_VAR</span>
<span class="n">rel_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">(</span><span class="n">rel_opts</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">model_name</span><span class="p">)</span>
<span class="n">related_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">()</span><span class="o">.</span><span class="n">name</span>
<span class="n">url_params</span> <span class="o">=</span> <span class="s2">&quot;&amp;&quot;</span><span class="o">.</span><span class="n">join</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">&quot;</span> <span class="o">%</span> <span class="n">param</span>
<span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="p">[</span>
<span class="p">(</span><span class="n">TO_FIELD_VAR</span><span class="p">,</span> <span class="n">related_field_name</span><span class="p">),</span>
<span class="p">(</span><span class="n">IS_POPUP_VAR</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</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;rendered_widget&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">render</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="s2">&quot;is_hidden&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_hidden</span><span class="p">,</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
<span class="s2">&quot;url_params&quot;</span><span class="p">:</span> <span class="n">url_params</span><span class="p">,</span>
<span class="s2">&quot;model&quot;</span><span class="p">:</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
<span class="s2">&quot;model_name&quot;</span><span class="p">:</span> <span class="n">rel_opts</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span>
<span class="s2">&quot;can_add_related&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_add_related</span><span class="p">,</span>
<span class="s2">&quot;can_change_related&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_change_related</span><span class="p">,</span>
<span class="s2">&quot;can_delete_related&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_delete_related</span><span class="p">,</span>
<span class="s2">&quot;can_view_related&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_view_related</span><span class="p">,</span>
<span class="s2">&quot;model_has_limit_choices_to&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">rel</span><span class="o">.</span><span class="n">limit_choices_to</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_add_related</span><span class="p">:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;add_related_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_related_url</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="s2">&quot;add&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_delete_related</span><span class="p">:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;delete_related_template_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_related_url</span><span class="p">(</span>
<span class="n">info</span><span class="p">,</span> <span class="s2">&quot;delete&quot;</span><span class="p">,</span> <span class="s2">&quot;__fk__&quot;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_view_related</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">can_change_related</span><span class="p">:</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;view_related_url_params&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">TO_FIELD_VAR</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">related_field_name</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;change_related_template_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_related_url</span><span class="p">(</span>
<span class="n">info</span><span class="p">,</span> <span class="s2">&quot;change&quot;</span><span class="p">,</span> <span class="s2">&quot;__fk__&quot;</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">value_from_datadict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">value_from_datadict</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_omitted_from_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">value_omitted_from_data</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">files</span><span class="p">,</span> <span class="n">name</span><span class="p">)</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="bp">self</span><span class="o">.</span><span class="n">widget</span><span class="o">.</span><span class="n">id_for_label</span><span class="p">(</span><span class="n">id_</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminTextareaWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Textarea</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">attrs</span><span class="o">=</span><span class="kc">None</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vLargeTextField&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminTextInputWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</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">attrs</span><span class="o">=</span><span class="kc">None</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vTextField&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminEmailInputWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">EmailInput</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">attrs</span><span class="o">=</span><span class="kc">None</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vTextField&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminURLFieldWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">URLInput</span><span class="p">):</span>
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;admin/widgets/url.html&quot;</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">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">validator_class</span><span class="o">=</span><span class="n">URLValidator</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vURLField&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validator</span> <span class="o">=</span> <span class="n">validator_class</span><span class="p">()</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="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validator</span><span class="p">(</span><span class="n">value</span> <span class="k">if</span> <span class="n">value</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">url_valid</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">except</span> <span class="n">ValidationError</span><span class="p">:</span>
<span class="n">url_valid</span> <span class="o">=</span> <span class="kc">False</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">context</span><span class="p">[</span><span class="s2">&quot;current_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Currently:&quot;</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;change_label&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Change:&quot;</span><span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;href&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">smart_urlquote</span><span class="p">(</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;widget&quot;</span><span class="p">][</span><span class="s2">&quot;value&quot;</span><span class="p">])</span> <span class="k">if</span> <span class="n">url_valid</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="p">)</span>
<span class="n">context</span><span class="p">[</span><span class="s2">&quot;url_valid&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">url_valid</span>
<span class="k">return</span> <span class="n">context</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminIntegerFieldWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">NumberInput</span><span class="p">):</span>
<span class="n">class_name</span> <span class="o">=</span> <span class="s2">&quot;vIntegerField&quot;</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">attrs</span><span class="o">=</span><span class="kc">None</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">class_name</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminBigIntegerFieldWidget</span><span class="p">(</span><span class="n">AdminIntegerFieldWidget</span><span class="p">):</span>
<span class="n">class_name</span> <span class="o">=</span> <span class="s2">&quot;vBigIntegerField&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AdminUUIDInputWidget</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">TextInput</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">attrs</span><span class="o">=</span><span class="kc">None</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="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="s2">&quot;vUUIDField&quot;</span><span class="p">,</span> <span class="o">**</span><span class="p">(</span><span class="n">attrs</span> <span class="ow">or</span> <span class="p">{})})</span>
<span class="c1"># Mapping of lowercase language codes [returned by Django&#39;s get_language()] to</span>
<span class="c1"># language codes supported by select2.</span>
<span class="c1"># See django/contrib/admin/static/admin/js/vendor/select2/i18n/*</span>
<span class="n">SELECT2_TRANSLATIONS</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span> <span class="n">x</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span>
<span class="s2">&quot;ar&quot;</span><span class="p">,</span>
<span class="s2">&quot;az&quot;</span><span class="p">,</span>
<span class="s2">&quot;bg&quot;</span><span class="p">,</span>
<span class="s2">&quot;ca&quot;</span><span class="p">,</span>
<span class="s2">&quot;cs&quot;</span><span class="p">,</span>
<span class="s2">&quot;da&quot;</span><span class="p">,</span>
<span class="s2">&quot;de&quot;</span><span class="p">,</span>
<span class="s2">&quot;el&quot;</span><span class="p">,</span>
<span class="s2">&quot;en&quot;</span><span class="p">,</span>
<span class="s2">&quot;es&quot;</span><span class="p">,</span>
<span class="s2">&quot;et&quot;</span><span class="p">,</span>
<span class="s2">&quot;eu&quot;</span><span class="p">,</span>
<span class="s2">&quot;fa&quot;</span><span class="p">,</span>
<span class="s2">&quot;fi&quot;</span><span class="p">,</span>
<span class="s2">&quot;fr&quot;</span><span class="p">,</span>
<span class="s2">&quot;gl&quot;</span><span class="p">,</span>
<span class="s2">&quot;he&quot;</span><span class="p">,</span>
<span class="s2">&quot;hi&quot;</span><span class="p">,</span>
<span class="s2">&quot;hr&quot;</span><span class="p">,</span>
<span class="s2">&quot;hu&quot;</span><span class="p">,</span>
<span class="s2">&quot;id&quot;</span><span class="p">,</span>
<span class="s2">&quot;is&quot;</span><span class="p">,</span>
<span class="s2">&quot;it&quot;</span><span class="p">,</span>
<span class="s2">&quot;ja&quot;</span><span class="p">,</span>
<span class="s2">&quot;km&quot;</span><span class="p">,</span>
<span class="s2">&quot;ko&quot;</span><span class="p">,</span>
<span class="s2">&quot;lt&quot;</span><span class="p">,</span>
<span class="s2">&quot;lv&quot;</span><span class="p">,</span>
<span class="s2">&quot;mk&quot;</span><span class="p">,</span>
<span class="s2">&quot;ms&quot;</span><span class="p">,</span>
<span class="s2">&quot;nb&quot;</span><span class="p">,</span>
<span class="s2">&quot;nl&quot;</span><span class="p">,</span>
<span class="s2">&quot;pl&quot;</span><span class="p">,</span>
<span class="s2">&quot;pt-BR&quot;</span><span class="p">,</span>
<span class="s2">&quot;pt&quot;</span><span class="p">,</span>
<span class="s2">&quot;ro&quot;</span><span class="p">,</span>
<span class="s2">&quot;ru&quot;</span><span class="p">,</span>
<span class="s2">&quot;sk&quot;</span><span class="p">,</span>
<span class="s2">&quot;sr-Cyrl&quot;</span><span class="p">,</span>
<span class="s2">&quot;sr&quot;</span><span class="p">,</span>
<span class="s2">&quot;sv&quot;</span><span class="p">,</span>
<span class="s2">&quot;th&quot;</span><span class="p">,</span>
<span class="s2">&quot;tr&quot;</span><span class="p">,</span>
<span class="s2">&quot;uk&quot;</span><span class="p">,</span>
<span class="s2">&quot;vi&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="n">SELECT2_TRANSLATIONS</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;zh-hans&quot;</span><span class="p">:</span> <span class="s2">&quot;zh-CN&quot;</span><span class="p">,</span> <span class="s2">&quot;zh-hant&quot;</span><span class="p">:</span> <span class="s2">&quot;zh-TW&quot;</span><span class="p">})</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_select2_language</span><span class="p">():</span>
<span class="n">lang_code</span> <span class="o">=</span> <span class="n">get_language</span><span class="p">()</span>
<span class="n">supported_code</span> <span class="o">=</span> <span class="n">SELECT2_TRANSLATIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lang_code</span><span class="p">)</span>
<span class="k">if</span> <span class="n">supported_code</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">lang_code</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># If &#39;zh-hant-tw&#39; is not supported, try subsequent language codes i.e.</span>
<span class="c1"># &#39;zh-hant&#39; and &#39;zh&#39;.</span>
<span class="n">i</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">:=</span> <span class="n">lang_code</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s2">&quot;-&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="k">if</span> <span class="n">supported_code</span> <span class="o">:=</span> <span class="n">SELECT2_TRANSLATIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lang_code</span><span class="p">[:</span><span class="n">i</span><span class="p">]):</span>
<span class="k">return</span> <span class="n">supported_code</span>
<span class="k">return</span> <span class="n">supported_code</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AutocompleteMixin</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Select widget mixin that loads options from AutocompleteJsonView via AJAX.</span>
<span class="sd"> Renders the necessary data attributes for select2 and adds the static form</span>
<span class="sd"> media.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">url_name</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:autocomplete&quot;</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">field</span><span class="p">,</span> <span class="n">admin_site</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">(),</span> <span class="n">using</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">field</span>
<span class="bp">self</span><span class="o">.</span><span class="n">admin_site</span> <span class="o">=</span> <span class="n">admin_site</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">using</span>
<span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="o">=</span> <span class="n">choices</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attrs</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">attrs</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">attrs</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">i18n_name</span> <span class="o">=</span> <span class="n">get_select2_language</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">url_name</span> <span class="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="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">build_attrs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base_attrs</span><span class="p">,</span> <span class="n">extra_attrs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set select2&#39;s AJAX attributes.</span>
<span class="sd"> Attributes can be set using the html5 data attribute.</span>
<span class="sd"> Nested attributes require a double dash as per</span>
<span class="sd"> https://select2.org/configuration/data-attributes#nested-subkey-options</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">build_attrs</span><span class="p">(</span><span class="n">base_attrs</span><span class="p">,</span> <span class="n">extra_attrs</span><span class="o">=</span><span class="n">extra_attrs</span><span class="p">)</span>
<span class="n">attrs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;class&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">attrs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">&quot;data-ajax--cache&quot;</span><span class="p">:</span> <span class="s2">&quot;true&quot;</span><span class="p">,</span>
<span class="s2">&quot;data-ajax--delay&quot;</span><span class="p">:</span> <span class="mi">250</span><span class="p">,</span>
<span class="s2">&quot;data-ajax--type&quot;</span><span class="p">:</span> <span class="s2">&quot;GET&quot;</span><span class="p">,</span>
<span class="s2">&quot;data-ajax--url&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_url</span><span class="p">(),</span>
<span class="s2">&quot;data-app-label&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">model</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="s2">&quot;data-model-name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">,</span>
<span class="s2">&quot;data-field-name&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="s2">&quot;data-theme&quot;</span><span class="p">:</span> <span class="s2">&quot;admin-autocomplete&quot;</span><span class="p">,</span>
<span class="s2">&quot;data-allow-clear&quot;</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_required</span><span class="p">),</span>
<span class="s2">&quot;data-placeholder&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="c1"># Allows clearing of the input.</span>
<span class="s2">&quot;lang&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">i18n_name</span><span class="p">,</span>
<span class="s2">&quot;class&quot;</span><span class="p">:</span> <span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;class&quot;</span><span class="p">]</span>
<span class="o">+</span> <span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="k">if</span> <span class="n">attrs</span><span class="p">[</span><span class="s2">&quot;class&quot;</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="o">+</span> <span class="s2">&quot;admin-autocomplete&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">attrs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">optgroups</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">attr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return selected options based on the ModelChoiceIterator.&quot;&quot;&quot;</span>
<span class="n">default</span> <span class="o">=</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[],</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">groups</span> <span class="o">=</span> <span class="p">[</span><span class="n">default</span><span class="p">]</span>
<span class="n">has_selected</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">selected_choices</span> <span class="o">=</span> <span class="p">{</span>
<span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span> <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">empty_values</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">is_required</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_multiple_selected</span><span class="p">:</span>
<span class="n">default</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">create_option</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="n">remote_model_opts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span>
<span class="n">to_field_name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="s2">&quot;field_name&quot;</span><span class="p">,</span> <span class="n">remote_model_opts</span><span class="o">.</span><span class="n">pk</span><span class="o">.</span><span class="n">attname</span>
<span class="p">)</span>
<span class="n">to_field_name</span> <span class="o">=</span> <span class="n">remote_model_opts</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">to_field_name</span><span class="p">)</span><span class="o">.</span><span class="n">attname</span>
<span class="n">choices</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">to_field_name</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">label_from_instance</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db</span><span class="p">)</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">&quot;</span><span class="si">%s</span><span class="s2">__in&quot;</span> <span class="o">%</span> <span class="n">to_field_name</span><span class="p">:</span> <span class="n">selected_choices</span><span class="p">}</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">option_value</span><span class="p">,</span> <span class="n">option_label</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
<span class="n">selected</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">option_value</span><span class="p">)</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">has_selected</span> <span class="ow">is</span> <span class="kc">False</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_multiple_selected</span>
<span class="p">)</span>
<span class="n">has_selected</span> <span class="o">|=</span> <span class="n">selected</span>
<span class="n">index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">default</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">subgroup</span> <span class="o">=</span> <span class="n">default</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">subgroup</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_option</span><span class="p">(</span>
<span class="n">name</span><span class="p">,</span> <span class="n">option_value</span><span class="p">,</span> <span class="n">option_label</span><span class="p">,</span> <span class="n">selected_choices</span><span class="p">,</span> <span class="n">index</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">groups</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">media</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">extra</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEBUG</span> <span class="k">else</span> <span class="s2">&quot;.min&quot;</span>
<span class="n">i18n_file</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="s2">&quot;admin/js/vendor/select2/i18n/</span><span class="si">%s</span><span class="s2">.js&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">i18n_name</span><span class="p">,)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">i18n_name</span>
<span class="k">else</span> <span class="p">()</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">forms</span><span class="o">.</span><span class="n">Media</span><span class="p">(</span>
<span class="n">js</span><span class="o">=</span><span class="p">(</span>
<span class="s2">&quot;admin/js/vendor/jquery/jquery</span><span class="si">%s</span><span class="s2">.js&quot;</span> <span class="o">%</span> <span class="n">extra</span><span class="p">,</span>
<span class="s2">&quot;admin/js/vendor/select2/select2.full</span><span class="si">%s</span><span class="s2">.js&quot;</span> <span class="o">%</span> <span class="n">extra</span><span class="p">,</span>
<span class="p">)</span>
<span class="o">+</span> <span class="n">i18n_file</span>
<span class="o">+</span> <span class="p">(</span>
<span class="s2">&quot;admin/js/jquery.init.js&quot;</span><span class="p">,</span>
<span class="s2">&quot;admin/js/autocomplete.js&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">css</span><span class="o">=</span><span class="p">{</span>
<span class="s2">&quot;screen&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;admin/css/vendor/select2/select2</span><span class="si">%s</span><span class="s2">.css&quot;</span> <span class="o">%</span> <span class="n">extra</span><span class="p">,</span>
<span class="s2">&quot;admin/css/autocomplete.css&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">},</span>
<span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AutocompleteSelect</span><span class="p">(</span><span class="n">AutocompleteMixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">Select</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AutocompleteSelectMultiple</span><span class="p">(</span><span class="n">AutocompleteMixin</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">SelectMultiple</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">django.contrib.admin.widgets</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>