U
    |e                     @   s8  d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZm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mZmZmZ dd
lmZmZ ddlmZ ddlmZ  dZ!dZ"d>ddZ#d?ddZ$dd Z%d@ddddZ&G dd dZ'G dd deZ(G dd dee	Z)G d d! d!e)e(d"Z*e*dddddddddf
d#d$Z+G d%d& d&ee	Z,e*de,d'd(d(ddddd(dddddd(ddddd(fd)d*Z-G d+d, d,e,Z.dAd-d.Z/e*e.dddd/d(ddddd(dddddd(ddddd(fd0d1Z0G d2d3 d3eZ1G d4d5 d5Z2G d6d7 d7Z3G d8d9 d9eZ4G d:d; d;e4Z5d<d= Z6dS )Bz[
Helper functions for creating Form classes from Django models
and database field objects.
    )chain)NON_FIELD_ERRORS
FieldErrorImproperlyConfiguredValidationError)
AltersData)ChoiceFieldField)BaseFormDeclarativeFieldsMetaclass)BaseFormSetformset_factory)	ErrorList)HiddenInputMultipleHiddenInputRadioSelectSelectMultiple)capfirstget_text_listgettext)gettext_lazy)	ModelFormBaseModelFormmodel_to_dictfields_for_modelModelChoiceFieldModelMultipleChoiceField
ALL_FIELDSBaseModelFormSetmodelformset_factoryBaseInlineFormSetinlineformset_factorymodelform_factory__all__Nc           	      C   s   ddl m} |j}| j}g }|jD ]}|jr"t||js"|j|krDq"|dk	rX|j|krXq"|rh|j|krhq"|	 r| |j j
j| j| j| |jr||j| |j j
jkrq"t||jr|| q"||||j  q"|D ]}||||j  q|S )z
    Construct and return a model instance from the bound ``form``'s
    ``cleaned_data``, but do not save the returned instance to the database.
    r   )modelsN)	django.dbr%   _metacleaned_datafieldseditable
isinstance	AutoFieldnamehas_defaultfieldwidgetvalue_omitted_from_datadatafiles
add_prefixgetempty_values	FileFieldappendsave_form_data)	forminstancer)   excluder%   optsr(   Zfile_field_listf r?   P/var/www/website-v5/atlas_env/lib/python3.8/site-packages/django/forms/models.pyconstruct_instance.   sB    

  
rA   c                 C   sh   | j }i }t|j|j|jD ]F}t|dds.q|dk	rB|j|krBq|rR|j|krRq|| ||j< q|S )a  
    Return a dict containing the data in ``instance`` suitable for passing as
    a Form's ``initial`` keyword argument.

    ``fields`` is an optional list of field names. If provided, return only the
    named.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named from the returned dict, even if they are listed in the ``fields``
    argument.
    r*   FN)r'   r   concrete_fieldsprivate_fieldsmany_to_manygetattrr-   value_from_object)r;   r)   r<   r=   r2   r>   r?   r?   r@   r   ^   s    r   c                 C   s   ddl m}m}m} t| dr|t| dr||  }|r||}t||sL|f |}|||ddM }| j|| jj	j
|| _dS )z=Apply limit_choices_to to the formfield's queryset if needed.r   )ExistsOuterRefQquerysetget_limit_choices_topkrL   N)django.db.modelsrG   rH   rI   hasattrrK   r+   rJ   filtermodelZ_base_manager)	formfieldrG   rH   rI   limit_choices_tocomplex_filterr?   r?   r@   #apply_limit_choices_to_to_formfieldw   s    

rU   Tapply_limit_choices_toc
                   s  i g | j }ddlm   fdd|jD }tt|j||jD ]}t|dds|dk	rB|j	|krBdksx|j	krBt
d|j	| jf qB|dk	r|j	|krqBr|j	krqBi }|r|j	|kr||j	 |d	< |tks|r|j	|krd
|d< |r|j	|kr||j	 |d< |r0|j	|kr0||j	 |d< |rP|j	|krP||j	 |d< |	rp|j	|	krp|	|j	 |d< |dkr|jf |}n t|stdn||f|}|r|
rt| ||j	< qB|j	 qB|rfdd|D S )a4  
    Return a dictionary containing form fields for the given model.

    ``fields`` is an optional list of field names. If provided, return only the
    named fields.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named fields from the returned fields, even if they are listed in the
    ``fields`` argument.

    ``widgets`` is a dictionary of model field names mapped to a widget.

    ``formfield_callback`` is a callable that takes a model field and returns
    a form field.

    ``localized_fields`` is a list of names of fields which should be localized.

    ``labels`` is a dictionary of model field names mapped to a label.

    ``help_texts`` is a dictionary of model field names mapped to a help text.

    ``error_messages`` is a dictionary of model field names mapped to a
    dictionary of error messages.

    ``field_classes`` is a dictionary of model field names mapped to a form
    field class.

    ``apply_limit_choices_to`` is a boolean indicating if limit_choices_to
    should be applied to a field's queryset.
    r   )r	   c                    s   g | ]}t | r|qS r?   )r+   .0r>   )
