U
    dR…f6U  ã                   @   sB  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZ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mZm Z m!Z!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z' zd dl(m)Z) W n e*k
rì   dZ)Y nX G dd„ de+ƒZ,G dd„ de,ƒZ-G dd„ de,ƒZ.G dd„ de,ƒZ/G dd„ de/ƒZ0dS )é    )ÚBeautifulSoup)ÚBaseFormÚBaseFormSetÚ
BoundFieldÚCheckboxInputÚCheckboxSelectMultipleÚ	DateInputÚ
EmailInputÚ	FileInputÚMultiWidgetÚNumberInputÚPasswordInputÚRadioSelectÚSelectÚSelectDateWidgetÚ	TextInput)Úconditional_escapeÚescapeÚ
strip_tags)Ú	mark_safeé   )Úget_bootstrap_setting)ÚBootstrapError)ÚFORM_GROUP_CLASSÚis_widget_with_placeholderÚrender_fieldÚrender_formÚrender_form_groupÚrender_label)Ú
text_value)Úadd_css_classÚrender_template_file)ÚReadOnlyPasswordHashWidgetNc                   @   s:   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ ZdS )ÚBaseRendererzA content renderer.c                 O   s¬   |  dd¡| _|  dt¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  d	d¡| _|  d
d¡| _	|  
|  dd¡¡| _|  dtdƒ¡| _|  dtdƒ¡| _d S )NÚlayoutÚ Úform_group_classÚfield_classÚlabel_classÚ	show_helpTÚ
show_labelÚexcludeÚset_placeholderÚsizeÚhorizontal_label_classÚhorizontal_field_class)Úgetr$   r   r&   r'   r(   r)   r*   r+   r,   Ú
parse_sizer-   r   r.   r/   )ÚselfÚargsÚkwargs© r5   ú8/tmp/pip-unpacked-wheel-ebr10wu1/bootstrap4/renderers.pyÚ__init__-   s"     ÿ ÿzBaseRenderer.__init__c                 C   sD   t |ƒ ¡  ¡ }|dkrdS |dkr(dS |dkr4dS td| ƒ‚d S )N)ÚsmÚsmallr9   )ZlgÚlarger:   )ZmdÚmediumr%   r;   zJInvalid value "%s" for parameter "size" (expected "sm", "md", "lg" or "").)r   ÚlowerÚstripr   )r2   r-   r5   r5   r6   r1   ?   s    zBaseRenderer.parse_sizeúform-controlc                 C   s(   | j dkr|d S | j dkr$|d S dS )Nr9   z-smr:   z-lgr%   )r-   )r2   Úprefixr5   r5   r6   Úget_size_classI   s
    

zBaseRenderer.get_size_classc                 C   s   dS ©Nr%   r5   ©r2   r5   r5   r6   Ú_renderP   s    zBaseRenderer._renderc                 C   s   t |  ¡ ƒS ©N)r   rC   rB   r5   r5   r6   ÚrenderS   s    zBaseRenderer.renderN)r>   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   r1   r@   rC   rE   r5   r5   r5   r6   r#   *   s   

