B
    é0H[ËN  ã               @   sZ  d dl mZ yd dlmZ W n ek
r4   dZY nX 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 d dlmZ d dlmZmZ d dl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- G dd„ de.ƒZ/G dd„ de/ƒZ0G dd„ de/ƒZ1G dd„ de/ƒZ2G dd„ de2ƒZ3dS )é    )Úunicode_literals)ÚReadOnlyPasswordHashWidgetN)Ú	TextInputÚPasswordInputÚ	DateInputÚ	FileInputÚNumberInputÚCheckboxInputÚMultiWidgetÚClearableFileInputÚSelectÚRadioSelectÚCheckboxSelectMultiple)ÚSelectDateWidget)ÚBaseFormÚ
BoundField)ÚBaseFormSet)Úconditional_escapeÚescapeÚ
strip_tags)Ú	mark_safeé   )Úget_bootstrap_setting)ÚBootstrapError)Úrender_formÚrender_fieldÚrender_labelÚrender_form_groupÚis_widget_with_placeholderÚFORM_GROUP_CLASS)Ú
text_value)Úadd_css_classÚrender_template_filec               @   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   úcC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-btmkd5di\django-bootstrap4\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   8   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_classB   s
    

zBaseRenderer.get_size_classc             C   s   dS )Nr%   r5   )r2   r5   r5   r6   Ú_renderI   s    zBaseRenderer._renderc             C   s   t |  ¡ ƒS )N)r   rA   )r2   r5   r5   r6   ÚrenderL   s    zBaseRenderer.renderN)r>   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   r1   r@   rA   rB   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t| ƒj||Ž d S )Nz:Parameter "formset" should contain a valid Django Formset.)Ú
isinstancer   r   ÚformsetÚsuperrG   r7   )r2   rI   r3   r4   )Ú	__class__r5   r6   r7   U   s
    
zFormsetRenderer.__init__c             C   s   t | jjƒS )N)r    rI   Zmanagement_form)r2   r5   r5   r6   Úrender_management_form\   s    z&FormsetRenderer.render_management_formc             K   s   t |f|ŽS )N)r   )r2   Úformr4   r5   r5   r6   r   _   s    zFormsetRenderer.render_formc             C   s^   g }xN| j jD ]B}| | j|| j| j| j| j| j| j	| j
| j| j| j| jd�¡ qW d |¡S )N)r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   Ú
)rI   ÚformsÚappendr   r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   Újoin)r2   Zrendered_formsrM   r5   r5   r6   Úrender_formsb   s     zFormsetRenderer.render_formsc             C   s
   | j  ¡ S )N)rI   Znon_form_errors)r2   r5   r5   r6   Úget_formset_errorsu   s    z"FormsetRenderer.get_formset_errorsc             C   s(   |   ¡ }|r$td|| j| jdœd�S dS )Nzbootstrap4/form_errors.html)ÚerrorsrM   r$   )Úcontextr%   )rS   r"   rI   r$   )r2   Zformset_errorsr5   r5   r6   Úrender_errorsx   s    zFormsetRenderer.render_errorsc             C   s   d  |  ¡ |  ¡ |  ¡ ¡S )Nz{}{}{})ÚformatrV   rL   rR   )r2   r5   r5   r6   rA   …   s    zFormsetRenderer._render)rC   rD   rE   rF   r7   rL   r   rR   rS   rV   rA   Ú__classcell__r5   r5   )rK   r6   rG   P   s   rG   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                sX   t |tƒstdƒ‚|| _tt| ƒj||Ž | 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)rH   r   r   rM   rJ   rY   r7   r0   rZ   r[   r\   )r2   rM   r3   r4   )rK   r5   r6   r7   ’   s    
zFormRenderer.__init__c             C   sf   g }xV| j D ]L}| t|| j| j| j| j| j| j| j	| j
| j| j| j| j| j| jd�¡ qW d |¡S )N)r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   rZ   r[   r\   rN   )rM   rP   r   r$   r&   r'   r(   r*   r)   r+   r,   r-   r.   r/   rZ   r[   r\   rQ   )r2   Zrendered_fieldsÚfieldr5   r5   r6   Úrender_fieldsœ   s&    zFormRenderer.render_fieldsc             C   s.   g }x$| j D ]}|js|jr||j7 }qW |S )N)rM   Ú	is_hiddenrT   )r2   Úform_errorsr]   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 )Nrb   ÚfieldsZ
non_fieldszbootstrap4/form_errors.html)rT   rM   r$   Útype)rU   r%   )ra   rM   Znon_field_errorsr"   r$   )r2   rd   r`   r5   r5   r6   rV   ¹   s    

zFormRenderer.render_errorsc             C   s   |   ¡ |  ¡  S )N)rV   r^   )r2   r5   r5   r6   rA   Ï   s    zFormRenderer._render)rb   )
rC   rD   rE   rF   r7   r^   ra   rV   rA   rX   r5   r5   )rK   r6   rY   �   s   