ModelFieldr?   r@   
<listcomp>   s    
 z$fields_for_model.<locals>.<listcomp>r*   FNzH'%s' cannot be specified for %s model form as it is a non-editable fieldr0   Tlocalizelabel	help_texterror_messages
form_classz1formfield_callback must be a function or callablec                    s,   i | ]$} r| kr|kr| |qS r?   )r5   rX   )r<   
field_dictignoredr?   r@   
<dictcomp>   s      z$fields_for_model.<locals>.<dictcomp>)r'   rN   r	   rC   sortedr   rB   rD   rE   r-   r   __name__r   rR   callable	TypeErrorrU   r8   )rQ   r)   r<   widgetsformfield_callbacklocalized_fieldslabels
help_textsr_   field_classesrW   r=   Zsortable_private_fieldsr>   kwargsrR   r?   )rZ   r<   ra   rb   r@   r      sz    ,





r   c                   @   s   e Zd ZdddZdS )ModelFormOptionsNc                 C   s   t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |d	d | _	t |d
d | _
d S )NrQ   r)   r<   rh   rj   rk   rl   r_   rm   ri   )rE   rQ   r)   r<   rh   rj   rk   rl   r_   rm   ri   )selfoptionsr?   r?   r@   __init__   s    zModelFormOptions.__init__)N)re   
__module____qualname__rr   r?   r?   r?   r@   ro      s   ro   c                       s   e Zd Z fddZ  ZS )ModelFormMetaclassc                    sD  t  | |||}|tfkr |S tt|dd  }|_dD ]:}t||}t|tr:|tkr:d|j	||d }t
|q:|jr4|jd kr|jd krtd| |jtkrd |_t|j|j|j|j|j|j|j|j|j|jdd}	dd	 |	 D }
|
|j}|r&d
}|d||jj	f; }t||	|j n|j}	|	|_|S )NMeta)r)   r<   rj   zP%(model)s.Meta.%(opt)s cannot be a string. Did you mean to type: ('%(value)s',)?)rQ   optvaluez|Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form %s needs updating.FrV   c                 S   s   h | ]\}}|s|qS r?   r?   )rY   kvr?   r?   r@   	<setcomp><  s      z-ModelFormMetaclass.__new__.<locals>.<setcomp>z&Unknown field(s) (%s) specified for %sz, )super__new__r   ro   rE   r'   r+   strr   re   rg   rQ   r)   r<   r   r   rh   ri   rj   rk   rl   r_   rm   items
differencedeclared_fieldsjoinr   updatebase_fields)mcsr-   basesattrs	new_classr=   rw   rx   msgr)   Znone_model_fieldsZmissing_fieldsmessage	__class__r?   r@   r}     s^    

	

zModelFormMetaclass.__new__)re   rs   rt   r}   __classcell__r?   r?   r   r@   ru     s   ru   c                       st   e Zd Zdddddedddddf fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZde_  ZS )r   Nid_%sFc                    s   | j }|jd krtd|	d kr0| | _i }n|	| _t|	|j|j}|d k	rX|| d| _t	 j
|||||||||
|d
 | j D ]}t| qd S )Nz'ModelForm has no model class specified.F)use_required_attributerenderer)r'   rQ   
ValueErrorr;   r   r)   r<   r   _validate_uniquer|   rr   valuesrU   )rp   r2   r3   auto_idprefixinitialerror_classlabel_suffixempty_permittedr;   r   r   r=   Zobject_datarR   r   r?   r@   rr   N  s2    


zBaseModelForm.__init__c                 C   s   t  }| jjjD ]}|j}|| jkr2||j q| jjrT|| jjkrT||j q| jjrv|| jjkrv||j q|| jkr||j q| j| }| j	|}|j
s|js||jkr||j q|S )z
        For backwards-compatibility, exclude several types of fields from model
        validation. See tickets #12507, #12521, #12553.
        )setr;   r'   r)   r-   addr<   _errorsr(   r5   blankrequiredr6   )rp   r<   r>   r/   Z
form_fieldfield_valuer?   r?   r@   _get_validation_exclusions|  s*    

	
z(BaseModelForm._get_validation_exclusionsc                 C   s   d| _ | jS )NT)r   r(   rp   r?   r?   r@   clean  s    zBaseModelForm.cleanc                 C   s   | j }t|dr|j}nt|i}| D ]p\}}|tkrT|jrTt|jkrT|jt }n|| jkr(| j| j}nq(|D ]$}t|trr|j	|krr||j	 |_
qrq(| d | d S )N
error_dict)r'   rO   r   r   r   r_   r)   r+   r   coder   	add_error)rp   errorsr=   r   r/   messagesr_   r   r?   r?   r@   _update_errors  s,    

