mirror of
https://github.com/evennia/evennia.git
synced 2026-03-17 05:16:31 +01:00
3033 lines
No EOL
389 KiB
HTML
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 — 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> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">django.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">"AutoField"</span><span class="p">,</span>
|
|
<span class="s2">"BLANK_CHOICE_DASH"</span><span class="p">,</span>
|
|
<span class="s2">"BigAutoField"</span><span class="p">,</span>
|
|
<span class="s2">"BigIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"BinaryField"</span><span class="p">,</span>
|
|
<span class="s2">"BooleanField"</span><span class="p">,</span>
|
|
<span class="s2">"CharField"</span><span class="p">,</span>
|
|
<span class="s2">"CommaSeparatedIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"DateField"</span><span class="p">,</span>
|
|
<span class="s2">"DateTimeField"</span><span class="p">,</span>
|
|
<span class="s2">"DecimalField"</span><span class="p">,</span>
|
|
<span class="s2">"DurationField"</span><span class="p">,</span>
|
|
<span class="s2">"EmailField"</span><span class="p">,</span>
|
|
<span class="s2">"Empty"</span><span class="p">,</span>
|
|
<span class="s2">"Field"</span><span class="p">,</span>
|
|
<span class="s2">"FilePathField"</span><span class="p">,</span>
|
|
<span class="s2">"FloatField"</span><span class="p">,</span>
|
|
<span class="s2">"GenericIPAddressField"</span><span class="p">,</span>
|
|
<span class="s2">"IPAddressField"</span><span class="p">,</span>
|
|
<span class="s2">"IntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"NOT_PROVIDED"</span><span class="p">,</span>
|
|
<span class="s2">"NullBooleanField"</span><span class="p">,</span>
|
|
<span class="s2">"PositiveBigIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"PositiveIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"PositiveSmallIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"SlugField"</span><span class="p">,</span>
|
|
<span class="s2">"SmallAutoField"</span><span class="p">,</span>
|
|
<span class="s2">"SmallIntegerField"</span><span class="p">,</span>
|
|
<span class="s2">"TextField"</span><span class="p">,</span>
|
|
<span class="s2">"TimeField"</span><span class="p">,</span>
|
|
<span class="s2">"URLField"</span><span class="p">,</span>
|
|
<span class="s2">"UUIDField"</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 "blank" in SelectFields. Will be appended to the start</span>
|
|
<span class="c1"># of most "choices" lists.</span>
|
|
<span class="n">BLANK_CHOICE_DASH</span> <span class="o">=</span> <span class="p">[(</span><span class="s2">""</span><span class="p">,</span> <span class="s2">"---------"</span><span class="p">)]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_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"># "name", except in the case of ForeignKeys, where "_id" 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"># "attname", 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 "obj":</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">"""Base class for all field types"""</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">"invalid_choice"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Value </span><span class="si">%(value)r</span><span class="s2"> is not a valid choice."</span><span class="p">),</span>
|
|
<span class="s2">"null"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"This field cannot be null."</span><span class="p">),</span>
|
|
<span class="s2">"blank"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"This field cannot be blank."</span><span class="p">),</span>
|
|
<span class="s2">"unique"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"</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."</span><span class="p">),</span>
|
|
<span class="s2">"unique_for_date"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="c1"># Translators: The 'lookup_type' is one of 'date', 'year' or</span>
|
|
<span class="c1"># 'month'. Eg: "Title must be unique for pub_date year"</span>
|
|
<span class="s2">"</span><span class="si">%(field_label)s</span><span class="s2"> must be unique for "</span>
|
|
<span class="s2">"</span><span class="si">%(date_field_label)s</span><span class="s2"> </span><span class="si">%(lookup_type)s</span><span class="s2">."</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'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">"blank"</span><span class="p">,</span>
|
|
<span class="s2">"choices"</span><span class="p">,</span>
|
|
<span class="s2">"db_column"</span><span class="p">,</span>
|
|
<span class="s2">"editable"</span><span class="p">,</span>
|
|
<span class="s2">"error_messages"</span><span class="p">,</span>
|
|
<span class="s2">"help_text"</span><span class="p">,</span>
|
|
<span class="s2">"limit_choices_to"</span><span class="p">,</span>
|
|
<span class="c1"># Database-level options are not supported, see #21961.</span>
|
|
<span class="s2">"on_delete"</span><span class="p">,</span>
|
|
<span class="s2">"related_name"</span><span class="p">,</span>
|
|
<span class="s2">"related_query_name"</span><span class="p">,</span>
|
|
<span class="s2">"validators"</span><span class="p">,</span>
|
|
<span class="s2">"verbose_name"</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">"Field of type: </span><span class="si">%(field_type)s</span><span class="s2">"</span><span class="p">)</span> <span class="o">%</span> <span class="p">{</span>
|
|
<span class="s2">"field_type"</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">""</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">"""</span>
|
|
<span class="sd"> Return "app_label.model_label.field_name" for fields attached to</span>
|
|
<span class="sd"> models.</span>
|
|
<span class="sd"> """</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">"model"</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">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">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">"""Display the module, class, and name of the field."""</span>
|
|
<span class="n">path</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="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">"name"</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">"<</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="s2">"<</span><span class="si">%s</span><span class="s2">>"</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">"""</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 "__" and 3) is not "pk".</span>
|
|
<span class="sd"> """</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">"_"</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">"Field names must not end with an underscore."</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">"fields.E001"</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">'Field names must not contain "</span><span class="si">%s</span><span class="s1">".'</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">"fields.E002"</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">"pk"</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">"'pk' is a reserved word that cannot be used as a field 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">"fields.E003"</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">"'choices' must be a mapping (e.g. a dictionary) or an iterable "</span>
|
|
<span class="s2">"(e.g. a list or tuple)."</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">"fields.E004"</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=['ab']</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">></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">"'max_length' is too small to fit the longest value "</span>
|
|
<span class="s2">"in 'choices' (</span><span class="si">%d</span><span class="s2"> characters)."</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">"fields.E009"</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">"'choices' must be a mapping of actual values to human readable names "</span>
|
|
<span class="s2">"or an iterable containing (actual value, human readable name) tuples."</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">"fields.E005"</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">"resolve_expression"</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">"allowed_default"</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">"</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."</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">"fields.E012"</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">"supports_expression_defaults"</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">"</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 "</span>
|
|
<span class="s2">"values with expressions (db_default)."</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">"fields.E011"</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">"'db_index' must be None, True or False."</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">"fields.E006"</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">"supports_comments"</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">"</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 "</span>
|
|
<span class="sa">f</span><span class="s2">"columns (db_comment)."</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">"fields.W163"</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 '' 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">"Primary keys must not have null=True."</span><span class="p">,</span>
|
|
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
|
|
<span class="s2">"Set null=False on the field, or "</span>
|
|
<span class="s2">"remove primary_key=True argument."</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">"fields.E007"</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">"All 'validators' must be callable."</span><span class="p">,</span>
|
|
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
|
|
<span class="s2">"validators[</span><span class="si">{i}</span><span class="s2">] (</span><span class="si">{repr}</span><span class="s2">) isn't a function or "</span>
|
|
<span class="s2">"instance of a validator class."</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">"fields.E008"</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">"msg"</span><span class="p">,</span>
|
|
<span class="s2">"</span><span class="si">%s</span><span class="s2"> has been removed except for support in historical "</span>
|
|
<span class="s2">"migrations."</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">"hint"</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">"id"</span><span class="p">,</span> <span class="s2">"fields.EXXX"</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">"msg"</span><span class="p">,</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> has been deprecated."</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">"hint"</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">"id"</span><span class="p">,</span> <span class="s2">"fields.WXXX"</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">"""</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't be</span>
|
|
<span class="sd"> used by Django.</span>
|
|
<span class="sd"> """</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">"""</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'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"> """</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">"verbose_name"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"primary_key"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"max_length"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"unique"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"blank"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"null"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"db_index"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"default"</span><span class="p">:</span> <span class="n">NOT_PROVIDED</span><span class="p">,</span>
|
|
<span class="s2">"db_default"</span><span class="p">:</span> <span class="n">NOT_PROVIDED</span><span class="p">,</span>
|
|
<span class="s2">"editable"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
|
<span class="s2">"serialize"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
|
|
<span class="s2">"unique_for_date"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"unique_for_month"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"unique_for_year"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"choices"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"help_text"</span><span class="p">:</span> <span class="s2">""</span><span class="p">,</span>
|
|
<span class="s2">"db_column"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"db_comment"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"db_tablespace"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
<span class="s2">"auto_created"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
<span class="s2">"validators"</span><span class="p">:</span> <span class="p">[],</span>
|
|
<span class="s2">"error_messages"</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">"unique"</span><span class="p">:</span> <span class="s2">"_unique"</span><span class="p">,</span>
|
|
<span class="s2">"error_messages"</span><span class="p">:</span> <span class="s2">"_error_messages"</span><span class="p">,</span>
|
|
<span class="s2">"validators"</span><span class="p">:</span> <span class="s2">"_validators"</span><span class="p">,</span>
|
|
<span class="s2">"verbose_name"</span><span class="p">:</span> <span class="s2">"_verbose_name"</span><span class="p">,</span>
|
|
<span class="s2">"db_tablespace"</span><span class="p">:</span> <span class="s2">"_db_tablespace"</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">"choices"</span><span class="p">,</span> <span class="s2">"validators"</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">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="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">"django.db.models.fields.related"</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">"django.db.models.fields.related"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields.files"</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">"django.db.models.fields.files"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields.generated"</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">"django.db.models.fields.generated"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields.json"</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">"django.db.models.fields.json"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields.proxy"</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">"django.db.models.fields.proxy"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields.composite"</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">"django.db.models.fields.composite"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"django.db.models.fields"</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">"django.db.models.fields"</span><span class="p">,</span> <span class="s2">"django.db.models"</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">"""</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"> """</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">"model"</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">"model"</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">"model"</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">"model"</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"><</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">"model"</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">"model"</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">"model"</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'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"><</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'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">"field"</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">"""</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"> """</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">"model"</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'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">"_get_default"</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">"""</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"> """</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">"""</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't be converted.</span>
|
|
<span class="sd"> Return the converted value. Subclasses should override this.</span>
|
|
<span class="sd"> """</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">"default_error_messages"</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">"""</span>
|
|
<span class="sd"> Some validators can'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"> """</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">"code"</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">"""</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"> """</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">"invalid_choice"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_choice"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"null"</span><span class="p">],</span> <span class="n">code</span><span class="o">=</span><span class="s2">"null"</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">"blank"</span><span class="p">],</span> <span class="n">code</span><span class="o">=</span><span class="s2">"blank"</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">"""</span>
|
|
<span class="sd"> Convert the value'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"> """</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">"qn_"</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">"""</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"> """</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">"""</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"> """</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"># "internal type".</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'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's get_internal_type() returns 'TextField'.</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'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">"""</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"> """</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">"""Return the data type to use in the Cast() function."""</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">"""</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"> """</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">"type"</span><span class="p">:</span> <span class="n">type_string</span><span class="p">,</span>
|
|
<span class="s2">"check"</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">"from_db_value"</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">"""Private API intended only to be used by Django itself."""</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">"_"</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">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">"""</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"> """</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't override a get_FOO_display() method defined explicitly on</span>
|
|
<span class="c1"># this class, but don'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">"get_</span><span class="si">%s</span><span class="s2">_display"</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">"get_</span><span class="si">%s</span><span class="s2">_display"</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">"""</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"> """</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">"""Return field's value just before saving."""</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">"""Perform preliminary non-db specific value checks and conversions."""</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">"""</span>
|
|
<span class="sd"> Return field'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"> """</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">"""Return field's value prepared for saving into a database."""</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">"as_sql"</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">"""Return a boolean of whether this field has a default value."""</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">"""Return a boolean of whether this field has a db_default value."""</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">"""Return the default value for this field."""</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">"resolve_expression"</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">"""</span>
|
|
<span class="sd"> Return choices with a default blank choices included, for use</span>
|
|
<span class="sd"> as <select> choices for this field.</span>
|
|
<span class="sd"> """</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">"get_related_field"</span><span class="p">)</span>
|
|
<span class="k">else</span> <span class="s2">"pk"</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">"""</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"> """</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">"""Flattened version of choices tuple."""</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">"""Return a django.forms.Field instance for this field."""</span>
|
|
<span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"required"</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">"label"</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">"help_text"</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">"initial"</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">"show_hidden_initial"</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">"initial"</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">"initial"</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">"choices"</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">"coerce"</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">"empty_value"</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'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">"coerce"</span><span class="p">,</span>
|
|
<span class="s2">"empty_value"</span><span class="p">,</span>
|
|
<span class="s2">"choices"</span><span class="p">,</span>
|
|
<span class="s2">"required"</span><span class="p">,</span>
|
|
<span class="s2">"widget"</span><span class="p">,</span>
|
|
<span class="s2">"label"</span><span class="p">,</span>
|
|
<span class="s2">"initial"</span><span class="p">,</span>
|
|
<span class="s2">"help_text"</span><span class="p">,</span>
|
|
<span class="s2">"error_messages"</span><span class="p">,</span>
|
|
<span class="s2">"show_hidden_initial"</span><span class="p">,</span>
|
|
<span class="s2">"disabled"</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">"""Return the value of this field in the given model instance."""</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">"""Return a slice of this field."""</span>
|
|
<span class="k">raise</span> <span class="n">NotSupportedError</span><span class="p">(</span><span class="s2">"This field does not support slicing."</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be either True or False."</span><span class="p">),</span>
|
|
<span class="s2">"invalid_nullable"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be either True, False, or None."</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">"Boolean (Either True or False)"</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">"BooleanField"</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">"t"</span><span class="p">,</span> <span class="s2">"True"</span><span class="p">,</span> <span class="s2">"1"</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">"f"</span><span class="p">,</span> <span class="s2">"False"</span><span class="p">,</span> <span class="s2">"0"</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">"invalid_nullable"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"initial"</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">"choices"</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, 'required' means "must be checked" which is</span>
|
|
<span class="c1"># different from the choices case ("must select some value").</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">"form_class"</span><span class="p">:</span> <span class="n">form_class</span><span class="p">,</span> <span class="s2">"required"</span><span class="p">:</span> <span class="kc">False</span><span class="p">}</span>
|
|
<span class="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">"String (up to </span><span class="si">%(max_length)s</span><span class="s2">)"</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">"String (unlimited)"</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">"databases"</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">"supports_unlimited_charfield"</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">"CharFields must define a 'max_length' attribute."</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">"fields.E120"</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"><=</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">"'max_length' must be a positive integer."</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">"fields.E121"</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">"supports_collation_on_charfield"</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">"</span><span class="si">%s</span><span class="s2"> does not support a database collation on "</span>
|
|
<span class="s2">"CharFields."</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">"fields.E190"</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">"collation"</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">"CharField"</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'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">"max_length"</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">"empty_value"</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">"db_collation"</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">"Comma-separated integers"</span><span class="p">)</span>
|
|
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"msg"</span><span class="p">:</span> <span class="p">(</span>
|
|
<span class="s2">"CommaSeparatedIntegerField is removed except for support in "</span>
|
|
<span class="s2">"historical migrations."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"hint"</span><span class="p">:</span> <span class="p">(</span>
|
|
<span class="s2">"Use CharField(validators=[validate_comma_separated_integer_list]) "</span>
|
|
<span class="s2">"instead."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"id"</span><span class="p">:</span> <span class="s2">"fields.E901"</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">></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">"The options auto_now, auto_now_add, and default "</span>
|
|
<span class="s2">"are mutually exclusive. Only one of these options "</span>
|
|
<span class="s2">"may be present."</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">"fields.E160"</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">"""</span>
|
|
<span class="sd"> Check if the given value appears to have been provided as a "fixed"</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"> """</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"><=</span> <span class="n">value</span> <span class="o"><=</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">"Fixed default value provided."</span><span class="p">,</span>
|
|
<span class="n">hint</span><span class="o">=</span><span class="p">(</span>
|
|
<span class="s2">"It seems you set a fixed date / time / datetime "</span>
|
|
<span class="s2">"value as default for this field. This may not be "</span>
|
|
<span class="s2">"what you want. If you want to have the current date "</span>
|
|
<span class="s2">"as default, use `django.utils.timezone.now`"</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">"fields.W161"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has an invalid date format. It must be "</span>
|
|
<span class="s2">"in YYYY-MM-DD format."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"invalid_date"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has the correct format (YYYY-MM-DD) "</span>
|
|
<span class="s2">"but it is an invalid date."</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">"Date (without time)"</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">"editable"</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">"blank"</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">"""</span>
|
|
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
|
|
<span class="sd"> it's only evaluated on server startup.</span>
|
|
<span class="sd"> """</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">"auto_now"</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">"auto_now_add"</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">"editable"</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"blank"</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">"DateField"</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">"invalid_date"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_date"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"get_next_by_</span><span class="si">%s</span><span class="s2">"</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">"get_previous_by_</span><span class="si">%s</span><span class="s2">"</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">""</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">"form_class"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in "</span>
|
|
<span class="s2">"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"invalid_date"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has the correct format "</span>
|
|
<span class="s2">"(YYYY-MM-DD) but it is an invalid date."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"invalid_datetime"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has the correct format "</span>
|
|
<span class="s2">"(YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) "</span>
|
|
<span class="s2">"but it is an invalid date/time."</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">"Date (with time)"</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">"""</span>
|
|
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
|
|
<span class="sd"> it's only evaluated on server startup.</span>
|
|
<span class="sd"> """</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">"DateTimeField"</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't work during DST change, but we can'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">"</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">"</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">"(unbound)"</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">"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 "</span>
|
|
<span class="s2">"time zone support is active."</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">"invalid_datetime"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_datetime"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"invalid_date"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_date"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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't work during DST change, but we can'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">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="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">"(unbound)"</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
<span class="s2">"DateTimeField </span><span class="si">%s</span><span class="s2"> received a naive datetime (</span><span class="si">%s</span><span class="s2">)"</span>
|
|
<span class="s2">" while time zone support is active."</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">""</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">"form_class"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be a decimal number."</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">"Decimal number"</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"><</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">"DecimalFields must define a 'decimal_places' attribute."</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">"fields.E130"</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">"'decimal_places' must be a non-negative integer."</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">"fields.E131"</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"><=</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">"DecimalFields must define a 'max_digits' attribute."</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">"fields.E132"</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">"'max_digits' must be a positive integer."</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">"fields.E133"</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">></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">"'max_digits' must be greater or equal to 'decimal_places'."</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">"fields.E134"</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">"max_digits"</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">"decimal_places"</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">"DecimalField"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"max_digits"</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">"decimal_places"</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">"form_class"</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">"""</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"> """</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in "</span>
|
|
<span class="s2">"[DD] [[HH:]MM:]ss[.uuuuuu] format."</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">"Duration"</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">"DurationField"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">""</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">"form_class"</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">"Email address"</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">"max_length"</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">"form_class"</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">"File path"</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">""</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">"max_length"</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">"FilePathFields must have either 'allow_files' or 'allow_folders' "</span>
|
|
<span class="s2">"set to True."</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">"fields.E140"</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">""</span><span class="p">:</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"path"</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">"match"</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">"recursive"</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">"allow_files"</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">"allow_folders"</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">"max_length"</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">"max_length"</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">"path"</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">"match"</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">"recursive"</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">"form_class"</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">"allow_files"</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">"allow_folders"</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">"FilePathField"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be a float."</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">"Floating point number"</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">"Field '</span><span class="si">%s</span><span class="s2">' expected a number but got </span><span class="si">%r</span><span class="s2">."</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">"FloatField"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"form_class"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be an integer."</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">"Integer"</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">"'max_length' is ignored when used with </span><span class="si">%s</span><span class="s2">."</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">"Remove 'max_length' from field"</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">"fields.W122"</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't be added at field initialization time since</span>
|
|
<span class="c1"># they'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">>=</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"><=</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">"Field '</span><span class="si">%s</span><span class="s2">' expected a number but got </span><span class="si">%r</span><span class="s2">."</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">"IntegerField"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"form_class"</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">"Big (8 byte) integer"</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">"BigIntegerField"</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">"min_value"</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">"max_value"</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">"Small integer"</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">"SmallIntegerField"</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">"IPv4 address"</span><span class="p">)</span>
|
|
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"msg"</span><span class="p">:</span> <span class="p">(</span>
|
|
<span class="s2">"IPAddressField has been removed except for support in "</span>
|
|
<span class="s2">"historical migrations."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"hint"</span><span class="p">:</span> <span class="s2">"Use GenericIPAddressField instead."</span><span class="p">,</span>
|
|
<span class="s2">"id"</span><span class="p">:</span> <span class="s2">"fields.E900"</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">"max_length"</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">"max_length"</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">"IPAddressField"</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">"IP address"</span><span class="p">)</span>
|
|
<span class="n">default_error_messages</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"Enter a valid </span><span class="si">%(protocol)s</span><span class="s2"> address."</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">"both"</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">"max_length"</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">"null"</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">"blank"</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">"GenericIPAddressFields cannot have blank=True if null=False, "</span>
|
|
<span class="s2">"as blank values are stored as nulls."</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">"fields.E150"</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">"unpack_ipv4"</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">"both"</span><span class="p">:</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"protocol"</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">"max_length"</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">"max_length"</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">"GenericIPAddressField"</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">":"</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">"invalid"</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">":"</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">"protocol"</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">"form_class"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be either None, True or False."</span><span class="p">),</span>
|
|
<span class="s2">"invalid_nullable"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value must be either None, True or False."</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">"Boolean (Either True, False or None)"</span><span class="p">)</span>
|
|
<span class="n">system_check_removed_details</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"msg"</span><span class="p">:</span> <span class="p">(</span>
|
|
<span class="s2">"NullBooleanField is removed except for support in historical "</span>
|
|
<span class="s2">"migrations."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"hint"</span><span class="p">:</span> <span class="s2">"Use BooleanField(null=True, blank=True) instead."</span><span class="p">,</span>
|
|
<span class="s2">"id"</span><span class="p">:</span> <span class="s2">"fields.E903"</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">"null"</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">"blank"</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">"null"</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"blank"</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">"integer_field_class"</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">"""</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"> """</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">"Positive big integer"</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">"PositiveBigIntegerField"</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">"min_value"</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">"Positive integer"</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">"PositiveIntegerField"</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">"min_value"</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">"Positive small integer"</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">"PositiveSmallIntegerField"</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">"min_value"</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">"Slug (up to </span><span class="si">%(max_length)s</span><span class="s2">)"</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">"max_length"</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">"max_length"</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">"db_index"</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">"db_index"</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">"allow_unicode"</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">"SlugField"</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">"form_class"</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">"allow_unicode"</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">"Text"</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">"databases"</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">"supports_collation_on_textfield"</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">"</span><span class="si">%s</span><span class="s2"> does not support a database collation on "</span>
|
|
<span class="s2">"TextFields."</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">"fields.E190"</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">"collation"</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">"TextField"</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'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">"max_length"</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">"widget"</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">"db_collation"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has an invalid format. It must be in "</span>
|
|
<span class="s2">"HH:MM[:ss[.uuuuuu]] format."</span>
|
|
<span class="p">),</span>
|
|
<span class="s2">"invalid_time"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span>
|
|
<span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” value has the correct format "</span>
|
|
<span class="s2">"(HH:MM[:ss[.uuuuuu]]) but it is an invalid time."</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">"Time"</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">"editable"</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">"blank"</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">"""</span>
|
|
<span class="sd"> Warn that using an actual date or datetime value is probably wrong;</span>
|
|
<span class="sd"> it's only evaluated on server startup.</span>
|
|
<span class="sd"> """</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">"auto_now"</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">"auto_now_add"</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">"blank"</span><span class="p">]</span>
|
|
<span class="k">del</span> <span class="n">kwargs</span><span class="p">[</span><span class="s2">"editable"</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">"TimeField"</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'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">"invalid_time"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid_time"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">""</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">"form_class"</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">"URL"</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">"max_length"</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">"max_length"</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">"max_length"</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">"form_class"</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">"Raw binary data"</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">""</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">"editable"</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">"BinaryField's default cannot be a string. Use bytes "</span>
|
|
<span class="s2">"content instead."</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">"fields.E170"</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">"editable"</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">"editable"</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">"BinaryField"</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">""</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="sa">b</span><span class="s2">""</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">"""Binary data is serialized as base64"""</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">"ascii"</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'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">"ascii"</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">"invalid"</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s2">"“</span><span class="si">%(value)s</span><span class="s2">” is not a valid UUID."</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">"Universally unique identifier"</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">"max_length"</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">"max_length"</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">"UUIDField"</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">"int"</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">"hex"</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">"invalid"</span><span class="p">],</span>
|
|
<span class="n">code</span><span class="o">=</span><span class="s2">"invalid"</span><span class="p">,</span>
|
|
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="n">value</span><span class="p">},</span>
|
|
<span class="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">"form_class"</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">"blank"</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">"AutoFields must set primary_key=True."</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">"fields.E100"</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">"blank"</span><span class="p">]</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"primary_key"</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">"Model </span><span class="si">%s</span><span class="s2"> can't have more than one auto-generated field."</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">"""</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"> """</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">"AutoField"</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">"BigAutoField"</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">"SmallAutoField"</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> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">django.db.models.fields</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2024, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
|
</div>
|
|
</body>
|
|
</html> |