rY   c                   sÚ   e Zd ZdZeeeefZ‡ fdd„Z	dd„ Z
d/dd„Zd0d	d
„Zd1d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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‡  ZS )2ÚFieldRendererz 
    Default field renderer
    c                sÚ  t |tƒstdƒ‚|| _tt| ƒj||Ž |jj| _t |jjtƒ| _	| jj
 ¡ | _| jrl|jrltt|jƒƒnd| _dd„ |jD ƒ| _d|kr˜|d | _ntdƒrª|j| _nd| _| jrÆt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	�rd|| _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>Úplaceholderr,   Úaddon_beforeÚaddon_afterÚaddon_before_classzinput-group-addonÚaddon_after_classrZ   r[   r\   Úsuccess_css_class)#rH   r   r   r]   rJ   re   r7   Úwidgetr
   Úis_multi_widgetÚattrsÚcopyÚinitial_attrsr)   Ú	help_textr    r   Ú
field_helprT   Úfield_errorsri   r   Úlabelr0   Úpoprj   rk   rl   rm   rZ   ÚgetattrrM   r[   rn   Zempty_permitted)r2   r]   r3   r4   rZ   r[   r\   )rK   r5   r6   r7   à   sT    

 



zFieldRenderer.__init__c             C   s   | j  ¡ | j_d S )N)rs   rr   ro   rq   )r2   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ƒsft|ddd�}t||  ¡ ƒ}| jj	r‚| j
r˜t|| j
ƒ}n| jjjr˜t|| jƒ}||jd< d S )NÚclassr%   zform-control-staticT)Úprependzform-control)ro   rq   r0   r   rH   r!   ÚWIDGETS_NO_FORM_CONTROLr@   r]   rT   rZ   rM   Úis_boundrn   )r2   ro   Ú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 )Nri   )ro   rq   r0   ri   r,   r   )r2   ro   ri   r5   r5   r6   Úadd_placeholder_attrs6  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)ro   rH   r	   rq   r0   r   r   ru   )r2   ro   r5   r5   r6   Úadd_help_attrs>  s    
zFieldRenderer.add_help_attrsc             C   sH   | j r| jj}n| jg}x*|D ]"}|  |¡ |  |¡ |  |¡ qW d S )N)rp   ro   Úwidgetsr€   r�   rƒ   )r2   r„   ro   r5   r5   r6   Úadd_widget_attrsG  s    



zFieldRenderer.add_widget_attrsc             C   sH   t ||  ¡ ƒ}ddddj|d�fdg}x|D ]\}}| ||¡}q,W |S )N)z<ulz<div)z</ul>z</div>z<liz<div class="{klass}")Úklass)z</li>z</div>)r!   r@   rW   Úreplace)r2   Úhtmlr†   r   ÚmappingÚkÚvr5   r5   r6   Úlist_to_classQ  s    zFieldRenderer.list_to_classc             C   s2   dj || jjd�}tt|ƒ| jjtt| jƒƒd�S )Nz{field} {label})r]   rw   )ÚcontentÚ	label_forZlabel_title)	rW   r]   rw   r   r   Úid_for_labelr   r   ru   )r2   rˆ   r�   r5   r5   r6   Úput_inside_label]  s    zFieldRenderer.put_inside_labelc             C   s4   d}d}|  d|d ¡}|  dd| ¡}d| d S )Nz<div class="col-4">z</div>z<selectz	</select>z(<div class="row bootstrap4-multi-input">)r‡   )r2   rˆ   Zdiv1Zdiv2r5   r5   r6   Úfix_date_select_inputh  s
    z#FieldRenderer.fix_date_select_inputc             C   s   dj |d�S )a©  
        Fix a clearable file input
        TODO: This needs improvement

        Currently Django returns
        Currently:
        <a href="dummy.txt">dummy.txt</a>
        <input id="file4-clear_id" name="file4-clear" type="checkbox" />
        <label for="file4-clear_id">Clear</label><br />
        Change: <input id="id_file4" name="file4" type="file" />
        <span class=help-block></span>
        </div>

        zN<div class="row bootstrap4-multi-input"><div class="col-12">{html}</div></div>)rˆ   )rW   )r2   rˆ   r5   r5   r6   Úfix_clearable_file_inputo  s    z&FieldRenderer.fix_clearable_file_inputc             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radioZcheckbox)rH   ro   r   rŒ   r   r   r‘   r   r’   r	   r�   )r2   rˆ   r5   r5   r6   Úpost_widget_renderƒ  s    