zBaseModelForm._update_errorsc              
   C   s   | j }|  }| j D ]\}}t|tr|| qzt| | j|j|j	| _W n, t
k
r| } z| | W 5 d }~X Y nX z| jj|dd W n, t
k
r } z| | W 5 d }~X Y nX | jr|   d S )NF)r<   validate_unique)r'   r   r)   r   r+   InlineForeignKeyFieldr   rA   r;   r<   r   r   
full_cleanr   r   )rp   r=   r<   r-   r/   er?   r?   r@   _post_clean  s(    	
   
zBaseModelForm._post_cleanc              
   C   sL   |   }z| jj|d W n, tk
rF } z| | W 5 d}~X Y nX dS )z
        Call the instance's validate_unique() method and update the form's
        validation errors if any were raised.
        )r<   N)r   r;   r   r   r   )rp   r<   r   r?   r?   r@   r     s
    zBaseModelForm.validate_uniquec                 C   s   | j }| jj}| jj}| jj}t|j|jD ]N}t|ds<q,|rL|j	|krLq,|r\|j	|kr\q,|j	|kr,|
| j||j	  q,dS )zS
        Save the many-to-many fields and generic relations for this form.
        r9   N)r(   r'   r<   r)   r;   r   rD   rC   rO   r-   r9   )rp   r(   r<   r)   r=   r>   r?   r?   r@   	_save_m2m  s    

zBaseModelForm._save_m2mTc                 C   sP   | j r*td| jjj| jjjr dndf |rB| j  |   n| j| _	| jS )z
        Save this form's self.instance object if commit=True. Otherwise, add
        a save_m2m() method to the form which can be called after the instance
        is saved manually at a later time. Return the model instance.
        z8The %s could not be %s because the data didn't validate.createdchanged)
r   r   r;   r'   object_name_stateaddingsaver   save_m2m)rp   commitr?   r?   r@   r     s    

zBaseModelForm.save)T)re   rs   rt   r   rr   r   r   r   r   r   r   r   alters_datar   r?   r?   r   r@   r   M  s(   .-! 
r   c                   @   s   e Zd ZdS )r   N)re   rs   rt   r?   r?   r?   r@   r   )  s   r   )	metaclassc                 C   s  d| i}|dk	r||d< |dk	r(||d< |dk	r8||d< |dk	rH||d< |dk	rX||d< |dk	rh||d< |	dk	rx|	|d	< |
dk	r|
|d
< t |dr|jfnd}td||}|rt||_| jd }d|i}t|dddkrt|dddkrtdt|||f|S )al  
    Return a ModelForm containing form fields for the given model. You can
    optionally pass a `form` argument to use as a starting point for
    constructing the ModelForm.

    ``fields`` is an optional list of field names. If provided, include only
    the named fields in the returned fields. If omitted or '__all__', use all
    fields.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named fields from the returned fields, even if they are listed in the
    ``fields`` argument.

    ``widgets`` is a dictionary of model field names mapped to a widget.

    ``localized_fields`` is a list of names of fields which should be localized.

    ``formfield_callback`` is a callable that takes a model field and returns
    a form field.

    ``labels`` is a dictionary of model field names mapped to a label.

    ``help_texts`` is a dictionary of model field names mapped to a help text.

    ``error_messages`` is a dictionary of model field names mapped to a
    dictionary of error messages.

    ``field_classes`` is a dictionary of model field names mapped to a form
    field class.
    rQ   Nr)   r<   rh   rj   rk   rl   r_   rm   rv   r?   FormzZCalling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.)rO   rv   typestaticmethodri   re   rE   r   )rQ   r:   r)   r<   ri   rh   rj   rk   rl   r_   rm   r   r   rv   
class_nameZform_class_attrsr?   r?   r@   r#   -  s8    0

 r#   c                       s   e Zd ZdZdZdZe Zd+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dZd-ddZd.ddZd/ddZde_dd Zdd Zdd  Zd!d" Zd#d$ Zd0d%d&Zd1d'd(Z fd)d*Z  ZS )2r   zO
    A ``FormSet`` for editing a queryset and/or adding new objects to it.
    NFr   )r   c                   s,   || _ || _t jf ||||d| d S )N)r2   r3   r   r   )rJ   initial_extrar|   rr   )rp   r2   r3   r   r   rJ   r   rn   r   r?   r@   rr     s    zBaseModelFormSet.__init__c                    s   | j st|  S t  S )z=Return the number of forms that are required in this FormSet.)is_boundlenget_querysetr|   initial_form_countr   r   r?   r@   r     s    z#BaseModelFormSet.initial_form_countc                 C   s*   t | dsdd |  D | _| j|S )N_object_dictc                 S   s   i | ]}|j |qS r?   rM   rY   or?   r?   r@   rc     s      z5BaseModelFormSet._existing_object.<locals>.<dictcomp>)rO   r   r   r5   )rp   rL   r?   r?   r@   _existing_object  s    
