U
    }®c˜M  ã                
   @   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
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ddf
dd„Z!dd„ Z"dS )é    )ÚValidationError)ÚForm)ÚBooleanFieldÚIntegerField)Ú	ErrorList)ÚHiddenInputÚNumberInput)Úcached_property)Ú	html_safe)Ú	mark_safe)Úgettext_lazyÚ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‡ 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__© ú9/tmp/pip-unpacked-wheel-7m9rsep5/django/forms/formsets.pyr   "   s
    zManagementForm.__init__c                    s&   t ƒ  ¡ }| td¡ | td¡ |S ©Nr   )r   ÚcleanÚ
setdefaultr   r   )r   Úcleaned_datar   r    r!   r#   ,   s    
zManagementForm.clean)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   Ú__classcell__r    r    r   r!   r      s   
r   c                   @   sz  e Zd ZdZeZdedƒiZddddded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ed,d-„ ƒZd.d/„ Z ed0d1„ ƒZ!d2d3„ Z"d4d5„ Z#d6d7„ Z$d8d9„ Z%d:d;„ Z&d<d=„ Z'd>d?„ Z(d@dA„ Z)dBdC„ Z*edDdE„ ƒZ+dFdG„ Z,dHdI„ Z-dJdK„ Z.dS )Lr   z;
    A collection of instances of the same Form class.
    Úmissing_management_formz“ManagementForm data is missing or has been tampered with. Missing fields: %(field_names)s. You may need to file a bug report if the issue persists.Nzid_%sc	                 C   s¢   |d k	p|d k	| _ |p|  ¡ | _|| _|p,i | _|p6i | _|| _|pFi | _|| _d | _	d | _
i }	tt| ƒjƒD ]}
|	 t|
di ƒ¡ qn|d k	r˜|	 |¡ |	| _d S )NÚdefault_error_messages)Úis_boundÚget_default_prefixÚprefixÚauto_idÚdataÚfilesÚinitialÚform_kwargsÚerror_classÚ_errorsÚ_non_form_errorsÚreversedÚtypeÚ__mro__ÚupdateÚgetattrÚerror_messages)r   r1   r2   r0   r/   r3   r5   r4   r=   ÚmessagesÚclsr    r    r!   r   B   s     



zBaseFormSet.__init__c                 C   s   |   ¡ S ©N©Úas_table©r   r    r    r!   Ú__str__W   s    zBaseFormSet.__str__c                 C   s
   t | jƒS )z5Yield the forms in the order they should be rendered.)ÚiterÚformsrC   r    r    r!   Ú__iter__Z   s    zBaseFormSet.__iter__c                 C   s
   | j | S )zAReturn the form at the given index, based on the rendering order.©rF   ©r   Úindexr    r    r!   Ú__getitem__^   s    zBaseFormSet.__getitem__c                 C   s
   t | jƒS r@   )ÚlenrF   rC   r    r    r!   Ú__len__b   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    rC   r    r    r!   Ú__bool__e   s    zBaseFormSet.__bool__c                 C   sV   | j r$t| j| j| jd�}| ¡  n.t| j| jt|  ¡ t|  	¡ t
| jt| jid�}|S )z4Return the ManagementForm instance for this FormSet.)r0   r/   )r0   r/   r3   )r-   r   r1   r0   r/   Ú
full_cleanr   Útotal_form_countr   Úinitial_form_countr   Úmin_numr   Úmax_num©r   Úformr    r    r!   Úmanagement_forml   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-   ÚminrV   r%   r   Úabsolute_maxrQ   ÚmaxrR   ÚextrarS   )r   Úinitial_formsZtotal_formsr    r    r!   rP   {   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-   rV   r%   r   r3   rL   )r   r[   r    r    r!   rQ   Ž   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ÚirC   r    r!   Ú
<listcomp>›   s   ÿz%BaseFormSet.forms.<locals>.<listcomp>)ÚrangerP   rC   r    rC   r!   rF   —   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.
        )r4   ÚcopyrI   r    r    r!   r]       s    zBaseFormSet.get_form_kwargsc                 K   s¬   | j |  |¡| jddœ}| jr2| j|d< | j|d< | jrhd|krhz| 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)r0   r/   r5   Úuse_required_attributer1   r2   r3   TÚempty_permitted)r0   Ú