r#   c                       sP   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚFormsetRendererzDefault formset renderer.c                    s*   t |tƒstdƒ‚|| _tƒ j||Ž d S )Nz:Parameter "formset" should contain a valid Django Formset.)Ú
isinstancer   r   ÚformsetÚsuperr7   )r2   rL   r3   r4   ©Ú	__class__r5   r6   r7   Z   s    
zFormsetRenderer.__init__c                 C   s   t | jjƒS rD   )r   rL   Zmanagement_formrB   r5   r5   r6   Úrender_management_form`   s    z&FormsetRenderer.render_management_formc                 K   s   t |f|ŽS rD   )r   )r2   Úformr4   r5   r5   r6   r   c   s    zFormsetRenderer.render_formc                 C   sZ   g }| j jD ]B}| | j|| j| j| j| j| j| j	| j
| j| j| j| jd¡ qd |¡S )N)r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   Ú
)rL   ÚformsÚappendr   r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   Újoin)r2   Zrendered_formsrQ   r5   r5   r6   Úrender_formsf   s&    ôÿzFormsetRenderer.render_formsc                 C   s
   | j  ¡ S rD   )rL   Znon_form_errorsrB   r5   r5   r6   Úget_formset_errors{   s    z"FormsetRenderer.get_formset_errorsc                 C   s(   |   ¡ }|r$td|| j| jdœdS dS )Núbootstrap4/form_errors.html)ÚerrorsrQ   r$   ©Úcontextr%   )rW   r!   rL   r$   )r2   Zformset_errorsr5   r5   r6   Úrender_errors~   s    þzFormsetRenderer.render_errorsc                 C   s   d  |  ¡ |  ¡ |  ¡ g¡S rA   )rU   r\   rP   rV   rB   r5   r5   r6   rC   ‡   s    zFormsetRenderer._render)rF   rG   rH   rI   r7   rP   r   rV   rW   r\   rC   Ú__classcell__r5   r5   rN   r6   rJ   W   s   	rJ   c                       sB   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	d
„Zdd„ Z‡  Z	S )ÚFormRendererzDefault form renderer.c                    sp   t |tƒstdƒ‚|| _tƒ j||Ž | dd ¡| _| dd ¡| _| dd ¡| _	| dd¡| _
| dd¡| _d S )	Nz4Parameter "form" should contain a valid Django Form.Úerror_css_classÚrequired_css_classÚbound_css_classÚalert_error_typeÚ
non_fieldsÚform_check_classú
form-check)rK   r   r   rQ   rM   r7   r0   r_   r`   ra   rb   rd   )r2   rQ   r3   r4   rN   r5   r6   r7   Ž   s    
zFormRenderer.__init__c                 C   sf   g }| j D ]P}| t|| j| j| j| j| j| j| j	| j
| j| j| j| j| j| j| jd¡ q
d |¡S )N)r$   r&   r'   r(   rd   r*   r)   r+   r,   r-   r.   r/   r_   r`   ra   rR   )rQ   rT   r   r$   r&   r'   r(   rd   r*   r)   r+   r,   r-   r.   r/   r_   r`   ra   rU   )r2   Zrendered_fieldsÚfieldr5   r5   r6   Úrender_fields™   s.    
ðÿzFormRenderer.render_fieldsc                 C   s*   g }| j D ]}|js
|jr
||j7 }q
|S rD   )rQ   Ú	is_hiddenrY   )r2   Úform_errorsrf   r5   r5   r6   Úget_fields_errors²   s
    
zFormRenderer.get_fields_errorsÚallc                 C   sf   d }|dkr |   ¡ | j ¡  }n$|dkr2|   ¡ }n|dkrD| j ¡ }|rbtd|| j| j|dœdS dS )Nrk   Úfieldsrc   rX   )rY   rQ   r$   ÚtyperZ   r%   )rj   rQ   Znon_field_errorsr!   r$   )r2   rm   ri   r5   r5   r6   r\   ¹   s    

þzFormRenderer.render_errorsc                 C   s   |   | j¡|  ¡  S rD   )r\   rb   rg   rB   r5   r5   r6   rC   Ê   s    zFormRenderer._render)rk   )
rF   rG   rH   rI   r7   rg   rj   r\   rC   r]   r5   r5   rN   r6   r^   ‹   s   
r^   c                       s  e Zd ZdZeeeefZ‡ fdd„Z	dd„ Z
d9dd„Zd:d	d
„Zd;dd„Zdd„ Zdd„ Z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d#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$‡  Z%S )<ÚFieldRendererzDefault field renderer.c                    sà  t |tƒstdƒ‚|| _tƒ j||Ž |jj| _t |jjtƒ| _| jj	 
¡ | _| jrh|jrhtt|jƒƒnd| _dd„ |jD ƒ| _| dd¡| _d|kr¢|d | _ntdƒr´|j| _nd| _| jrÌt| jƒ| _| d	| jj	 d	d¡¡| _| d
| jj	 d
d¡¡| _| d| jj	 dd¡¡| _| d| jj	 dd¡¡| _| dd ¡}| dd ¡}| dd ¡}|d k	rj|| _nt|jdtdƒƒ| _|d k	r|| _ nt|jdtdƒƒ| _ |d k	r¶|| _!nt|jdtdƒƒ| _!| jjj"rÜd| _ d S )Nz;Parameter "field" should contain a valid Django BoundField.r%   c                 S   s   g | ]}t t|ƒƒ‘qS r5   )r   r   )Ú.0Úerrorr5   r5   r6   Ú
<listcomp>Þ   s     z*FieldRenderer.__init__.<locals>.<listcomp>rd   re   Úplaceholderr,   Úaddon_beforeÚaddon_afterÚaddon_before_classzinput-group-textÚaddon_after_classr_   r`   ra   Úsuccess_css_class)#rK   r   r   rf   rM   r7   Úwidgetr   Úis_multi_widgetÚattrsÚcopyÚinitial_attrsr)   Ú	help_textr   r   Ú
field_helprY   Úfield_errorsr0   rd   rr   r   ÚlabelÚpoprs   rt   ru   rv   r_   ÚgetattrrQ   r`   rw   Zempty_permitted)r2   rf   r3   r4   r_   r`   ra   rN   r5   r6   r7   Ô   sZ    

 
 ÿ ÿ

  ÿ
