B
    CVvg˜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-install-o3oxmrkh/Django/django/forms/formsets.pyr   "   s
    zManagementForm.__init__c                s&   t ƒ  ¡ }| td¡ | td¡ |S )Nr   )r   ÚcleanÚ
setdefaultr   r   )r   Úcleaned_data)r   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 }	x(tt| ƒjƒD ]}
|	 t|
di ƒ¡ qpW |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   r/   r0   r.   r-   r1   r3   r2   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Úforms)r   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.)rA   )r   Úindexr   r   r    Ú__getitem__^   s    zBaseFormSet.__getitem__c             C   s
   t | jƒS )N)ÚlenrA   )r   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   )r   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.)r.   r-   )r.   r-   r1   )r+   r   r/   r.   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+   ÚminrN   r#   r   Úabsolute_maxrJ   ÚmaxrK   ÚextrarL   )r   Úinitial_formsZtotal_formsr   r   r    rI   {   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+   rN   r#   r   r1   rE   )r   rS   r   r   r    rJ   Ž   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>)ÚrangerI   )r   r   )r   r    rA   —   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.
        )r2   Úcopy)r   rC   r   r   r    rU       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-   r3   Úuse_required_attributer/   r0   r1   TÚempty_permitted)r.   Ú
add_prefixr3   r+   r/   r0   r1   Ú
IndexErrorrJ   rK   r9   rM   Ú
add_fields)r   rW   r   ÚdefaultsrM   r   r   r    rT   ©   s$    


zBaseFormSet._construct_formc             C   s   | j d|  ¡ … S )z7Return a list of all the initial forms in this formset.N)rA   rJ   )r   r   r   r    rS   Å   s    zBaseFormSet.initial_formsc             C   s   | j |  ¡ d… S )z5Return a list of all the extra forms in this formset.N)rA   rJ   )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-   r\   r[   )rM   r.   r]   rU   r_   )r   rM   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#   )rV   rM   r   r   r    rX   â   s    z,BaseFormSet.cleaned_data.<locals>.<listcomp>)Úis_validÚAttributeErrorr   r$   rA   )r   r   r   r    r#   Û   s    zBaseFormSet.cleaned_datac                sz   ˆ   ¡ rˆ jsg S tˆ dƒsfg ˆ _xBtˆ jƒD ]4\}}|ˆ  ¡ krL| ¡ sLq.ˆ  |¡r.ˆ j 	|¡ q.W ‡ 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   )rA   )rV   rW   )r   r   r    rX   ó   s    z-BaseFormSet.deleted_forms.<locals>.<listcomp>)
rc   Ú
can_deleteÚhasattrre   Ú	enumeraterA   rJ   Úhas_changedÚ_should_delete_formÚappend)r   rW   rM   r   )r   r    Údeleted_formsä   s    

