a
    xdH                     @   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f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  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                    sZ   t td| jt< t td| jt< t dtd| jt< t dtd| jt< t j|i | 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__ M/var/www/html/Ranjet/env/lib/python3.9/site-packages/django/forms/formsets.pyr   "   s
    zManagementForm.__init__)__name__
__module____qualname____doc__r   __classcell__r    r    r   r!   r      s   r   c                   @   sl  e Zd ZdZe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ed*d+ Zd,d- Zed.d/ Zd0d1 Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'd@dA Z(edBdC Z)dDdE Z*dFdG Z+dHdI Z,dS )Jr   z;
    A collection of instances of the same Form class.
    Nzid_%sc                 C   s`   |d up|d u| _ |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.   r0   r/   r    r    r!   r   4   s    


zBaseFormSet.__init__c                 C   s   |   S r'   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formsr5   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.r8   r   indexr    r    r!   __getitem__H   s    zBaseFormSet.__getitem__c                 C   s
   t | jS r'   )lenr8   r5   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    r5   r    r    r!   __bool__O   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_formV   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(   minrK   cleaned_datar   absolute_maxrF   maxrG   extrarH   )r   initial_formsZtotal_formsr    r    r!   rE   i   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(   rK   rM   r   r.   r>   )r   rQ   r    r    r!   rF   |   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i  |qS r    )_construct_formget_form_kwargs.0ir5   r    r!   
<listcomp>   s   z%BaseFormSet.forms.<locals>.<listcomp>)rangerE   r5   r    r5   r!   r8      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/   copyr;   r    r    r!   rS      s    zBaseFormSet.get_form_kwargsc                 K   s   | j | || jdd}| jr2| j|d< | j|d< | jrfd|vrfz| j| |d< W n tyd   Y n0 ||  kr|| j	krd|d< |
| | jf i |}| || |S )z;Instantiate and return the i-th form instance in a formset.F)r+   r*   r0   use_required_attributer,   r-   r.   Tempty_permitted)r+   
add_prefixr0   r(   r,   r-   r.   
IndexErrorrF   rG   updaterJ   
add_fields)r   rV   r   defaultsrJ   r    r    r!   rR      s&    	


zBaseFormSet._construct_formc                 C   s   | j d|   S )z7Return a list of all the initial forms in this formset.Nr8   rF   r5   r    r    r!   rQ      s    zBaseFormSet.initial_formsc                 C   s   | j |  d S )z5Return a list of all the extra forms in this formset.Nra   r5   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[   rZ   )rJ   r+   r\   rS   r_   rI   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    )rM   rU   rJ   r    r    r!   rW          z,BaseFormSet.cleaned_data.<locals>.<listcomp>)rC   AttributeErrorr   r"   r8   r5   r    r    r!   rM      s    zBaseFormSet.cleaned_datac                    s      r jsg S t dslg  _td  D ]:} j| }|  krT| sTq0 	|r0 j
| q0 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    r:   rT   r5   r    r!   rW      re   z-BaseFormSet.deleted_forms.<locals>.<listcomp>)rC   
can_deletehasattrrg   rX   rE   r8   rF   has_changed_should_delete_formappend)r   rV   rJ   r    r5   r!   deleted_forms   s    


zBaseFormSet.deleted_formsc                    s      r jstd jj t dsg  _td  D ]L} j	| }| 
 kr`| s`q< jrr |rrq< j||jt f q<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 u rdS d| d fS )N   )ro   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   r:   rT   r5   r    r!   rW     re   z-BaseFormSet.ordered_forms.<locals>.<listcomp>)rC   	can_orderrf   r   r"   ri   rn   rX   rE   r8   rF   rj   rh   rk   rl   rM   ORDERING_FIELD_NAMEsort)r   rV   rJ   rq   r    r5   r!   ordered_forms   s    

zBaseFormSet.ordered_formsc                 C   s   dS )NrJ   r    clsr    r    r!   r)   
  s    zBaseFormSet.get_default_prefixc                 C   s   | j S r'   )ordering_widgetrw   r    r    r!   get_ordering_widget  s    zBaseFormSet.get_ordering_widgetc                 C   s   | j du 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)r2   
full_cleanr5   r    r    r!   non_form_errors  s    
zBaseFormSet.non_form_errorsc                 C   s   | j du r|   | j S )z:Return a list of form.errors for every form in self.forms.N)r1   r{   r5   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'   )r>   )rU   form_errorsr    r    r!   	<genexpr>&  re   z0BaseFormSet.total_error_count.<locals>.<genexpr>)r>   r|   sumr}   r5   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)rM   getDELETION_FIELD_NAMErI   r    r    r!   rk   (  s    zBaseFormSet._should_delete_formc                 C   s^   | j s
dS d}| j td|  D ],}| j| }| jrB| |rBq"|| M }q"|o\|   S )z1Return True if every form in self.forms is valid.FTr   )	r(   r}   rX   rE   r8   rh   rk   rC   r|   )r   Zforms_validrV   rJ   r    r    r!   rC   ,  s    
zBaseFormSet.is_validc              
   C   sP  g | _ |  | _d}| jsdS td|  D ]N}| j| }| sV||  krV|d7 }|j	}| j
rn| |rnq,| j | q,z| jr|  t| j | jks| jjt | jkrttdd| j| j dd| jr|  t| j | | jk rttdd| j| j dd|   W n4 tyJ } z| |j| _W Y d}~n
d}~0 0 dS )	ze
        Clean all of self.data and populate self._errors and
        self._non_form_errors.
        r   Nro   z Please submit %d or fewer forms.Ztoo_many_formsrA   zPlease submit %d or more forms.Ztoo_few_forms)r1   r0   r2   r(   rX   rE   r8   rj   rF   r}   rh   rk   rl   validate_maxr>   rm   rH   rK   rM   r   rN   r   r   validate_minrG   cleanZ
error_list)r   Zempty_forms_countrV   rJ   r~   er    r    r!   r{   >  sR    

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    r5   r    r    r!   r   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   | ]}|  V  qd S r'   )rj   rd   r    r    r!   r   s  re   z*BaseFormSet.has_changed.<locals>.<genexpr>)anyr5   r    r    r!   rj   q  s    zBaseFormSet.has_changedc                 C   sz   | j rZ|dur>||  k r>ttd|d d|  d|jt< nttdd|  d|jt< | jrvttddd|jt	< dS )	z8A hook for adding extra fields on to each form instance.NZOrderro   F)labelr.   r   r   )r   r   r   Delete)r   r   )
rs   rF   r   rD   rz   fieldsrt   rh   r   r   )r   rJ   r<   r    r    r!   r_   u  s    zBaseFormSet.add_fieldsc                 C   s   d| j |f S )Nz%s-%s)r*   r;   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)r8   is_multipartrc   r5   r    r    r!   r     s    zBaseFormSet.is_multipartc                 C   s   | j r| j d jS | jjS d S )Nr   )r8   mediarc   r5   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'   r3   rd   r    r    r!   r     re   z'BaseFormSet.as_table.<locals>.<genexpr>
joinr   strrK   r   r8   r    r    r!   r4     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_prd   r    r    r!   r     re   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_ulrd   r    r    r!   r     re   z$BaseFormSet.as_ul.<locals>.<genexpr>r   r   r   r    r    r!   r     s    zBaseFormSet.as_ul)-r"   r#   r$   r%   r   ry   r   r   r6   r9   r=   r?   r@   r	   rK   rE   rF   r8   rS   rR   propertyrQ   rb   rc   rM   rm   rv   classmethodr)   rz   r|   r}   r   rk   rC   r{   r   rj   r_   r\   r   r   r4   r   r   r    r    r    r!   r   -   sf   

	
	





%



*	

r   ro   FNc	              
   C   sL   |du rt }|du rt}|t }	| ||||||	||d	}
t| jd |f|
S )z*Return a FormSet for the given form class.N)	rJ   rP   rs   rh   rG   rH   rN   r   r   ZFormSet)DEFAULT_MIN_NUMDEFAULT_MAX_NUMtyper"   )rJ   formsetrP   rs   rh   rH   r   rG   r   rN   attrsr    r    r!   r     s     r   c                 C   s   d}| D ]}||  M }q|S )z8Validate every formset and return True if all are valid.T)rC   )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   r   Zdjango.utils.functionalr	   Zdjango.utils.htmlr
   Zdjango.utils.safestringr   Zdjango.utils.translationr   rD   r   __all__r   r   r   r   rt   r   r   r   r   r   r   r   r    r    r    r!   <module>   s8      
