o
    [h{                     @   sT  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dlZd dl	Z
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 d dlmZ d d	lmZ eed
Ze Zdd Zejej  Z!dd Z"dd Z#dZ$dZ%dd e$D Z&dd Z'e dd Z(dd Z)e dd Z*e dd Z+e dd  Z,d!d" Z-d#d$ Z.d%d& Z/d'd( Z0ej1ej2pd) Z3d*d+ Z4d,d- Z5e5 Z6e4d.Z7ee3Z8d/d0 Z9d1d2 Z:d3d4 Z;d5d6 Z<G d7d8 d8Z=G d9d: d:e>Z?d;d< Z@d=d> ZAG d?d@ d@eBZCdAdB ZDdCdD ZEdSdFdGZFG dHdI dIZGdJZHdKZIdLZJe9eJZKe L ZMG dMdN dNZNdOdP ZOdQdR ZPdS )T    N)Random)OrderedDictimport_module)IterableTuple)Path)	lru_cache)Signer)settingsUSE_TIMEOUT_WORKERc                 C   sJ   t tj| }ttj|d }|| tj||d< tj|S )N   )	listurllibparseurlparser   	parse_qslupdate	urlencode
urlunparse)urlparamsZ	url_partsquery r   s/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/common.pyadd_params_to_url   s
   
r   c                 C   s   d dd t| D S )N c                 s   s    | ]}t tV  qd S N)rngchoiceSESSION_CODE_CHARSET).0_r   r   r   	<genexpr>-   s    zrandom_chars.<locals>.<genexpr>)joinrange)Z	num_charsr   r   r   random_chars,   s   r&   c                   C   s   t dS N   )r&   r   r   r   r   random_chars_80   s   r)   ZbdfghjklmnprstvzZaeiouc                 C   s   g | ]}t D ]}|| qqS r   )VOWELS)r!   cvr   r   r   
<listcomp>7   s    r-   c                   C   s   d ttdS )Nr   r   )r$   r   sample	SYLLABLESr   r   r   r   random_chars_join_code:   s   r0   c                 C   s$   t |  d}| od|dv S )Nz/__init__.pyimportutf8)r   exists	read_text)app_nameZ	init_pathr   r   r   	is_noself>   s   r6   c                 C   s   t |  dS )Nz.testsr   )r5   r   r   r   get_bots_moduleD   s   r7   c                 C   s   t | r| n|  d}t|S )Nz.models)r6   r   )r5   module_namer   r   r   get_models_moduleH   s   r9   c              
   C   sb   |  d| gt |  }zt|W S  ty0 } zdd l}|  td W Y d }~d S d }~ww )Nz.pagesr      )r6   r   	Exception	traceback	print_excsysexit)r5   r8   excr<   r   r   r   get_pages_moduleN   s   
rA   c                 C   s   t | }t|dr|jS |jS )N	Constants)r9   hasattrrB   C)r5   modelsr   r   r   get_constants\   s   
rF   c                 C   s   t | }||S r   )rF   Zget_normalized)r5   Zconstant_namerB   r   r   r   get_builtin_constantd   s   
rG   c                 C   s   d | j| jS )Nz{}.{})format
__module____name__)ZClsr   r   r   get_dotted_namei      rK   c                 C   s   |  dd S )zworks for self and no-self.r   )split)Zimport_pathr   r   r   get_app_label_from_import_pathm   s   rO   c                 C   s,   | sdS t | d ttfsdd | D } | S )zhallows the programmer to define choices as a list of values rather
    than (value, display_value)

    Nr   c                 S   s   g | ]}||fqS r   r   )r!   valuer   r   r   r-   z       z(expand_choice_tuples.<locals>.<listcomp>)
isinstancer   tuple)choicesr   r   r   expand_choice_tuplesr   s
   rU   r   c                 C   s"   | t 7 } t|   d d S r'   _SECREThashlibsha224encode	hexdigestsr   r   r   	make_hash   s   r^   c                  C   s   t } t|   d d S r'   rV   r\   r   r   r   get_admin_secret_code   s   r_   Z