add_prefixr5   r-   r1   r2   r3   Ú
IndexErrorrQ   rR   r;   rU   Ú
add_fields)r   r`   r   ÚdefaultsrU   r    r    r!   r\   ©   s&    ù	


zBaseFormSet._construct_formc                 C   s   | j d|  ¡ … S )z7Return a list of all the initial forms in this formset.N©rF   rQ   rC   r    r    r!   r[   Å   s    zBaseFormSet.initial_formsc                 C   s   | j |  ¡ d… S )z5Return a list of all the extra forms in this formset.Nrj   rC   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)r0   r/   re   rd   )rU   r0   rf   r]   rh   rT   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    )r%   ©r_   rU   r    r    r!   ra   â   s     z,BaseFormSet.cleaned_data.<locals>.<listcomp>)Úis_validÚAttributeErrorr   r&   rF   rC   r    r    r!   r%   Û   s    zBaseFormSet.cleaned_datac                    sv   ˆ   ¡ rˆ jsg S tˆ dƒsbg ˆ _tˆ jƒD ]4\}}|ˆ  ¡ krJ| ¡ sJq,ˆ  |¡r,ˆ j 	|¡ q,‡ fdd„ˆ jD ƒS )z:Return a list of forms that have been marked for deletion.Ú_deleted_form_indexesc                    s   g | ]}ˆ j | ‘qS r    rH   r^   rC   r    r!   ra   ó   s     z-BaseFormSet.deleted_forms.<locals>.<listcomp>)
rn   Ú
can_deleteÚhasattrrp   Ú	enumeraterF   rQ   Úhas_changedÚ_should_delete_formÚappend)r   r`   rU   r    rC   r!   Údeleted_formsä   s    

zBaseFormSet.deleted_formsc                    sª   ˆ   ¡ rˆ jstdˆ jj ƒ‚tˆ dƒs–g ˆ _tˆ jƒD ]F\}}|ˆ  	¡ krV| 
¡ sVq8ˆ jrhˆ  |¡rhq8ˆ j ||jt f¡ q8d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'Ú	_orderingc                 S   s   | d d krdS d| d fS )Né   )ry   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   rH   r^   rC   r    r!   ra     s     z-BaseFormSet.ordered_forms.<locals>.<listcomp>)rn   Ú	can_orderro   r   r&   rr   rx   rs   rF   rQ   rt   rq   ru   rv   r%   ÚORDERING_FIELD_NAMEÚsort)r   r`   rU   r{   r    rC   r!   Úordered_formsõ   s    
zBaseFormSet.ordered_formsc                 C   s   dS )NrU   r    ©r?   r    r    r!   r.     s    zBaseFormSet.get_default_prefixc                 C   s   | j S r@   )Úordering_widgetr�   r    r    r!   Úget_ordering_widget  s    zBaseFormSet.get_ordering_widgetc                 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)r7   rO   rC   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)r6   rO   rC   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 r@   )rL   )r_   Úform_errorsr    r    r!   Ú	<genexpr>6  s     z0BaseFormSet.total_error_count.<locals>.<genexpr>)rL   r„   Úsumr…   rC   r    r    r!   Útotal_error_count3  s    
ÿzBaseFormSet.total_error_countc                 C   s   |j  td¡S )z7Return whether or not the form was marked for deletion.F)r%   ÚgetÚDELETION_FIELD_NAMErT   r    r    r!   ru   8  s    zBaseFormSet._should_delete_formc                    s6   ˆ j s
dS ˆ j t‡ fdd„ˆ jD ƒƒ}|o4ˆ  ¡  S )z1Return True if every form in self.forms is valid.Fc                    s$   g | ]}ˆ j rˆ  |¡s| ¡ ‘qS r    )rq   ru   rn   rm   rC   r    r!   ra   D  s    
ÿz(BaseFormSet.is_valid.<locals>.<listcomp>)r-   r…   ÚallrF   r„   )r   Zforms_validr    rC   r!   rn   <  s    ÿzBaseFormSet.is_validc              
      sŒ  g ˆ _ ˆ  ¡ ˆ _d}ˆ jsdS ˆ j ¡ sdtˆ jd dd ‡ fdd„ˆ jj	D ƒ¡idd�}ˆ j 
|¡ tˆ jƒD ]H\}}| ¡ s’|ˆ  ¡ kr’|d	7 }|j	}ˆ jrªˆ  |¡rªqnˆ j  
|¡ qnzœˆ jrØˆ  ¡ tˆ jƒ ˆ jksìˆ jjt ˆ jk�rttd
dˆ jƒˆ j dd�‚ˆ j�rJˆ  ¡ tˆ jƒ | ˆ jk �rJttddˆ jƒˆ j dd�‚ˆ  ¡  W n2 tk
�r† } zˆ  |j¡ˆ _W 5 d}~X Y nX dS )ze
        Clean all of self.data and populate self._errors and
        self._non_form_errors.
        r   Nr+   Úfield_namesz, c                 3   s   | ]}ˆ j  |¡V  qd S r@   )rV   rf   )r_   Ú