zFieldRenderer.__init__c                 C   s   | j  ¡ | j_d S rD   )r|   r{   rx   rz   rB   r5   r5   r6   Úrestore_widget_attrs  s    z"FieldRenderer.restore_widget_attrsNc                 C   sÚ   |d kr| j }|j dd¡}td k	r>t|tƒr>t|ddd}n\t|| jƒsht|ddd}t||  ¡ ƒ}n2t|tƒr‚t|ddd}nt|t	ƒršt|ddd}| j
jr¶| jrÌt|| jƒ}n| j
jjrÌt|| jƒ}||jd< d S )	NÚclassr%   zform-control-staticT)Úprependr>   úform-check-inputzform-control-file)rx   rz   r0   r"   rK   r    ÚWIDGETS_NO_FORM_CONTROLr@   r   r
   rf   rY   r_   rQ   Úis_boundrw   )r2   rx   Úclassesr5   r5   r6   Úadd_class_attrs  s$    


zFieldRenderer.add_class_attrsc                 C   s>   |d kr| j }|j d| j¡}|r:| jr:t|ƒr:||jd< d S )Nrr   )rx   rz   r0   rr   r,   r   )r2   rx   rr   r5   r5   r6   Úadd_placeholder_attrs*  s
    z#FieldRenderer.add_placeholder_attrsc                 C   s:   |d kr| j }t|tƒs6|j dtt| jƒƒ¡|jd< d S )NÚtitle)rx   rK   r   rz   r0   r   r   r~   )r2   rx   r5   r5   r6   Úadd_help_attrs2  s    
zFieldRenderer.add_help_attrsc                 C   sD   | j r| jj}n| jg}|D ]"}|  |¡ |  |¡ |  |¡ qd S rD   )ry   rx   ÚwidgetsrŠ   r‹   r   )r2   rŽ   rx   r5   r5   r6   Úadd_widget_attrs8  s    


zFieldRenderer.add_widget_attrsc           
   	   C   sØ   t ||  ¡ ƒ}ddj|dfdddj| jdfdg}|D ]\}}| ||¡}q8t|d	d
}| dd|i¡}|rÐ| d¡D ]V}	|	j 	dg ¡dg |	jd< z"|	j
j 	dg ¡dg |	j
jd< W qx tk
rÌ   Y qxX qxt|ƒS )Nz<ulz<div class="{classes}")r‰   )z</ul>ú</div>z<liz<div class="{form_check_class}")rd   )z</li>r   zhtml.parser)ÚfeaturesÚdivr„   r€   úform-check-labelr†   )r    r@   Úformatrd   Úreplacer   ÚfindZfind_allrz   r0   ÚinputÚAttributeErrorÚstr)
r2   ÚhtmlÚklassr‰   ÚmappingÚkÚvZsoupZenclosing_divr€   r5   r5   r6   Úlist_to_classB  s$    ü"zFieldRenderer.list_to_classc                 C   s&   |t | jj| jjtt| jƒƒdd S )Nr“   )ÚcontentÚ	label_forZlabel_titler(   )r   rf   r€   Úid_for_labelr   r   r~   ©r2   rš   r5   r5   r6   Úadd_checkbox_label[  s    üz FieldRenderer.add_checkbox_labelc                 C   s4   d}d}|  d|d ¡}|  dd| ¡}dj|dS )Nz<div class="col-4">r   z<selectz	</select>z4<div class="row bootstrap4-multi-input">{html}</div>©rš   )r•   r”   )r2   rš   Zdiv1Zdiv2r5   r5   r6   Úfix_date_select_inputc  s
    z#FieldRenderer.fix_date_select_inputc                 C   s   d| }|S )Nz<br>r5   r£   r5   r5   r6   Úfix_file_input_labelj  s    z"FieldRenderer.fix_file_input_labelc                 C   s~   t | jtƒr|  |d¡}n`t | jtƒr4|  |d¡}nFt | jtƒrL|  |¡}n.t | jtƒrd|  |¡}nt | jt	ƒrz|  