z!BaseModelFormSet._existing_objectc                 C   s   |j dk	r|j  }q |jS )z
        If the field is a related field, fetch the concrete field's (that
        is, the ultimate pointed-to field's) to_python.
        N)remote_fieldget_related_field	to_pythonrp   r/   r?   r?   r@   _get_to_python  s    
zBaseModelFormSet._get_to_pythonc                    s  ||   k }|r| jrd| || jjjjf }z| j| }W n tk
rR   Y qX | 	| jjj}z||}W n t
k
r   Y qX | ||d< q|  | |d< n6| jrz| j||     |d< W n tk
r   Y nX t j|f|}|rd|j| jjjj _|S )Nz%s-%sr;   r   T)r   r   r4   rQ   r'   rL   r-   r2   KeyErrorr   r   r   r   r   
IndexErrorr|   _construct_formr)   r   )rp   irn   Zpk_requiredZpk_keyrL   r   r:   r   r?   r@   r     s0    z BaseModelFormSet._construct_formc                 C   sL   t | dsF| jd k	r| j}n| jj }|js@|| jjjj	}|| _
| j
S )N	_queryset)rO   rJ   rQ   _default_managerr   Zorderedorder_byr'   rL   r-   r   )rp   qsr?   r?   r@   r     s    

zBaseModelFormSet.get_querysetTc                 C   s   |j |dS )z8Save and return a new model instance for the given form.r   r   rp   r:   r   r?   r?   r@   save_new  s    zBaseModelFormSet.save_newc                 C   s   |j |dS )z>Save and return an existing model instance for the given form.r   r   )rp   r:   r;   r   r?   r?   r@   save_existing  s    zBaseModelFormSet.save_existingc                 C   s   |r|   dS )z#Deletes an existing model instance.N)delete)rp   objr   r?   r?   r@   delete_existing  s    z BaseModelFormSet.delete_existingc                    sD   |sg  _  fdd}| _ jr, |S  | | S dS )z
        Save model instances for every form, adding and changing instances
        as necessary, and return the list of instances.
        c                     s    j D ]} |   qd S N)saved_formsr   )r:   r   r?   r@   r     s    
z'BaseModelFormSet.save.<locals>.save_m2mN)r   r   	edit_onlysave_existing_objectssave_new_objects)rp   r   r   r?   r   r@   r      s    
zBaseModelFormSet.savec                 C   s   |    d S r   )r   r   r?   r?   r@   r     s    zBaseModelFormSet.cleanc                    s  t  }t  }jfddjD }|D ]4   } jj|dd\}}|| || q*g }|D ]\}}	t  }
|D ]  fdd|	D }tdd |D }|rzd |krz||
kr|	|	 j
 gjd jt< |	D ]}| jkr j|= q|
| qzqh|D ]}t  }
|\}}}}|D ]  jr. j| d k	r. j| d k	r.|d	kr j| }|j|j|jf}nt j| |f} j| f| }||
kr|| j
 gjd jt<  j|= |
| q.q|r t|d S )
Nc                    s    g | ]}|  r| kr|qS r?   )is_valid)rY   r:   )forms_to_deleter?   r@   r[     s    z4BaseModelFormSet.validate_unique.<locals>.<listcomp>T)r<   Zinclude_meta_constraintsc                 3   s0   | ](}| j kr|jkr|n j | V  qd S r   )r(   unique_fieldsrY   r/   )r:   rp   r?   r@   	<genexpr>1  s   
z3BaseModelFormSet.validate_unique.<locals>.<genexpr>c                 s   s6   | ].}t |d r| nt|tr*t|n|V  qdS )_get_pk_valN)rO   r   r+   listtuple)rY   dr?   r?   r@   r   7  s   )r   date)r   deleted_formsformsr   r;   Z_get_unique_checksr   r   r8   get_unique_error_messager   get_form_errorr   r   r   r(   r   yearmonthdayrE   get_date_error_messager   )rp   Zall_unique_checksZall_date_checksZvalid_formsr<   Zunique_checksZdate_checksr   Zuclassunique_checkZ	seen_dataZrow_datar/   
date_checklookupZ
unique_forr   Z	date_datar2   r?   )r:   r   rp   r@   r     sx    








