mirror of
https://github.com/evennia/evennia.git
synced 2026-03-27 10:16:32 +01:00
735 lines
No EOL
93 KiB
HTML
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 — 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" accesskey="U">Module code</a> »</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">"""</span>
|
|
<span class="sd">Form Widget classes specific to the Django admin site.</span>
|
|
<span class="sd">"""</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">"""</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"> """</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">"admin/js/core.js"</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/SelectBox.js"</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/SelectFilter2.js"</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">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">][</span><span class="s2">"class"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"selectfilter"</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">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">][</span><span class="s2">"class"</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">"stacked"</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">][</span><span class="s2">"data-field-name"</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">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">][</span><span class="s2">"data-is-stacked"</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">"admin/js/calendar.js"</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/admin/DateTimeShortcuts.js"</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">"class"</span><span class="p">:</span> <span class="s2">"vDateField"</span><span class="p">,</span> <span class="s2">"size"</span><span class="p">:</span> <span class="s2">"10"</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">"admin/widgets/date.html"</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">"admin/js/calendar.js"</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/admin/DateTimeShortcuts.js"</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">"class"</span><span class="p">:</span> <span class="s2">"vTimeField"</span><span class="p">,</span> <span class="s2">"size"</span><span class="p">:</span> <span class="s2">"8"</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">"admin/widgets/time.html"</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">"""</span>
|
|
<span class="sd"> A SplitDateTime Widget that has some admin-specific styling.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">"admin/widgets/split_datetime.html"</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'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">"date_label"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Date:"</span><span class="p">)</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"time_label"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Time:"</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">"admin/widgets/radio.html"</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">"admin/widgets/clearable_file_input.html"</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">"""</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"> """</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">"items"</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">","</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">"0"</span><span class="p">,</span> <span class="s2">"1"</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">"""</span>
|
|
<span class="sd"> A Widget for displaying ForeignKeys in the "raw_id" interface rather than</span>
|
|
<span class="sd"> in a <select> box.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">"admin/widgets/foreign_key_raw_id.html"</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">"admin:</span><span class="si">%s</span><span class="s2">_</span><span class="si">%s</span><span class="s2">_changelist"</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">"?"</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">"related_url"</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">"link_title"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Lookup"</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">"vForeignKeyRawIdAdminField"</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">" vUUIDField"</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">]</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"class"</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">"related_url"</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">"widget"</span><span class="p">][</span><span class="s2">"value"</span><span class="p">]:</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"link_label"</span><span class="p">],</span> <span class="n">context</span><span class="p">[</span><span class="s2">"link_url"</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">"link_label"</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">""</span><span class="p">,</span> <span class="s2">""</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">"</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"</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">""</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">"""</span>
|
|
<span class="sd"> A Widget for displaying ManyToMany ids in the "raw_id" interface rather than</span>
|
|
<span class="sd"> in a <select multiple> box.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">"admin/widgets/many_to_many_raw_id.html"</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">"widget"</span><span class="p">][</span><span class="s2">"attrs"</span><span class="p">][</span><span class="s2">"class"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"vManyToManyRawIdAdminField"</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">""</span><span class="p">,</span> <span class="s2">""</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">","</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">","</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">""</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">"""</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"> """</span>
|
|
|
|
<span class="n">template_name</span> <span class="o">=</span> <span class="s2">"admin/widgets/related_widget_wrapper.html"</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">"allow_multiple_selected"</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">"data-context"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"available-source"</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">"on_delete"</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">"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">"</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">"&"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
|
<span class="s2">"</span><span class="si">%s</span><span class="s2">=</span><span class="si">%s</span><span class="s2">"</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">"rendered_widget"</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">"is_hidden"</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">"name"</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
|
|
<span class="s2">"url_params"</span><span class="p">:</span> <span class="n">url_params</span><span class="p">,</span>
|
|
<span class="s2">"model"</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">"model_name"</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">"can_add_related"</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">"can_change_related"</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">"can_delete_related"</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">"can_view_related"</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">"model_has_limit_choices_to"</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">"add_related_url"</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">"add"</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">"delete_related_template_url"</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">"delete"</span><span class="p">,</span> <span class="s2">"__fk__"</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">"view_related_url_params"</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</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">"</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"change_related_template_url"</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">"change"</span><span class="p">,</span> <span class="s2">"__fk__"</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">"class"</span><span class="p">:</span> <span class="s2">"vLargeTextField"</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">"class"</span><span class="p">:</span> <span class="s2">"vTextField"</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">"class"</span><span class="p">:</span> <span class="s2">"vTextField"</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">"admin/widgets/url.html"</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">"class"</span><span class="p">:</span> <span class="s2">"vURLField"</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">""</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">"current_label"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Currently:"</span><span class="p">)</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"change_label"</span><span class="p">]</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Change:"</span><span class="p">)</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"widget"</span><span class="p">][</span><span class="s2">"href"</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">"widget"</span><span class="p">][</span><span class="s2">"value"</span><span class="p">])</span> <span class="k">if</span> <span class="n">url_valid</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="p">)</span>
|
|
<span class="n">context</span><span class="p">[</span><span class="s2">"url_valid"</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">"vIntegerField"</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">"class"</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">"vBigIntegerField"</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">"class"</span><span class="p">:</span> <span class="s2">"vUUIDField"</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'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">"ar"</span><span class="p">,</span>
|
|
<span class="s2">"az"</span><span class="p">,</span>
|
|
<span class="s2">"bg"</span><span class="p">,</span>
|
|
<span class="s2">"ca"</span><span class="p">,</span>
|
|
<span class="s2">"cs"</span><span class="p">,</span>
|
|
<span class="s2">"da"</span><span class="p">,</span>
|
|
<span class="s2">"de"</span><span class="p">,</span>
|
|
<span class="s2">"el"</span><span class="p">,</span>
|
|
<span class="s2">"en"</span><span class="p">,</span>
|
|
<span class="s2">"es"</span><span class="p">,</span>
|
|
<span class="s2">"et"</span><span class="p">,</span>
|
|
<span class="s2">"eu"</span><span class="p">,</span>
|
|
<span class="s2">"fa"</span><span class="p">,</span>
|
|
<span class="s2">"fi"</span><span class="p">,</span>
|
|
<span class="s2">"fr"</span><span class="p">,</span>
|
|
<span class="s2">"gl"</span><span class="p">,</span>
|
|
<span class="s2">"he"</span><span class="p">,</span>
|
|
<span class="s2">"hi"</span><span class="p">,</span>
|
|
<span class="s2">"hr"</span><span class="p">,</span>
|
|
<span class="s2">"hu"</span><span class="p">,</span>
|
|
<span class="s2">"id"</span><span class="p">,</span>
|
|
<span class="s2">"is"</span><span class="p">,</span>
|
|
<span class="s2">"it"</span><span class="p">,</span>
|
|
<span class="s2">"ja"</span><span class="p">,</span>
|
|
<span class="s2">"km"</span><span class="p">,</span>
|
|
<span class="s2">"ko"</span><span class="p">,</span>
|
|
<span class="s2">"lt"</span><span class="p">,</span>
|
|
<span class="s2">"lv"</span><span class="p">,</span>
|
|
<span class="s2">"mk"</span><span class="p">,</span>
|
|
<span class="s2">"ms"</span><span class="p">,</span>
|
|
<span class="s2">"nb"</span><span class="p">,</span>
|
|
<span class="s2">"nl"</span><span class="p">,</span>
|
|
<span class="s2">"pl"</span><span class="p">,</span>
|
|
<span class="s2">"pt-BR"</span><span class="p">,</span>
|
|
<span class="s2">"pt"</span><span class="p">,</span>
|
|
<span class="s2">"ro"</span><span class="p">,</span>
|
|
<span class="s2">"ru"</span><span class="p">,</span>
|
|
<span class="s2">"sk"</span><span class="p">,</span>
|
|
<span class="s2">"sr-Cyrl"</span><span class="p">,</span>
|
|
<span class="s2">"sr"</span><span class="p">,</span>
|
|
<span class="s2">"sv"</span><span class="p">,</span>
|
|
<span class="s2">"th"</span><span class="p">,</span>
|
|
<span class="s2">"tr"</span><span class="p">,</span>
|
|
<span class="s2">"uk"</span><span class="p">,</span>
|
|
<span class="s2">"vi"</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">"zh-hans"</span><span class="p">:</span> <span class="s2">"zh-CN"</span><span class="p">,</span> <span class="s2">"zh-hant"</span><span class="p">:</span> <span class="s2">"zh-TW"</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 'zh-hant-tw' is not supported, try subsequent language codes i.e.</span>
|
|
<span class="c1"># 'zh-hant' and 'zh'.</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">"-"</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">></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">"""</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"> """</span>
|
|
|
|
<span class="n">url_name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">:autocomplete"</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">"""</span>
|
|
<span class="sd"> Set select2'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"> """</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">"class"</span><span class="p">,</span> <span class="s2">""</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">"data-ajax--cache"</span><span class="p">:</span> <span class="s2">"true"</span><span class="p">,</span>
|
|
<span class="s2">"data-ajax--delay"</span><span class="p">:</span> <span class="mi">250</span><span class="p">,</span>
|
|
<span class="s2">"data-ajax--type"</span><span class="p">:</span> <span class="s2">"GET"</span><span class="p">,</span>
|
|
<span class="s2">"data-ajax--url"</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">"data-app-label"</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">"data-model-name"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">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">"data-field-name"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
<span class="s2">"data-theme"</span><span class="p">:</span> <span class="s2">"admin-autocomplete"</span><span class="p">,</span>
|
|
<span class="s2">"data-allow-clear"</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">"data-placeholder"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span> <span class="c1"># Allows clearing of the input.</span>
|
|
<span class="s2">"lang"</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">"class"</span><span class="p">:</span> <span class="n">attrs</span><span class="p">[</span><span class="s2">"class"</span><span class="p">]</span>
|
|
<span class="o">+</span> <span class="p">(</span><span class="s2">" "</span> <span class="k">if</span> <span class="n">attrs</span><span class="p">[</span><span class="s2">"class"</span><span class="p">]</span> <span class="k">else</span> <span class="s2">""</span><span class="p">)</span>
|
|
<span class="o">+</span> <span class="s2">"admin-autocomplete"</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">"""Return selected options based on the ModelChoiceIterator."""</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">""</span><span class="p">,</span> <span class="s2">""</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">"field_name"</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">"</span><span class="si">%s</span><span class="s2">__in"</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">""</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">".min"</span>
|
|
<span class="n">i18n_file</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="p">(</span><span class="s2">"admin/js/vendor/select2/i18n/</span><span class="si">%s</span><span class="s2">.js"</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">"admin/js/vendor/jquery/jquery</span><span class="si">%s</span><span class="s2">.js"</span> <span class="o">%</span> <span class="n">extra</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/vendor/select2/select2.full</span><span class="si">%s</span><span class="s2">.js"</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">"admin/js/jquery.init.js"</span><span class="p">,</span>
|
|
<span class="s2">"admin/js/autocomplete.js"</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">"screen"</span><span class="p">:</span> <span class="p">(</span>
|
|
<span class="s2">"admin/css/vendor/select2/select2</span><span class="si">%s</span><span class="s2">.css"</span> <span class="o">%</span> <span class="n">extra</span><span class="p">,</span>
|
|
<span class="s2">"admin/css/autocomplete.css"</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> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">django.contrib.admin.widgets</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> |