|¡}|S )Nzradio radio-successZcheckbox)rK   rx   r   rŸ   r   r   r¦   r   r¤   r
   r§   r£   r5   r5   r6   Úpost_widget_rendern  s    
z FieldRenderer.post_widget_renderc                 C   s   t | jtƒrdj|d}|S )Nz$<div class="form-check">{html}</div>r¥   )rK   rx   r   r”   r£   r5   r5   r6   Úwrap_widget{  s    zFieldRenderer.wrap_widgetc                 C   s(   |sdS |rdj ||d}dj ||dS )Nr%   z,<span class="{inner_class}">{content}</span>)Úinner_classr    z*<div class="{outer_class}">{content}</div>)Úouter_classr    )r”   )r2   rª   r«   r    r5   r5   r6   Úmake_input_group_addon‚  s
    z$FieldRenderer.make_input_group_addonc                 C   s(   t tttttf}| js| jo&t| j	|ƒS rD   )
r   r   r   r   r   r	   rs   rt   rK   rx   )r2   Zallowed_widget_typesr5   r5   r6   Úis_input_group‰  s    zFieldRenderer.is_input_groupc                 C   sP   | j rL|  | jd| j¡}|  | jd| j¡}|  dj|||d¡}dj|d}|S )Nzinput-group-prependzinput-group-appendz{before}{html}{after})Úbeforerš   Úafterz%<div class="input-group">{html}</div>r¥   )r­   r¬   ru   rs   rv   rt   Úappend_errorsr”   )r2   rš   r®   r¯   r5   r5   r6   Úmake_input_groupŽ  s    zFieldRenderer.make_input_groupc                 C   s6   | j pd }|r2td| j|| j| jdœd}||7 }|S )Nzbootstrap4/field_help_text.html)rf   r~   r$   r)   rZ   )r~   r!   rf   r$   r)   )r2   rš   r~   Z	help_htmlr5   r5   r6   Úappend_help–  s    
üþ	zFieldRenderer.append_helpc                 C   s2   | j }|r.td| j|| j| jdœd}||7 }|S )Nzbootstrap4/field_errors.html)rf   r   r$   r)   rZ   )r   r!   rf   r$   r)   )r2   rš   r   Zerrors_htmlr5   r5   r6   r°   ¥  s    üþ	zFieldRenderer.append_errorsc                 C   s*   t | jtƒr|S | js |  |¡}|  |¡S rD   )rK   rx   r   r­   r°   r²   r£   r5   r5   r6   Úappend_to_field´  s
    
