U
    gh                     @   s  d dl Zd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZmZmZ d d	lmZ d d
lmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z8 ddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3g Z9G d4d! d!Z:G d5d( d(Z;d6gZ<d7d8 Z=d9d: Z>d;d< Z?eG d=d" d"e Z@G d>d de@ZAG d?d de@ZBG d@d deBZCG dAdB dBZDG dCd deDe@ZEG dDd deEZFG dEd de@ZGG dFd de@ZHG dGd  d eBZIG dHd# d#e@ZJG dId$ d$e@ZKG dJd' d'e@ZLG dKd deLZMG dLd/ d/eLZNG dMd& d&e@ZOG dNd% d%e@ZPG dOd) d)eAZQG dPdQ dQZRG dRd* d*eReMZSG dSd+ d+eReLZTG dTd, d,eReNZUG dUd- d-eBZVG dVd0 d0e@ZWG dWd1 d1eDe@ZXG dXd2 d2eBZYG dYd de@ZZG dZd3 d3e@Z[G d[d\ d\Z\G d]d^ d^e]Z^G d_d de\eLe^d`Z_G dad de\eMZ`G dbd. d.e\eNZadS )c    N)	b64decode	b64encode)partialmethodtotal_ordering)forms)apps)settings)checks
exceptions
validators)
connectionconnectionsrouter)
LOOKUP_SEP)DeferredAttributeRegisterLookupMixin)timezone)DictWrapper)
parse_dateparse_datetimeparse_duration
parse_time)duration_microsecondsduration_string)Promisecached_property)clean_ipv6_address)is_iterable)capfirst)gettext_lazy	AutoFieldBLANK_CHOICE_DASHBigAutoFieldBigIntegerFieldBinaryFieldBooleanField	CharFieldCommaSeparatedIntegerField	DateFieldDateTimeFieldDecimalFieldDurationField
EmailFieldEmptyFieldFilePathField
FloatFieldGenericIPAddressFieldIPAddressFieldIntegerFieldNOT_PROVIDEDNullBooleanFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeFieldURLField	UUIDFieldc                   @   s   e Zd ZdS )r-   N__name__
__module____qualname__ rD   rD   D/tmp/pip-unpacked-wheel-ye1bytdm/django/db/models/fields/__init__.pyr-   *   s   c                   @   s   e Zd ZdS )r4   Nr@   rD   rD   rD   rE   r4   .   s   ) z	---------c                 C   s   t | |j|S N)r   Z	get_model_meta	get_field)	app_label
model_name
field_namerD   rD   rE   _load_field7   s    rM   c                 C   s   t  }| |_|S rG   )r-   	__class__)Zof_clsnewrD   rD   rE   _emptyJ   s    rP   c                   C   s   d S rG   rD   rD   rD   rD   rE   return_NoneP   s    rQ   c                       s  e Zd ZdZdZeejZdZ	dZ
g Zededededed	d
ZdZdZdZdZdZdZdZdZeZdd ZeeZdddddddddeddddddddddddfddZ fddZdd Zdd Zdd Z e!dd Z"dd Z#dd  Z$d!d" Z%dd#d$Z&d%d& Z'd'd( Z(dd)d*Z)e*d+d, Z+d-d. Z,d/d0 Z-d1d2 Z.d3d4 Z/d5d6 Z0d7d8 Z1d9d: Z2d;d< Z3d=d> Z4d?d@ Z5dAdB Z6e*dCdD ZdEdF Z7dGdH Z8dIdJ Z9dKdL Z:dMdN Z;dOdP Z<dQdR Z=dSdT Z>dUdV Z?dWdX Z@dYdZ ZAed[d\ ZBed]d^ ZCed_d` ZDdadb ZEddcddZFdedf ZGdgdh ZHdidj ZIdkdl ZJdmdn ZKdodp ZLddqdrZMdsdt ZNdudv ZOdwdx ZPe*dydz ZQdeRddfd{d|ZSd}d~ ZTdd ZUeeUZVdd ZWdddZXdd ZY  ZZS )r.   zBase class for all field typesTr   z&Value %(value)r is not a valid choice.zThis field cannot be null.zThis field cannot be blank.z8%(model_name)s with this %(field_label)s already exists.zH%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s.)invalid_choicenullblankuniqueunique_for_dateNFc                 C   s   t dd| jji S )NzField of type: %(field_type)sZ
field_type)_rN   rA   selfrD   rD   rE   _description}   s     zField._descriptionrF   rD   c                 C   s(  || _ || _|| _|| _|| | _| _|| | _| _|	| _| jd k	| _	|
| _
|| _|| _|| _|| _|| _t|tjjrt|}|| _|| _|| _|| _|| _|| _|rtj| _t jd8  _ntj| _t jd7  _t|| _i }t| j j!D ]}|"t#|di  q|"|pi  || _$|| _%d S )N   default_error_messages)&nameverbose_name_verbose_nameprimary_key
max_length_uniquerU   rT   remote_fieldZis_relationdefaulteditable	serializerW   unique_for_monthunique_for_year
isinstancecollectionsabcIteratorlistchoices	help_textdb_index	db_column_db_tablespaceauto_createdr.   auto_creation_countercreation_counter_validatorsreversedrN   __mro__updategetattr_error_messageserror_messages)rZ   r_   r^   ra   rb   rV   rU   rT   rq   relre   rf   rg   rW   rh   ri   ro   rp   rr   db_tablespacert   r   r}   messagescrD   rD   rE   __init__   sD    
zField.__init__c                    s,   t | dst  S | j}d|jj| jf S )zb
        Return "app_label.model_label.field_name" for fields attached to
        models.
        model%s.%s)hasattrsuper__str__r   rH   labelr^   )rZ   r   rN   rD   rE   r      s    

zField.__str__c                 C   s<   d| j j| j jf }t| dd}|dk	r4d||f S d| S )z1Display the module, class, and name of the field.r   r^   Nz<%s: %s>z<%s>)rN   rB   rC   r{   )rZ   pathr^   rD   rD   rE   __repr__   s
    zField.__repr__c                 K   s2   |   |  |  |  | jf ||  |  S rG   )_check_field_name_check_choices_check_db_index$_check_null_allowed_for_primary_keys_check_backend_specific_checks_check_validators_check_deprecation_detailsrZ   kwargsrD   rD   rE   check   s    
zField.checkc                 C   sb   | j drtjd| ddgS t| j kr>tjdt | ddgS | j dkrZtjd| d	dgS g S d
S )z
        Check if field name is valid, i.e. 1) does not end with an
        underscore, 2) does not contain "__" and 3) is not "pk".
        rX   z,Field names must not end with an underscore.zfields.E001objidz"Field names must not contain "%s".zfields.E002pkz<'pk' is a reserved word that cannot be used as a field name.zfields.E003N)r^   endswithr	   Errorr   rY   rD   rD   rE   r      s,    

zField._check_field_namec                 C   s   t |ttfpt| S rG   )rj   strr   r   )clsvaluerD   rD   rE   _choices_is_value   s    zField._choices_is_valuec              
      st   j s
g S t j r t j tr2tjd ddgS d} j D ]}z|\}}W n  ttfk
rl   Y  qbY nX zHt fdd|D sW  qb j	d k	r|rt
|fdd |D }W nf ttfk
r   || }} |r |sY  qb j	d k	rt|trt
|t|}Y nX t|tr< qbq< j	d k	r^| j	kr^tjd|  d	dgS g S tjd
 ddgS )Nz6'choices' must be an iterable (e.g., a list or tuple).zfields.E004r   r   c                 3   s&   | ]\}}  |o  |V  qd S rG   )r   ).0r   
human_namerY   rD   rE   	<genexpr>	  s   z'Field._check_choices.<locals>.<genexpr>c                 s   s$   | ]\}}t |trt|V  qd S rG   )rj   r   len)r   r   rX   rD   rD   rE   r     s     
 zP'max_length' is too small to fit the longest value in 'choices' (%d characters).zfields.E009zT'choices' must be an iterable containing (actual value, human readable name) tuples.zfields.E005)ro   r   rj   r   r	   r   	TypeError
ValueErrorallrb   maxr   r   )rZ   Zchoice_max_lengthZchoices_groupZ
group_nameZgroup_choicesr   r   rD   rY   rE   r      sd    