z BaseModelFormSet.validate_uniquec                 C   s>   t |dkr tdd|d i S tddt|tdi S d S )N   z0Please correct the duplicate data for %(field)s.r/   r   zFPlease correct the duplicate data for %(field)s, which must be unique.and)r   r   r   _rp   r   r?   r?   r@   r   t  s      z)BaseModelFormSet.get_unique_error_messagec                 C   s$   t d|d |d t|d d S )NzoPlease correct the duplicate data for %(field_name)s which must be unique for the %(lookup)s in %(date_field)s.      r   )
field_nameZ
date_fieldr   )r   r~   )rp   r   r?   r?   r@   r     s    
z'BaseModelFormSet.get_date_error_messagec                 C   s   t dS )Nz*Please correct the duplicate values below.r   r   r?   r?   r@   r     s    zBaseModelFormSet.get_form_errorc                 C   s   g | _ g | _| jsg S g }| j}| jD ]z}|j}|jd kr<q&||kr`| j| | j||d q&| r&| j ||j	f || j
|||d |s&| j| q&|S Nr   )Zchanged_objectsZdeleted_objectsinitial_formsr   r;   rL   r8   r   has_changedchanged_datar   r   )rp   r   Zsaved_instancesr   r:   r   r?   r?   r@   r     s&    

z&BaseModelFormSet.save_existing_objectsc                 C   sZ   g | _ | jD ]F}| sq| jr,| |r,q| j | j||d |s| j| q| j S r   )Znew_objectsextra_formsr   
can_delete_should_delete_formr8   r   r   )rp   r   r:   r?   r?   r@   r     s    
z!BaseModelFormSet.save_new_objectsc           	         s(  ddl m m}m} | jjj | _} fdd|sH|j|j	kr|j
rf|jjjr\dn|jj}n:z |dk	r|  | j}nd}W n tk
r   d}Y nX t|||fr|jjj }n| jj }||jjj}|jjr|jj| jjt}nt}t||d|d|j	| jj< t || dS )z0Add a hidden field for the object's primary key.r   )r,   
ForeignKeyOneToOneFieldc                    s6   | j  p4| jp4t|  p4| jo4| jjo4| jjjjS r   )r*   auto_createdr+   r   parent_linkrQ   r'   rL   rM   r,   pk_is_not_editabler?   r@   r    s    z7BaseModelFormSet.add_fields.<locals>.pk_is_not_editableNF)r   r   r0   )rN   r,   r  r  rQ   r'   rL   	_pk_fieldr-   r)   r   r;   r   r   r   r   r+   r   r   usingdbrh   r5   r   r   r|   
add_fields)	rp   r:   indexr  r  rL   Zpk_valuer   r0   r   r  r@   r    s4    
   zBaseModelFormSet.add_fields)NNr   NN)T)T)T)T)T)T)re   rs   rt   __doc__rQ   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r?   r?   r   r@   r     s<        	"



]


r   r   Fc                 C   s   t |dd}t |d|dkr4t |d|	dkr4tdt| |||	||
|||||d}t||||||||||||d}| |_||_|S )z8Return a FormSet class for the given Django model class.rv   Nr)   r<   z]Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited.)
r:   r)   r<   ri   rh   rj   rk   rl   r_   rm   )
extramin_nummax_num	can_orderr  validate_minvalidate_maxabsolute_maxcan_delete_extrar   )rE   r   r#   r   rQ   r   )rQ   r:   ri   formsetr  r  r  r  r)   r<   rh   r  rj   rk   rl   r_   r  r  rm   r  r  r   r   metaFormSetr?   r?   r@   r      sL    r    c                       sl   e Zd ZdZd fdd	Z fddZ fdd	Zed
d Zd fdd	Z	 fddZ
 fddZ  ZS )r!   z0A formset for child objects related to a parent.NFc           	         s   |d kr| j j | _n|| _|| _|d kr4| jj}| jjd k	rX|jf | j j| ji}n|	 }| j jh| _
