evennia/docs/latest/_modules/django/db/models/fields.html
Evennia docbuilder action 4544902e08 Updated HTML docs.
2026-02-15 17:42:43 +00:00

3033 lines
No EOL
389 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-content_root="../../../../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>django.db.models.fields &#8212; Evennia latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../../../../_static/nature.css?v=279e0f84" />
<link rel="stylesheet" type="text/css" href="../../../../_static/custom.css?v=e4a91a55" />
<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="icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="Related">
<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</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.db.models.fields</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for django.db.models.fields</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">decimal</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">operator</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">uuid</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">base64</span><span class="w"> </span><span class="kn">import</span> <span class="n">b64decode</span><span class="p">,</span> <span class="n">b64encode</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">collections.abc</span><span class="w"> </span><span class="kn">import</span> <span class="n">Iterable</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">partialmethod</span><span class="p">,</span> <span class="n">total_ordering</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.apps</span><span class="w"> </span><span class="kn">import</span> <span class="n">apps</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</span><span class="w"> </span><span class="kn">import</span> <span class="n">checks</span><span class="p">,</span> <span class="n">exceptions</span><span class="p">,</span> <span class="n">validators</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db</span><span class="w"> </span><span class="kn">import</span> <span class="n">connection</span><span class="p">,</span> <span class="n">connections</span><span class="p">,</span> <span class="n">router</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.constants</span><span class="w"> </span><span class="kn">import</span> <span class="n">LOOKUP_SEP</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.query_utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">DeferredAttribute</span><span class="p">,</span> <span class="n">RegisterLookupMixin</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">NotSupportedError</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">timezone</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.choices</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">BlankChoiceIterator</span><span class="p">,</span>
<span class="n">CallableChoiceIterator</span><span class="p">,</span>
<span class="n">flatten_choices</span><span class="p">,</span>
<span class="n">normalize_choices</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.datastructures</span><span class="w"> </span><span class="kn">import</span> <span class="n">DictWrapper</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.dateparse</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">parse_date</span><span class="p">,</span>
<span class="n">parse_datetime</span><span class="p">,</span>
<span class="n">parse_duration</span><span class="p">,</span>
<span class="n">parse_time</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.duration</span><span class="w"> </span><span class="kn">import</span> <span class="n">duration_microseconds</span><span class="p">,</span> <span class="n">duration_string</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.functional</span><span class="w"> </span><span class="kn">import</span> <span class="n">Promise</span><span class="p">,</span> <span class="n">cached_property</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.ipv6</span><span class="w"> </span><span class="kn">import</span> <span class="n">MAX_IPV6_ADDRESS_LENGTH</span><span class="p">,</span> <span class="n">clean_ipv6_address</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.text</span><span class="w"> </span><span class="kn">import</span> <span class="n">capfirst</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.utils.translation</span><span class="w"> </span><span class="kn">import</span> <span class="n">gettext_lazy</span> <span class="k">as</span> <span class="n">_</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;AutoField&quot;</span><span class="p">,</span>
<span class="s2">&quot;BLANK_CHOICE_DASH&quot;</span><span class="p">,</span>
<span class="s2">&quot;BigAutoField&quot;</span><span class="p">,</span>
<span class="s2">&quot;BigIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;BinaryField&quot;</span><span class="p">,</span>
<span class="s2">&quot;BooleanField&quot;</span><span class="p">,</span>
<span class="s2">&quot;CharField&quot;</span><span class="p">,</span>
<span class="s2">&quot;CommaSeparatedIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;DateField&quot;</span><span class="p">,</span>
<span class="s2">&quot;DateTimeField&quot;</span><span class="p">,</span>
<span class="s2">&quot;DecimalField&quot;</span><span class="p">,</span>
<span class="s2">&quot;DurationField&quot;</span><span class="p">,</span>
<span class="s2">&quot;EmailField&quot;</span><span class="p">,</span>
<span class="s2">&quot;Empty&quot;</span><span class="p">,</span>
<span class="s2">&quot;Field&quot;</span><span class="p">,</span>
<span class="s2">&quot;FilePathField&quot;</span><span class="p">,</span>
<span class="s2">&quot;FloatField&quot;</span><span class="p">,</span>
<span class="s2">&quot;GenericIPAddressField&quot;</span><span class="p">,</span>
<span class="s2">&quot;IPAddressField&quot;</span><span class="p">,</span>
<span class="s2">&quot;IntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;NOT_PROVIDED&quot;</span><span class="p">,</span>
<span class="s2">&quot;NullBooleanField&quot;</span><span class="p">,</span>
<span class="s2">&quot;PositiveBigIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;PositiveIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;PositiveSmallIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;SlugField&quot;</span><span class="p">,</span>
<span class="s2">&quot;SmallAutoField&quot;</span><span class="p">,</span>
<span class="s2">&quot;SmallIntegerField&quot;</span><span class="p">,</span>
<span class="s2">&quot;TextField&quot;</span><span class="p">,</span>
<span class="s2">&quot;TimeField&quot;</span><span class="p">,</span>
<span class="s2">&quot;URLField&quot;</span><span class="p">,</span>
<span class="s2">&quot;UUIDField&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Empty</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">class</span><span class="w"> </span><span class="nc">NOT_PROVIDED</span><span class="p">:</span>
<span class="k">pass</span>
<span class="c1"># The values to use for &quot;blank&quot; in SelectFields. Will be appended to the start</span>
<span class="c1"># of most &quot;choices&quot; lists.</span>
<span class="n">BLANK_CHOICE_DASH</span> <span class="o">=</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="k">def</span><span class="w"> </span><span class="nf">_load_field</span><span class="p">(</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="p">,</span> <span class="n">field_name</span><span class="p">):</span>
<span class="k">return</span> <span class="n">apps</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span><span class="p">)</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">field_name</span><span class="p">)</span>
<span class="c1"># A guide to Field parameters:</span>
<span class="c1">#</span>
<span class="c1"># * name: The name of the field specified in the model.</span>
<span class="c1"># * attname: The attribute to use on the model object. This is the same as</span>
<span class="c1"># &quot;name&quot;, except in the case of ForeignKeys, where &quot;_id&quot; is</span>
<span class="c1"># appended.</span>
<span class="c1"># * db_column: The db_column specified in the model (or None).</span>
<span class="c1"># * column: The database column for this field. This is the same as</span>
<span class="c1"># &quot;attname&quot;, except if db_column is specified.</span>
<span class="c1">#</span>
<span class="c1"># Code that introspects values, or does other dynamic things, should use</span>
<span class="c1"># attname. For example, this gets the primary key value of object &quot;obj&quot;:</span>
<span class="c1">#</span>
<span class="c1"># getattr(obj, opts.pk.attname)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_empty</span><span class="p">(</span><span class="n">of_cls</span><span class="p">):</span>
<span class="n">new</span> <span class="o">=</span> <span class="n">Empty</span><span class="p">()</span>
<span class="n">new</span><span class="o">.</span><span class="vm">__class__</span> <span class="o">=</span> <span class="n">of_cls</span>
<span class="k">return</span> <span class="n">new</span>
<span class="k">def</span><span class="w"> </span><span class="nf">return_None</span><span class="p">():</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="nd">@total_ordering</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Field</span><span class="p">(</span><span class="n">RegisterLookupMixin</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Base class for all field types&quot;&quot;&quot;</span>
<span class="c1"># Designates whether empty strings fundamentally are allowed at the</span>
<span class="c1"># database level.</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">empty_values</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">validators</span><span class="o">.</span><span class="n">EMPTY_VALUES</span><span class="p">)</span>
<span class="c1"># These track each time a Field instance is created. Used to retain order.</span>
<span class="c1"># The auto_creation_counter is used for fields that Django implicitly</span>
<span class="c1"># creates, creation_counter is used for all user-specified fields.</span>
<span class="n">creation_counter</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">auto_creation_counter</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="n">default_validators</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># Default set of validators</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid_choice&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Value </span><span class="si">%(value)r</span><span class="s2"> is not a valid choice.&quot;</span><span class="p">),</span>
<span class="s2">&quot;null&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;This field cannot be null.&quot;</span><span class="p">),</span>
<span class="s2">&quot;blank&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;This field cannot be blank.&quot;</span><span class="p">),</span>
<span class="s2">&quot;unique&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(model_name)s</span><span class="s2"> with this </span><span class="si">%(field_label)s</span><span class="s2"> already exists.&quot;</span><span class="p">),</span>
<span class="s2">&quot;unique_for_date&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="c1"># Translators: The &#39;lookup_type&#39; is one of &#39;date&#39;, &#39;year&#39; or</span>
<span class="c1"># &#39;month&#39;. Eg: &quot;Title must be unique for pub_date year&quot;</span>
<span class="s2">&quot;</span><span class="si">%(field_label)s</span><span class="s2"> must be unique for &quot;</span>
<span class="s2">&quot;</span><span class="si">%(date_field_label)s</span><span class="s2"> </span><span class="si">%(lookup_type)s</span><span class="s2">.&quot;</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="n">system_check_deprecated_details</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Attributes that don&#39;t affect a column definition.</span>
<span class="c1"># These attributes are ignored when altering the field.</span>
<span class="n">non_db_attrs</span> <span class="o">=</span> <span class="p">(</span>
<span class="s2">&quot;blank&quot;</span><span class="p">,</span>
<span class="s2">&quot;choices&quot;</span><span class="p">,</span>
<span class="s2">&quot;db_column&quot;</span><span class="p">,</span>
<span class="s2">&quot;editable&quot;</span><span class="p">,</span>
<span class="s2">&quot;error_messages&quot;</span><span class="p">,</span>
<span class="s2">&quot;help_text&quot;</span><span class="p">,</span>
<span class="s2">&quot;limit_choices_to&quot;</span><span class="p">,</span>
<span class="c1"># Database-level options are not supported, see #21961.</span>
<span class="s2">&quot;on_delete&quot;</span><span class="p">,</span>
<span class="s2">&quot;related_name&quot;</span><span class="p">,</span>
<span class="s2">&quot;related_query_name&quot;</span><span class="p">,</span>
<span class="s2">&quot;validators&quot;</span><span class="p">,</span>
<span class="s2">&quot;verbose_name&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># Field flags</span>
<span class="n">hidden</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">many_to_many</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">many_to_one</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">one_to_many</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">one_to_one</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">related_model</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">generated</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">descriptor_class</span> <span class="o">=</span> <span class="n">DeferredAttribute</span>
<span class="c1"># Generic field type description, usually overridden by subclasses</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Field of type: </span><span class="si">%(field_type)s</span><span class="s2">&quot;</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
<span class="s2">&quot;field_type&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_description</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">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">primary_key</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">max_length</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">unique</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">blank</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">null</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">db_index</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">rel</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">NOT_PROVIDED</span><span class="p">,</span>
<span class="n">editable</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">serialize</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">unique_for_date</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">unique_for_month</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">unique_for_year</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="kc">None</span><span class="p">,</span>
<span class="n">help_text</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">db_column</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">db_tablespace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">auto_created</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">validators</span><span class="o">=</span><span class="p">(),</span>
<span class="n">error_messages</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">db_comment</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">db_default</span><span class="o">=</span><span class="n">NOT_PROVIDED</span><span class="p">,</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</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="c1"># May be set by set_attributes_from_name</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="c1"># Store original for deconstruction</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary_key</span> <span class="o">=</span> <span class="n">primary_key</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unique</span> <span class="o">=</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">unique</span>
<span class="bp">self</span><span class="o">.</span><span class="n">blank</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span> <span class="o">=</span> <span class="n">blank</span><span class="p">,</span> <span class="n">null</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span> <span class="o">=</span> <span class="n">rel</span>
<span class="bp">self</span><span class="o">.</span><span class="n">is_relation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">default</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_default</span> <span class="o">=</span> <span class="n">db_default</span>
<span class="bp">self</span><span class="o">.</span><span class="n">editable</span> <span class="o">=</span> <span class="n">editable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">serialize</span> <span class="o">=</span> <span class="n">serialize</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unique_for_date</span> <span class="o">=</span> <span class="n">unique_for_date</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unique_for_month</span> <span class="o">=</span> <span class="n">unique_for_month</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unique_for_year</span> <span class="o">=</span> <span class="n">unique_for_year</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">help_text</span> <span class="o">=</span> <span class="n">help_text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_index</span> <span class="o">=</span> <span class="n">db_index</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_column</span> <span class="o">=</span> <span class="n">db_column</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_comment</span> <span class="o">=</span> <span class="n">db_comment</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_db_tablespace</span> <span class="o">=</span> <span class="n">db_tablespace</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_created</span> <span class="o">=</span> <span class="n">auto_created</span>
<span class="c1"># Adjust the appropriate creation counter, and save our local copy.</span>
<span class="k">if</span> <span class="n">auto_created</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">=</span> <span class="n">Field</span><span class="o">.</span><span class="n">auto_creation_counter</span>
<span class="n">Field</span><span class="o">.</span><span class="n">auto_creation_counter</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">=</span> <span class="n">Field</span><span class="o">.</span><span class="n">creation_counter</span>
<span class="n">Field</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_validators</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">validators</span><span class="p">)</span> <span class="c1"># Store for deconstruction later</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_error_messages</span> <span class="o">=</span> <span class="n">error_messages</span> <span class="c1"># Store for deconstruction later</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return &quot;app_label.model_label.field_name&quot; for fields attached to</span>
<span class="sd"> models.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__str__</span><span class="p">()</span>
<span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span>
<span class="k">return</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="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span><span class="p">,</span> <span class="bp">self</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="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Display the module, class, and name of the field.&quot;&quot;&quot;</span>
<span class="n">path</span> <span class="o">=</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="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">%s</span><span class="s2">&gt;&quot;</span> <span class="o">%</span> <span class="n">path</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_field_name</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_choices</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_db_default</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_db_index</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_db_comment</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_null_allowed_for_primary_keys</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_backend_specific_checks</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_validators</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_deprecation_details</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_field_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check if field name is valid, i.e. 1) does not end with an</span>
<span class="sd"> underscore, 2) does not contain &quot;__&quot; and 3) is not &quot;pk&quot;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;Field names must not end with an underscore.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E001&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">elif</span> <span class="n">LOOKUP_SEP</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s1">&#39;Field names must not contain &quot;</span><span class="si">%s</span><span class="s1">&quot;.&#39;</span> <span class="o">%</span> <span class="n">LOOKUP_SEP</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E002&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;pk&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;pk&#39; is a reserved word that cannot be used as a field name.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E003&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_choices_is_value</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Promise</span><span class="p">))</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_choices</span><span class="p">(</span><span class="bp">self</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">choices</span><span class="p">:</span>
<span class="k">return</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="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;choices&#39; must be a mapping (e.g. a dictionary) or an iterable &quot;</span>
<span class="s2">&quot;(e.g. a list or tuple).&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E004&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="n">choice_max_length</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># Expect [group_name, [value, display]]</span>
<span class="k">for</span> <span class="n">choices_group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">group_name</span><span class="p">,</span> <span class="n">group_choices</span> <span class="o">=</span> <span class="n">choices_group</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="c1"># Containing non-pairs</span>
<span class="k">break</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_choices_is_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choices_is_value</span><span class="p">(</span><span class="n">human_name</span><span class="p">)</span>
<span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">human_name</span> <span class="ow">in</span> <span class="n">group_choices</span>
<span class="p">):</span>
<span class="k">break</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">group_choices</span><span class="p">:</span>
<span class="n">choice_max_length</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span>
<span class="p">[</span>
<span class="n">choice_max_length</span><span class="p">,</span>
<span class="o">*</span><span class="p">(</span>
<span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">group_choices</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">]</span>
<span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="c1"># No groups, choices in the form [value, display]</span>
<span class="n">value</span><span class="p">,</span> <span class="n">human_name</span> <span class="o">=</span> <span class="n">group_name</span><span class="p">,</span> <span class="n">group_choices</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choices_is_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choices_is_value</span><span class="p">(</span>
<span class="n">human_name</span>
<span class="p">):</span>
<span class="k">break</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">choice_max_length</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">choice_max_length</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="c1"># Special case: choices=[&#39;ab&#39;]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">choices_group</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">choice_max_length</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;max_length&#39; is too small to fit the longest value &quot;</span>
<span class="s2">&quot;in &#39;choices&#39; (</span><span class="si">%d</span><span class="s2"> characters).&quot;</span> <span class="o">%</span> <span class="n">choice_max_length</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E009&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;choices&#39; must be a mapping of actual values to human readable names &quot;</span>
<span class="s2">&quot;or an iterable containing (actual value, human readable name) tuples.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E005&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">databases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Value</span>
<span class="k">if</span> <span class="p">(</span>
<span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_db_default</span><span class="p">()</span>
<span class="ow">or</span> <span class="p">(</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db_default</span><span class="p">,</span> <span class="n">Value</span><span class="p">)</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">db_default</span><span class="p">,</span> <span class="s2">&quot;resolve_expression&quot;</span><span class="p">)</span>
<span class="p">)</span>
<span class="ow">or</span> <span class="n">databases</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="p">):</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_db_default_expression</span><span class="p">,</span> <span class="s2">&quot;allowed_default&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_expression_defaults</span>
<span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">db_default</span><span class="si">}</span><span class="s2"> cannot be used in db_default.&quot;</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E012&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_expression_defaults</span>
<span class="ow">or</span> <span class="s2">&quot;supports_expression_defaults&quot;</span>
<span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">required_db_features</span>
<span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">connection</span><span class="o">.</span><span class="n">display_name</span><span class="si">}</span><span class="s2"> does not support default database &quot;</span>
<span class="s2">&quot;values with expressions (db_default).&quot;</span>
<span class="p">)</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E011&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_index</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;db_index&#39; must be None, True or False.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E006&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_comment</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">databases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_comment</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_comments</span>
<span class="ow">or</span> <span class="s2">&quot;supports_comments&quot;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">required_db_features</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Warning</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">connection</span><span class="o">.</span><span class="n">display_name</span><span class="si">}</span><span class="s2"> does not support comments on &quot;</span>
<span class="sa">f</span><span class="s2">&quot;columns (db_comment).&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.W163&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_null_allowed_for_primary_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">primary_key</span>
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">interprets_empty_strings_as_nulls</span>
<span class="p">):</span>
<span class="c1"># We cannot reliably check this for backends like Oracle which</span>
<span class="c1"># consider NULL and &#39;&#39; to be equal (and thus set up</span>
<span class="c1"># character-based fields a little differently).</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;Primary keys must not have null=True.&quot;</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
<span class="s2">&quot;Set null=False on the field, or &quot;</span>
<span class="s2">&quot;remove primary_key=True argument.&quot;</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E007&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_backend_specific_checks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">databases</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="n">databases</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">connections</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span><span class="o">.</span><span class="n">validation</span><span class="o">.</span><span class="n">check_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_validators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">validator</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">validator</span><span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;All &#39;validators&#39; must be callable.&quot;</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
<span class="s2">&quot;validators[</span><span class="si">{i}</span><span class="s2">] (</span><span class="si">{repr}</span><span class="s2">) isn&#39;t a function or &quot;</span>
<span class="s2">&quot;instance of a validator class.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">i</span><span class="o">=</span><span class="n">i</span><span class="p">,</span>
<span class="nb">repr</span><span class="o">=</span><span class="nb">repr</span><span class="p">(</span><span class="n">validator</span><span class="p">),</span>
<span class="p">)</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E008&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_deprecation_details</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_check_removed_details</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">system_check_removed_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;msg&quot;</span><span class="p">,</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> has been removed except for support in historical &quot;</span>
<span class="s2">&quot;migrations.&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">system_check_removed_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;hint&quot;</span><span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">system_check_removed_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="s2">&quot;fields.EXXX&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_check_deprecated_details</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Warning</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">system_check_deprecated_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s2">&quot;msg&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> has been deprecated.&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="p">),</span>
<span class="n">hint</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">system_check_deprecated_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;hint&quot;</span><span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">system_check_deprecated_details</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="s2">&quot;fields.WXXX&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_col</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">alias</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_table</span> <span class="ow">and</span> <span class="p">(</span>
<span class="n">output_field</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">output_field</span> <span class="o">==</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">cached_col</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Col</span>
<span class="k">return</span> <span class="n">Col</span><span class="p">(</span><span class="n">alias</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">output_field</span><span class="p">)</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">_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">_choices</span> <span class="o">=</span> <span class="n">normalize_choices</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">cached_col</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.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Col</span>
<span class="k">return</span> <span class="n">Col</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">db_table</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">select_format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">compiler</span><span class="p">,</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Custom format for select clauses. For example, GIS columns need to be</span>
<span class="sd"> selected as AsText(table.col) on MySQL as the table.col data can&#39;t be</span>
<span class="sd"> used by Django.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">sql</span><span class="p">,</span> <span class="n">params</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return enough information to recreate the field as a 4-tuple:</span>
<span class="sd"> * The name of the field on the model, if contribute_to_class() has</span>
<span class="sd"> been run.</span>
<span class="sd"> * The import path of the field, including the class, e.g.</span>
<span class="sd"> django.db.models.IntegerField. This should be the most portable</span>
<span class="sd"> version, so less specific may be better.</span>
<span class="sd"> * A list of positional arguments.</span>
<span class="sd"> * A dict of keyword arguments.</span>
<span class="sd"> Note that the positional or keyword arguments must contain values of</span>
<span class="sd"> the following types (including inner values of collection types):</span>
<span class="sd"> * None, bool, str, int, float, complex, set, frozenset, list, tuple,</span>
<span class="sd"> dict</span>
<span class="sd"> * UUID</span>
<span class="sd"> * datetime.datetime (naive), datetime.date</span>
<span class="sd"> * top-level classes, top-level functions - will be referenced by their</span>
<span class="sd"> full import path</span>
<span class="sd"> * Storage instances - these have their own deconstruct() method</span>
<span class="sd"> This is because the values here must be serialized into a text format</span>
<span class="sd"> (possibly new Python code, possibly JSON) and these are the only types</span>
<span class="sd"> with encoding handlers defined.</span>
<span class="sd"> There&#39;s no need to return the exact way the field was instantiated this</span>
<span class="sd"> time, just ensure that the resulting field is the same - prefer keyword</span>
<span class="sd"> arguments over positional ones, and omit parameters with their default</span>
<span class="sd"> values.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Short-form way of fetching all the default parameters</span>
<span class="n">keywords</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">possibles</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;verbose_name&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;primary_key&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;max_length&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;unique&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;blank&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;null&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;db_index&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;default&quot;</span><span class="p">:</span> <span class="n">NOT_PROVIDED</span><span class="p">,</span>
<span class="s2">&quot;db_default&quot;</span><span class="p">:</span> <span class="n">NOT_PROVIDED</span><span class="p">,</span>
<span class="s2">&quot;editable&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;serialize&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;unique_for_date&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;unique_for_month&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;unique_for_year&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;help_text&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="s2">&quot;db_column&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;db_comment&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;db_tablespace&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;auto_created&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;validators&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;error_messages&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">attr_overrides</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;unique&quot;</span><span class="p">:</span> <span class="s2">&quot;_unique&quot;</span><span class="p">,</span>
<span class="s2">&quot;error_messages&quot;</span><span class="p">:</span> <span class="s2">&quot;_error_messages&quot;</span><span class="p">,</span>
<span class="s2">&quot;validators&quot;</span><span class="p">:</span> <span class="s2">&quot;_validators&quot;</span><span class="p">,</span>
<span class="s2">&quot;verbose_name&quot;</span><span class="p">:</span> <span class="s2">&quot;_verbose_name&quot;</span><span class="p">,</span>
<span class="s2">&quot;db_tablespace&quot;</span><span class="p">:</span> <span class="s2">&quot;_db_tablespace&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">equals_comparison</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">,</span> <span class="s2">&quot;validators&quot;</span><span class="p">}</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">default</span> <span class="ow">in</span> <span class="n">possibles</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr_overrides</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="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">CallableChoiceIterator</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">func</span>
<span class="c1"># Do correct kind of comparison</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">equals_comparison</span><span class="p">:</span>
<span class="k">if</span> <span class="n">value</span> <span class="o">!=</span> <span class="n">default</span><span class="p">:</span>
<span class="n">keywords</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">default</span><span class="p">:</span>
<span class="n">keywords</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="c1"># Work out path - we shorten it for known Django core fields</span>
<span class="n">path</span> <span class="o">=</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="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__qualname__</span><span class="p">)</span>
<span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.related&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.related&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.files&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.files&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.generated&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.generated&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.json&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.json&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.proxy&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.proxy&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.composite&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields.composite&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields&quot;</span><span class="p">):</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;django.db.models.fields&quot;</span><span class="p">,</span> <span class="s2">&quot;django.db.models&quot;</span><span class="p">)</span>
<span class="c1"># Return basic info - other fields should override this.</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="p">[],</span> <span class="n">keywords</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">clone</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Uses deconstruct() to clone a new copy of this Field.</span>
<span class="sd"> Will not preserve any class attachments/attribute names.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="c1"># Needed for @total_ordering</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">creation_counter</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">,</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">==</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="c1"># This is needed because bisect does not take a comparison function.</span>
<span class="c1"># Order by creation_counter first for backward compatibility.</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">!=</span> <span class="n">other</span><span class="o">.</span><span class="n">creation_counter</span>
<span class="ow">or</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
<span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span> <span class="o">&lt;</span> <span class="n">other</span><span class="o">.</span><span class="n">creation_counter</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span> <span class="c1"># Order no-model fields first</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># creation_counter&#39;s are equal, compare only models.</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="p">)</span> <span class="o">&lt;</span> <span class="p">(</span>
<span class="n">other</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="n">other</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="p">)</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">creation_counter</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memodict</span><span class="p">):</span>
<span class="c1"># We don&#39;t have to deepcopy very much here, since most things are not</span>
<span class="c1"># intended to be altered after initial creation.</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">remote_field</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="o">.</span><span class="n">remote_field</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="s2">&quot;field&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">field</span> <span class="ow">is</span> <span class="bp">self</span><span class="p">:</span>
<span class="n">obj</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">field</span> <span class="o">=</span> <span class="n">obj</span>
<span class="n">memodict</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="k">def</span><span class="w"> </span><span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># We need to avoid hitting __reduce__, so define this</span>
<span class="c1"># slightly weird copy construct.</span>
<span class="n">obj</span> <span class="o">=</span> <span class="n">Empty</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span>
<span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">return</span> <span class="n">obj</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pickling should return the model._meta.fields instance of the field,</span>
<span class="sd"> not a new copy of that field. So, use the app registry to load the</span>
<span class="sd"> model and then the field back.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">):</span>
<span class="c1"># Fields are sometimes used without attaching them to models (for</span>
<span class="c1"># example in aggregation). In this case give back a plain field</span>
<span class="c1"># instance. The code below will create a new empty instance of</span>
<span class="c1"># class self.__class__, then update its dict with self.__dict__</span>
<span class="c1"># values - so, this is very close to normal pickle.</span>
<span class="n">state</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="c1"># The _get_default cached_property can&#39;t be pickled due to lambda</span>
<span class="c1"># usage.</span>
<span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;_get_default&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_empty</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,),</span> <span class="n">state</span>
<span class="k">return</span> <span class="n">_load_field</span><span class="p">,</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">object_name</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_pk_value_on_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Hook to generate new PK values on save. This method is called when</span>
<span class="sd"> saving instances with no primary key value set. If this method returns</span>
<span class="sd"> something else than None, then the returned value is used when saving</span>
<span class="sd"> the new instance.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Convert the input value into the expected Python data type, raising</span>
<span class="sd"> django.core.exceptions.ValidationError if the data can&#39;t be converted.</span>
<span class="sd"> Return the converted value. Subclasses should override this.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">value</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">error_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">messages</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__mro__</span><span class="p">):</span>
<span class="n">messages</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s2">&quot;default_error_messages&quot;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="n">messages</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_error_messages</span> <span class="ow">or</span> <span class="p">{})</span>
<span class="k">return</span> <span class="n">messages</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Some validators can&#39;t be created at field initialization time.</span>
<span class="sd"> This method provides a way to delay their creation until required.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">default_validators</span><span class="p">,</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_validators</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">run_validators</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">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">v</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="s2">&quot;code&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">code</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">:</span>
<span class="n">e</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="n">e</span><span class="o">.</span><span class="n">code</span><span class="p">]</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">error_list</span><span class="p">)</span>
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="n">errors</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate</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">model_instance</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Validate value and raise ValidationError if necessary. Subclasses</span>
<span class="sd"> should override this to provide validation logic.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">editable</span><span class="p">:</span>
<span class="c1"># Skip validation for non-editable fields.</span>
<span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="k">for</span> <span class="n">option_key</span><span class="p">,</span> <span class="n">option_value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">option_value</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
<span class="c1"># This is an optgroup, so look inside the group for</span>
<span class="c1"># options.</span>
<span class="k">for</span> <span class="n">optgroup_key</span><span class="p">,</span> <span class="n">optgroup_value</span> <span class="ow">in</span> <span class="n">option_value</span><span class="p">:</span>
<span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="n">optgroup_key</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="n">value</span> <span class="o">==</span> <span class="n">option_key</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_choice&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid_choice&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;null&quot;</span><span class="p">],</span> <span class="n">code</span><span class="o">=</span><span class="s2">&quot;null&quot;</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">blank</span> <span class="ow">and</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">],</span> <span class="n">code</span><span class="o">=</span><span class="s2">&quot;blank&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Convert the value&#39;s type and run validation. Validation errors</span>
<span class="sd"> from to_python() and validate() are propagated. Return the correct</span>
<span class="sd"> value if no error is raised.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">run_validators</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_type_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">DictWrapper</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">,</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">quote_name</span><span class="p">,</span> <span class="s2">&quot;qn_&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the database column check constraint for this field, for the</span>
<span class="sd"> provided connection. Works the same way as db_type() for the case that</span>
<span class="sd"> get_internal_type() does not map to a preexisting model field.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type_parameters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">data_type_check_constraints</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()]</span> <span class="o">%</span> <span class="n">data</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the database column data type for this field, for the provided</span>
<span class="sd"> connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># The default implementation of this method looks at the</span>
<span class="c1"># backend-specific data_types dictionary, looking up the field by its</span>
<span class="c1"># &quot;internal type&quot;.</span>
<span class="c1">#</span>
<span class="c1"># A Field class can implement the get_internal_type() method to specify</span>
<span class="c1"># which *preexisting* Django Field class it&#39;s most similar to -- i.e.,</span>
<span class="c1"># a custom field might be represented by a TEXT column type, which is</span>
<span class="c1"># the same as the TextField Django field type, which means the custom</span>
<span class="c1"># field&#39;s get_internal_type() returns &#39;TextField&#39;.</span>
<span class="c1">#</span>
<span class="c1"># But the limitation of the get_internal_type() / data_types approach</span>
<span class="c1"># is that it cannot handle database column types that aren&#39;t already</span>
<span class="c1"># mapped to one of the built-in Django field types. In this case, you</span>
<span class="c1"># can implement db_type() instead of get_internal_type() to specify</span>
<span class="c1"># exactly which wacky database column type you want to use.</span>
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type_parameters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">column_type</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">data_types</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># column_type is either a single-parameter function or a string.</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">column_type</span><span class="p">):</span>
<span class="k">return</span> <span class="n">column_type</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">return</span> <span class="n">column_type</span> <span class="o">%</span> <span class="n">data</span>
<span class="k">def</span><span class="w"> </span><span class="nf">rel_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the data type that a related field pointing to this field should</span>
<span class="sd"> use. For example, this method is called by ForeignKey and OneToOneField</span>
<span class="sd"> to determine its data type.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">cast_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the data type to use in the Cast() function.&quot;&quot;&quot;</span>
<span class="n">db_type</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">cast_data_types</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">())</span>
<span class="k">if</span> <span class="n">db_type</span><span class="p">:</span>
<span class="k">return</span> <span class="n">db_type</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type_parameters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Extension of db_type(), providing a range of different return values</span>
<span class="sd"> (type, checks). This will look at db_type(), allowing custom model</span>
<span class="sd"> fields to override it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">type_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="n">check_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_check</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">type_string</span><span class="p">,</span>
<span class="s2">&quot;check&quot;</span><span class="p">:</span> <span class="n">check_string</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_type_suffix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">data_types_suffix</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_converters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;from_db_value&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">from_db_value</span><span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">unique</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">_unique</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">primary_key</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_tablespace</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">_db_tablespace</span> <span class="ow">or</span> <span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_INDEX_TABLESPACE</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_returning</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Private API intended only to be used by Django itself.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_db_default</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">set_attributes_from_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">or</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_attname_column</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">concrete</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verbose_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</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="bp">self</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">replace</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="k">def</span><span class="w"> </span><span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">private_only</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Register the field with the model class it belongs to.</span>
<span class="sd"> If private_only is True, create a separate instance of this field</span>
<span class="sd"> for every subclass of cls, even if cls is not an abstract model.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_attributes_from_name</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="bp">cls</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">add_field</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">private</span><span class="o">=</span><span class="n">private_only</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">descriptor_class</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Don&#39;t override a get_FOO_display() method defined explicitly on</span>
<span class="c1"># this class, but don&#39;t check methods derived from inheritance, to</span>
<span class="c1"># allow overriding inherited choices. For more complex inheritance</span>
<span class="c1"># structures users should override contribute_to_class().</span>
<span class="k">if</span> <span class="s2">&quot;get_</span><span class="si">%s</span><span class="s2">_display&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="bp">cls</span><span class="p">,</span>
<span class="s2">&quot;get_</span><span class="si">%s</span><span class="s2">_display&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">partialmethod</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_get_FIELD_display</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="bp">self</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_filter_kwargs_for_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a dict that when passed as kwargs to self.model.filter(), would</span>
<span class="sd"> yield all instances having the same value for this field as obj has.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</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="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">)}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_attname</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">name</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_attname_column</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">attname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_attname</span><span class="p">()</span>
<span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_column</span> <span class="ow">or</span> <span class="n">attname</span>
<span class="k">return</span> <span class="n">attname</span><span class="p">,</span> <span class="n">column</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</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="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">def</span><span class="w"> </span><span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return field&#39;s value just before saving.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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="w"> </span><span class="sd">&quot;&quot;&quot;Perform preliminary non-db specific value checks and conversions.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Promise</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">_proxy____cast</span><span class="p">()</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return field&#39;s value prepared for interacting with the database</span>
<span class="sd"> backend.</span>
<span class="sd"> Used by the default implementations of get_db_prep_save().</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_save</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">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return field&#39;s value prepared for saving into a database.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;as_sql&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a boolean of whether this field has a default value.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOT_PROVIDED</span>
<span class="k">def</span><span class="w"> </span><span class="nf">has_db_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a boolean of whether this field has a db_default value.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">NOT_PROVIDED</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the default value for this field.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default</span><span class="p">()</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_db_default</span><span class="p">():</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">DatabaseDefault</span>
<span class="k">return</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">DatabaseDefault</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_db_default_expression</span><span class="p">,</span> <span class="n">output_field</span><span class="o">=</span><span class="bp">self</span>
<span class="p">)</span>
<span class="k">if</span> <span class="p">(</span>
<span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_strings_allowed</span>
<span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span>
<span class="ow">and</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">interprets_empty_strings_as_nulls</span>
<span class="p">):</span>
<span class="k">return</span> <span class="n">return_None</span>
<span class="k">return</span> <span class="nb">str</span> <span class="c1"># return empty string</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_db_default_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">db_default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_default</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_db_default</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">db_default</span><span class="p">,</span> <span class="s2">&quot;resolve_expression&quot;</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.expressions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Value</span>
<span class="n">db_default</span> <span class="o">=</span> <span class="n">Value</span><span class="p">(</span><span class="n">db_default</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="n">db_default</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_choices</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">include_blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">blank_choice</span><span class="o">=</span><span class="n">BLANK_CHOICE_DASH</span><span class="p">,</span>
<span class="n">limit_choices_to</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">ordering</span><span class="o">=</span><span class="p">(),</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return choices with a default blank choices included, for use</span>
<span class="sd"> as &lt;select&gt; choices for this field.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">include_blank</span><span class="p">:</span>
<span class="k">return</span> <span class="n">BlankChoiceIterator</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">,</span> <span class="n">blank_choice</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span>
<span class="n">rel_model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">model</span>
<span class="n">limit_choices_to</span> <span class="o">=</span> <span class="n">limit_choices_to</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_limit_choices_to</span><span class="p">()</span>
<span class="n">choice_func</span> <span class="o">=</span> <span class="n">operator</span><span class="o">.</span><span class="n">attrgetter</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="o">.</span><span class="n">get_related_field</span><span class="p">()</span><span class="o">.</span><span class="n">attname</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_field</span><span class="p">,</span> <span class="s2">&quot;get_related_field&quot;</span><span class="p">)</span>
<span class="k">else</span> <span class="s2">&quot;pk&quot;</span>
<span class="p">)</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">rel_model</span><span class="o">.</span><span class="n">_default_manager</span><span class="o">.</span><span class="n">complex_filter</span><span class="p">(</span><span class="n">limit_choices_to</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ordering</span><span class="p">:</span>
<span class="n">qs</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="o">*</span><span class="n">ordering</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">blank_choice</span> <span class="k">if</span> <span class="n">include_blank</span> <span class="k">else</span> <span class="p">[])</span> <span class="o">+</span> <span class="p">[</span>
<span class="p">(</span><span class="n">choice_func</span><span class="p">(</span><span class="n">x</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">qs</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a string value of this field from the passed obj.</span>
<span class="sd"> This is used by the serialization framework.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">flatchoices</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Flattened version of choices tuple.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">flatten_choices</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">choices</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">save_form_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">choices_form_class</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a django.forms.Field instance for this field.&quot;&quot;&quot;</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;required&quot;</span><span class="p">:</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">blank</span><span class="p">,</span>
<span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="n">capfirst</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">),</span>
<span class="s2">&quot;help_text&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">help_text</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">has_default</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">):</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;initial&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;show_hidden_initial&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;initial&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Fields with choices get special treatment.</span>
<span class="n">include_blank</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">blank</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">()</span> <span class="ow">or</span> <span class="s2">&quot;initial&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span>
<span class="p">)</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;choices&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_choices</span><span class="p">(</span><span class="n">include_blank</span><span class="o">=</span><span class="n">include_blank</span><span class="p">)</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;coerce&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;empty_value&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">choices_form_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">choices_form_class</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">TypedChoiceField</span>
<span class="c1"># Many of the subclass-specific formfield arguments (min_value,</span>
<span class="c1"># max_value) don&#39;t apply for choice fields, so be sure to only pass</span>
<span class="c1"># the values that TypedChoiceField will understand.</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span>
<span class="s2">&quot;coerce&quot;</span><span class="p">,</span>
<span class="s2">&quot;empty_value&quot;</span><span class="p">,</span>
<span class="s2">&quot;choices&quot;</span><span class="p">,</span>
<span class="s2">&quot;required&quot;</span><span class="p">,</span>
<span class="s2">&quot;widget&quot;</span><span class="p">,</span>
<span class="s2">&quot;label&quot;</span><span class="p">,</span>
<span class="s2">&quot;initial&quot;</span><span class="p">,</span>
<span class="s2">&quot;help_text&quot;</span><span class="p">,</span>
<span class="s2">&quot;error_messages&quot;</span><span class="p">,</span>
<span class="s2">&quot;show_hidden_initial&quot;</span><span class="p">,</span>
<span class="s2">&quot;disabled&quot;</span><span class="p">,</span>
<span class="p">):</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
<span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">form_class</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span>
<span class="k">return</span> <span class="n">form_class</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_from_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the value of this field in the given model instance.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">slice_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Return a slice of this field.&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span><span class="s2">&quot;This field does not support slicing.&quot;</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">BooleanField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be either True or False.&quot;</span><span class="p">),</span>
<span class="s2">&quot;invalid_nullable&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be either True, False, or None.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Boolean (Either True or False)&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;BooleanField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span> <span class="ow">and</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">empty_values</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="c1"># 1/0 are equal to True/False. bool() converts former to latter.</span>
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;t&quot;</span><span class="p">,</span> <span class="s2">&quot;True&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;f&quot;</span><span class="p">,</span> <span class="s2">&quot;False&quot;</span><span class="p">,</span> <span class="s2">&quot;0&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_nullable&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span> <span class="k">else</span> <span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">include_blank</span> <span class="o">=</span> <span class="ow">not</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">()</span> <span class="ow">or</span> <span class="s2">&quot;initial&quot;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">)</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_choices</span><span class="p">(</span><span class="n">include_blank</span><span class="o">=</span><span class="n">include_blank</span><span class="p">)}</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">form_class</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">NullBooleanField</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span> <span class="k">else</span> <span class="n">forms</span><span class="o">.</span><span class="n">BooleanField</span>
<span class="c1"># In HTML checkboxes, &#39;required&#39; means &quot;must be checked&quot; which is</span>
<span class="c1"># different from the choices case (&quot;must select some value&quot;).</span>
<span class="c1"># required=False allows unchecked checkboxes.</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">form_class</span><span class="p">,</span> <span class="s2">&quot;required&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">}</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="o">**</span><span class="n">defaults</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">})</span>
<span class="k">class</span><span class="w"> </span><span class="nc">CharField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">db_collation</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span> <span class="o">=</span> <span class="n">db_collation</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">validators</span><span class="o">.</span><span class="n">MaxLengthValidator</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;String (up to </span><span class="si">%(max_length)s</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;String (unlimited)&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">databases</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;databases&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_db_collation</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_max_length_attribute</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_max_length_attribute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_unlimited_charfield</span>
<span class="ow">or</span> <span class="s2">&quot;supports_unlimited_charfield&quot;</span>
<span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">required_db_features</span>
<span class="p">):</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;CharFields must define a &#39;max_length&#39; attribute.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E120&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">elif</span> <span class="p">(</span>
<span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
<span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
<span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="o">&lt;=</span> <span class="mi">0</span>
<span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;max_length&#39; must be a positive integer.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E121&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_collation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">or</span> <span class="s2">&quot;supports_collation_on_charfield&quot;</span>
<span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">required_db_features</span>
<span class="ow">or</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_collation_on_charfield</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> does not support a database collation on &quot;</span>
<span class="s2">&quot;CharFields.&quot;</span> <span class="o">%</span> <span class="n">connection</span><span class="o">.</span><span class="n">display_name</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E190&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">cast_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">cast_char_field_without_max_length</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">cast_db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="n">db_params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">db_parameters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="n">db_params</span><span class="p">[</span><span class="s2">&quot;collation&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span>
<span class="k">return</span> <span class="n">db_params</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;CharField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># Passing max_length to forms.CharField means that the value&#39;s length</span>
<span class="c1"># will be validated twice. This is considered acceptable since we want</span>
<span class="c1"># the value in the form field (to pass into widget for example).</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;max_length&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">}</span>
<span class="c1"># TODO: Handle multiple backends with different feature flags.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">interprets_empty_strings_as_nulls</span><span class="p">:</span>
<span class="n">defaults</span><span class="p">[</span><span class="s2">&quot;empty_value&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_collation&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">slice_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.functions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Substr</span>
<span class="k">return</span> <span class="n">Substr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">CommaSeparatedIntegerField</span><span class="p">(</span><span class="n">CharField</span><span class="p">):</span>
<span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validators</span><span class="o">.</span><span class="n">validate_comma_separated_integer_list</span><span class="p">]</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Comma-separated integers&quot;</span><span class="p">)</span>
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;msg&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;CommaSeparatedIntegerField is removed except for support in &quot;</span>
<span class="s2">&quot;historical migrations.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;hint&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;Use CharField(validators=[validate_comma_separated_integer_list]) &quot;</span>
<span class="s2">&quot;instead.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;fields.E901&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_to_naive</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">timezone</span><span class="o">.</span><span class="n">is_aware</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">make_naive</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">UTC</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_naive_now</span><span class="p">():</span>
<span class="k">return</span> <span class="n">_to_naive</span><span class="p">(</span><span class="n">timezone</span><span class="o">.</span><span class="n">now</span><span class="p">())</span>
<span class="k">class</span><span class="w"> </span><span class="nc">DateTimeCheckMixin</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_mutually_exclusive_options</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_fix_default_value</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_mutually_exclusive_options</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># auto_now, auto_now_add, and default are mutually exclusive</span>
<span class="c1"># options. The use of more than one of these options together</span>
<span class="c1"># will trigger an Error</span>
<span class="n">mutually_exclusive_options</span> <span class="o">=</span> <span class="p">[</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">(),</span>
<span class="p">]</span>
<span class="n">enabled_options</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">option</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">mutually_exclusive_options</span>
<span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">enabled_options</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;The options auto_now, auto_now_add, and default &quot;</span>
<span class="s2">&quot;are mutually exclusive. Only one of these options &quot;</span>
<span class="s2">&quot;may be present.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E160&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_fix_default_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="c1"># Concrete subclasses use this in their implementations of</span>
<span class="c1"># _check_fix_default_value().</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_if_value_fixed</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">now</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"> Check if the given value appears to have been provided as a &quot;fixed&quot;</span>
<span class="sd"> time value, and include a warning in the returned list if it does. The</span>
<span class="sd"> value argument must be a date object or aware/naive datetime object. If</span>
<span class="sd"> now is provided, it must be a naive datetime object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">now</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">now</span> <span class="o">=</span> <span class="n">_get_naive_now</span><span class="p">()</span>
<span class="n">offset</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="n">lower</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="n">offset</span>
<span class="n">upper</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="n">offset</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">_to_naive</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="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">)</span>
<span class="n">lower</span> <span class="o">=</span> <span class="n">lower</span><span class="o">.</span><span class="n">date</span><span class="p">()</span>
<span class="n">upper</span> <span class="o">=</span> <span class="n">upper</span><span class="o">.</span><span class="n">date</span><span class="p">()</span>
<span class="k">if</span> <span class="n">lower</span> <span class="o">&lt;=</span> <span class="n">value</span> <span class="o">&lt;=</span> <span class="n">upper</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Warning</span><span class="p">(</span>
<span class="s2">&quot;Fixed default value provided.&quot;</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
<span class="s2">&quot;It seems you set a fixed date / time / datetime &quot;</span>
<span class="s2">&quot;value as default for this field. This may not be &quot;</span>
<span class="s2">&quot;what you want. If you want to have the current date &quot;</span>
<span class="s2">&quot;as default, use `django.utils.timezone.now`&quot;</span>
<span class="p">),</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.W161&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">class</span><span class="w"> </span><span class="nc">DateField</span><span class="p">(</span><span class="n">DateTimeCheckMixin</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has an invalid date format. It must be &quot;</span>
<span class="s2">&quot;in YYYY-MM-DD format.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;invalid_date&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has the correct format (YYYY-MM-DD) &quot;</span>
<span class="s2">&quot;but it is an invalid date.&quot;</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Date (without time)&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">auto_now</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">auto_now_add</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="o">=</span> <span class="n">auto_now</span><span class="p">,</span> <span class="n">auto_now_add</span>
<span class="k">if</span> <span class="n">auto_now</span> <span class="ow">or</span> <span class="n">auto_now_add</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_fix_default_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
<span class="sd"> it&#39;s only evaluated on server startup.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">_to_naive</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">date</span><span class="p">()</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># No explicit date / datetime value -- no checks necessary</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="c1"># At this point, value is a date object.</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_if_value_fixed</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;auto_now&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;auto_now_add&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;DateField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span> <span class="ow">and</span> <span class="n">timezone</span><span class="o">.</span><span class="n">is_aware</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># Convert aware datetimes to the default time zone</span>
<span class="c1"># before casting them to dates (#17742).</span>
<span class="n">default_timezone</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">get_default_timezone</span><span class="p">()</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">make_naive</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">default_timezone</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">date</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_date</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parsed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parsed</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_date&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid_date&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="ow">and</span> <span class="n">add</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">pre_save</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">null</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="bp">cls</span><span class="p">,</span>
<span class="s2">&quot;get_next_by_</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">partialmethod</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_get_next_or_previous_by_FIELD</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">is_next</span><span class="o">=</span><span class="kc">True</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span>
<span class="bp">cls</span><span class="p">,</span>
<span class="s2">&quot;get_previous_by_</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
<span class="n">partialmethod</span><span class="p">(</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_get_next_or_previous_by_FIELD</span><span class="p">,</span> <span class="n">field</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">is_next</span><span class="o">=</span><span class="kc">False</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="c1"># Casts dates into the format expected by the backend</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_datefield_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">val</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">DateField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">DateTimeField</span><span class="p">(</span><span class="n">DateField</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in &quot;</span>
<span class="s2">&quot;YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;invalid_date&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has the correct format &quot;</span>
<span class="s2">&quot;(YYYY-MM-DD) but it is an invalid date.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;invalid_datetime&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has the correct format &quot;</span>
<span class="s2">&quot;(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) &quot;</span>
<span class="s2">&quot;but it is an invalid date/time.&quot;</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Date (with time)&quot;</span><span class="p">)</span>
<span class="c1"># __init__ is inherited from DateField</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_fix_default_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
<span class="sd"> it&#39;s only evaluated on server startup.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">)):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_if_value_fixed</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="c1"># No explicit date / datetime value -- no checks necessary.</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;DateTimeField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
<span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span><span class="p">:</span>
<span class="c1"># For backwards compatibility, interpret naive datetimes in</span>
<span class="c1"># local time. This won&#39;t work during DST change, but we can&#39;t</span>
<span class="c1"># do much about it, so we let the exceptions percolate up the</span>
<span class="c1"># call stack.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;(unbound)&quot;</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;DateTimeField </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2"> received a naive datetime (</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">) while &quot;</span>
<span class="s2">&quot;time zone support is active.&quot;</span><span class="p">,</span>
<span class="ne">RuntimeWarning</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">default_timezone</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">get_default_timezone</span><span class="p">()</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">make_aware</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">default_timezone</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_datetime</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parsed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parsed</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_datetime&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid_datetime&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_date</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parsed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="n">parsed</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">parsed</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">parsed</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_date&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid_date&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="ow">and</span> <span class="n">add</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">pre_save</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">)</span>
<span class="c1"># contribute_to_class is inherited from DateField, it registers</span>
<span class="c1"># get_next_by_FOO and get_prev_by_FOO</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">settings</span><span class="o">.</span><span class="n">USE_TZ</span> <span class="ow">and</span> <span class="n">timezone</span><span class="o">.</span><span class="n">is_naive</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># For backwards compatibility, interpret naive datetimes in local</span>
<span class="c1"># time. This won&#39;t work during DST change, but we can&#39;t do much</span>
<span class="c1"># about it, so we let the exceptions percolate up the call stack.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</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="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;(unbound)&quot;</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;DateTimeField </span><span class="si">%s</span><span class="s2"> received a naive datetime (</span><span class="si">%s</span><span class="s2">)&quot;</span>
<span class="s2">&quot; while time zone support is active.&quot;</span> <span class="o">%</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="ne">RuntimeWarning</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">default_timezone</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">get_default_timezone</span><span class="p">()</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">timezone</span><span class="o">.</span><span class="n">make_aware</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">default_timezone</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="c1"># Casts datetimes into the format expected by the backend</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_datetimefield_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">val</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">DecimalField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be a decimal number.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Decimal number&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">max_digits</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">decimal_places</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span> <span class="o">=</span> <span class="n">max_digits</span><span class="p">,</span> <span class="n">decimal_places</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="n">digits_errors</span> <span class="o">=</span> <span class="p">[</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_decimal_places</span><span class="p">(),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_max_digits</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">digits_errors</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_decimal_places_and_max_digits</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">errors</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">digits_errors</span><span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_decimal_places</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">decimal_places</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">decimal_places</span><span class="p">)</span>
<span class="k">if</span> <span class="n">decimal_places</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;DecimalFields must define a &#39;decimal_places&#39; attribute.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E130&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;decimal_places&#39; must be a non-negative integer.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E131&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_max_digits</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">max_digits</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">max_digits</span><span class="p">)</span>
<span class="k">if</span> <span class="n">max_digits</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;DecimalFields must define a &#39;max_digits&#39; attribute.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E132&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;max_digits&#39; must be a positive integer.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E133&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_decimal_places_and_max_digits</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;&#39;max_digits&#39; must be greater or equal to &#39;decimal_places&#39;.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E134&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validators</span><span class="p">,</span>
<span class="n">validators</span><span class="o">.</span><span class="n">DecimalValidator</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span><span class="p">),</span>
<span class="p">]</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Context</span><span class="p">(</span><span class="n">prec</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_digits&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;decimal_places&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;DecimalField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="n">decimal_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">create_decimal_from_float</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">decimal_value</span> <span class="o">=</span> <span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</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="n">decimal</span><span class="o">.</span><span class="n">InvalidOperation</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">decimal_value</span><span class="o">.</span><span class="n">is_finite</span><span class="p">():</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">decimal_value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_decimalfield_value</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;max_digits&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_digits</span><span class="p">,</span>
<span class="s2">&quot;decimal_places&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">decimal_places</span><span class="p">,</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">DecimalField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">DurationField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Store timedelta objects.</span>
<span class="sd"> Use interval on PostgreSQL, INTERVAL DAY TO SECOND on Oracle, and bigint</span>
<span class="sd"> of microseconds on other databases.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in &quot;</span>
<span class="s2">&quot;[DD] [[HH:]MM:]ss[.uuuuuu] format.&quot;</span>
<span class="p">)</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Duration&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;DurationField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_duration</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">parsed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parsed</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">has_native_duration_field</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="n">duration_microseconds</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_converters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="n">converters</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">has_native_duration_field</span><span class="p">:</span>
<span class="n">converters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">convert_durationfield_value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">converters</span> <span class="o">+</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_db_converters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">duration_string</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">DurationField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">EmailField</span><span class="p">(</span><span class="n">CharField</span><span class="p">):</span>
<span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validators</span><span class="o">.</span><span class="n">validate_email</span><span class="p">]</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Email address&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># max_length=254 to be compliant with RFCs 3696 and 5321</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">,</span> <span class="mi">254</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="c1"># We do not exclude max_length if it matches default as we want to</span>
<span class="c1"># change the default in future.</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># As with CharField, this will cause email validation to be performed</span>
<span class="c1"># twice.</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">EmailField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">FilePathField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;File path&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">match</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">recursive</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">allow_files</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">allow_folders</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">recursive</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span> <span class="n">match</span><span class="p">,</span> <span class="n">recursive</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allow_files</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_folders</span> <span class="o">=</span> <span class="n">allow_files</span><span class="p">,</span> <span class="n">allow_folders</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">,</span> <span class="mi">100</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_allowing_files_or_folders</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_allowing_files_or_folders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_files</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_folders</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;FilePathFields must have either &#39;allow_files&#39; or &#39;allow_folders&#39; &quot;</span>
<span class="s2">&quot;set to True.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E140&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;match&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">recursive</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;recursive&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">recursive</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_files</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;allow_files&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_files</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_folders</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;allow_folders&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_folders</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">100</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">()</span> <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
<span class="s2">&quot;match&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">match</span><span class="p">,</span>
<span class="s2">&quot;recursive&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">recursive</span><span class="p">,</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">FilePathField</span><span class="p">,</span>
<span class="s2">&quot;allow_files&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_files</span><span class="p">,</span>
<span class="s2">&quot;allow_folders&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_folders</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;FilePathField&quot;</span>
<div class="viewcode-block" id="FloatField">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.FloatField">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">FloatField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be a float.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Floating point number&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="FloatField.get_prep_value">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.FloatField.get_prep_value">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">float</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">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">e</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span>
<span class="s2">&quot;Field &#39;</span><span class="si">%s</span><span class="s2">&#39; expected a number but got </span><span class="si">%r</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span>
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span></div>
<div class="viewcode-block" id="FloatField.get_internal_type">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.FloatField.get_internal_type">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;FloatField&quot;</span></div>
<div class="viewcode-block" id="FloatField.to_python">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.FloatField.to_python">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">float</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">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="FloatField.formfield">
<a class="viewcode-back" href="../../../../api/evennia.typeclasses.managers.html#evennia.typeclasses.managers.FloatField.formfield">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">FloatField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span></div>
</div>
<span class="k">class</span><span class="w"> </span><span class="nc">IntegerField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be an integer.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Integer&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_max_length_warning</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_max_length_warning</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Warning</span><span class="p">(</span>
<span class="s2">&quot;&#39;max_length&#39; is ignored when used with </span><span class="si">%s</span><span class="s2">.&quot;</span>
<span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
<span class="n">hint</span><span class="o">=</span><span class="s2">&quot;Remove &#39;max_length&#39; from field&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.W122&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="nd">@cached_property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validators</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># These validators can&#39;t be added at field initialization time since</span>
<span class="c1"># they&#39;re based on values retrieved from `connection`.</span>
<span class="n">validators_</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">validators</span>
<span class="n">internal_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_internal_type</span><span class="p">()</span>
<span class="n">min_value</span><span class="p">,</span> <span class="n">max_value</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">integer_field_range</span><span class="p">(</span><span class="n">internal_type</span><span class="p">)</span>
<span class="k">if</span> <span class="n">min_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span>
<span class="p">(</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">validator</span><span class="p">,</span> <span class="n">validators</span><span class="o">.</span><span class="n">MinValueValidator</span><span class="p">)</span>
<span class="ow">and</span> <span class="p">(</span>
<span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span><span class="p">)</span>
<span class="k">else</span> <span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span>
<span class="p">)</span>
<span class="o">&gt;=</span> <span class="n">min_value</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">validator</span> <span class="ow">in</span> <span class="n">validators_</span>
<span class="p">):</span>
<span class="n">validators_</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">validators</span><span class="o">.</span><span class="n">MinValueValidator</span><span class="p">(</span><span class="n">min_value</span><span class="p">))</span>
<span class="k">if</span> <span class="n">max_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span>
<span class="p">(</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">validator</span><span class="p">,</span> <span class="n">validators</span><span class="o">.</span><span class="n">MaxValueValidator</span><span class="p">)</span>
<span class="ow">and</span> <span class="p">(</span>
<span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span><span class="p">)</span>
<span class="k">else</span> <span class="n">validator</span><span class="o">.</span><span class="n">limit_value</span>
<span class="p">)</span>
<span class="o">&lt;=</span> <span class="n">max_value</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">validator</span> <span class="ow">in</span> <span class="n">validators_</span>
<span class="p">):</span>
<span class="n">validators_</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">validators</span><span class="o">.</span><span class="n">MaxValueValidator</span><span class="p">(</span><span class="n">max_value</span><span class="p">))</span>
<span class="k">return</span> <span class="n">validators_</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">int</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">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">e</span><span class="o">.</span><span class="vm">__class__</span><span class="p">(</span>
<span class="s2">&quot;Field &#39;</span><span class="si">%s</span><span class="s2">&#39; expected a number but got </span><span class="si">%r</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span>
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_integerfield_value</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">get_internal_type</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;IntegerField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">int</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">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">IntegerField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">BigIntegerField</span><span class="p">(</span><span class="n">IntegerField</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Big (8 byte) integer&quot;</span><span class="p">)</span>
<span class="n">MAX_BIGINT</span> <span class="o">=</span> <span class="mi">9223372036854775807</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;BigIntegerField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;min_value&quot;</span><span class="p">:</span> <span class="o">-</span><span class="n">BigIntegerField</span><span class="o">.</span><span class="n">MAX_BIGINT</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
<span class="s2">&quot;max_value&quot;</span><span class="p">:</span> <span class="n">BigIntegerField</span><span class="o">.</span><span class="n">MAX_BIGINT</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">SmallIntegerField</span><span class="p">(</span><span class="n">IntegerField</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Small integer&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;SmallIntegerField&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">IPAddressField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;IPv4 address&quot;</span><span class="p">)</span>
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;msg&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;IPAddressField has been removed except for support in &quot;</span>
<span class="s2">&quot;historical migrations.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;hint&quot;</span><span class="p">:</span> <span class="s2">&quot;Use GenericIPAddressField instead.&quot;</span><span class="p">,</span>
<span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;fields.E900&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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">15</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;IPAddressField&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">GenericIPAddressField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;IP address&quot;</span><span class="p">)</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Enter a valid </span><span class="si">%(protocol)s</span><span class="s2"> address.&quot;</span><span class="p">)}</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">protocol</span><span class="o">=</span><span class="s2">&quot;both&quot;</span><span class="p">,</span>
<span class="n">unpack_ipv4</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unpack_ipv4</span> <span class="o">=</span> <span class="n">unpack_ipv4</span>
<span class="bp">self</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="n">protocol</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default_validators</span> <span class="o">=</span> <span class="n">validators</span><span class="o">.</span><span class="n">ip_address_validators</span><span class="p">(</span>
<span class="n">protocol</span><span class="p">,</span> <span class="n">unpack_ipv4</span>
<span class="p">)</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">MAX_IPV6_ADDRESS_LENGTH</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_blank_and_null_values</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_blank_and_null_values</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;null&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;blank&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;GenericIPAddressFields cannot have blank=True if null=False, &quot;</span>
<span class="s2">&quot;as blank values are stored as nulls.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E150&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unpack_ipv4</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;unpack_ipv4&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">unpack_ipv4</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span> <span class="o">!=</span> <span class="s2">&quot;both&quot;</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;protocol&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;GenericIPAddressField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="k">return</span> <span class="n">clean_ipv6_address</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">unpack_ipv4</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">]</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_ipaddressfield_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">and</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">clean_ipv6_address</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">unpack_ipv4</span><span class="p">)</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;protocol&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">,</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">GenericIPAddressField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">NullBooleanField</span><span class="p">(</span><span class="n">BooleanField</span><span class="p">):</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be either None, True or False.&quot;</span><span class="p">),</span>
<span class="s2">&quot;invalid_nullable&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value must be either None, True or False.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Boolean (Either True, False or None)&quot;</span><span class="p">)</span>
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;msg&quot;</span><span class="p">:</span> <span class="p">(</span>
<span class="s2">&quot;NullBooleanField is removed except for support in historical &quot;</span>
<span class="s2">&quot;migrations.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;hint&quot;</span><span class="p">:</span> <span class="s2">&quot;Use BooleanField(null=True, blank=True) instead.&quot;</span><span class="p">,</span>
<span class="s2">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;fields.E903&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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;null&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;null&quot;</span><span class="p">]</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">class</span><span class="w"> </span><span class="nc">PositiveIntegerRelDbTypeMixin</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__init_subclass__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init_subclass__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">&quot;integer_field_class&quot;</span><span class="p">):</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">integer_field_class</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span>
<span class="p">(</span>
<span class="n">parent</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__mro__</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">IntegerField</span><span class="p">)</span>
<span class="p">),</span>
<span class="kc">None</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">rel_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the data type that a related field pointing to this field should</span>
<span class="sd"> use. In most cases, a foreign key pointing to a positive integer</span>
<span class="sd"> primary key will have an integer column data type but some databases</span>
<span class="sd"> (e.g. MySQL) have an unsigned integer type. In that case</span>
<span class="sd"> (related_fields_match_type=True), the primary key should return its</span>
<span class="sd"> db_type.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">related_fields_match_type</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">integer_field_class</span><span class="p">()</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">PositiveBigIntegerField</span><span class="p">(</span><span class="n">PositiveIntegerRelDbTypeMixin</span><span class="p">,</span> <span class="n">BigIntegerField</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Positive big integer&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;PositiveBigIntegerField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;min_value&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">PositiveIntegerField</span><span class="p">(</span><span class="n">PositiveIntegerRelDbTypeMixin</span><span class="p">,</span> <span class="n">IntegerField</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Positive integer&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;PositiveIntegerField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;min_value&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">PositiveSmallIntegerField</span><span class="p">(</span><span class="n">PositiveIntegerRelDbTypeMixin</span><span class="p">,</span> <span class="n">SmallIntegerField</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Positive small integer&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;PositiveSmallIntegerField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;min_value&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">SlugField</span><span class="p">(</span><span class="n">CharField</span><span class="p">):</span>
<span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validators</span><span class="o">.</span><span class="n">validate_slug</span><span class="p">]</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Slug (up to </span><span class="si">%(max_length)s</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">db_index</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">allow_unicode</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allow_unicode</span> <span class="o">=</span> <span class="n">allow_unicode</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_unicode</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validators</span><span class="o">.</span><span class="n">validate_unicode_slug</span><span class="p">]</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">max_length</span><span class="o">=</span><span class="n">max_length</span><span class="p">,</span> <span class="n">db_index</span><span class="o">=</span><span class="n">db_index</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">50</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_index</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_index&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_index&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_unicode</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;allow_unicode&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_unicode</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;SlugField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">SlugField</span><span class="p">,</span>
<span class="s2">&quot;allow_unicode&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_unicode</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">TextField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Text&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">db_collation</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span> <span class="o">=</span> <span class="n">db_collation</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">databases</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;databases&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_db_collation</span><span class="p">(</span><span class="n">databases</span><span class="p">),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_db_collation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">databases</span><span class="p">):</span>
<span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">db</span> <span class="ow">in</span> <span class="n">databases</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">router</span><span class="o">.</span><span class="n">allow_migrate_model</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">connections</span><span class="p">[</span><span class="n">db</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span> <span class="ow">is</span> <span class="kc">None</span>
<span class="ow">or</span> <span class="s2">&quot;supports_collation_on_textfield&quot;</span>
<span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">required_db_features</span>
<span class="ow">or</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">supports_collation_on_textfield</span>
<span class="p">):</span>
<span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> does not support a database collation on &quot;</span>
<span class="s2">&quot;TextFields.&quot;</span> <span class="o">%</span> <span class="n">connection</span><span class="o">.</span><span class="n">display_name</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E190&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="nf">db_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="n">db_params</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">db_parameters</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="n">db_params</span><span class="p">[</span><span class="s2">&quot;collation&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span>
<span class="k">return</span> <span class="n">db_params</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;TextField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># Passing max_length to forms.CharField means that the value&#39;s length</span>
<span class="c1"># will be validated twice. This is considered acceptable since we want</span>
<span class="c1"># the value in the form field (to pass into widget for example).</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;max_length&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">,</span>
<span class="o">**</span><span class="p">({}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="p">{</span><span class="s2">&quot;widget&quot;</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="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;db_collation&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">db_collation</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">slice_expression</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expression</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">django.db.models.functions</span><span class="w"> </span><span class="kn">import</span> <span class="n">Substr</span>
<span class="k">return</span> <span class="n">Substr</span><span class="p">(</span><span class="n">expression</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">TimeField</span><span class="p">(</span><span class="n">DateTimeCheckMixin</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in &quot;</span>
<span class="s2">&quot;HH:MM[:ss[.uuuuuu]] format.&quot;</span>
<span class="p">),</span>
<span class="s2">&quot;invalid_time&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
<span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” value has the correct format &quot;</span>
<span class="s2">&quot;(HH:MM[:ss[.uuuuuu]]) but it is an invalid time.&quot;</span>
<span class="p">),</span>
<span class="p">}</span>
<span class="n">description</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">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="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">auto_now</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">auto_now_add</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span>
<span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="o">=</span> <span class="n">auto_now</span><span class="p">,</span> <span class="n">auto_now_add</span>
<span class="k">if</span> <span class="n">auto_now</span> <span class="ow">or</span> <span class="n">auto_now_add</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_fix_default_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
<span class="sd"> it&#39;s only evaluated on server startup.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="n">now</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">):</span>
<span class="n">now</span> <span class="o">=</span> <span class="n">_get_naive_now</span><span class="p">()</span>
<span class="c1"># This will not use the right date in the race condition where now</span>
<span class="c1"># is just before the date change and value is just past 0:00.</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">now</span><span class="o">.</span><span class="n">date</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="c1"># No explicit time / datetime value -- no checks necessary</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="c1"># At this point, value is a datetime object.</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_if_value_fixed</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">now</span><span class="o">=</span><span class="n">now</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;auto_now&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;auto_now_add&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;TimeField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">):</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
<span class="c1"># Not usually a good idea to pass in a datetime here (it loses</span>
<span class="c1"># information), but this can be a side-effect of interacting with a</span>
<span class="c1"># database backend (e.g. Oracle), so we&#39;ll be accommodating.</span>
<span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_time</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parsed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parsed</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid_time&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid_time&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">pre_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_now</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auto_now_add</span> <span class="ow">and</span> <span class="n">add</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">attname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">pre_save</span><span class="p">(</span><span class="n">model_instance</span><span class="p">,</span> <span class="n">add</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="c1"># Casts times into the format expected by the backend</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">adapt_timefield_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span> <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">val</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">TimeField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">URLField</span><span class="p">(</span><span class="n">CharField</span><span class="p">):</span>
<span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validators</span><span class="o">.</span><span class="n">URLValidator</span><span class="p">()]</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;URL&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">,</span> <span class="mi">200</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">verbose_name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;max_length&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># As with CharField, this will cause URL validation to be performed</span>
<span class="c1"># twice.</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">URLField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">BinaryField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Raw binary data&quot;</span><span class="p">)</span>
<span class="n">empty_values</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;editable&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">validators</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">validators</span><span class="o">.</span><span class="n">MaxLengthValidator</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_length</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_str_default_value</span><span class="p">()]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_str_default_value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">()</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;BinaryField&#39;s default cannot be a string. Use bytes &quot;</span>
<span class="s2">&quot;content instead.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E170&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">editable</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;editable&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;BinaryField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_placeholder</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">compiler</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">binary_placeholder_sql</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_default</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_default</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">default</span>
<span class="n">default</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_default</span><span class="p">()</span>
<span class="k">if</span> <span class="n">default</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
<span class="k">return</span> <span class="n">default</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_db_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">Database</span><span class="o">.</span><span class="n">Binary</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value_to_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Binary data is serialized as base64&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">b64encode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value_from_object</span><span class="p">(</span><span class="n">obj</span><span class="p">))</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1"># If it&#39;s a string, it should be base64-encoded data</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">memoryview</span><span class="p">(</span><span class="n">b64decode</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">class</span><span class="w"> </span><span class="nc">UUIDField</span><span class="p">(</span><span class="n">Field</span><span class="p">):</span>
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;invalid&quot;</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%(value)s</span><span class="s2">” is not a valid UUID.&quot;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Universally unique identifier&quot;</span><span class="p">)</span>
<span class="n">empty_strings_allowed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">32</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">verbose_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;max_length&quot;</span><span class="p">]</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;UUIDField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_prep_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">value</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">uuid</span><span class="o">.</span><span class="n">UUID</span><span class="p">):</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_python</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">connection</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">has_native_uuid_field</span><span class="p">:</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">hex</span>
<span class="k">def</span><span class="w"> </span><span class="nf">to_python</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">uuid</span><span class="o">.</span><span class="n">UUID</span><span class="p">):</span>
<span class="n">input_form</span> <span class="o">=</span> <span class="s2">&quot;int&quot;</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">else</span> <span class="s2">&quot;hex&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">uuid</span><span class="o">.</span><span class="n">UUID</span><span class="p">(</span><span class="o">**</span><span class="p">{</span><span class="n">input_form</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">AttributeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">ValidationError</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error_messages</span><span class="p">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">],</span>
<span class="n">code</span><span class="o">=</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">formfield</span><span class="p">(</span>
<span class="o">**</span><span class="p">{</span>
<span class="s2">&quot;form_class&quot;</span><span class="p">:</span> <span class="n">forms</span><span class="o">.</span><span class="n">UUIDField</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</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">AutoFieldMixin</span><span class="p">:</span>
<span class="n">db_returning</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span>
<span class="o">*</span><span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">check</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">),</span>
<span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_primary_key</span><span class="p">(),</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_primary_key</span><span class="p">(</span><span class="bp">self</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">primary_key</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">checks</span><span class="o">.</span><span class="n">Error</span><span class="p">(</span>
<span class="s2">&quot;AutoFields must set primary_key=True.&quot;</span><span class="p">,</span>
<span class="n">obj</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
<span class="nb">id</span><span class="o">=</span><span class="s2">&quot;fields.E100&quot;</span><span class="p">,</span>
<span class="p">),</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deconstruct</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">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">deconstruct</span><span class="p">()</span>
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;blank&quot;</span><span class="p">]</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;primary_key&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate</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">model_instance</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_db_prep_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">connection</span><span class="p">,</span> <span class="n">prepared</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">prepared</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_prep_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">ops</span><span class="o">.</span><span class="n">validate_autopk_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">contribute_to_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">auto_field</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Model </span><span class="si">%s</span><span class="s2"> can&#39;t have more than one auto-generated field.&quot;</span>
<span class="o">%</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label</span>
<span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">contribute_to_class</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">auto_field</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">def</span><span class="w"> </span><span class="nf">formfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AutoFieldMeta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Metaclass to maintain backward inheritance compatibility for AutoField.</span>
<span class="sd"> It is intended that AutoFieldMixin become public API when it is possible to</span>
<span class="sd"> create a non-integer automatically-generated field using column defaults</span>
<span class="sd"> stored in the database.</span>
<span class="sd"> In many areas Django also relies on using isinstance() to check for an</span>
<span class="sd"> automatically-generated field as a subclass of AutoField. A new flag needs</span>
<span class="sd"> to be implemented on Field to be used instead.</span>
<span class="sd"> When these issues have been addressed, this metaclass could be used to</span>
<span class="sd"> deprecate inheritance from AutoField and use of isinstance() with AutoField</span>
<span class="sd"> for detecting automatically-generated fields.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_subclasses</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="n">BigAutoField</span><span class="p">,</span> <span class="n">SmallAutoField</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__instancecheck__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subclasses</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__instancecheck__</span><span class="p">(</span>
<span class="n">instance</span>
<span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__subclasscheck__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subclass</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">subclass</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subclasses</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__subclasscheck__</span><span class="p">(</span>
<span class="n">subclass</span>
<span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">AutoField</span><span class="p">(</span><span class="n">AutoFieldMixin</span><span class="p">,</span> <span class="n">IntegerField</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">AutoFieldMeta</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;AutoField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">rel_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">IntegerField</span><span class="p">()</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">BigAutoField</span><span class="p">(</span><span class="n">AutoFieldMixin</span><span class="p">,</span> <span class="n">BigIntegerField</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;BigAutoField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">rel_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">BigIntegerField</span><span class="p">()</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">SmallAutoField</span><span class="p">(</span><span class="n">AutoFieldMixin</span><span class="p">,</span> <span class="n">SmallIntegerField</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_internal_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;SmallAutoField&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">rel_db_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="k">return</span> <span class="n">SmallIntegerField</span><span class="p">()</span><span class="o">.</span><span class="n">db_type</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection</span><span class="p">)</span>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo of Evennia"/>
</a></p>
<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>
<h3>Doc Versions</h3>
<ul>
<li>
<a href="https://www.evennia.com/docs/latest/index.html">latest (main branch)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/5.x/index.html">v5.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/4.x/index.html">v4.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/3.x/index.html">v3.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/2.x/index.html">v2.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/1.x/index.html">v1.0.0 branch (outdated)</a>
</li>
<li>
<a href="https://www.evennia.com/docs/0.x/index.html">v0.9.5 branch (outdated)</a>
</li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="Related">
<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</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.db.models.fields</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>