zField._check_choicesc                 C   s$   | j dkrtjd| ddgS g S d S )N)NTFz''db_index' must be None, True or False.zfields.E006r   )rq   r	   r   rY   rD   rD   rE   r   3  s    
zField._check_db_indexc                 C   s0   | j r(| jr(tjjs(tjdd| ddgS g S d S )Nz%Primary keys must not have null=True.zASet null=False on the field, or remove primary_key=True argument.zfields.E007hintr   r   )ra   rT   r   features!interprets_empty_strings_as_nullsr	   r   rY   rD   rD   rE   r   ?  s    
z*Field._check_null_allowed_for_primary_keysc                 K   sX   |d krg S | j jj}g }|D ]4}tj||| j jjdr|t| jj	| f| q|S )N)rK   )
r   rH   rJ   r   Zallow_migraterK   extendr   Z
validationZcheck_field)rZ   	databasesr   rJ   errorsaliasrD   rD   rE   r   Q  s    
z$Field._check_backend_specific_checksc              	   C   sJ   g }t | jD ]6\}}t|s|tjddj|t|d| dd q|S )Nz"All 'validators' must be callable.zKvalidators[{i}] ({repr}) isn't a function or instance of a validator class.)ireprzfields.E008r   )	enumerater   callableappendr	   r   formatr   )rZ   r   r   	validatorrD   rD   rE   r   [  s     zField._check_validatorsc                 C   s   | j d k	rBtj| j dd| jj | j d| | j dddgS | jd k	rtj| jdd| jj | jd| | jdddgS g S )	Nmsgz@%s has been removed except for support in historical migrations.r   r   zfields.EXXXr   z%s has been deprecated.zfields.WXXX)system_check_removed_detailsr	   r   getrN   rA   system_check_deprecated_detailsWarningrY   rD   rD   rE   r   n  s2    




z Field._check_deprecation_detailsc                 C   sD   |d kr| }|| j jjks"|| kr:ddlm} ||| |S | jS d S Nr   )Col)r   rH   db_tabledjango.db.models.expressionsr   
cached_col)rZ   r   Zoutput_fieldr   rD   rD   rE   get_col  s    zField.get_colc                 C   s   ddl m} || jjj| S r   )r   r   r   rH   r   )rZ   r   rD   rD   rE   r     s    zField.cached_colc                 C   s   ||fS )z
        Custom format for select clauses. For example, GIS columns need to be
        selected as AsText(table.col) on MySQL as the table.col data can't be
        used by Django.
        rD   )rZ   compilerZsqlparamsrD   rD   rE   select_format  s    zField.select_formatc           	      C   sT  i }dddddddt ddddddddddg dd}dddd	d
d}ddh}| D ]b\}}t| |||}|dkrt|tjjrt|}||kr||kr|||< qR||k	rR|||< qRd| j	j
| j	jf }|dr|dd}nd|dr|dd}nL|dr|dd}n2|dr.|dd}n|drF|dd}| j|g |fS )az  
        Return enough information to recreate the field as a 4-tuple:

         * The name of the field on the model, if contribute_to_class() has
           been run.
         * The import path of the field, including the class:e.g.
           django.db.models.IntegerField This should be the most portable
           version, so less specific may be better.
         * A list of positional arguments.
         * A dict of keyword arguments.

        Note that the positional or keyword arguments must contain values of
        the following types (including inner values of collection types):

         * None, bool, str, int, float, complex, set, frozenset, list, tuple,
           dict
         * UUID
         * datetime.datetime (naive), datetime.date
         * top-level classes, top-level functions - will be referenced by their
           full import path
         * Storage instances - these have their own deconstruct() method

        This is because the values here must be serialized into a text format
        (possibly new Python code, possibly JSON) and these are the only types
        with encoding handlers defined.

        There's no need to return the exact way the field was instantiated this
        time, just ensure that the resulting field is the same - prefer keyword
        arguments over positional ones, and omit parameters with their default
        values.
        NFTrF   )r_   ra   rb   rV   rU   rT   rq   re   rf   rg   rW   rh   ri   ro   rp   rr   r   rt   r   r}   rc   r|   rw   r`   rs   )rV   r}   r   r_   r   ro   r   r   zdjango.db.models.fields.relatedzdjango.db.modelszdjango.db.models.fields.fileszdjango.db.models.fields.jsonzdjango.db.models.fields.proxyzdjango.db.models.fields)r4   itemsr{   r   rj   rk   rl   Iterablern   rN   rB   rC   
startswithreplacer^   )	rZ   keywordsZ	possiblesZattr_overridesZequals_comparisonr^   re   r   r   rD   rD   rE   deconstruct  sd    !



zField.deconstructc                 C   s   |   \}}}}| j||S )z
        Uses deconstruct() to clone a new copy of this Field.
        Will not preserve any class attachments/attribute names.
        )r   rN   rZ   r^   r   argsr   rD   rD   rE   clone  s    zField.clonec                 C   s2   t |tr.| j|jko,t| dd t|dd kS tS Nr   )rj   r.   rv   r{   NotImplementedrZ   otherrD   rD   rE   __eq__  s
    
zField.__eq__c                 C   s   t |tr~| j|jks*t| ds6t|ds6| j|jk S t| dt|dkrVt| d S | jjj| jjjf|jjj|jjjfk S tS r   )	rj   r.   rv   r   r   rH   rJ   rK   r   r   rD   rD   rE   __lt__  s    

zField.__lt__c                 C   s8   t | jt| dr| jjjnd t| dr0| jjjnd fS r   )hashrv   r   r   rH   rJ   rK   rY   rD   rD   rE   __hash__  s
    zField.__hash__c                 C   sN   t  | }| jr>t  | j|_t| jdr>| jj| kr>||j_||t| < |S )Nfield)copyrd   r   r   r   )rZ   Zmemodictr   rD   rD   rE   __deepcopy__&  s    
zField.__deepcopy__c                 C   s   t  }| j|_| j |_|S rG   )r-   rN   __dict__r   rZ   r   rD   rD   rE   __copy__1  s    zField.__copy__c                 C   sJ   t | ds.| j }|dd t| jf|fS t| jjj	| jjj
| jffS )z
        Pickling should return the model._meta.fields instance of the field,
        not a new copy of that field. So, use the app registry to load the
        model and then the field back.
        r   _get_defaultN)r   r   r   poprP   rN   rM   r   rH   rJ   Zobject_namer^   )rZ   staterD   rD   rE   
__reduce__9  s    

zField.__reduce__c                 C   s   | j r|  S dS )a  
        Hook to generate new PK values on save. This method is called when
        saving instances with no primary key value set. If this method returns
        something else than None, then the returned value is used when saving
        the new instance.
        N)re   get_defaultrZ   instancerD   rD   rE   get_pk_value_on_saveM  s    zField.get_pk_value_on_savec                 C   s   |S )z
        Convert the input value into the expected Python data type, raising
        django.core.exceptions.ValidationError if the data can't be converted.
        Return the converted value. Subclasses should override this.
        rD   rZ   r   rD   rD   rE   	to_pythonX  s    zField.to_pythonc                 C   s   | j | jS )z
        Some validators can't be created at field initialization time.
        This method provides a way to delay their creation until required.
        )default_validatorsrw   rY   rD   rD   rE   r   `  s    zField.validatorsc                 C   s   || j krd S g }| jD ]f}z|| W q tjk
r| } z4t|dr`|j| jkr`| j|j |_||j	 W 5 d }~X Y qX q|rt|d S )Ncode)
empty_valuesr   r
   ValidationErrorr   r   r}   messager   Z
error_list)rZ   r   r   verD   rD   rE   run_validatorsh  s    

 zField.run_validatorsc                 C   s   | j s
dS | jdk	r|| jkr| jD ]D\}}t|ttfrZ|D ]\}}||kr>  dS q>q$||kr$ dS q$tj| jd dd|id|dkr| j	stj| jd dd| j
s|| jkrtj| jd dddS )z
        Validate value and raise ValidationError if necessary. Subclasses
        should override this to provide validation logic.
        NrS   r   r   r   rT   )r   rU   )rf   ro   r   rj   rn   tupler
   r   r}   rT   rU   )rZ   r   model_instanceZ
option_keyZoption_valueZoptgroup_keyZoptgroup_valuerD   rD   rE   validatex  s&    zField.validatec                 C   s$   |  |}| || | | |S )z
        Convert the value's type and run validation. Validation errors
        from to_python() and validate() are propagated. Return the correct
        value if no error is raised.
        )r   r   r   rZ   r   r   rD   rD   rE   clean  s    

zField.cleanc                 C   s   t | j|jjdS )NZqn_)r   r   opsZ
quote_namerZ   r   rD   rD   rE   db_type_parameters  s    zField.db_type_parametersc                 C   s:   |  |}z|j|   | W S  tk
r4   Y dS X dS )z
        Return the database column check constraint for this field, for the
        provided connection. Works the same way as db_type() for the case that
        get_internal_type() does not map to a preexisting model field.
        N)r   Zdata_type_check_constraintsget_internal_typeKeyErrorrZ   r   datarD   rD   rE   db_check  s
    
zField.db_checkc                 C   s:   |  |}z|j|   | W S  tk
r4   Y dS X dS )zk
        Return the database column data type for this field, for the provided
        connection.
        N)r   
data_typesr   r   r   rD   rD   rE   db_type  s
    