t j||f||d| | jjjr| j j| jjjkrt| jjjtrt| jjj| jj_| jjj| j j d S )N)r   rJ   )fkr   rQ   r;   save_as_newr   rL   rP   r-   noner   r|   rr   r:   r'   r)   r+   r   r   r8   )	rp   r2   r3   r;   r  r   rJ   rn   r   r   r?   r@   rr   2  s    
zBaseInlineFormSet.__init__c                    s   | j r
dS t  S )Nr   )r  r|   r   r   r   r?   r@   r   Q  s    z$BaseInlineFormSet.initial_form_countc                    s   t  j|f|}| jrlt|jdd }|d k	r4d|j_d |j|| jj< d |j|| j	j< |d k	rl||j_| j
j}| j	jj| j	jjjjjkrt| j
| j	jj}t|d|}t|j
| j	 | |S )N_mutableTrL   )r|   r   r  rE   r2   r  r4   r	  r-   r  r;   rL   r   r   rQ   r'   setattrget_attname)rp   r   rn   r:   mutableZfk_valuer   r?   r@   r   V  s    z!BaseInlineFormSet._construct_formc                 C   s   | j jj| jdddS )N)rQ   + )r  r   Zget_accessor_namerQ   replace)clsr?   r?   r@   get_default_prefixm  s    z$BaseInlineFormSet.get_default_prefixTc                    s$   t |j| jj| j t j||dS r   )r  r;   r  r-   r|   r   r   r   r?   r@   r   q  s    zBaseInlineFormSet.save_newc                    s   t  || | j| jkr,| jj}ddi}n(| jj}dt|j|dt| jj	i}| jj
j| jj
jjjjkr|| jj
j|d< | jjjr|dd k	r| jj|d }n
| jjj}| rt| j|jd  t| jf||j|< d S )Npk_fieldTr]   to_field)r|   r  r	  r  r-   rE   r)   r5   r   verbose_namer   r   rQ   r'   rL   r;   r   r   	get_fieldr.   r  attnamer   )rp   r:   r  r-   rn   r'  r   r?   r@   r  x  s*    
 
  
	

zBaseInlineFormSet.add_fieldsc                    s    fdd|D }t  |S )Nc                    s   g | ]}| j jkr|qS r?   )r  r-   r   r   r?   r@   r[     s      z>BaseInlineFormSet.get_unique_error_message.<locals>.<listcomp>)r|   r   r   r   r   r@   r     s    z*BaseInlineFormSet.get_unique_error_message)NNNFNN)T)re   rs   rt   r  rr   r   r   classmethodr%  r   r  r   r   r?   r?   r   r@   r!   /  s         
!r!   c                    s@  ddl m  |j}rfdd|jD }t|dkr|d }j t| r|jjjj	rn|jjjj
ks|jjjj	s|jjkr|jjkrtdjjf n|std|jjf nzj  fdd|jD }t|dkr|d }nB|s$|r
d	S td
|jjjjf ntd|jjjjf |S )aD  
    Find and return the ForeignKey from model to parent if there is one
    (return None if can_fail is True and no such field exists). If fk_name is
    provided, assume it is the name of the ForeignKey field. Unless can_fail is
    True, raise an exception if there isn't a ForeignKey from model to
    parent_model.
    r   )r  c                    s   g | ]}|j  kr|qS r?   )r-   rX   fk_namer?   r@   r[     s     
 z$_get_foreign_key.<locals>.<listcomp>r   z)fk_name '%s' is not a ForeignKey to '%s'.z'%s' has no field named '%s'.c                    sN   g | ]F}t | r|jjksF|jjksF|jjjjr|jjjjkr|qS r?   )r+   r   rQ   r'   proxyproxy_for_modelrX   )r  parent_listparent_modelr?   r@   r[     s   
Nz'%s' has no ForeignKey to '%s'.zR'%s' has more than one ForeignKey to '%s'. You must specify a 'fk_name' attribute.)rN   r  r'   r)   r   get_parent_listr+   r   rQ   r.  r/  r   r]   )r1  rQ   r-  Zcan_failr=   Zfks_to_parentr  r?   )r  r-  r0  r1  r@   _get_foreign_key  sh    	

	






r3  r   c                 C   s`   t | ||d}|jrd}
|||||	|||||
||||||||||||d}t|f|}||_|S )z
    Return an ``InlineFormSet`` for the given kwargs.

    ``fk_name`` must be provided if ``model`` has more than one ``ForeignKey``
    to ``parent_model``.
    r,  r   )r:   ri   r  r  r  r  r)   r<   r  r  rh   r  r  rj   rk   rl   r_   rm   r  r  r   r   )r3  uniquer    r  )r1  rQ   r:   r  r-  r)   r<   r  r  r  r  ri   rh   r  rj   rk   rl   r_   r  r  rm   r  r  r   r   r  rn   r  r?   r?   r@   r"     s:    !r"   c                       sH   e Zd ZdZeZdediZddd fdd
Zd	d
 Z	dd Z
  ZS )r   zw
    A basic integer field that deals with validating the given value to a
    given parent instance in an inline.
    invalid_choicez3The inline value did not match the parent instance.FN)r&  r'  c                   s\   || _ || _|| _| j d k	rB| jr6t| j | j|d< n| j j|d< d|d< t j|| d S )Nr   Fr   )parent_instancer&  r'  rE   rL   r|   rr   )rp   r6  r&  r'  argsrn   r   r?   r@   rr   =  s    
zInlineForeignKeyField.__init__c                 C   s`   || j kr| jrd S | jS | jr0t| j| j}n| jj}t|t|krZt| jd dd| jS )Nr5  r   )	r6   r&  r6  r'  rE   rL   r~   r   r_   )rp   rx   origr?   r?   r@   r   I  s    
 zInlineForeignKeyField.cleanc                 C   s   dS )NFr?   )rp   r   r2   r?   r?   r@   r   Z  s    z!InlineForeignKeyField.has_changed)re   rs   rt   r  r   r0   r   default_error_messagesrr   r   r   r   r?   r?   r   r@   r   2  s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ModelChoiceIteratorValuec                 C   s   || _ || _d S r   )rx   r;   )rp   rx   r;   r?   r?   r@   rr   _  s    z!ModelChoiceIteratorValue.__init__c                 C   s
   t | jS r   )r~   rx   r   r?   r?   r@   __str__c  s    z ModelChoiceIteratorValue.__str__c                 C   s
   t | jS r   )hashrx   r   r?   r?   r@   __hash__f  s    z!ModelChoiceIteratorValue.__hash__c                 C   s   t |tr|j}| j|kS r   )r+   r;  rx   )rp   otherr?   r?   r@   __eq__i  s    
