o
    [h3)                  
   @   sD  d dl Z d dlmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlZd dlZd dl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 dd Zdd ZG dd dejjZ dd Z!G dd de j"Z#e#j$e!e#j%e%e#j&e&e#jee#j'e'iZ(de#fddZ)G dd dej*Z+dd Z,dS )     N)Dict)sqltypes)Boolean)
validators)converts)settings)Currencyto_dec)CurrencyType   )fields)widgets   )core_gettextc                 C   s  i }|D ]}t | |}|j}g i d| d}d|v r!|d |d< | }t || dd }	d}
|	r;|	||d< d}
nd|v rG|d |d< d}
|
st|jtjtjtfv rt || dd }	|	re|	|}n|d	d
}t || dd }	|	r{|	|}n|d}||gd d gkr|d 	t
j||d |d ur|d jt|d |d ur|d jt|d |ds|d 	t
  |d|d< |d}|rt|tr| }||d< |||< qtjj| t|t |dS )NZid_)r   	render_kwidlabelZ_choicesFchoicesT_minminr   _maxmaxr   )r   r   r   r   r   blank	help_textdescriptionwidget)modelZ
base_classonly	converter
field_args)getattr
form_propsZget_user_defined_targettypestIntegerFloatr
   getappendr   NumberRangeupdater	   ZInputRequired
isinstancewtforms_sqlalchemyorm
model_form	ModelFormModelConverter)
ModelClassobjr   r!   nameZmodel_fieldZfield_propsfatargetfuncZhas_choicesr   r   r    r8   x/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/forms/forms.pyr/      sl   







r/   c                 C   s6   d| _ tt| | |d}||| |d}||_d| _ |S )NF)r3   r   )formdatar3   viewT)Z
_is_frozenr/   r$   field_names)instancer<   r;   r:   Z	FormClassformr8   r8   r9   get_formc   s   r?   c                       s   e Zd Zd fdd	Zedd Zeddd	 Zed
dd Zeddd Z	eddd Z
eddd Zeddd Z  ZS )r1   NTc                    s   t  j||d d S )N)use_mro)super__init__)selfZextra_convertersr@   	__class__r8   r9   rB   p      zModelConverter.__init__c                 K   s<   t |jjtr|jjr|d tj|jjd d S d S d S )Nr   r   )r,   r$   lengthintr)   r   ZLength)clscolumnr!   extrar8   r8   r9   _string_commons   s   zModelConverter._string_commonStringc                 K   s0   | j dd|i| t|tjptjdi |S Nr!   r8   )rL   get_choices_fieldFormDataTypesstrr   StringFieldrC   r!   rK   r8   r8   r9   conv_Stringx   s   zModelConverter.conv_StringTextc                 K   s$   | j dd|i| tjdi |S rN   )rL   r   ZTextAreaFieldrS   r8   r8   r9   	conv_Text   s   zModelConverter.conv_Textr   c                 K   s@   | dt  t|d tjrtjdi |S t|tj	}|S )Nr   r8   )

setdefaultr   RadioSelectr,   ZCheckboxInputr   ZCheckboxFieldrO   rP   bool)rC   r!   rK   Zfldr8   r8   r9   conv_Boolean   s
   zModelConverter.conv_Booleanr&   c                 K   sD   t |jdd}|r|d tjdd t|tjp!tj	di |S )NunsignedFr   r   r   r8   )
r"   r$   r)   r   r*   rO   rP   rH   r   ZIntegerField)rC   r   rJ   r!   rK   r[   r8   r8   r9   handle_integer_types   s   z#ModelConverter.handle_integer_typesZNumericc                 K      t |tjptjdi |S Nr8   )rO   rP   floatr   Z
FloatFieldrS   r8   r8   r9   handle_decimal_types   s   z#ModelConverter.handle_decimal_typesr
   c                 K   r]   r^   )rO   rP   r   r   ZCurrencyFieldrS   r8   r8   r9   handle_currency   s
   zModelConverter.handle_currency)NT)__name__