zField.db_typec                 C   s
   |  |S )z
        Return the data type that a related field pointing to this field should
        use. For example, this method is called by ForeignKey and OneToOneField
        to determine its data type.
        )r   r   rD   rD   rE   rel_db_type  s    zField.rel_db_typec                 C   s.   |j j|  }|r$|| | S | |S )z3Return the data type to use in the Cast() function.)r   Zcast_data_typesr   r   r   r   )rZ   r   r   rD   rD   rE   cast_db_type  s    zField.cast_db_typec                 C   s   |  |}| |}||dS )z
        Extension of db_type(), providing a range of different return values
        (type, checks). This will look at db_type(), allowing custom model
        fields to override it.
        )typer   )r   r   )rZ   r   Ztype_stringZcheck_stringrD   rD   rE   db_parameters  s
    

zField.db_parametersc                 C   s   |j |  S rG   )Zdata_types_suffixr   r   r   rD   rD   rE   db_type_suffix  s    zField.db_type_suffixc                 C   s   t | dr| jgS g S )Nfrom_db_value)r   r  r   rD   rD   rE   get_db_converters  s    
zField.get_db_convertersc                 C   s   | j p
| jS rG   )rc   ra   rY   rD   rD   rE   rV     s    zField.uniquec                 C   s   | j p
tjS rG   )rs   r   ZDEFAULT_INDEX_TABLESPACErY   rD   rD   rE   r     s    zField.db_tablespacec                 C   s   dS )z
        Private API intended only to be used by Django itself. Currently only
        the PostgreSQL backend supports returning multiple fields on a model.
        FrD   rY   rD   rD   rE   db_returning  s    zField.db_returningc                 C   sL   | j p|| _ |  \| _| _| jd k	| _| jd krH| j rH| j dd| _d S )NrX    )r^   get_attname_columnattnamecolumnZconcreter_   r   )rZ   r^   rD   rD   rE   set_attributes_from_name  s
    zField.set_attributes_from_namec                 C   s   |  | || _|jj| |d | jrHt|| jdsHt|| j| |  | j	dk	r~d| j
 |jkr~t|d| j
 t|j| d dS )z
        Register the field with the model class it belongs to.

        If private_only is True, create a separate instance of this field
        for every subclass of cls, even if cls is not an abstract model.
        )privateNzget_%s_display)r   )r
  r   rH   Z	add_fieldr	  r{   r  setattrdescriptor_classro   r^   r   r   Z_get_FIELD_display)rZ   r   r^   Zprivate_onlyrD   rD   rE   contribute_to_class  s    

zField.contribute_to_classc                 C   s   | j t|| jiS )z
        Return a dict that when passed as kwargs to self.model.filter(), would
        yield all instances having the same value for this field as obj has.
        )r^   r{   r  r   rD   rD   rE   get_filter_kwargs_for_object"  s    z"Field.get_filter_kwargs_for_objectc                 C   s   | j S rG   )r^   rY   rD   rD   rE   get_attname)  s    zField.get_attnamec                 C   s   |   }| jp|}||fS rG   )r  rr   )rZ   r  r	  rD   rD   rE   r  ,  s    
zField.get_attname_columnc                 C   s   | j jS rG   )rN   rA   rY   rD   rD   rE   r   1  s    zField.get_internal_typec                 C   s   t || jS )z(Return field's value just before saving.r{   r  )rZ   r   addrD   rD   rE   pre_save4  s    zField.pre_savec                 C   s   t |tr| }|S )zAPerform preliminary non-db specific value checks and conversions.)rj   r   Z_proxy____castr   rD   rD   rE   get_prep_value8  s    
zField.get_prep_valuec                 C   s   |s|  |}|S )z
        Return field's value prepared for interacting with the database backend.

        Used by the default implementations of get_db_prep_save().
        )r  rZ   r   r   preparedrD   rD   rE   get_db_prep_value>  s    
zField.get_db_prep_valuec                 C   s   | j ||ddS )z9Return field's value prepared for saving into a database.F)r   r  )r  rZ   r   r   rD   rD   rE   get_db_prep_saveH  s    zField.get_db_prep_savec                 C   s
   | j tk	S )z;Return a boolean of whether this field has a default value.)re   r4   rY   rD   rD   rE   has_defaultL  s    zField.has_defaultc                 C   s   |   S )z(Return the default value for this field.)r   rY   rD   rD   rE   r   P  s    zField.get_defaultc                    s@      r$t jr jS  fddS  jr8 jr<tjjs<tS t	S )Nc                      s    j S rG   )re   rD   rY   rD   rE   <lambda>Y      z$Field._get_default.<locals>.<lambda>)
r  r   re   empty_strings_allowedrT   r   r   r   rQ   r   rY   rD   rY   rE   r   T  s    
zField._get_defaultc           	         s   | j dk	r<t| j }|r8tdd | jD }|s8|| }|S | jj}|pN|  }tt	| jdrl| j
 jnd |j|}|r|j| }|r|ng  fdd|D  S )z{
        Return choices with a default blank choices included, for use
        as <select> choices for this field.
        Nc                 s   s   | ]\}}|d kV  qdS ))rF   NNrD   )r   choicerX   rD   rD   rE   r   g  s     z$Field.get_choices.<locals>.<genexpr>get_related_fieldr   c                    s   g | ]} |t |fqS rD   )r   )r   xZchoice_funcrD   rE   
<listcomp>u  s    z%Field.get_choices.<locals>.<listcomp>)ro   rn   anyflatchoicesrd   r   Zget_limit_choices_tooperator
attrgetterr   r  r  Z_default_managerZcomplex_filterZorder_by)	rZ   include_blankZblank_choiceZlimit_choices_toZorderingro   Zblank_definedZ	rel_modelqsrD   r!  rE   get_choices_  s(    



zField.get_choicesc                 C   s   t | |S )z
        Return a string value of this field from the passed obj.
        This is used by the serialization framework.
        )r   value_from_objectr   rD   rD   rE   value_to_stringy  s    zField.value_to_stringc                 C   sN   | j dkrg S g }| j D ]0\}}t|ttfr:|| q|||f q|S )z#Flattened version of choices tuple.N)ro   rj   rn   r   r   r   )rZ   Zflatr  r   rD   rD   rE   _get_flatchoices  s    
zField._get_flatchoicesc                 C   s   t || j| d S rG   )r  r^   )rZ   r   r   rD   rD   rE   save_form_data  s    zField.save_form_datac                 K   s   | j  t| j| jd}|  rJt| jr>| j|d< d|d< n|  |d< | jdk	r| j pj|  phd|k }| j	|d|d< | j
|d< | jrd|d	< |dk	r|}ntj}t|D ]}|d
kr||= q|| |dkrtj}|f |S )z4Return a django.forms.Field instance for this field.)requiredr   rp   initialTshow_hidden_initialNr'  ro   coerceempty_value)r2  r3  ro   r.  widgetr   r/  rp   r}   r0  disabled)rU   r   r_   rp   r  r   re   r   ro   r)  r   rT   r   ZTypedChoiceFieldrn   rz   r&   )rZ   
form_classZchoices_form_classr   defaultsr'  krD   rD   rE   	formfield  s6    





zField.formfieldc                 C   s   t || jS )z;Return the value of this field in the given model instance.r  r   rD   rD   rE   r*    s    zField.value_from_object)N)N)F)F)NN)[rA   rB   rC   __doc__r  rn   r   ZEMPTY_VALUESr   rv   ru   r   rX   r]   r   r   hiddenZmany_to_manyZmany_to_oneZone_to_manyZ
one_to_oneZrelated_modelr   r  r[   propertydescriptionr4   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rV   r   r  r
  r  r  r  r  r   r  r  r  r  r  r   r   r!   r)  r+  r,  r$  r-  r9  r*  __classcell__rD   rD   r   rE   r.   T   s   
             
/
 
@


	
[	









&c                       sV   e Zd ZdZededdZedZdd Zdd	 Z fd
dZ	 fddZ
  ZS )r%   Fu3   “%(value)s” value must be either True or False.u:   “%(value)s” value must be either True, False, or None.invalidinvalid_nullablezBoolean (Either True or False)c                 C   s   dS )Nr%   rD   rY   rD   rD   rE   r     s    zBooleanField.get_internal_typec                 C   sd   | j r|| jkrd S |dkr$t|S |dkr0dS |dkr<dS tj| j| j rNdnd dd|id	d S )
N)TF)tTrue1T)fFalse0FrB  rA  r   r   )rT   r   boolr
   r   r}   r   rD   rD   rE   r     s    zBooleanField.to_pythonc                    s"   t  |}|d krd S | |S rG   r   r  r   r   r   rD   rE   r    s    zBooleanField.get_prep_valuec                    s\   | j d k	r.|  pd|k }d| j|di}n| jr:tjntj}|dd}t jf ||S )Nr/  ro   r1  F)r6  r.  )	ro   r  r)  rT   r   r5   r%   r   r9  )rZ   r   r'  r7  r6  r   rD   rE   r9    s    