z FieldRenderer.post_widget_renderc             C   s   t | jtƒrdj|d�}|S )Nz%<div class="checkbox">{content}</div>)r�   )rH   ro   r	   rW   )r2   rˆ   r5   r5   r6   Úwrap_widget�  s    zFieldRenderer.wrap_widgetc             C   sr   t ttttf}| js| jrnt| j|ƒrn| jr>dj	| j
| jd�nd}| jrZdj	| j| jd�nd}dj	|||d�}|S )Nz*<span class="{input_class}">{addon}</span>)Zinput_classZaddonr%   z4<div class="input-group">{before}{html}{after}</div>)ÚbeforeÚafterrˆ   )r   r   r   r   r   rj   rk   rH   ro   rW   rl   rm   )r2   rˆ   Zallowed_widget_typesr•   r–   r5   r5   r6   Úmake_input_group—  s    zFieldRenderer.make_input_groupc             C   sB   | j pd }| j}|s|r>td| j||| j| jdœd�}||7 }|S )Nz*bootstrap4/field_help_text_and_errors.html)r]   ru   rv   r$   r)   )rU   )ru   rv   r"   r]   r$   r)   )r2   rˆ   ru   rv   Z	help_htmlr5   r5   r6   Úappend_to_field¥  s    
zFieldRenderer.append_to_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="{klass}">{html}</div>)r†   rˆ   )rš   rW   )r2   rˆ   r'   r5   r5   r6   Ú
wrap_field¼  s
    
zFieldRenderer.wrap_fieldc             C   s@   | j }|s$| jdkr$| j}t|dƒ}t|ƒ}| js<t|dƒ}|S )Nr™   zcol-form-labelzsr-only)r(   r$   r.   r!   r    r*   )r2   r(   r5   r5   r6   Úget_label_classÃ  s    

zFieldRenderer.get_label_classc             C   s4   t | jtƒrd }n| jj}| jdkr0|s0tdƒS |S )Nr™   z&#160;)rH   ro   r	   r]   rw   r$   r   )r2   rw   r5   r5   r6   Ú	get_labelÍ  s    zFieldRenderer.get_labelc             C   s*   |   ¡ }|r&t|| jj|  ¡ d�| }|S )N)rŽ   r(   )r�   r   r]   r�   rœ   )r2   rˆ   rw   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&   r]   rT   rZ   r!   rM   r~   rn   Úrequiredr[   r$   )r2   r&   r5   r5   r6   Úget_form_group_classß  s    

z"FieldRenderer.get_form_group_classc             C   s   t ||  ¡ ƒS )N)r   r¡   )r2   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%   ú,)rq   )r]   Únamer+   r‡   Úsplitr_   r    r…   Z	as_widgetro   rq   rz   r“   r”   r—   r˜   r›   rž   r¢   )r2   rˆ   r5   r5   r6   rA   ó  s    







zFieldRenderer._render)N)N)N) rC   rD   rE   rF   r	   r   r   r   r}   r7   rz   r€   r�   rƒ   r…   rŒ   r�   r‘   r’   r“   r”   r—   r˜   rš   r›   rœ   r�   rž   r¡   r¢   rA   rX   r5   r5   )rK   r6   re   Ó   s6   >


	

		re   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   )rf   Úer5   r5   r6   rh     s    z7InlineFieldRenderer.add_error_attrs.<locals>.<listcomp>)ro   rq   r0   rQ   rv   r=   )r2   Zfield_titler5   r5   r6   Úadd_error_attrs  s    z#InlineFieldRenderer.add_error_attrsc                s   t t| ƒ ¡  |  ¡  d S )N)rJ   r§   r…   r©   )r2   )rK   r5   r6   r…     s    z$InlineFieldRenderer.add_widget_attrsc             C   s   |S )Nr5   )r2   rˆ   r5   r5   r6   r˜     s    z#InlineFieldRenderer.append_to_fieldc             C   s   | j S )N)r'   )r2   r5   r5   r6   rš     s    z#InlineFieldRenderer.get_field_classc             C   s   t | jdƒS )Nzsr-only)r!   r(   )r2   r5   r5   r6   rœ     s    z#InlineFieldRenderer.get_label_class)
rC   rD   rE   rF   r©   r…   r˜   rš   rœ   rX   r5   r5   )rK   r6   r§   	  s   r§   )4Ú
__future__r   Zdjango.contrib.auth.formsr   ÚRuntimeErrorZdjango.formsr   r   r   r   r   r	   r
   r   r   r   r   Zdjango.forms.widgetsr   Zdjango.forms.formsr   r   Zdjango.forms.formsetsr   Zdjango.utils.htmlr   r   r   Zdjango.utils.safestringr   Z	bootstrapr   Ú
exceptionsr   rO   r   r   r   r   r   r   Útextr    Úutilsr!   r"   Úobjectr#   rG   rY   re   r§   r5   r5   r5   r6   Ú<module>   s,   
4 2=F  8