zBaseFormSet.deleted_formsc                s®   ˆ   ¡ rˆ jstdˆ jj ƒ‚tˆ dƒsšg ˆ _xTtˆ jƒD ]F\}}|ˆ  	¡ krX| 
¡ sXq:ˆ jrjˆ  |¡rjq:ˆ 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'Ú	_orderingc             S   s   | d d krdS d| d fS )Né   )rn   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   )rA   )rV   rW   )r   r   r    rX     s    z-BaseFormSet.ordered_forms.<locals>.<listcomp>)rc   Ú	can_orderrd   r   r$   rg   rm   rh   rA   rJ   ri   rf   rj   rk   r#   ÚORDERING_FIELD_NAMEÚsort)r   rW   rM   rp   r   )r   r    Úordered_formsõ   s    
zBaseFormSet.ordered_formsc             C   s   dS )NrM   r   )r=   r   r   r    r,     s    zBaseFormSet.get_default_prefixc             C   s   | j S )N)Úordering_widget)r=   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)r5   rH   )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)r4   rH   )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)rE   )rV   Úform_errorsr   r   r    ú	<genexpr>6  s    z0BaseFormSet.total_error_count.<locals>.<genexpr>)rE   rx   Úsumry   )r   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_NAME)r   rM   r   r   r    rj   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   )rf   rj   rc   )rV   rM   )r   r   r    rX   E  s    z(BaseFormSet.is_valid.<locals>.<listcomp>)r+   ry   ÚallrA   rx   )r   Zforms_validr   )r   r    rc   <  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 
|¡ xVtˆ jƒD ]H\}}| ¡ s”|ˆ  ¡ kr”|d	7 }|j	}ˆ jr¬ˆ  |¡r¬qpˆ j  
|¡ qpW yœˆ jrÜˆ  ¡ tˆ jƒ ˆ jksðˆ jjt ˆ jk�rttd
dˆ jƒˆ j dd�‚ˆ j�rNˆ  ¡ tˆ jƒ | ˆ jk �rNttddˆ jƒˆ j dd�‚ˆ  ¡  W n2 tk
�rŠ } 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   Nr)   Úfield_namesz, c             3   s   | ]}ˆ j  |¡V  qd S )N)rN   r]   )rV   Ú
field_name)r   r   r    r{   [  s   z)BaseFormSet.full_clean.<locals>.<genexpr>)ÚparamsÚcodern   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)r4   r3   r5   r+   rN   rc   r   r;   Újoinry   rk   rh   rA   ri   rJ   rf   rj   Úvalidate_maxrI   rE   rl   rL   r#   r   rP   r   Úvalidate_minrK   r!   Z
error_list)r   Zempty_forms_countÚerrorrW   rM   rz   Úer   )r   r    rH   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   )r   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 )N)ri   )rV   rM   r   r   r    r{   Œ  s    z*BaseFormSet.has_changed.<locals>.<genexpr>)Úany)r   r   r   r    ri   Š  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Orderrn   F)Úlabelr1   r   r   )r‹   r   r   ZDelete)r‹   r   )rJ   rr   r   Ú_rw   Úfieldsrs   rf   Úcan_delete_extrar   r   )r   rM   rC   rJ   r   r   r    r_   Ž  s    zBaseFormSet.add_fieldsc             C   s   d| j |f S )Nz%s-%s)r-   )r   rC   r   r   r    r]   £  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)rA   Úis_multipartrb   )r   r   r   r    r�   ¦  s    zBaseFormSet.is_multipartc             C   s   | j r| j d jS | jjS d S )Nr   )rA   Úmediarb   )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)r>   )rV   rM   r   r   r    r{   ¾  s    z'BaseFormSet.as_table.<locals>.<genexpr>Ú
)r…   r   ÚstrrN   )r   rA   r   r   r    r>   ¹  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)rV   rM   r   r   r    r{   Ã  s    z#BaseFormSet.as_p.<locals>.<genexpr>r’   )r…   r   r“   rN   )r   rA   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)rV   rM   r   r   r    r{   È  s    z$BaseFormSet.as_ul.<locals>.<genexpr>r’   )r…   r   r“   rN   )r   rA   r   r   r    r•   Æ  s    zBaseFormSet.as_ul)/r$   r%   r&   r'   r   rv   rŒ   r*   r   r   r?   rB   rD   rF   rG   r	   rN   rI   rJ   rA   rU   rT   ÚpropertyrS   ra   rb   r#   rl   ru   Úclassmethodr,   rw   rx   ry   r}   rj   rc   rH   r!   ri   r_   r]   r�   r�   r>   r”   r•   r   r   r   r    r   5   sR   				%
7	
	r   rn   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'.)
rM   rR   rr   rf   rŽ   rK   rL   rP   r‡   r†   ZFormSet)ÚDEFAULT_MIN_NUMÚDEFAULT_MAX_NUMÚ
ValueErrorr7   r$   )rM   ÚformsetrR   rr   rf   rL   r†   rK   r‡   rP   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   )rc   )rV   r›   r   r   r    rX   ð  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   rs   r   r˜   r™   r   r   r   r   r   r   r   r    Ú<module>   s6      