zBooleanField.formfield)rA   rB   rC   r  rX   r]   r=  r   r   r  r9  r?  rD   rD   r   rE   r%     s   c                       s   e Zd ZedZdd fdd
Z fddZdd	 Zd
d Z fddZ	dd Z
dd Z fddZ fddZ fddZ  ZS )r&   zString (up to %(max_length)s)Ndb_collationc                   s,   t  j|| || _| jt| j d S rG   )r   r   rL  r   r   MaxLengthValidatorrb   rZ   rL  r   r   r   rD   rE   r     s    zCharField.__init__c                    s0   | dpg }t jf || || jf |S Nr   )r   r   r   _check_db_collation_check_max_length_attributerZ   r   r   r   rD   rE   r     s
    
zCharField.checkc                 K   sX   | j d krtjd| ddgS t| j tr>t| j ts>| j dkrPtjd| ddgS g S d S )Nz0CharFields must define a 'max_length' attribute.zfields.E120r   r   z('max_length' must be a positive integer.zfields.E121)rb   r	   r   rj   intrI  r   rD   rD   rE   rQ    s"    
z%CharField._check_max_length_attributec                 C   sf   g }|D ]X}t || jsqt| }| jd ksd| jjjks|jjs|	t
jd|j | dd q|S )Nsupports_collation_on_charfieldz7%s does not support a database collation on CharFields.fields.E190r   )r   allow_migrate_modelr   r   rL  rH   required_db_featuresr   rT  r   r	   r   display_namerZ   r   r   dbr   rD   rD   rE   rP    s*    zCharField._check_db_collationc                    s   | j d kr|jjS t |S rG   )rb   r   Z"cast_char_field_without_max_lengthr   r   r   r   rD   rE   r   #  s    
zCharField.cast_db_typec                 C   s   dS )Nr&   rD   rY   rD   rD   rE   r   (  s    zCharField.get_internal_typec                 C   s   t |ts|d kr|S t|S rG   rj   r   r   rD   rD   rE   r   +  s    zCharField.to_pythonc                    s   t  |}| |S rG   rJ  r   r   rD   rE   r  0  s    zCharField.get_prep_valuec                    s8   d| j i}| jr tjjs d |d< || t jf |S )Nrb   r3  )rb   rT   r   r   r   rz   r   r9  )rZ   r   r7  r   rD   rE   r9  4  s
    

zCharField.formfieldc                    s.   t   \}}}}| jr"| j|d< ||||fS NrL  r   r   rL  r   r   rD   rE   r   ?  s    
zCharField.deconstruct)rA   rB   rC   rX   r=  r   r   rQ  rP  r   r   r   r  r9  r   r?  rD   rD   r   rE   r&     s   c                   @   s(   e Zd ZejgZedZddddZdS )r'   zComma-separated integerszRCommaSeparatedIntegerField is removed except for support in historical migrations.zJUse CharField(validators=[validate_comma_separated_integer_list]) instead.zfields.E901r   r   r   N)	rA   rB   rC   r   Z%validate_comma_separated_integer_listr   rX   r=  r   rD   rD   rD   rE   r'   F  s   c                       s,   e Zd Z fddZdd Zdd Z  ZS )DateTimeCheckMixinc                    s   t  jf ||  |  S rG   )r   r   !_check_mutually_exclusive_options_check_fix_default_valuer   r   rD   rE   r   X  s    zDateTimeCheckMixin.checkc                 C   sH   | j | j|  g}dd |D d}|dkr@tjd| ddgS g S d S )Nc                 S   s   g | ]}|d kqS ))NFrD   )r   optionrD   rD   rE   r"  d  s     zHDateTimeCheckMixin._check_mutually_exclusive_options.<locals>.<listcomp>Tr\   zqThe options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.zfields.E160r   )auto_now_addauto_nowr  countr	   r   )rZ   Zmutually_exclusive_optionsZenabled_optionsrD   rD   rE   r`  _  s    
z4DateTimeCheckMixin._check_mutually_exclusive_optionsc                 C   s   g S rG   rD   rY   rD   rD   rE   ra  r  s    z+DateTimeCheckMixin._check_fix_default_value)rA   rB   rC   r   r`  ra  r?  rD   rD   r   rE   r_  V  s   r_  c                       s   e Zd ZdZededdZedZd fdd	Zd	d
 Z fddZ	dd Z
dd Z fddZ fddZ fddZdddZdd Z fddZ  ZS )r(   FuR   “%(value)s” value has an invalid date format. It must be in YYYY-MM-DD format.T   “%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid date.)rA  invalid_datezDate (without time)Nc                    s<   || | _ | _|s|r&d|d< d|d< t j||f| d S NFrf   TrU   rd  rc  r   r   rZ   r_   r^   rd  rc  r   r   rD   rE   r     s
    zDateField.__init__c                 C   s   |   sg S t }t|s,t|tj}| j}t|tjr`t|sVt|tj}|	 }nt|tj	rnng S tj