zModelChoiceIteratorValue.__eq__N)re   rs   rt   rr   r<  r>  r@  r?   r?   r?   r@   r;  ^  s   r;  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ModelChoiceIteratorc                 C   s   || _ |j| _d S r   )r/   rJ   r   r?   r?   r@   rr   p  s    zModelChoiceIterator.__init__c                 c   sH   | j jd k	rd| j jfV  | j}|js.| }|D ]}| |V  q2d S )Nr"  )r/   empty_labelrJ   Z_prefetch_related_lookupsiteratorchoice)rp   rJ   r   r?   r?   r@   __iter__t  s    zModelChoiceIterator.__iter__c                 C   s   | j  | jjd k	rdnd S )Nr   r   )rJ   countr/   rB  r   r?   r?   r@   __len__~  s    zModelChoiceIterator.__len__c                 C   s   | j jd k	p| j S r   )r/   rB  rJ   existsr   r?   r?   r@   __bool__  s    zModelChoiceIterator.__bool__c                 C   s   t | j||| j|fS r   )r;  r/   prepare_valuelabel_from_instancerp   r   r?   r?   r@   rD    s    
zModelChoiceIterator.choiceN)re   rs   rt   rr   rE  rG  rI  rD  r?   r?   r?   r@   rA  o  s
   
rA  c                
       s   e Zd ZdZdediZeZdddddddddd		d
dZdd Z	 fddZ
dd Zdd ZeeeZdd Zdd ZeeejZ fddZdd Zdd Zdd Z  ZS ) r   z1A ChoiceField whose choices are a model QuerySet.r5  zGSelect a valid choice. That choice is not one of the available choices.z	---------TNr"  F)	rB  r   r0   r]   r   r^   to_field_namerS   r   c       	         K   s^   t j| f|||||d| |r*|d k	s:t| jtrB|
sBd | _n|| _|| _|	| _|| _d S )N)r   r0   r]   r   r^   )	r	   rr   r+   r0   r   rB  rJ   rS   rM  )rp   rJ   rB  r   r0   r]   r   r^   rM  rS   r   rn   r?   r?   r@   rr     s*    	
zModelChoiceField.__init__c                 C   s   t | jr|  S | jS )z
        Return ``limit_choices_to`` for this form field.

        If it is a callable, invoke it and return the result.
        )rf   rS   r   r?   r?   r@   rK     s    
z%ModelChoiceField.get_limit_choices_toc                    s*   t t| |}| jd k	r&| j |_|S r   )r|   r   __deepcopy__rJ   all)rp   memoresultr   r?   r@   rN    s    
zModelChoiceField.__deepcopy__c                 C   s   | j S r   )r   r   r?   r?   r@   _get_queryset  s    zModelChoiceField._get_querysetc                 C   s$   |d krd n|  | _| j| j_d S r   )rO  r   choicesr0   )rp   rJ   r?   r?   r@   _set_queryset  s    zModelChoiceField._set_querysetc                 C   s   t |S )z
        Convert objects into strings and generate the labels for the choices
        presented by this object. Subclasses can override this method to
        customize the display of the choices.
        r~   rL  r?   r?   r@   rK    s    z$ModelChoiceField.label_from_instancec                 C   s   t | dr| jS | | S )N_choices)rO   rV  rC  r   r?   r?   r@   _get_choices  s    
	zModelChoiceField._get_choicesc                    s.   t |dr"| jr|| jS |jS t |S Nr'   )rO   rM  Zserializable_valuerL   r|   rJ  rp   rx   r   r?   r@   rJ    s
    
zModelChoiceField.prepare_valuec              
   C   s   || j krd S z8| jpd}t|| jjr2t||}| jjf ||i}W n8 tt| jjj	fk
