
v^H              
   @   sD  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
 d d f Z d Z d Z d Z d Z d Z d Z d  Z d Z Gd d   d e  Z e Gd d
   d
   Z  e  d d d d d d d d d  Z! d d   Z" d S)    )ValidationError)Form)BooleanFieldIntegerField)	ErrorList)HiddenInputNumberInput)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   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                s{   t  d t  |  j t <t  d t  |  j t <t  d d d t  |  j t <t  d d d t  |  j t <t   j | |   d  S)NwidgetrequiredF)	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__ 7/tmp/pip-build-8lau8j11/django/django/forms/formsets.pyr   "   s
    zManagementForm.__init__)__name__
__module____qualname____doc__r   r   r   )r   r    r      s   r   c            	   @   s  e  Z d  Z d Z e Z d d d d d e d 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 d. d/    Z d0 d1   Z  d2 d3   Z! d4 d5   Z" d6 d7   Z# d8 d9   Z$ d: d;   Z% d< d=   Z& d> d?   Z' d@ dA   Z( e dB dC    Z) dD dE   Z* dF dG   Z+ dH dI   Z, d S)Jr   z;
    A collection of instances of the same Form class.
    Nzid_%sc             C   s   | d  k	 p | d  k	 |  _  | p* |  j   |  _ | |  _ | pB i  |  _ | pQ i  |  _ | |  _ | pi i  |  _ | |  _ 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   4   s    				zBaseFormSet.__init__c             C   s
   |  j    S)N)as_table)r   r   r   r    __str__A   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__D   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__H   s    zBaseFormSet.__getitem__c             C   s   t  |  j  S)N)lenr3   )r   r   r   r    __len__L   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__O   s    zBaseFormSet.__bool__c             C   s   |  j  rQ t |  j d |  j d |  j } | j   s t t d  d d  nK t d |  j d |  j d t |  j	   t
 |  j   t |  j t |  j i  } | S)z4Return the ManagementForm instance for this FormSet.r(   r'   z8ManagementForm data is missing or has been tampered withcodeZmissing_management_formr+   )r%   r   r)   r(   r'   is_validr   _r   total_form_countr   initial_form_countr   min_numr   max_num)r   formr   r   r    management_formV   s    	!	zBaseFormSet.management_formc             C   s   |  j  r# t |  j j t |  j  S|  j   } t | |  j  |  j	 } | |  j
 k ob d k n rp | } n( | |  j
 k o d k n r |  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=   i   s    			zBaseFormSet.total_form_countc             C   s9   |  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>   |   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  |   j |    q Sr   )_construct_formget_form_kwargs).0i)r   r   r    
<listcomp>   s   	z%BaseFormSet.forms.<locals>.<listcomp>)ranger=   )r   r   )r   r    r3      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.
        )r,   copy)r   r5   r   r   r    rJ      s    zBaseFormSet.get_form_kwargsc             K   s   d |  j  d |  j |  d |  j d d i } |  j rP |  j | d <|  j | d <|  j r d | k r y |  j | | d <Wn t k
 r Yn X| |  j   k r | |  j	 k r d	 | d
 <| j
 |  |  j |   } |  j | |  | S)z;Instantiate and return the i-th form instance in a formset.r(   r'   r-   use_required_attributeFr)   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 |  j    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  |  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   sP   |  j  d |  j d |  j d  d d d d |  j d    } |  j | d   | S)Nr(   r'   Z
__prefix__rQ   TrP   F)rA   r(   rR   rJ   rU   )r   rA   r   r   r    
empty_form   s    		zBaseFormSet.empty_formc             C   s6   |  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 Sr   )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     j    s   j r g  St   d  s g    _ xk t d   j    D]T }   j | } |   j   k r~ | j   r~ qI   j	 |  rI   j j
 |  qI W  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 Sr   )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    j    s   j r- t d   j j   t   d  s g    _ x t d   j    D]m }   j	 | } |   j
   k r | j   r q[   j r   j |  r q[   j j | | j t f  q[ Wd 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 Sd |  d f S)N   r   )rb   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  S)N)ordering_widget)rj   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)r/   