dd}|| 	 }|| 	 }||  kr|krn ntjdd| ddgS g S )
        Warn that using an actual date or datetime value is probably wrong;
        it's only evaluated on server startup.
        r\   )daysFixed default value provided.It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`fields.W161r   )r  r   nowis_naive
make_naiveutcre   rj   datetimedate	timedeltar	   r   )rZ   rp  r   offsetlowerupperrD   rD   rE   ra    s2    


z"DateField._check_fix_default_valuec                    sR   t   \}}}}| jr d|d< | jr.d|d< | js:| jrF|d= |d= ||||fS )NTrd  rc  rf   rU   r   r   rd  rc  r   r   rD   rE   r     s    zDateField.deconstructc                 C   s   dS )Nr(   rD   rY   rD   rD   rE   r     s    zDateField.get_internal_typec                 C   s   |d kr|S t |tjrDtjr<t|r<t }t||}| S t |tjrT|S zt	|}|d k	rl|W S W n. t
k
r   tj| jd dd|idY nX tj| jd dd|idd S )Nrg  r   r   rA  )rj   rt  r   USE_TZr   is_awareget_default_timezonerr  ru  r   r   r
   r   r}   rZ   r   default_timezoneparsedrD   rD   rE   r     s0    
zDateField.to_pythonc                    s>   | j s| jr,|r,tj }t|| j| |S t ||S d S rG   )	rd  rc  rt  ru  todayr  r  r   r  rZ   r   r  r   r   rD   rE   r    s
    
zDateField.pre_savec                    sX   t  j||f| | jsTt|d| j t|j| dd t|d| j t|j| dd d S )Nzget_next_by_%sT)r   Zis_nextzget_previous_by_%sF)r   r  rT   r  r^   r   Z_get_next_or_previous_by_FIELDrZ   r   r^   r   r   rD   rE   r    s      zDateField.contribute_to_classc                    s   t  |}| |S rG   rJ  r   r   rD   rE   r    s    zDateField.get_prep_valuec                 C   s   |s|  |}|j|S rG   )r  r   Zadapt_datefield_valuer  rD   rD   rE   r    s    
zDateField.get_db_prep_valuec                 C   s   |  |}|d krdS | S NrF   r*  	isoformatrZ   r   valrD   rD   rE   r+    s    
zDateField.value_to_stringc                    s   t  jf dtji|S Nr6  )r   r9  r   r(   r   r   rD   rE   r9    s     zDateField.formfield)NNFF)F)rA   rB   rC   r  rX   r]   r=  r   ra  r   r   r   r  r  r  r  r+  r9  r?  rD   rD   r   rE   r(   v  s$     (
c                       s   e Zd ZdZedededdZedZdd Zd	d
 Zdd Z	 fddZ
 fddZdddZdd Z fddZ  ZS )r)   Fue   “%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format.rf  uq   “%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time.)rA  rg  invalid_datetimezDate (with time)c                 C   s  |   sg S t }t|s,t|tj}| j}t|tjrttj	dd}|| }|| }t
|rt|tj}njt|tjrtj	dd}|| }t|j|j|j}|| }t|j|j|j}t|j|j|j}ng S ||  kr|krn ntjdd| ddgS g S rk  
   )secondsrm  rn  ro  r   )r  r   rp  rq  rr  rs  re   rj   rt  rv  r|  ru  yearmonthdayr	   r   rZ   rp  r   Zsecond_offsetrx  ry  rD   rD   rE   ra    s:    

z&DateTimeField._check_fix_default_valuec                 C   s   dS )Nr)   rD   rY   rD   rD   rE   r   ?  s    zDateTimeField.get_internal_typec                 C   s:  |d kr|S t |tjr|S t |tjrvt|j|j|j}tjrrt	d| j
j| j|f t t }t||}|S zt|}|d k	r|W S W n. tk
r   tj| jd dd|idY nX z*t|}|d k	rt|j|j|jW S W n0 tk
r   tj| jd dd|idY nX tj| jd dd|idd S )NzUDateTimeField %s.%s received a naive datetime (%s) while time zone support is active.r  r   r   rg  rA  )rj   rt  ru  r  r  r  r   r{  warningswarnr   rA   r^   RuntimeWarningr   r}  
make_awarer   r   r
   r   r}   r   r~  rD   rD   rE   r   B  sP    
zDateTimeField.to_pythonc                    s<   | j s| jr*|r*t }t|| j| |S t ||S d S rG   )rd  rc  r   rp  r  r  r   r  r  r   rD   rE   r  r  s
    zDateTimeField.pre_savec                    s   t  |}| |}|d k	rtjrt|rzd| jj| j	f }W n t
k
r\   d}Y nX td||f t t }t||}|S )Nr   z	(unbound)zRDateTimeField %s received a naive datetime (%s) while time zone support is active.)r   r  r   r   r{  r   rq  r   rA   r^   AttributeErrorr  r  r  r}  r  )rZ   r   r^   r  r   rD   rE   r  }  s    

zDateTimeField.get_prep_valuec                 C   s   |s|  |}|j|S rG   )r  r   Zadapt_datetimefield_valuer  rD   rD   rE   r    s    
zDateTimeField.get_db_prep_valuec                 C   s   |  |}|d krdS | S r  r  r  rD   rD   rE   r+    s    
zDateTimeField.value_to_stringc                    s   t  jf dtji|S r  )r   r9  r   r)   r   r   rD   rE   r9    s     zDateTimeField.formfield)F)rA   rB   rC   r  rX   r]   r=  ra  r   r   r  r  r  r+  r9  r?  rD   rD   r   rE   r)     s   	+0
c                       s   e Zd ZdZdediZedZd  fdd	Z fdd	Zd
d Z	dd Z
dd Ze fddZedd Z fddZdd Zdd Zdd Z fddZ fddZ  ZS )!r*   FrA  u/   “%(value)s” value must be a decimal number.zDecimal numberNc                    s$   || | _ | _t j||f| d S rG   )
max_digitsdecimal_placesr   r   )rZ   r_   r^   r  r  r   r   rD   rE   r     s    zDecimalField.__init__c                    sD   t  jf |}|  |  }|s6|| jf | n
|| |S rG   )r   r   _check_decimal_places_check_max_digitsr   $_check_decimal_places_and_max_digits)rZ   r   r   Zdigits_errorsr   rD   rE   r     s    
zDecimalField.checkc                 C   sp   zt | j}|dk rt W nJ tk
rB   tjd| ddg Y S  tk
rf   tjd| ddg Y S X g S d S )Nr   z7DecimalFields must define a 'decimal_places' attribute.zfields.E130r   z0'decimal_places' must be a non-negative integer.zfields.E131)rS  r  r   r   r	   r   )rZ   r  rD   rD   rE   r    s&    


z"DecimalField._check_decimal_placesc                 C   sp   zt | j}|dkrt W nJ tk
rB   tjd| ddg Y S  tk
rf   tjd| ddg Y S X g S d S )Nr   z3DecimalFields must define a 'max_digits' attribute.zfields.E132r   z('max_digits' must be a positive integer.zfields.E133)rS  r  r   r   r	   r   )rZ   r  rD   rD   rE   r    s&    


zDecimalField._check_max_digitsc                 K   s*   t | jt | jkr&tjd| ddgS g S )Nz:'max_digits' must be greater or equal to 'decimal_places'.zfields.E134r   )rS  r  r  r	   r   r   rD   rD   rE   r    s    z1DecimalField._check_decimal_places_and_max_digitsc                    s   t  jt| j| jg S rG   )r   r   ZDecimalValidatorr  r  rY   r   rD   rE   r     s    zDecimalField.validatorsc                 C   s   t j| jdS )N)prec)decimalContextr  rY   rD   rD   rE   context  s    zDecimalField.contextc                    sF   t   \}}}}| jd k	r&| j|d< | jd k	r:| j|d< ||||fS )Nr  r  )r   r   r  r  r   r   rD   rE   r     s    



zDecimalField.deconstructc                 C   s   dS )Nr*   rD   rY   rD   rD   rE   r     s    zDecimalField.get_internal_typec              
   C   sj   |d kr|S t |tr"| j|S zt|W S  tjttfk
rd   t	j
| jd dd|idY nX d S NrA  r   r   )rj   floatr  create_decimal_from_floatr  DecimalInvalidOperationr   r   r
   r   r}   r   rD   rD   rE   r   
  s    
zDecimalField.to_pythonc                 C   s   |j | || j| jS rG   )r   Zadapt_decimalfield_valuer   r  r  r  rD   rD   rE   r    s    zDecimalField.get_db_prep_savec                    s   t  |}| |S rG   rJ  r   r   rD   rE   r    s    zDecimalField.get_prep_valuec                    s    t  jf | j| jtjd|S )N)r  r  r6  )r   r9  r  r  r   r*   r   r   rD   rE   r9    s    zDecimalField.formfield)NNNN)rA   rB   rC   r  rX   r]   r=  r   r   r  r  r  r   r   r  r   r   r   r  r  r9  r?  rD   rD   r   rE   r*     s,      
c                       sf   e Zd ZdZdZdediZedZdd Zdd	 Z	dd
dZ
 fddZdd Z fddZ  ZS )r+   z
    Store timedelta objects.

    Use interval on PostgreSQL, INTERVAL DAY TO SECOND on Oracle, and bigint
    of microseconds on other databases.
    FrA  u]   “%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[.uuuuuu] format.ZDurationc                 C   s   dS )Nr+   rD   rY   rD   rD   rE   r   6  s    zDurationField.get_internal_typec                 C   sh   |d kr|S t |tjr|S zt|}W n tk
r<   Y nX |d k	rJ|S tj| jd dd|idd S r  )rj   rt  rv  r   r   r
   r   r}   rZ   r   r  rD   rD   rE   r   9  s    zDurationField.to_pythonc                 C   s    |j jr|S |d krd S t|S rG   )r   has_native_duration_fieldr   r  rD   rD   rE   r  L  s
    zDurationField.get_db_prep_valuec                    s*   g }|j js||jj |t | S rG   )r   r  r   r   Zconvert_durationfield_valuer   r  )rZ   r   
convertersr   rD   rE   r  S  s    zDurationField.get_db_convertersc                 C   s   |  |}|d krdS t|S r  )r*  r   r  rD   rD   rE   r+  Y  s    
zDurationField.value_to_stringc                    s   t  jf dtji|S r  )r   r9  r   r+   r   r   rD   rE   r9  ]  s     zDurationField.formfield)F)rA   rB   rC   r:  r  rX   r]   r=  r   r   r  r  r+  r9  r?  rD   rD   r   rE   r+   (  s    
c                       sD   e Zd ZejgZedZ fddZ fddZ	 fddZ
  ZS )r,   zEmail addressc                    s   | dd t j|| d S )Nrb      
setdefaultr   r   rZ   r   r   r   rD   rE   r   h  s    zEmailField.__init__c                    s   t   \}}}}||||fS rG   r   r   r   r   rD   rE   r   m  s    zEmailField.deconstructc                    s   t  jf dtji|S r  )r   r9  r   r,   r   r   rD   rE   r9  s  s     zEmailField.formfield)rA   rB   rC   r   Zvalidate_emailr   rX   r=  r   r   r9  r?  rD   rD   r   rE   r,   d  s
   c                       sf   e Zd ZedZd fdd	Z fdd	Zd
d Z fddZ fddZ	 fddZ
dd Z  ZS )r/   z	File pathNrF   FTc           	         sF   |||  | _ | _| _|| | _| _|dd t j||f| d S )Nrb   d   )r   match	recursiveallow_filesallow_foldersr  r   r   )	rZ   r_   r^   r   r  r  r  r  r   r   rD   rE   r     s    zFilePathField.__init__c                    s   t  jf || jf |S rG   )r   r    _check_allowing_files_or_foldersr   r   rD   rE   r     s    
zFilePathField.checkc                 K   s"   | j s| jstjd| ddgS g S )NzMFilePathFields must have either 'allow_files' or 'allow_folders' set to True.zfields.E140r   )r  r  r	   r   r   rD   rD   rE   r    s    z.FilePathField._check_allowing_files_or_foldersc                    s   t   \}}}}| jdkr&| j|d< | jd k	r:| j|d< | jdk	rN| j|d< | jdk	rb| j|d< | jdk	rv| j|d< |d	d
kr|d	= ||||fS )NrF   r   r  Fr  Tr  r  rb   r  )r   r   r   r  r  r  r  r   r   r   rD   rE   r     s    









zFilePathField.deconstructc                    s    t  |}|d krd S t|S rG   r   r  r   r   r   rD   rE   r    s    zFilePathField.get_prep_valuec              	      s>   t  jf t| jr|  n| j| j| jtj| j| j	d|S )N)r   r  r  r6  r  r  )
r   r9  r   r   r  r  r   r/   r  r  r   r   rD   rE   r9    s    zFilePathField.formfieldc                 C   s   dS )Nr/   rD   rY   rD   rD   rE   r     s    zFilePathField.get_internal_type)NNrF   NFTF)rA   rB   rC   rX   r=  r   r   r  r   r  r9  r   r?  rD   rD   r   rE   r/   |  s         c                       sP   e Zd ZdZdediZedZ fddZdd Zd	d
 Z	 fddZ
  ZS )r0   FrA  u&   “%(value)s” value must be a float.zFloating point numberc              
      sd   t  |}|d krd S z
t|W S  ttfk
r^ } z|d| j|f |W 5 d }~X Y nX d S Nz(Field '%s' expected a number but got %r.)r   r  r  r   r   rN   r^   rZ   r   r   r   rD   rE   r    s    
zFloatField.get_prep_valuec                 C   s   dS )Nr0   rD   rY   rD   rD   rE   r     s    zFloatField.get_internal_typec              	   C   sN   |d kr|S z
t |W S  ttfk
rH   tj| jd dd|idY nX d S r  )r  r   r   r
   r   r}   r   rD   rD   rE   r     s    
zFloatField.to_pythonc                    s   t  jf dtji|S r  )r   r9  r   r0   r   r   rD   rE   r9    s     zFloatField.formfield)rA   rB   rC   r  rX   r]   r=  r  r   r   r9  r?  rD   rD   r   rE   r0     s    c                       st   e Zd ZdZdediZedZ fddZdd Ze	 fd	d
Z
 fddZdd Zdd Z fddZ  ZS )r3   FrA  u)   “%(value)s” value must be an integer.ZIntegerc                    s   t  jf ||  S rG   )r   r   _check_max_length_warningr   r   rD   rE   r     s    zIntegerField.checkc                 C   s*   | j d k	r&tjd| jj d| ddgS g S )Nz*'max_length' is ignored when used with %s.zRemove 'max_length' from fieldzfields.W122r   )rb   r	   r   rN   rA   rY   rD   rD   rE   r    s    

z&IntegerField._check_max_length_warningc                    s   t  j}|  }tj|\ d k	rNtfdd|D sN|t  d k	r|t fdd|D s||t	  |S )Nc                 3   s6   | ].}t |tjo,t|jr$| n|j kV  qd S rG   )rj   r   MinValueValidatorr   limit_valuer   r   )	min_valuerD   rE   r     s   
z*IntegerField.validators.<locals>.<genexpr>c                 3   s6   | ].}t |tjo,t|jr$| n|j kV  qd S rG   )rj   r   MaxValueValidatorr   r  r  )	max_valuerD   rE   r     s   
)
r   r   r   r   r   Zinteger_field_ranger#  r   r  r  )rZ   Zvalidators_Zinternal_typer   )r  r  rE   r     s    		zIntegerField.validatorsc              
      sd   t  |}|d krd S z
t|W S  ttfk
r^ } z|d| j|f |W 5 d }~X Y nX d S r  )r   r  rS  r   r   rN   r^   r  r   rD   rE   r    s    
zIntegerField.get_prep_valuec                 C   s   dS )Nr3   rD   rY   rD   rD   rE   r   %  s    zIntegerField.get_internal_typec              	   C   sN   |d kr|S z
t |W S  ttfk
rH   tj| jd dd|idY nX d S r  )rS  r   r   r
   r   r}   r   rD   rD   rE   r   (  s    
zIntegerField.to_pythonc                    s   t  jf dtji|S r  )r   r9  r   r3   r   r   rD   rE   r9  4  s     zIntegerField.formfield)rA   rB   rC   r  rX   r]   r=  r   r  r   r   r  r   r   r9  r?  rD   rD   r   rE   r3     s    c                       s0   e Zd ZedZdZdd Z fddZ  ZS )r#   zBig (8 byte) integerl    c                 C   s   dS )Nr#   rD   rY   rD   rD   rE   r   ?  s    z!BigIntegerField.get_internal_typec                    s"   t  jf tj d tjd|S )Nr\   )r  r  )r   r9  r#   
MAX_BIGINTr   r   rD   rE   r9  B  s    
zBigIntegerField.formfield)	rA   rB   rC   rX   r=  r  r   r9  r?  rD   rD   r   rE   r#   ;  s   c                   @   s   e Zd ZedZdd ZdS )r;   zSmall integerc                 C   s   dS )Nr;   rD   rY   rD   rD   rE   r   M  s    z#SmallIntegerField.get_internal_typeN)rA   rB   rC   rX   r=  r   rD   rD   rD   rE   r;   J  s   c                       sT   e Zd ZdZedZddddZ fddZ fd	d
Z fddZ	dd Z
  ZS )r2   FzIPv4 addresszLIPAddressField has been removed except for support in historical migrations.z"Use GenericIPAddressField instead.zfields.E900r^  c                    s   d|d< t  j|| d S )N   rb   r   r   r  r   rD   rE   r   ]  s    zIPAddressField.__init__c                    s$   t   \}}}}|d= ||||fS Nrb   r  r   r   rD   rE   r   a  s    zIPAddressField.deconstructc                    s    t  |}|d krd S t|S rG   r  r   r   rD   rE   r  f  s    zIPAddressField.get_prep_valuec                 C   s   dS )Nr2   rD   rY   rD   rD   rE   r   l  s    z IPAddressField.get_internal_type)rA   rB   rC   r  rX   r=  r   r   r   r  r   r?  rD   rD   r   rE   r2   Q  s   	c                       s   e Zd ZdZedZi Zd fdd	Z fddZd	d
 Z	 fddZ
dd Zdd ZdddZ fddZ fddZ  ZS )r1   Fz
IP addressNbothc                    sJ   || _ || _t||\| _}|| jd< d|d< t j||f|| d S )NrA  '   rb   )unpack_ipv4protocolr   Zip_address_validatorsr   r]   r   r   )rZ   r_   r^   r  r  r   r   Zinvalid_error_messager   rD   rE   r   u  s    

zGenericIPAddressField.__init__c                    s   t  jf || jf |S rG   )r   r   _check_blank_and_null_valuesr   r   rD   rE   r     s    
zGenericIPAddressField.checkc                 K   s.   t | dds*t | ddr*tjd| ddgS g S )NrT   FrU   zaGenericIPAddressFields cannot have blank=True if null=False, as blank values are stored as nulls.zfields.E150r   )r{   r	   r   r   rD   rD   rE   r    s    z2GenericIPAddressField._check_blank_and_null_valuesc                    sZ   t   \}}}}| jdk	r&| j|d< | jdkr:| j|d< |ddkrN|d= ||||fS )NFr  r  r  rb   r  )r   r   r  r  r   r   r   rD   rE   r     s    



z!GenericIPAddressField.deconstructc                 C   s   dS )Nr1   rD   rY   rD   rD   rE   r     s    z'GenericIPAddressField.get_internal_typec                 C   sF   |d krd S t |tst|}| }d|krBt|| j| jd S |S )N:rA  )rj   r   stripr   r  r}   r   rD   rD   rE   r     s    
zGenericIPAddressField.to_pythonc                 C   s   |s|  |}|j|S rG   )r  r   Zadapt_ipaddressfield_valuer  rD   rD   rE   r    s    
z'GenericIPAddressField.get_db_prep_valuec                    sR   t  |}|d krd S |rJd|krJzt|| jW S  tjk
rH   Y nX t|S )Nr  )r   r  r   r  r
   r   r   r   r   rD   rE   r    s    z$GenericIPAddressField.get_prep_valuec                    s   t  jf | jtjd|S )N)r  r6  )r   r9  r  r   r1   r   r   rD   rE   r9    s    zGenericIPAddressField.formfield)NNr  F)F)rA   rB   rC   r  rX   r=  r]   r   r   r  r   r   r   r  r  r9  r?  rD   rD   r   rE   r1   p  s     



c                       sV   e Zd ZededdZedZddddZ fdd	Z fd
dZdd Z	  Z
S )r5   u9   “%(value)s” value must be either None, True or False.r@  z$Boolean (Either True, False or None)zoNullBooleanField is deprecated. Support for it (except in historical migrations) will be removed in Django 4.0.z$Use BooleanField(null=True) instead.zfields.W903r^  c                    s"   d|d< d|d< t  j|| d S )NTrT   rU   r  r  r   rD   rE   r     s    zNullBooleanField.__init__c                    s*   t   \}}}}|d= |d= ||||fS )NrT   rU   r  r   r   rD   rE   r     s    zNullBooleanField.deconstructc                 C   s   dS )Nr5   rD   rY   rD   rD   rE   r     s    z"NullBooleanField.get_internal_type)rA   rB   rC   rX   r]   r=  r   r   r   r   r?  rD   rD   r   rE   r5     s   	c                       s$   e Zd Z fddZdd Z  ZS )PositiveIntegerRelDbTypeMixinc                    s<   t  jf | t| ds8tdd | jdd  D d | _d S )Ninteger_field_classc                 s   s   | ]}t |tr|V  qd S rG   )
issubclassr3   )r   parentrD   rD   rE   r     s   
zBPositiveIntegerRelDbTypeMixin.__init_subclass__.<locals>.<genexpr>r\   )r   __init_subclass__r   nextry   r  )r   r   r   rD   rE   r    s    
z/PositiveIntegerRelDbTypeMixin.__init_subclass__c                 C   s&   |j jr| |S |  j|dS dS )a  
        Return the data type that a related field pointing to this field should
        use. In most cases, a foreign key pointing to a positive integer
        primary key will have an integer column data type but some databases
        (e.g. MySQL) have an unsigned integer type. In that case
        (related_fields_match_type=True), the primary key should return its
        db_type.
        r   N)r   Zrelated_fields_match_typer   r  r   rD   rD   rE   r     s    	
z)PositiveIntegerRelDbTypeMixin.rel_db_type)rA   rB   rC   r  r   r?  rD   rD   r   rE   r    s   r  c                       s,   e Zd ZedZdd Z fddZ  ZS )r6   zPositive big integerc                 C   s   dS )Nr6   rD   rY   rD   rD   rE   r     s    z)PositiveBigIntegerField.get_internal_typec                    s   t  jf ddi|S Nr  r   r   r9  r   r   rD   rE   r9     s     z!PositiveBigIntegerField.formfieldrA   rB   rC   rX   r=  r   r9  r?  rD   rD   r   rE   r6     s   c                       s,   e Zd ZedZdd Z fddZ  ZS )r7   zPositive integerc                 C   s   dS )Nr7   rD   rY   rD   rD   rE   r   
  s    z&PositiveIntegerField.get_internal_typec                    s   t  jf ddi|S r  r  r   r   rD   rE   r9    s     zPositiveIntegerField.formfieldr  rD   rD   r   rE   r7     s   c                       s,   e Zd ZedZdd Z fddZ  ZS )r8   zPositive small integerc                 C   s   dS )Nr8   rD   rY   rD   rD   rE   r     s    z+PositiveSmallIntegerField.get_internal_typec                    s   t  jf ddi|S r  r  r   r   rD   rE   r9    s     z#PositiveSmallIntegerField.formfieldr  rD   rD   r   rE   r8     s   c                       sV   e Zd ZejgZedZdddd fdd
Z fdd	Z	d
d Z
 fddZ  ZS )r9   zSlug (up to %(max_length)s)2   TF)rb   rq   allow_unicodec                   s2   || _ | j rtjg| _t j|||d| d S )N)rb   rq   )r  r   Zvalidate_unicode_slugr   r   r   )rZ   rb   rq   r  r   r   r   rD   rE   r   %  s    
zSlugField.__init__c                    s`   t   \}}}}|ddkr&|d= | jdkr:d|d< n|d= | jdk	rT| j|d< ||||fS )Nrb   r  Frq   r  )r   r   r   rq   r  r   r   rD   rE   r   +  s    



