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r°q"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r¢qBˆr²|j	ˆkr²qBi }|rÒ|j	|krÒ||j	 |d	< |tksè|rð|j	|krðd
|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|ƒ�sœtdƒ‚n||f|Ž}|�rÈ|
�r¼t|ƒ |ˆ|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ržtd| ƒ‚|jtkr®d |_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|ƒ qˆd 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||ƒ}|r¸t|ƒ|_| jd }d|i}t|ddƒdkròt|ddƒdkròt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r–d|  |¡| jjjjf }z| j| }W n tk
rR   Y q¦X |  	| jjj¡}z||ƒ}W n t
k
r„   Y q¦X |  |¡|d< qÞ|  ¡ | |d< n6| jrÞz| 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rÜt| jjjtƒrÈt| 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r¬t| 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}| ¡ rÊt| 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rÀtdˆˆjjf ƒ‚n|sÀt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r¼t| 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