B
    ©0H[G  ã               @   sà   d dl 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 d dlmZ d dlmZ d d	lmZmZ d
ZdZdZdZdZdZdZd ZdZG dd„ deƒZeG dd„ dƒƒZedddddddfdd„Z dd„ Z!dS )é    )ÚValidationError)ÚForm)ÚBooleanFieldÚIntegerField)Ú	ErrorList)ÚHiddenInput)Úcached_property)Ú	html_safe)Ú	mark_safe)ÚgettextÚngettext)ÚBaseFormSetÚformset_factoryÚ	all_validZTOTAL_FORMSZINITIAL_FORMSZMIN_NUM_FORMSZMAX_NUM_FORMSZORDERÚDELETEiè  c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚManagementFormz±
    Keep track of how many form instances are displayed on the page. If adding
    new forms via JavaScript, you should increment the count field of this form
    as well.
    c                sV   t td�| jt< t td�| jt< t dtd�| jt< t dtd�| jt< tƒ j||Ž d S )N)ÚwidgetF)Úrequiredr   )	r   r   Zbase_fieldsÚTOTAL_FORM_COUNTÚINITIAL_FORM_COUNTÚMIN_NUM_FORM_COUNTÚMAX_NUM_FORM_COUNTÚsuperÚ__init__)ÚselfÚargsÚkwargs)Ú	__class__© úYC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\forms\formsets.pyr   "   s
    zManagementForm.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__r   r   )r   r   r      s   r   c               @   s\  e Zd ZdZdddddedfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