zSlugField.deconstructc                 C   s   dS )Nr9   rD   rY   rD   rD   rE   r   7  s    zSlugField.get_internal_typec                    s   t  jf tj| jd|S )N)r6  r  )r   r9  r   r9   r  r   r   rD   rE   r9  :  s    zSlugField.formfield)rA   rB   rC   r   Zvalidate_slugr   rX   r=  r   r   r   r9  r?  rD   rD   r   rE   r9   !  s   c                       sr   e Zd ZedZdd fdd
Z fddZdd	 Zd
d Zdd Z	 fddZ
 fddZ fddZ  ZS )r<   TextNrK  c                   s   t  j|| || _d S rG   )r   r   rL  rN  r   rD   rE   r   E  s    zTextField.__init__c                    s&   | dpg }t jf || |S rO  )r   r   r   rP  rR  r   rD   rE   r   I  s    zTextField.checkc                 C   sf   g }|D ]X}t || jsqt| }| jd ksd| jjjks|jjs|	t
jd|j | dd q|S )Nsupports_collation_on_textfieldz7%s does not support a database collation on TextFields.rU  r   )r   rV  r   r   rL  rH   rW  r   r  r   r	   r   rX  rY  rD   rD   rE   rP  P  s*    zTextField._check_db_collationc                 C   s   dS )Nr<   rD   rY   rD   rD   rE   r   e  s    zTextField.get_internal_typec                 C   s   t |ts|d kr|S t|S rG   r[  r   rD   rD   rE   r   h  s    zTextField.to_pythonc                    s   t  |}| |S rG   rJ  r   r   rD   rE   r  m  s    zTextField.get_prep_valuec                    s.   t  jf d| ji| jd k	ri ndtji|S )Nrb   r4  )r   r9  rb   ro   r   ZTextarear   r   rD   rE   r9  q  s     zTextField.formfieldc                    s.   t   \}}}}| jr"| j|d< ||||fS r\  r]  r   r   rD   rE   r   {  s    
zTextField.deconstruct)rA   rB   rC   rX   r=  r   r   rP  r   r   r  r9  r   r?  rD   rD   r   rE   r<   B  s   
c                       s   e Zd ZdZededdZedZd fdd	Zd	d
 Z fddZ	dd Z