dataexportc                 C   s   t | dS Nr2   )_signersigndecoder\   r   r   r   signer_sign   rL   rd   c                 C   s   t | ddS r`   )ra   ZunsignrZ   rc   )shr   r   r   signer_unsign   s   rf   c                 C   s$   t d| r| S d|| }t|)Nz^[a-zA-Z0-9_]+$z>{} "{}" can only contain letters, numbers, and underscores (_))rematchrH   
ValueError)
identifierZidentifier_descriptionmsgr   r   r   validate_alphanumeric   s   rl   c                 C   s"   t | j}t|ot|d ddS )Nr   Zgroup_by_arrival_timeF)rA   page_sequenceboolgetattr)r5   rm   r   r   r   has_group_by_arrival_time   s   


rp   c                   @   s   e Zd Zdee fddZdS )
DebugTablerowsc                 C   sH   || _ g | _|D ]\}}t|tr| dd}| j||f qd S )N
z<br>)titlerr   rR   strstripreplaceappend)selfrt   rr   kr,   r   r   r   __init__   s   
zDebugTable.__init__N)rJ   rI   __qualname__r   r   r{   r   r   r   r   rq      s    rq   c                   @      e Zd ZdS )InvalidRoundErrorNrJ   rI   r|   r   r   r   r   r~          r~   c              
   K   s~   |dk rd |}t|z| jdd|i| W S  ty> } zddlm} t||r9d | j|}t|d  d }~ww )Nr:   Invalid round number: {}round_numberr   )NoResultFoundz.No corresponding {} found with round_number={}r   )	rH   r~   objects_filteroner;   Zotree.databaser   rR   rJ   )
ModelClassr   kwargsrk   r@   r   r   r   r   in_round   s   


r   c                 K   s|   |dk rd |}t|t| j| j|k| j|kfi |d}t|}|| d }||kr<d ||||}t||S )Nr:   r   r   z>Database contains {} records for rounds {}-{}, but expected {})rH   r~   r   r   r   Zorder_bylen)r   firstlastr   rk   retZnum_resultsZexpected_num_resultsr   r   r   	in_rounds   s&   
r   c                   @   r}   )BotErrorNr   r   r   r   r   r      r   r   c                 C   s
   d | S )Nz/InitializeParticipant/{})rH   )coder   r   r   participant_start_url   s   
r   c                 C   s<   |}| }g }t dt||D ]}|||||   q|S )Nr   )r%   r   rx   )Zranked_listplayers_per_groupZppgplayersgroup_matrixir   r   r   _group_by_rank   s   r   Fc                    s   t tj| }dd | D   r t fdd D r td d }|r?dd t|  D } | D ]}t| q1t t|  S t| t	||S )z5Random Uniform distribution of players in every groupc                 S      g | ]}t |qS r   )r   )r!   groupr   r   r   r-      rQ   z#_group_randomly.<locals>.<listcomp>c                 3   s    | ]	}| d  kV  qdS )r   Nr   )r!   sizesizesr   r   r#      s    z"_group_randomly.<locals>.<genexpr>z7This algorithm does not work with unevenly sized groupsr   c                 S   r   r   )r   )r!   colr   r   r   r-      rQ   )
r   	itertoolschainfrom_iterableanyri   zipr   shuffler   )r   Zfixed_id_in_groupr   r   columnr   r   r   _group_randomly   s   

r   c                   @   s   e Zd ZdZdS )GlobalStater   N)rJ   rI   r|   Z"browser_bots_launcher_session_coder   r   r   r   r      s    r   __all__Z	csrftokenZotreeadminauthc                   @   r}   )FULL_DECIMAL_PLACESNr   r   r   r   r   r     r   r   c                 C   sF   |  d| d}ttd| |d  tjd }||  }||fS )Nz
class (z^\wr:   )indexr   rg   finditer	MULTILINEstart)txtZ	ClassNameZclass_startmZ	class_endr   r   r   get_class_bounds  s    r   c                 C   s4   |   s
d|  dS d}t| |krd| dS d S )N'zN' is not a valid name. Please make sure the name is a valid Python identifier.(   zName must be shorter than z characters)isidentifierr   )nameZ	max_charsr   r   r   app_name_validity_message  s   
r   )F)QasynciorX   r   osrandomr   rg   stringr>   urllib.parser   collectionsr   	importlibr   typingr   r   pathlibr   	functoolsr	   Zitsdangerousr
   Zotreer   rn   getenvr   r   r   ascii_lowercasedigitsr    r&   r)   Z
CONSONANTSr*   r/   r0   r6   r7   r9   rA   rF   rG   rK   rO   rU   Z
SECRET_KEYZADMIN_PASSWORDrW   r^   r_   ZADMIN_SECRET_CODEZDATA_EXPORT_HASHra   rd   rf   rl   rp   rq   ri   r~   r   r   AssertionErrorr   r   r   r   r   ZNON_FIELD_ERROR_KEYZCSRF_TOKEN_NAMEZAUTH_COOKIE_NAMEZAUTH_COOKIE_VALUELocklockr   r   r   r   r   r   r   <module>   s    



	

	