field_namerC   r    r!   r‡   Z  s   ÿz)BaseFormSet.full_clean.<locals>.<genexpr>)ÚparamsÚcodery   zPlease submit at most %d form.zPlease submit at most %d forms.Ztoo_many_forms)r�   zPlease submit at least %d form.z Please submit at least %d forms.Ztoo_few_forms)r6   r5   r7   r-   rV   rn   r   r=   Újoinr…   rv   rs   rF   rt   rQ   rq   ru   Úvalidate_maxrP   rL   rw   rS   r%   r   rX   r   Úvalidate_minrR   r#   Z
error_list)r   Zempty_forms_countÚerrorr`   rU   r†   Úer    rC   r!   rO   J  sj    

 þÿø
ÿþ þþýÿ þþý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    rC   r    r    r!   r#   �  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 r@   )rt   rm   r    r    r!   r‡   Œ  s     z*BaseFormSet.has_changed.<locals>.<genexpr>)ÚanyrC   r    r    r!   rt   Š  s    zBaseFormSet.has_changedc                 C   sŒ   |   ¡ }| jr^|dk	rB||k rBttdƒ|d d|  ¡ d�|jt< nttdƒd|  ¡ d�|jt< | jrˆ| jsr||k rˆt	tdƒdd�|jt
< dS )	z8A hook for adding extra fields on to each form instance.NZOrderry   F)Úlabelr3   r   r   )r—   r   r   ZDelete)r—   r   )rQ   r}   r   Ú_rƒ   Úfieldsr~   rq   Úcan_delete_extrar   r‹   )r   rU   rJ   rQ   r    r    r!   rh   Ž  s     üýzBaseFormSet.add_fieldsc                 C   s   d| j |f S )Nz%s-%s)r/   rI   r    r    r!   rf   £  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)rF   Úis_multipartrl   rC   r    r    r!   r›   ¦  s    zBaseFormSet.is_multipartc                 C   s   | j r| j d jS | jjS d S r"   )rF   Úmediarl   rC   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 r@   rA   rm   r    r    r!   r‡   ¾  s     z'BaseFormSet.as_table.<locals>.<genexpr>Ú
©r‘   r   ÚstrrV   ©r   rF   r    r    r!   rB   ¹  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 r@   )Úas_prm   r    r    r!   r‡   Ã  s     z#BaseFormSet.as_p.<locals>.<genexpr>rž   rŸ   r¡   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 r@   )Úas_ulrm   r    r    r!   r‡   È  s     z$BaseFormSet.as_ul.<locals>.<genexpr>rž   rŸ   r¡   r    r    r!   r£   Æ  s    zBaseFormSet.as_ul)/r&   r'   r(   r)   r   r‚   r˜   r,   r   r   rD   rG   rK   rM   rN   r	   rV   rP   rQ   rF   r]   r\   Úpropertyr[   rk   rl   r%   rw   r€   Úclassmethodr.   rƒ   r„   r…   r‰   ru   rn   rO   r#   rt   rh   rf   r›   rœ   rB   r¢   r£   r    r    r    r!   r   5   sv    ÿÿ  þ

	
	





$



7	

r   ry   FNTc                 C   sf   |dkrt }|dkrt}|	dkr(|t }	||	kr8tdƒ‚| ||||
|||	||dœ
}t| jd |f|ƒS )z*Return a FormSet for the given form class.Nz5'absolute_max' must be greater or equal to 'max_num'.)
rU   rZ   r}   rq   rš   rR   rS   rX   r“   r’   ZFormSet)ÚDEFAULT_MIN_NUMÚDEFAULT_MAX_NUMÚ
ValueErrorr9   r&   )rU   ÚformsetrZ   r}   rq   rS   r’   rR   r“   rX   rš   Úattrsr    r    r!   r   Ì  s,    ÿör   c                 C   s   t dd„ | D ƒƒS )z8Validate every formset and return True if all are valid.c                 S   s   g | ]}|  ¡ ‘qS r    )rn   )r_   r©   r    r    r!   ra   ð  s     zall_valid.<locals>.<listcomp>)rŒ   )Zformsetsr    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   r   Zdjango.utils.functionalr	   Zdjango.utils.htmlr
   Zdjango.utils.safestringr   Zdjango.utils.translationr   r˜   r   Ú__all__r   r   r   r   r~   r‹   r¦   r§   r   r   r   r   r    r    r    r!   Ú<module>   sB          ý
!