dd Z fddZ fddZdddZdd Z fddZ  ZS )r=   FuV   “%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] format.u]   “%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an invalid time.)rA  invalid_timeZTimeNc                    s<   || | _ | _|s|r&d|d< d|d< t j||f| d S rh  ri  rj  r   rD   rE   r     s
    zTimeField.__init__c                 C   s   |   sg S t }t|s,t|tj}| j}t|tjrttj	dd}|| }|| }t
|rt|tj}n\t|tjrtj	dd}|| }|| }tj| |}t
|rt|tj }ng S ||  kr|krn ntjdd| ddgS g S r  )r  r   rp  rq  rr  rs  re   rj   rt  rv  r|  timecombineru  r	   r   r  rD   rD   rE   ra    s:    


z"TimeField._check_fix_default_valuec                    s^   t   \}}}}| jdk	r&| j|d< | jdk	r:| j|d< | jsF| jrR|d= |d= ||||fS )NFrd  rc  rU   rf   rz  r   r   rD   rE   r     s    



zTimeField.deconstructc                 C   s   dS )Nr=   rD   rY   rD   rD   rE   r     s    zTimeField.get_internal_typec                 C   s   |d krd S t |tjr|S t |tjr0| S zt|}|d k	rH|W S W n. tk
rx   tj| jd dd|idY nX tj| jd dd|idd S )Nr  r   r   rA  )rj   rt  r  r   r   r
   r   r}   r  rD   rD   rE   r     s*    
zTimeField.to_pythonc                    sB   | j s| jr0|r0tj  }t|| j| |S t ||S d S rG   )	rd  rc  rt  rp  r  r  r  r   r  r  r   rD   rE   r    s
    zTimeField.pre_savec                    s   t  |}| |S rG   rJ  r   r   rD   rE   r    s    zTimeField.get_prep_valuec                 C   s   |s|  |}|j|S rG   )r  r   Zadapt_timefield_valuer  rD   rD   rE   r    s    
zTimeField.get_db_prep_valuec                 C   s   |  |}|d krdS | S r  r  r  rD   rD   rE   r+    s    
zTimeField.value_to_stringc                    s   t  jf dtji|S r  )r   r9  r   r=   r   r   rD   rE   r9    s     zTimeField.formfield)NNFF)F)rA   rB   rC   r  rX   r]   r=  r   ra  r   r   r   r  r  r  r+  r9  r?  rD   rD   r   rE   r=     s"     +
c                       sH   e Zd Ze gZedZd	 fdd	Z fddZ	 fddZ
  ZS )
r>   URLNc                    s"   | dd t j||f| d S Nrb      r  )rZ   r_   r^   r   r   rD   rE   r   
	  s    zURLField.__init__c                    s2   t   \}}}}|ddkr&|d= ||||fS r  )r   r   r   r   r   rD   rE   r   	  s    zURLField.deconstructc                    s   t  jf dtji|S r  )r   r9  r   r>   r   r   rD   rE   r9  	  s     zURLField.formfield)NN)rA   rB   rC   r   ZURLValidatorr   rX   r=  r   r   r9  r?  rD   rD   r   rE   r>   	  s
   