edd„ ƒZdd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZd*d+„ Zed,d-„ ƒZd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d>d?„ Z%ed@dA„ ƒZ&dBdC„ Z'dDdE„ Z(dFdG„ Z)dS )Hr   z;
    A collection of instances of the same Form class.
    Nzid_%sc             C   s`   |d k	p|d k	| _ |p|  ¡ | _|| _|p,i | _|p6i | _|| _|pFi | _|| _d | _	d | _
d S )N)Úis_boundÚget_default_prefixÚprefixÚauto_idÚdataÚfilesÚinitialÚform_kwargsÚerror_classÚ_errorsÚ_non_form_errors)r   r)   r*   r(   r'   r+   r-   r,   r   r   r   r   2   s    


zBaseFormSet.__init__c             C   s   |   ¡ S )N)Úas_table)r   r   r   r   Ú__str__?   s    zBaseFormSet.__str__c             C   s
   t | jƒS )z5Yield the forms in the order they should be rendered.)ÚiterÚforms)r   r   r   r   Ú__iter__B   s    zBaseFormSet.__iter__c             C   s
   | j | S )zAReturn the form at the given index, based on the rendering order.)r3   )r   Úindexr   r   r   Ú__getitem__F   s    zBaseFormSet.__getitem__c             C   s
   t | jƒS )N)Úlenr3   )r   r   r   r   Ú__len__J   s    zBaseFormSet.__len__c             C   s   dS )zt
        Return True since all formsets have a management form which is not
        included in the length.
        Tr   )r   r   r   r   Ú__bool__M   s    zBaseFormSet.__bool__c             C   sf   | j r4t| j| j| jd�}| ¡ sbttdƒdd�‚n.t| j| jt|  	¡ t
|  ¡ t| jt| jid�}|S )z4Return the ManagementForm instance for this FormSet.)r(   r'   z8ManagementForm data is missing or has been tampered withZmissing_management_form)Úcode)r(   r'   r+   )r%   r   r)   r(   r'   Úis_validr   Ú_r   Útotal_form_countr   Úinitial_form_countr   Úmin_numr   Úmax_num)r   Úformr   r   r   Úmanagement_formT   s    

zBaseFormSet.management_formc             C   sx   | j rt| jjt | jƒS |  ¡ }t|| jƒ| j	 }|| j
  krJdkrTn n|}n || j
  krjdkrtn n| j
}|S )z1Return the total number of forms in this FormSet.r   )r%   ÚminrB   Úcleaned_datar   Úabsolute_maxr>   Úmaxr?   Úextrar@   )r   Úinitial_formsZtotal_formsr   r   r   r=   g   s    zBaseFormSet.total_form_countc             C   s*   | j r| jjt S | jr"t| jƒnd}|S )z=Return the number of forms that are required in this FormSet.r   )r%   rB   rD   r   r+   r7   )r   rH   r   r   r   r>   z   s    zBaseFormSet.initial_form_countc                s   ‡ fdd„t ˆ  ¡ ƒD ƒ}|S )z+Instantiate forms at first property access.c                s    g | ]}ˆ j |fˆ  |¡Ž‘qS r   )Ú_construct_formÚget_form_kwargs)Ú.0Úi)r   r   r   ú
<listcomp>‡   s   z%BaseFormSet.forms.<locals>.<listcomp>)Úranger=   )r   r3   r   )r   r   r3   ƒ   s    
zBaseFormSet.formsc             C   s
   | j  ¡ S )z®
        Return additional keyword arguments for each individual formset form.

        index will be None if the form being constructed is a new empty
        form.
        )r,   Úcopy)r   r5   r   r   r   rJ   ‹   s    zBaseFormSet.get_form_kwargsc             K   s¬   | j |  |¡| jddœ}| jr2| j|d< | j|d< | jrhd|krhy| j| |d< W n tk
rf   Y nX ||  ¡ kr†|| j	kr†d|d< | 
|¡ | jf |Ž}|  ||¡ |S )z;Instantiate and return the i-th form instance in a formset.F)r(   r'   r-   Úuse_required_attributer)   r*   r+   TÚempty_permitted)r(   Ú
add_prefixr-   r%   r)   r*   r+   Ú
IndexErrorr>   r?   ÚupdaterA   Ú
add_fields)r   rL   r   ÚdefaultsrA   r   r   r   rI   ”   s$    


zBaseFormSet._construct_formc             C   s   | j d|  ¡ … S )z7Return a list of all the initial forms in this formset.N)r3   r>   )r   r   r   r   rH   °   s    zBaseFormSet.initial_formsc             C   s   | j |  ¡ d… S )z5Return a list of all the extra forms in this formset.N)r3   r>   )r   r   r   r   Úextra_formsµ   s    zBaseFormSet.extra_formsc             C   s8   | j f | j|  d¡dddœ|  d ¡—Ž}|  |d ¡ |S )NZ
__prefix__TF)r(   r'   rQ   rP   )rA   r(   rR   rJ   rU   )r   rA   r   r   r   Ú
empty_formº   s    zBaseFormSet.empty_formc             C   s(   |   ¡ std| jj ƒ‚dd„ | jD ƒS )zX
        Return a list of form.cleaned_data dicts for every form in self.forms.
        z+'%s' object has no attribute 'cleaned_data'c             S   s   g | ]
}|j ‘qS r   )rD   )rK   rA   r   r   r   rM   Í   s    z,BaseFormSet.cleaned_data.<locals>.<listcomp>)r;   ÚAttributeErrorr   r    r3   )r   r   r   r   rD   Æ   s    zBaseFormSet.cleaned_datac                s„   ˆ   ¡ rˆ jsg S tˆ dƒspg ˆ _xLtdˆ  ¡ ƒD ]:}ˆ j| }|ˆ  ¡ krV| ¡ sVq2ˆ  	|¡r2ˆ j 
|¡ q2W ‡ fdd„ˆ jD ƒS )z:Return a list of forms that have been marked for deletion.Ú_deleted_form_indexesr   c                s   g | ]}ˆ j | ‘qS r   )r3   )rK   rL   )r   r   r   rM   ß   s    z-BaseFormSet.deleted_forms.<locals>.<listcomp>)r;   Ú
can_deleteÚhasattrrZ   rN   r=   r3   r>   Úhas_changedÚ_should_delete_formÚappend)r   rL   rA   r   )r   r   Údeleted_formsÏ   s    


zBaseFormSet.deleted_formsc                s¸   ˆ   ¡ rˆ jstdˆ jj ƒ‚tˆ dƒs¤g ˆ _x^tdˆ  ¡ ƒD ]L}ˆ j	| }|ˆ  
¡ krb| ¡ sbq>ˆ jrtˆ  |¡rtq>ˆ j ||jt f¡ q>W dd„ }ˆ jj|d� ‡ fdd„ˆ jD ƒS )	z�
        Return a list of form in the order specified by the incoming data.
        Raise an AttributeError if ordering is not allowed.
        z,'%s' object has no attribute 'ordered_forms'Ú	_orderingr   c             S   s   | d d krdS d| d fS )Né   )rb   r   r   r   )Úkr   r   r   Úcompare_ordering_keyþ   s    z7BaseFormSet.ordered_forms.<locals>.compare_ordering_key)Úkeyc                s   g | ]}ˆ j |d   ‘qS )r   )r3   )rK   rL   )r   r   r   rM     s    z-BaseFormSet.ordered_forms.<locals>.<listcomp>)r;   Ú	can_orderrY   r   r    r\   ra   rN   r=   r3   r>   r]   r[   r^   r_   rD   ÚORDERING_FIELD_NAMEÚsort)r   rL   rA   rd   r   )r   r   Úordered_formsá   s    

zBaseFormSet.ordered_formsc             C   s   dS )NrA   r   )Úclsr   r   r   r&     s    zBaseFormSet.get_default_prefixc             C   s   | j dkr|  ¡  | j S )z¹
        Return an ErrorList of errors that aren't associated with a particular
        form -- i.e., from formset.clean(). Return an empty ErrorList if there
        are none.
        N)r/   Ú
full_clean)r   r   r   r   Únon_form_errors  s    
zBaseFormSet.non_form_errorsc             C   s   | j dkr|  ¡  | j S )z:Return a list of form.errors for every form in self.forms.N)r.   rk   )r   r   r   r   Úerrors  s    
zBaseFormSet.errorsc             C   s    t |  ¡ ƒtdd„ | jD ƒƒ S )z<Return the number of errors across all forms in the formset.c             s   s   | ]}t |ƒV  qd S )N)r7   )rK   Úform_errorsr   r   r   ú	<genexpr>  s    z0BaseFormSet.total_error_count.<locals>.<genexpr>)r7   rl   Úsumrm   )r   r   r   r   Útotal_error_count  s    
zBaseFormSet.total_error_countc             C   s   |j  td¡S )z7Return whether or not the form was marked for deletion.F)rD   ÚgetÚDELETION_FIELD_NAME)r   rA   r   r   r   r^   !  s    zBaseFormSet._should_delete_formc             C   sb   | j s
dS d}| j x>td|  ¡ ƒD ],}| j| }| jrD|  |¡rDq$|| ¡ M }q$W |o`|  ¡  S )z1Return True if every form in self.forms is valid.FTr   )	r%   rm   rN   r=   r3   r[   r^   r;   rl   )r   Zforms_validrL   rA   r   r   r   r;   %  s    
zBaseFormSet.is_validc          
   C   sR  g | _ |  ¡ | _d}| jsdS x`td|  ¡ ƒD ]N}| j| }| ¡ sX||  ¡ krX|d7 }|j	}| j
rp|  |¡rpq.| j  |¡ q.W yš| jr |  ¡ t| jƒ | jks²| jjt | jkrÎttdd| jƒ| j dd�‚| j�r|  ¡ t| jƒ | | jk �rttdd| jƒ| j dd�‚|  ¡  W n2 tk
�rL } z|  |j¡| _W dd}~X Y nX dS )	ze
        Clean all of self.data and populate self._errors and
        self._non_form_errors.
        r   Nrb   z Please submit %d or fewer forms.Ztoo_many_forms)r:   zPlease submit %d or more forms.Ztoo_few_forms)r.   r-   r/   r%   rN   r=   r3   r]   r>   rm   r[   r^   r_   Úvalidate_maxr7   r`   r@   rB   rD   r   rE   r   r   Úvalidate_minr?   ÚcleanZ