full_clean)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)r.   rm   )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)r7   )rK   form_errorsr   r   r    	<genexpr>&  s    z0BaseFormSet.total_error_count.<locals>.<genexpr>)r7   rn   sumro   )r   r   r   r    total_error_count#  s    zBaseFormSet.total_error_countc             C   s   | j  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   s   |  j  s d Sd } |  j xU t d |  j    D]> } |  j | } |  j r^ |  j |  r^ q0 | | j   M} q0 W| o |  j   S)z1Return True if every form in self.forms is valid.FTr   )	r%   ro   rN   r=   r3   r[   r^   r;   rn   )r   Zforms_validrL   rA   r   r   r    r;   ,  s    	zBaseFormSet.is_validc             C   s  g  |  _  |  j   |  _ d } |  j s+ d Sx t d |  j    D]p } |  j | } | j   r} | |  j   k r} | d 7} | j	 } |  j
 r |  j |  r qA |  j  j |  qA Wy |  j r |  j   t |  j  |  j k s |  j j t |  j k r$t t d d |  j  |  j d d  |  j r{|  j   t |  j  | |  j k  r{t t d d |  j  |  j d d  |  j   Wn: t k
 r} z |  j | j  |  _ WYd d } ~ Xn Xd 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.r:   Ztoo_many_formszPlease submit %d or more forms.Ztoo_few_forms)r.   r-   r/   r%   rN   r=   r3   r]   r>   ro   r[   r^   r_   validate_maxr7   r`   r@   rB   rD   r   rE   r   r   validate_minr?   cleanZ
error_list)r   Zempty_forms_countrL   rA   rp   er   r   r    rm   >  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    rx   h  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)r]   )rK   rA   r   r   r    rq   s  s    z*BaseFormSet.has_changed.<locals>.<genexpr>)any)r   r   r   r    r]   q  s    zBaseFormSet.has_changedc          	   C   s   |  j  r | d k	 rb | |  j   k  rb t d t d  d | d d d d |  j    | j t <n. t d t d  d d d |  j    | j t <|  j r t d t d	  d d  | j t	 <d S)
z8A hook for adding extra fields on to each form instance.NlabelZOrderr+   rb   r   Fr   Delete)
rf   r>   r   r<   rl   fieldsrg   r[   r   ru   )r   rA   r5   r   r   r    rU   u  s    	
	zBaseFormSet.add_fieldsc             C   s   d |  j  | f S)Nz%s-%s)r'   )r   r5   r   r   r    rR     s    zBaseFormSet.add_prefixc             C   s+   |  j  r |  j  d j   S|  j j   Sd 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 Sd  S)Nr   )r3   mediarX   )r   r   r   r    r     s    	zBaseFormSet.mediac             C   s7   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)r0   )rK   rA   r   r   r    rq     s    z'BaseFormSet.as_table.<locals>.<genexpr>
)joinr   strrB   )r   r3   r   r   r    r0     s    zBaseFormSet.as_tablec             C   s7   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)rK   rA   r   r   r    rq     s    z#BaseFormSet.as_p.<locals>.<genexpr>r   )r   r   r   rB   )r   r3   r   r   r    r     s    zBaseFormSet.as_pc             C   s7   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)rK   rA   r   r   r    rq     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   rk   r   r   r1   r4   r6   r8   r9   r	   rB   r=   r>   r3   rJ   rI   propertyrH   rW   rX   rD   r`   ri   classmethodr&   rl   rn   ro   rs   r^   r;   rm   rx   r]   rU   rR   r~   r   r0   r   r   r   r   r   r    r   -   sL   				&
*	
	rb   FNc	             C   s   | d k r t  } | d k r$ t } | t }	 d |  d | d | d | d | d | d |	 d	 | d
 | i	 }
 t |  j d | f |
  S)z*Return a FormSet for the given form class.NrA   rG   rf   r[   r?   r@   rE   rw   rv   ZFormSet)DEFAULT_MIN_NUMDEFAULT_MAX_NUMtyper!   )rA   formsetrG   rf   r[   r@   rv   r?   rw   rE   attrsr   r   r    r     s    
c             C   s+   d } x |  D] } | | j    M} q W| S)z8Validate every formset and return True if all are valid.T)r;   )Zformsetsvalidr   r   r   r    r     s    )#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   rg   ru   r   r   r   r   r   r   r   r   r   r    <module>   s0    		