c                       s   e Zd ZedZddgZ fddZ fddZdd	 Z fd
dZ	dd Z
dd Z fddZd fdd	Zdd Zdd Z  ZS )r$   zRaw binary dataNr  c                    s<   | dd t j|| | jd k	r8| jt| j d S )Nrf   F)r  r   r   rb   r   r   rM  r  r   rD   rE   r   !	  s    
zBinaryField.__init__c                    s   t  jf ||  S rG   )r   r   _check_str_default_valuer   r   rD   rE   r   '	  s    zBinaryField.checkc                 C   s*   |   r&t| jtr&tjd| ddgS g S )NzDBinaryField's default cannot be a string. Use bytes content instead.zfields.E170r   )r  rj   re   r   r	   r   rY   rD   rD   rE   r  *	  s    z$BinaryField._check_str_default_valuec                    s4   t   \}}}}| jr"d|d< n|d= ||||fS )NTrf   )r   r   rf   r   r   rD   rE   r   6	  s
    
zBinaryField.deconstructc                 C   s   dS )Nr$   rD   rY   rD   rD   rE   r   >	  s    zBinaryField.get_internal_typec                 C   s   |j |S rG   )r   Zbinary_placeholder_sql)rZ   r   r   r   rD   rD   rE   get_placeholderA	  s    zBinaryField.get_placeholderc                    s2   |   rt| js| jS t  }|dkr.dS |S )NrF   r  )r  r   re   r   r   )rZ   re   r   rD   rE   r   D	  s    
zBinaryField.get_defaultFc                    s(   t  |||}|d k	r$|j|S |S rG   )r   r  ZDatabaseBinaryr  r   rD   rE   r  L	  s    zBinaryField.get_db_prep_valuec                 C   s   t | |dS )z#Binary data is serialized as base64ascii)r   r*  decoder   rD   rD   rE   r+  R	  s    zBinaryField.value_to_stringc                 C   s    t |trtt|dS |S )Nr  )rj   r   
memoryviewr   encoder   rD   rD   rE   r   V	  s    
zBinaryField.to_python)F)rA   rB   rC   rX   r=  r   r   r   r  r   r   r  r   r  r+  r   r?  rD   rD   r   rE   r$   	  s   c                       st   e Zd ZdediZedZdZd fdd	Z fdd	Zd
d Z	 fddZ
dddZdd Z fddZ  ZS )r?   rA  u$   “%(value)s” is not a valid UUID.zUniversally unique identifierFNc                    s   d|d< t  j|f| d S )N    rb   r  )rZ   r_   r   r   rD   rE   r   d	  s    zUUIDField.__init__c                    s$   t   \}}}}|d= ||||fS r  r  r   r   rD   rE   r   h	  s    zUUIDField.deconstructc                 C   s   dS )Nr?   rD   rY   rD   rD   rE   r   m	  s    zUUIDField.get_internal_typec                    s   t  |}| |S rG   rJ  r   r   rD   rE   r  p	  s    zUUIDField.get_prep_valuec                 C   s4   |d krd S t |tjs"| |}|jjr.|S |jS rG   )rj   uuidUUIDr   r   Zhas_native_uuid_fieldhexr  rD   rD   rE   r  t	  s    
zUUIDField.get_db_prep_valuec              	   C   sp   |d k	rlt |tjslt |tr"dnd}ztjf ||iW S  ttfk
rj   tj| jd dd|idY nX |S )NrS  r  rA  r   r   )	rj   r  r  rS  r  r   r
   r   r}   )rZ   r   Z
input_formrD   rD   rE   r   ~	  s    zUUIDField.to_pythonc                    s   t  jf dtji|S r  )r   r9  r   r?   r   r   rD   rE   r9  	  s     zUUIDField.formfield)N)F)rA   rB   rC   rX   r]   r=  r  r   r   r   r  r  r   r9  r?  rD   rD   r   rE   r?   ]	  s    

c                       sf   e Zd ZdZ fddZ fddZdd Z fdd	Zd
d ZdddZ	 fddZ
dd Z  ZS )AutoFieldMixinTc                    s   d|d< t  j|| d S )NTrU   r  r  r   rD   rE   r   	  s    zAutoFieldMixin.__init__c                    s   t  jf ||  S rG   )r   r   _check_primary_keyr   r   rD   rE   r   	  s    zAutoFieldMixin.checkc                 C   s    | j stjd| ddgS g S d S )Nz%AutoFields must set primary_key=True.zfields.E100r   )ra   r	   r   rY   rD   rD   rE   r  	  s    z!AutoFieldMixin._check_primary_keyc                    s,   t   \}}}}|d= d|d< ||||fS )NrU   Tra   r  r   r   rD   rE   r   	  s    zAutoFieldMixin.deconstructc                 C   s   d S rG   rD   r   rD   rD   rE   r   	  s    zAutoFieldMixin.validateFc                 C   s   |s|  |}|j|}|S rG   )r  r   Zvalidate_autopk_valuer  rD   rD   rE   r  	  s    
z AutoFieldMixin.get_db_prep_valuec                    s6   |j jrtd|j j t j||f| | |j _d S )Nz7Model %s can't have more than one auto-generated field.)rH   Z
auto_fieldAssertionErrorr   r   r  r  r   rD   rE   r  	  s    
z"AutoFieldMixin.contribute_to_classc                 K   s   d S rG   rD   r   rD   rD   rE   r9  	  s    zAutoFieldMixin.formfield)F)rA   rB   rC   r  r   r   r  r   r   r  r  r9  r?  rD   rD   r   rE   r  	  s   
r  c                       s8   e Zd ZdZedd Z fddZ fddZ  ZS )AutoFieldMetaa  
    Metaclass to maintain backward inheritance compatibility for AutoField.

    It is intended that AutoFieldMixin become public API when it is possible to
    create a non-integer automatically-generated field using column defaults
    stored in the database.

    In many areas Django also relies on using isinstance() to check for an
    automatically-generated field as a subclass of AutoField. A new flag needs
    to be implemented on Field to be used instead.

    When these issues have been addressed, this metaclass could be used to
    deprecate inheritance from AutoField and use of isinstance() with AutoField
    for detecting automatically-generated fields.
    c                 C   s   t tfS rG   )r"   r:   rY   rD   rD   rE   _subclasses	  s    zAutoFieldMeta._subclassesc                    s   t || jpt |S rG   )rj   r  r   __instancecheck__r   r   rD   rE   r  	  s    zAutoFieldMeta.__instancecheck__c                    s   t || jpt |S rG   )r  r  r   __subclasscheck__)rZ   subclassr   rD   rE   r  	  s    zAutoFieldMeta.__subclasscheck__)	rA   rB   rC   r:  r<  r  r  r  r?  rD   rD   r   rE   r  	  s
   
r  c                   @   s   e Zd Zdd Zdd ZdS )r    c                 C   s   dS )Nr    rD   rY   rD   rD   rE   r   	  s    zAutoField.get_internal_typec                 C   s   t  j|dS Nr  )r3   r   r   rD   rD   rE   r   	  s    zAutoField.rel_db_typeNrA   rB   rC   r   r   rD   rD   rD   rE   r    	  s   )	metaclassc                   @   s   e Zd Zdd Zdd ZdS )r"   c                 C   s   dS )Nr"   rD   rY   rD   rD   rE   r   	  s    zBigAutoField.get_internal_typec                 C   s   t  j|dS r  )r#   r   r   rD   rD   rE   r   	  s    zBigAutoField.rel_db_typeNr  rD   rD   rD   rE   r"   	  s   c                   @   s   e Zd Zdd Zdd ZdS )r:   c                 C   s   dS )Nr:   rD   rY   rD   rD   rE   r   	  s    z SmallAutoField.get_internal_typec                 C   s   t  j|dS r  )r;   r   r   rD   rD   rE   r   	  s    zSmallAutoField.rel_db_typeNr  rD   rD   rD   rE   r:   	  s   )bcollections.abcrk   r   rt  r  r%  r  r  base64r   r   	functoolsr   r   Zdjangor   Zdjango.appsr   Zdjango.confr   Zdjango.corer	   r
   r   Z	django.dbr   r   r   Zdjango.db.models.constantsr   Zdjango.db.models.query_utilsr   r   Zdjango.utilsr   Zdjango.utils.datastructuresr   Zdjango.utils.dateparser   r   r   r   Zdjango.utils.durationr   r   Zdjango.utils.functionalr   r   Zdjango.utils.ipv6r   Zdjango.utils.itercompatr   Zdjango.utils.textr   Zdjango.utils.translationr   rX   __all__r-   r4   r!   rM   rP   rQ   r.   r%   r&   r'   r_  r(   r)   r*   r+   r,   r/   r0   r3   r#   r;   r2   r1   r5   r  r6   r7   r8   r9   r<   r=   r>   r$   r?   r  r   r  r    r"   r:   rD   rD   rD   rE   <module>   s                                 l.]    <@(WP!@ @54		