3
gM              
   @   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__ S/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/forms/formsets.pyr   "   s
    zManagementForm.__init__c                s&   t  j }|jtd |j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_formzManagementForm 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| j | _|| _|p,i | _|p6i | _|| _|pFi | _|| _d | _	d | _
i }	x(tt| jD ]}
|	jt|
di  qpW |d k	r|	j| |	| _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   | j  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}|j  n.t| j| jt| j t| j	 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 | j }t|| j| j	 }|| j
  koHdkn  rT|}n || j
  kohdkn  rt| 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  j D S )z+Instantiate forms at first property access.c                s    g | ]} j |f j|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 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|| jdd}| jr2| j|d< | j|d< | jrhd|krhy| j| |d< W n tk
rf   Y nX || j kr|| j	krd|d< |j
| | jf |}| j|| |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| j  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 | 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| jdddd| jd }| j|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(   | j  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                s    j   s j rg S t dslg  _xDt jD ]6\}}| j krR|j  rRq2 j|r2 jj	| q2W  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    j   s j r"td jj t dsg  _xVt jD ]H\}}| j	 kr^|j
  r^q> jrp j|rpq> j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   r   )rn   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  | 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  | 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 | j 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 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 j  S )z1Return True if every form in self.forms is valid.Fc                s$   g | ]} j o j|s|j 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  _  j  _d} jsdS  jj sdt jd ddj fdd jj	D idd} jj
| xXt jD ]J\}}|j  r| j kr|d	7 }|j	} jr j|rqp j j
| qpW y jrވ j t j  jks jjt  jkrttd
d j j dd jrP j t j |  jk rPttdd j j dd j  W n2 tk
r } z j|j _W Y dd}~X 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 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   | ]}|j  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  }| jr^|dk	rB||k rBttd|d d| j d|jt< nttdd| j d|jt< | jr| jsr||k rt	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   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 j S | j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j dd | D }tt| jd | S )zLReturn this formset rendered as HTML <tr>s -- excluding the <table></table>. c             s   s   | ]}|j  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j dd | D }tt| jd | S )z*Return this formset rendered as HTML <p>s.r   c             s   s   | ]}|j  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j dd | D }tt| jd | S )z+Return this formset rendered as HTML <li>s.r   c             s   s   | ]}|j  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	
	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(    c             C   s   t dd | D S )z8Validate every formset and return True if all are valid.c             S   s   g | ]}|j  qS r   )rc   )rV   r   r   r   r    rX     s    zall_valid.<locals>.<listcomp>)r   )Zformsetsr   r   r    r     s    )r   r   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      