error_list)r   Zempty_forms_countrL   rA   rn   Úer   r   r   rk   7  s<    

zBaseFormSet.full_cleanc             C   s   dS )a  
        Hook for doing any extra formset-wide cleaning after Form.clean() has
        been called on every form. Any ValidationError raised by this method
        will not be associated with a particular form; it will be accessible
        via formset.non_form_errors()
        Nr   )r   r   r   r   rv   a  s    zBaseFormSet.cleanc             C   s   t dd„ | D ƒƒS )z5Return True if data in any form differs from initial.c             s   s   | ]}|  ¡ V  qd S )N)r]   )rK   rA   r   r   r   ro   l  s    z*BaseFormSet.has_changed.<locals>.<genexpr>)Úany)r   r   r   r   r]   j  s    zBaseFormSet.has_changedc             C   sn   | j rN|dk	r8||  ¡ k r8ttdƒ|d dd�|jt< nttdƒdd�|jt< | jrjttdƒdd�|jt< dS )z8A hook for adding extra fields on to each form instance.NZOrderrb   F)Úlabelr+   r   )ry   r   ZDelete)	rf   r>   r   r<   Úfieldsrg   r[   r   rs   )r   rA   r5   r   r   r   rU   n  s    zBaseFormSet.add_fieldsc             C   s   d| j |f S )Nz%s-%s)r'   )r   r5   r   r   r   rR   y  s    zBaseFormSet.add_prefixc             C   s"   | j r| j d  ¡ S | j ¡ S dS )zv
        Return True if the formset needs to be multipart, i.e. it
        has FileInput, or False otherwise.
        r   N)r3   Úis_multipartrX   )r   r   r   r   r{   |  s    zBaseFormSet.is_multipartc             C   s   | j r| j d jS | jjS d S )Nr   )r3   ÚmediarX   )r   r   r   r   r|   †  s    zBaseFormSet.mediac             C   s*   d  dd„ | D ƒ¡}tt| jƒd | ƒS )zLReturn this formset rendered as HTML <tr>s -- excluding the <table></table>.ú c             s   s   | ]}|  ¡ V  qd S )N)r0   )rK   rA   r   r   r   ro   ”  s    z'BaseFormSet.as_table.<locals>.<genexpr>Ú
)Újoinr
   ÚstrrB   )r   r3   r   r   r   r0   �  s    zBaseFormSet.as_tablec             C   s*   d  dd„ | D ƒ¡}tt| jƒd | ƒS )z*Return this formset rendered as HTML <p>s.r}   c             s   s   | ]}|  ¡ V  qd S )N)Úas_p)rK   rA   r   r   r   ro   ™  s    z#BaseFormSet.as_p.<locals>.<genexpr>r~   )r   r
   r€   rB   )r   r3   r   r   r   r�   —  s    zBaseFormSet.as_pc             C   s*   d  dd„ | D ƒ¡}tt| jƒd | ƒS )z+Return this formset rendered as HTML <li>s.r}   c             s   s   | ]}|  ¡ V  qd S )N)Úas_ul)rK   rA   r   r   r   ro   ž  s    z$BaseFormSet.as_ul.<locals>.<genexpr>r~   )r   r
   r€   rB   )r   r3   r   r   r   r‚   œ  s    zBaseFormSet.as_ul)*r    r!   r"   r#   r   r   r1   r4   r6   r8   r9   r   rB   r=   r>   r3   rJ   rI   ÚpropertyrH   rW   rX   rD   r`   ri   Úclassmethodr&   rl   rm   rq   r^   r;   rk   rv   r]   rU   rR   r{   r|   r0   r�   r‚   r   r   r   r   r   -   sH   			&
*	
	r   rb   FNc	          
   C   sL   |dkrt }|dkrt}|t }	| ||||||	||dœ	}
t| jd |f|
ƒS )z*Return a FormSet for the given form class.N)	rA   rG   rf   r[   r?   r@   rE   ru   rt   ZFormSet)ÚDEFAULT_MIN_NUMÚDEFAULT_MAX_NUMÚtyper    )rA   ÚformsetrG   rf   r[   r@   rt   r?   ru   rE   Úattrsr   r   r   r   ¢  s    r   c             C   s"   d}x| D ]}|  ¡ s
d}q
W |S )z2Return True if every formset in formsets is valid.TF)r;   )ZformsetsZvalidrˆ   r   r   r   r   ¶  s
    
r   )"Zdjango.core.exceptionsr   Zdjango.formsr   Zdjango.forms.fieldsr   r   Zdjango.forms.utilsr   Zdjango.forms.widgetsr   Zdjango.utils.functionalr   Zdjango.utils.htmlr	   Zdjango.utils.safestringr
   Zdjango.utils.translationr   r<   r   Ú__all__r   r   r   r   rg   rs   r…   r†   r   r   r   r   r   r   r   r   Ú<module>   s2     w