r~   t
| jd dd|idY nX |S )NrL   r5  rx   r   params)r6   rM  r+   rJ   rQ   rE   r5   r   rg   DoesNotExistr   r_   )rp   rx   keyr?   r?   r@   r     s    


zModelChoiceField.to_pythonc                 C   s   t | |S r   )r	   validaterY  r?   r?   r@   r^    s    zModelChoiceField.validatec                 C   s@   | j r
dS |d k	r|nd}|d k	r&|nd}t| |t|kS )NFr"  )disabledr~   rJ  )rp   r   r2   initial_value
data_valuer?   r?   r@   r     s
    zModelChoiceField.has_changed)re   rs   rt   r  r   r:  rA  rC  rr   rK   rN  rR  rT  propertyrJ   rK  rW  r   _set_choicesrS  rJ  r   r^  r   r   r?   r?   r   r@   r     s:    $

r   c                       sl   e Zd ZdZeZeZedededdZ	 fddZ
dd	 Zd
d Zdd Z fddZdd Z  ZS )r   z9A MultipleChoiceField whose choices are a model QuerySet.zEnter a list of values.zESelect a valid choice. %(value)s is not one of the available choices.u"   “%(pk)s” is not a valid value.)invalid_listr5  invalid_pk_valuec                    s   t  j|fdd i| d S )NrB  )r|   rr   )rp   rJ   rn   r   r?   r@   rr   #  s    z!ModelMultipleChoiceField.__init__c                 C   s   |sg S t | |S r   )r   _check_valuesrY  r?   r?   r@   r   &  s    z"ModelMultipleChoiceField.to_pythonc                 C   st   |  |}| jr(|s(t| jd ddn| js<|s<| j S t|ttfs\t| jd dd| 	|}| 
| |S )Nr   r8  rd  )rJ  r   r   r_   rJ   r  r+   r   r   rf  run_validators)rp   rx   r   r?   r?   r@   r   +  s    





zModelMultipleChoiceField.cleanc              
      s   | j pd zt|}W n& tk
r<   t| jd ddY nX |D ]L}z| jjf  |i W qB ttfk
r   t| jd dd|idY qBX qB| jjf d  |i} fdd|D }|D ](}t||krt| jd	 d	d
|idq|S )z
        Given a list of possible PK values, return a QuerySet of the
        corresponding objects. Raise a ValidationError if a given value is
        invalid (not a valid PK, not in the queryset, etc.)
        rL   rd  r8  re  rZ  z%s__inc                    s   h | ]}t t| qS r?   )r~   rE   r   r]  r?   r@   r{   W  s     z9ModelMultipleChoiceField._check_values.<locals>.<setcomp>r5  rx   )	rM  	frozensetrg   r   r_   rJ   rP   r   r~   )rp   rx   rL   r   Zpksvalr?   rh  r@   rf  <  s6    
z&ModelMultipleChoiceField._check_valuesc                    sD   t |dr8t|ts8t |ds8t j  fdd|D S t |S )NrE  r'   c                    s   g | ]} |qS r?   r?   )rY   rz   rJ  r?   r@   r[   h  s     z:ModelMultipleChoiceField.prepare_value.<locals>.<listcomp>)rO   r+   r~   r|   rJ  rY  r   rk  r@   rJ  a  s    z&ModelMultipleChoiceField.prepare_valuec                 C   s`   | j r
dS |d krg }|d kr"g }t|t|kr6dS dd | |D }dd |D }||kS )NFTc                 S   s   h | ]}t |qS r?   rU  rY   rx   r?   r?   r@   r{   t  s     z7ModelMultipleChoiceField.has_changed.<locals>.<setcomp>c                 S   s   h | ]}t |qS r?   rU  rl  r?   r?   r@   r{   u  s     )r_  r   rJ  )rp   r   r2   initial_setdata_setr?   r?   r@   r   k  s    z$ModelMultipleChoiceField.has_changed)re   rs   rt   r  r   r0   r   hidden_widgetr   r:  rr   r   r   rf  rJ  r   r   r?   r?   r   r@   r     s   %
r   c                 C   s"   t | do | jjd k	p | jjd k	S rX  )rO   r'   r)   r<   )r`   r?   r?   r@   modelform_defines_fieldsy  s    
rp  )NN)NN)	NNNNNNNNN)NF)7r  	itertoolsr   django.core.exceptionsr   r   r   r   django.db.models.utilsr   django.forms.fieldsr   r	   django.forms.formsr
   r   django.forms.formsetsr   r   django.forms.utilsr   django.forms.widgetsr   r   r   r   django.utils.textr   r   django.utils.translationr   r   r   r$   r   rA   r   rU   r   ro   ru   r   r   r#   r   r    r!   r3  r"   r   r;  rA  r   r   rp  r?   r?   r?   r@   <module>   s   
0
         nI ]
[  d
Go
R
E, 	c