__module____qualname__rB   classmethodrL   r   rT   rV   rZ   r\   r`   ra   __classcell__r8   r8   rD   r9   r1   o   s     





r1   c                 C   s   | dv rdS dS )N)NF 0FalsefalseFTr8   )valr8   r8   r9   bool_from_form_value   s   rl   c                   @   s    e Zd ZdZdZdZdZdZdS )rP   rY   r_   rH   currencyrQ   N)rb   rc   rd   rY   r_   rH   r   rQ   r8   r8   r8   r9   rP      s    rP   datatypec                 C   s  |t jkr| ddtdfdtdfg d| v rh|t jkr>| d }t|d ttfr3dd |D }nd	d |D }|| d< t| | d
< | 	dd }|rPt
|}tjtjtjtjtjtjd tji| di | S | dr~t| d tjtjfrd}t|d S d S )Nr   TZYesFZNor   c                 S   s   g | ]
\}}t ||fqS r8   )r	   ).0vr   r8   r8   r9   
<listcomp>       z%get_choices_field.<locals>.<listcomp>c                 S   s   g | ]
}t |t|fqS r8   )r	   r   )ro   rp   r8   r8   r9   rq      rr   Zcoercer   z;Field uses a radio/select widget but no choices are definedr8   )rP   rY   rW   r   r   r,   listtuplecoerce_functionspopr$   r   rX   r   Z
RadioFieldZRadioSelectHorizontalZRadioFieldHorizontalZ	TextInputrR   ZDropdownFieldr(   	Exception)r5   rn   beforeafterr   msgr8   r8   r9   rO      s<   

rO   c                       s   e Zd ZU G dd dZeeejjf e	d< dZ
g Z					d fdd	Zdd	 Z fd
dZe fddZdd Z  ZS )r0   c                   @   s   e Zd Zejdd gZdS )zModelForm.MetaNr   )rb   rc   rd   r   ZLANGUAGE_CODE_ISOZlocalesr8   r8   r8   r9   Meta   s    r{   _fieldsNrg   c                    s.   || _ || _t jd|||||d| d S )N)r:   r3   prefixdatametar8   )r;   r=   rA   rB   )rC   r;   r:   r3   r}   r~   r   kwargsrD   r8   r9   rB      s   


zModelForm.__init__c                 C   s:   | j | jfD ]}t||rt||}t|r|  S qd S N)r;   r=   hasattrr"   callable)rC   method_namer3   methr8   r8   r9   _get_method_from_page_or_model   s   

z(ModelForm._get_method_from_page_or_modelc                    s&  t   }|r	g nt| j}t| j}| j D ]C\}}||v r!qt||}|jt	ks<t
|jt	rF|jd u rF|jdsFtjj}|j| | jj| d|jdd}|r[|j| q| jst| jdr| jd| j}	|	rt
|	tr|	 D ]\}
}t| |
j| qxn|	| _t| jp| j S )Nr   Z_error_messageT)
missing_okerror_message)rA   validaters   errorsr$   r=   r|   itemsr"   r   r,   r~   r#   r(   otree	constantsZfield_required_msgr)   Zcall_user_definedr   r;   dictnon_field_errorrY   )rC   Zsuper_validatesZfields_with_errorsr2   r4   fieldrJ   rz   Zerror_stringerrorkrp   rD   r8   r9   r      s<   







zModelForm.validatec                    s   t  j}| jr| j|d< |S )N__all__)rA   r   r   )rC   r   rD   r8   r9   r   $  s   
zModelForm.errorsc                    s    fdd j D S )Nc                 3   s    | ]} | V  qd S r   r8   )ro   r   rC   r8   r9   	<genexpr>,  s    z%ModelForm.__iter__.<locals>.<genexpr>)r<   r   r8   r   r9   __iter__+  rF   zModelForm.__iter__)NNrg   NN)rb   rc   rd   r{   r   rQ   wtformsr   Field__annotations__r   r<   rB   r   r   propertyr   r   rf   r8   r8   rD   r9   r0      s    
 'r0   c                 C   s,   | sdS t | d ttfsdd | D } | S )z]
    Don't need it while generating the form,
    since wtforms also accepts flat lists.
    Nr   c                 S   s   g | ]}||fqS r8   r8   )ro   valuer8   r8   r9   rq   7  s    z(expand_choice_tuples.<locals>.<listcomp>)r,   rs   rt   )r   r8   r8   r9   expand_choice_tuples/  s
   r   )-enumtypingr   r   Zwtforms_sqlalchemy.ormr-   Zsqlalchemy.sqlr   r%   Zsqlalchemy.typesr   r   r   Zotree.commonr   Zotree.constantsZotree.modelsr   Zotree.currencyr   r	   Zotree.databaser
   rg   r   r   Zi18nr   r/   r?   r.   ZModelConverterBaser1   rl   EnumrP   rY   rH   r_   rQ   ru   rO   ZFormr0   r   r8   r8   r8   r9   <module>   s>    M3		!S