zFieldRenderer.append_to_fieldc                 C   s$   t | jtƒs|S |  |¡}|  |¡S rD   )rK   rx   r   r°   r²   r£   r5   r5   r6   Úappend_to_checkbox_fieldÀ  s    
z&FieldRenderer.append_to_checkbox_fieldc                 C   s   | j }|s| jdkr| j}|S )NÚ
horizontal)r'   r$   r/   )r2   r'   r5   r5   r6   Úget_field_classÈ  s    zFieldRenderer.get_field_classc                 C   s   |   ¡ }|rdj||d}|S )Nz'<div class="{field_class}">{html}</div>)r'   rš   )r¶   r”   )r2   rš   r'   r5   r5   r6   Ú
wrap_fieldÎ  s    zFieldRenderer.wrap_fieldc                 C   sJ   | j }|s$| jdkr$| j}t|dƒ}t|ƒ}| jr<| jdkrFt|dƒ}|S )Nrµ   zcol-form-labelúsr-only)r(   r$   r.   r    r   r*   )r2   r(   r5   r5   r6   Úget_label_classÔ  s    

zFieldRenderer.get_label_classc                 C   sB   | j dkrd S t| jtƒr d }n| jj}| jdkr>|s>tdƒS |S )NÚskiprµ   z&#160;)r*   rK   rx   r   rf   r€   r$   r   )r2   r€   r5   r5   r6   Ú	get_labelÞ  s    
zFieldRenderer.get_labelc                 C   s*   |   ¡ }|r&t|| jj|  ¡ d| }|S )N)r¡   r(   )r»   r   rf   r¢   r¹   )r2   rš   r€   r5   r5   r6   Ú	add_labelé  s    zFieldRenderer.add_labelc                 C   sl   | j }| jjr"| jr8t|| jƒ}n| jjjr8t|| jƒ}| jjjrT| j	rTt|| j	ƒ}| j
dkrht|dƒ}|S )Nrµ   Úrow)r&   rf   rY   r_   r    rQ   rˆ   rw   Úrequiredr`   r$   )r2   r&   r5   r5   r6   Úget_form_group_classï  s    


z"FieldRenderer.get_form_group_classc                 C   s   t ||  ¡ ƒS rD   )r   r¿   r£   r5   r5   r6   Úwrap_label_and_fieldý  s    z"FieldRenderer.wrap_label_and_fieldc                 C   s¨   | j j| j dd¡ d¡kr dS | j jr2t| j ƒS |  ¡  | j j| j	j
d}|  ¡  |  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S )Nú r%   ú,)rz   )rf   Únamer+   r•   Úsplitrh   r   r   Z	as_widgetrx   rz   rƒ   r¨   r´   r©   r±   r³   r·   r¼   rÀ   r£   r5   r5   r6   rC      s     








zFieldRenderer._render)N)N)N)&rF   rG   rH   rI   r   r   r   r
   r‡   r7   rƒ   rŠ   r‹   r   r   rŸ   r¤   r¦   r§   r¨   r©   r¬   Úpropertyr­   r±   r²   r°   r³   r´   r¶   r·   r¹   r»   r¼   r¿   rÀ   rC   r]   r5   r5   rN   r6   rn   Î   s<   :





rn   c                       s@   e Zd ZdZdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Z‡  Z	S )ÚInlineFieldRendererzInline field renderer.c                 C   sB   | j j dd¡}|dd dd„ | jD ƒ¡ 7 }| ¡ | j jd< d S )NrŒ   r%   rÁ   c                 S   s   g | ]}t |ƒ‘qS r5   )r   )ro   Úer5   r5   r6   rq     s     z7InlineFieldRenderer.add_error_attrs.<locals>.<listcomp>)rx   rz   r0   rU   r   r=   )r2   Zfield_titler5   r5   r6   Úadd_error_attrs  s    z#InlineFieldRenderer.add_error_attrsc                    s   t ƒ  ¡  |  ¡  d S rD   )rM   r   rÈ   rB   rN   r5   r6   r     s    
z$InlineFieldRenderer.add_widget_attrsc                 C   s   |S rD   r5   r£   r5   r5   r6   r³   #  s    z#InlineFieldRenderer.append_to_fieldc                 C   s   | j S rD   )r'   rB   r5   r5   r6   r¶   &  s    z#InlineFieldRenderer.get_field_classc                 C   s   t | jdƒS )Nr¸   )r    r(   rB   r5   r5   r6   r¹   )  s    z#InlineFieldRenderer.get_label_class)
rF   rG   rH   rI   rÈ   r   r³   r¶   r¹   r]   r5   r5   rN   r6   rÆ     s   rÆ   )1Zbs4r   Zdjango.formsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zdjango.utils.htmlr   r   r   Zdjango.utils.safestringr   Z	bootstrapr   Ú
exceptionsr   rS   r   r   r   r   r   r   Útextr   Úutilsr    r!   Zdjango.contrib.auth.formsr"   ÚRuntimeErrorÚobjectr#   rJ   r^   rn   rÆ   r5   r5   r5   r6   Ú<module>   s&   D 
-4C  K