o
    [h                     @   s  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 d dlmZ G dd	 d	Z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Z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ZG dd deZd S )!    )Decimal)escapeMarkup)	text_type)html_params)settings)CURRENCY_SYMBOLS)core_gettextc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
BaseWidgetTc                 K   sf   || _ |d|j | jrd|vr| |d< d|vr'dt|dg v r'd|d< || _td| 	 S )NidvaluerequiredflagsT )
field
setdefaultr   	has_value_valuegetattr	render_kwr   joinget_html_fragmentsselfr   r    r   z/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/forms/widgets.py__call__   s   zBaseWidget.__call__c                 C   s   t N)NotImplementedErrorr   r   r   r   r      s   zBaseWidget.get_html_fragmentsc                 C   s   t dd| jji| jS )Nnamer   )r   r   r    r   r   r   r   r   attrs   s   zBaseWidget.attrsN)__name__
__module____qualname__r   r   r   r!   r   r   r   r   r
      s
    r
   c                       $   e Zd Z fddZdd Z  ZS )CheckboxInputc                    s*   t |d|jrd|d< t j|fi |S )NcheckedT)r   datasuperr   r   	__class__r   r   r   #   s   zCheckboxInput.__call__c                 c       d|    V  d S )Nz3<input type="checkbox" class="form-check-input" %s>r!   r   r   r   r   r   (      z CheckboxInput.get_html_fragmentsr"   r#   r$   r   r   __classcell__r   r   r*   r   r&   "   s    r&   c                   @      e Zd ZdZdd ZdS )IntegerWidgetz
    better to use number input when we can, because:
    - on mobile it pops up the number keypad
    - better validation of numbers
    c                 c   B    | j d}|d ur|dkrd}nd}d| d|   V  d S )Nminr   numericr   5<input type="number" class="form-control" inputmode="" %s>r   getr!   r   r4   Z	inputmoder   r   r   r   3   s   z IntegerWidget.get_html_fragmentsNr"   r#   r$   __doc__r   r   r   r   r   r2   ,       r2   c                   @   r1   )FloatWidgetz
    use input type='text' instead of 'number' because:
    - it allows comma as decimal separator
    - no annoying spinner widget
    - no problems dealing with step= argument.
    c                 c   r3   )Nr4   r   decimalr   3<input type="text" class="form-control" inputmode="r7   r8   r:   r   r   r   r   E   s   zFloatWidget.get_html_fragmentsNr;   r   r   r   r   r>   =       r>   c                   @   s   e Zd Zdd Zdd ZdS )CurrencyWidgetc                 C   sP   t jrtt dd rt j}ntd}t j}ntt jt j}t j	}|| _
|| _d S )NPOINTS_CUSTOM_NAMEZpoints)r   Z
USE_POINTSr   rC   r	   ZPOINTS_DECIMAL_PLACESr   r9   ZREAL_WORLD_CURRENCY_CODEZ"REAL_WORLD_CURRENCY_DECIMAL_PLACESsymbolplaces)r   ZCURRENCY_SYMBOLrE   r   r   r   __init__O   s   
zCurrencyWidget.__init__c                 c   s    dV  | j d}|d u s|dk rd}n
| jdkrd}nd}| jdkr1d| d|   d	V  nd
| d|   d	V  d| j dV  dV  d S )Nz,<div class="input-group input-group-narrow">r4   r   r   r5   r?   r6   z" >r@   z<span class="input-group-text">z</span></div>)r   r9   rE   r!   rD   r:   r   r   r   r   _   s   


z!CurrencyWidget.get_html_fragmentsN)r"   r#   r$   rF   r   r   r   r   r   rB   N   s    rB   c                   @   s   e Zd Zdd ZdS )	TextInputc                 c   r,   )Nz+<input type="text" class="form-control" %s>r-   r   r   r   r   r   s   r.   zTextInput.get_html_fragmentsN)r"   r#   r$   r   r   r   r   r   rI   r   s    rI   c                   @   r1   )TextAreazs
    Renders a multi-line text area.

    `rows` and `cols` ought to be passed as keyword args when rendering.
    c                 c   s"    d|   t| j f V  d S )Nz1<textarea class="form-control" %s>
%s</textarea>)r!   r   r   r   r   r   r   r   r   ~   s
   zTextArea.get_html_fragmentsNr;   r   r   r   r   rJ   w   r=   rJ   c                   @   s(   e Zd ZdZdZdd Zedd ZdS )Selectz
    Renders a select field.

    The field must provide an `iter_choices()` method which the widget will
    call on rendering; this method must yield tuples of
    `(value, label, selected)`.
    Fc                 c   sF    d|    V  dV  | j D ]\}}}| |||V  qdV  d S )Nz<select class="form-select" %s>z"<option value="">--------</option>z	</select>)r!   r   Ziter_choicesrender_option)r   vallabelselectedr   r   r   r      s   
zSelect.get_html_fragmentsc                 K   sF   |du rt |}t||d}|rd|d< tdtdi |t|f S )NT)r   rO   z<option %s>%s</option>r   )r   dictr   r   r   )clsr   rN   rO   kwargsoptionsr   r   r   rL      s   zSelect.render_optionN)r"   r#   r$   r<   r   r   classmethodrL   r   r   r   r   rK      s    rK   c                   @   r1   )SelectOptionz
    Renders the individual option from a select field.

    This is just a convenience for various custom rendering situations, and an
    option by itself does not constitute an entire field.
    c                 K   s    t j| |jj|jfi |S r   )rK   rL   r   rN   textr'   r   r   rR   r   r   r   r      s
   zSelectOption.__call__N)r"   r#   r$   r<   r   r   r   r   r   rU      rA   rU   c                   @   r1   )RadioSelectFc                 c   sZ    dt di | j V  | jD ]}| jdr|ddn| }d||jf V  qdV  d S )Nz<div %s>r   Tr   z#<div class="form-check">%s %s</div>rH   r   )r   r   r   r9   rN   r   ZsubfieldZsubfield_htmlr   r   r   r      s   



zRadioSelect.get_html_fragmentsNr"   r#   r$   r   r   r   r   r   r   rX          rX   c                   @   r1   )RadioSelectHorizontalFc                 c   sN    | j D ] }| jdr|ddn| }d| d|j d|jj dV  qd S )Nr   TrY   zH
            <div class="form-check form-check-inline">
                z
                <label for="z" class="form-check-label">z(</label>
            </div>
            )r   r   r9   r   rN   rV   rZ   r   r   r   r      s   

z(RadioSelectHorizontal.get_html_fragmentsNr[   r   r   r   r   r]      r\   r]   c                       r%   )RadioOptionc                    s"   |j rd|d< t j|fi |S )NTr'   )r'   r)   r   rW   r*   r   r   r      s   zRadioOption.__call__c                 c   r,   )Nz0<input class="form-check-input" type="radio" %s>r-   r   r   r   r   r      r.   zRadioOption.get_html_fragmentsr/   r   r   r*   r   r^      s    r^   N)r?   r   Z
markupsafer   r   Zwtforms.compatr   Zwtforms.widgetsr   Zotreer   Zotree.currencyr   Z
otree.i18nr	   r
   r&   r2   r>   rB   rI   rJ   rK   objectrU   rX   r]   r^   r   r   r   r   <module>   s&    
$