o
    [h'                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	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mZ d dlmZmZ d dl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' 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 ed!ed"e/fd#d$Z0d efd%d&Z1d efd'd(Z2G d)d* d*e'Z3G d+d, d,e'Z4dZ5G d-d. d.e'Z6G d/d0 d0e'Z7G d1d2 d2e'Z8dS )3    N)Path)import_module)Request)ResponseJSONResponse)settings)utils)GlobalStateget_models_module)
json_dumps)dbdbq)SessionParticipant)ParticipantVarsFromREST)	ROOM_DICT)create_sessionSESSION_CONFIGS_DICTCreateSessionInvalidArgs)ibis_loader   )BaseRESTViewc                   @      e Zd ZdZdd ZdS )RESTOTreeVersionz/api/otree_versionc                 C   s   t ttjdS )N)version)r   dictotree__version__self r    w/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/views/rest.pyget   s   zRESTOTreeVersion.getN__name__
__module____qualname__url_patternr"   r    r    r    r!   r          r   c                   @   r   )RESTSessionConfigsz/api/session_configsc                 C   s   t ttt S )N)r   r   listr   valuesr   r    r    r!   r"   #   s   zRESTSessionConfigs.getNr#   r    r    r    r!   r)       r(   r)   c                   @   r   )	RESTRoomsz
/api/roomsc                    s    fddt  D }t|S )Nc                    s   g | ]}|  jqS r    )Zrest_api_dictrequest).0rr   r    r!   
<listcomp>+   s    z!RESTRooms.get.<locals>.<listcomp>)r   r+   r   )r   datar    r   r!   r"   *   s   zRESTRooms.getNr#   r    r    r    r!   r,   '   r(   r,   c                   @   r   )RESTSessionVarsz/api/session_vars/{code}c                 C   .   | j jd }tjt|d}|j| ti S Ncoder5   )r-   path_paramsr   
get_or_404r   varsupdater   )r   r9   r5   sessionr    r    r!   post3      zRESTSessionVars.postNr$   r%   r&   r'   r<   r    r    r    r!   r2   /       r2   c                   @   r   )RESTParticipantVarsz/api/participant_vars/{code}c                 C   r3   r4   )r-   r7   r   r8   r   r9   r:   r   )r   r9   r5   participantr    r    r!   r<   >   r=   zRESTParticipantVars.postNr>   r    r    r    r!   r@   :   r?   r@   c                   @   s   e Zd ZdZdZdd ZdS )RESTParticipantVarsByRooma  
    This can be used when you don't know the participant code,
    or when the participant doesn't have a code yet.
    For example, you might need to send data to oTree about the participant
    BEFORE sending the participant to oTree via their room link.
    z/api/participant_varsc           
      C   s   |t vrtd| dddS t | }| }|r-|jj|d }|r-|j| ti S t	||d}t
|}tjdi |}	|	rI||	_ti S tdi |d|i}	t|	 ti S )	NzRoom z
 not foundi  status_code)label)participant_label	room_name
_json_datar    )r   r   Zget_sessionpp_set	filter_byfirstr9   r:   r   r   jsondumpsr   Zobjects_firstrH   r   add)
r   rG   rF   r9   roomr;   rA   kwargsrH   objr    r    r!   r<   O   s*   

zRESTParticipantVarsByRoom.postN)r$   r%   r&   __doc__r'   r<   r    r    r    r!   rB   E   s    rB   c                   @   s    e Zd ZdZdd Zdd ZdS )RESTSessionsz/api/sessionsc                 C   sL   g }t tjdddD ]}t|}|t|| j || qt	|S )NF)Zis_demoid)
r   r   rJ   Zorder_bysession_attrs_for_listr:   get_session_urlsr-   appendr   )r   sessionsr;   Zsession_dictr    r    r!   r"   k   s   zRESTSessions.getc              
   K   s   z	t di |}W n ty# } ztt|ddW  Y d }~S d }~ww |d}t|jd}|r=tjt	|ddid |
t|| j t|S )	N  rC   rG   r6   statussession_readygroupr1   r    )r   r   r   strr"   r   r5   channel_utilssync_group_sendZroom_participants_group_namer:   rV   r-   r   )r   rP   r;   excrG   Zresponse_payloadr    r    r!   r<   s   s   
zRESTSessions.postN)r$   r%   r&   r'   r"   r<   r    r    r    r!   rS   g   s    rS   r;   r-   returnc                 C   sB   t |jd| jd|jd| jdd}|  }|r|||d< |S )NZJoinSessionAnonymously)Zanonymous_codeZSessionStartLinksr6   )Zsession_wide_urlZ	admin_urlZroom_url)r   Zurl_forZ_anonymous_coder5   Zget_roomZget_room_wide_url)r;   r-   drO   r    r    r!   rV      s   rV   c                 C   s    t | j| j| j| j| jd dS )Nname)r5   num_participantsZ
created_atrE   Zconfig_name)r   r5   re   Z_createdrE   configr;   r    r    r!   rU      s   rU   c                 C   s   t | jtjdS )N)rf   REAL_WORLD_CURRENCY_CODE)r   rf   r   rh   rg   r    r    r!   session_attrs_for_detail   s   ri   c                   @   s   e Zd ZdZdddZdS )RESTGetSessionInfoz/api/get_session/{code}Nc              
   C   s  |d u rg }|d u rg }| j jd }tjt|d}|j}|d ur)|tj	|}g }|D ]U}t
|j|j|j|j|d}	dtjv rL|jdd|	d< |D ].}
|
|jv r||j|
 }zt| W n tyw   td|
 ddd	 Y     S w ||	|
< qN||	 q-t|}|t| |t|| j  |j|j|tjd
 |D ],}
|
|jv r|j|
 }zt| W n ty   td|
 ddd	 Y   S w |||
< q|jd}|rt|d d|d< tt|S )Nr5   r6   )id_in_sessionr5   rE   Zpayoff_in_real_world_currencyfinishedFzparticipant.vars['z'] is not JSON serializablerY   rC   )rf   Zparticipantsrh   zsession.vars['Zmturk_hit_settingstemplateutf8Zmturk_template_html) r-   r7   r   r8   r   rI   filterr   rE   in_r   rk   r5   ZpayoffZto_real_world_currencyr   ZPARTICIPANT_FIELDSr9   r"   r   	TypeErrorr   rW   rU   r:   ri   rV   rf   rh   r   Zsearch_template	read_text)r   Zparticipant_labelsZparticipant_varsZsession_varsr5   r;   rI   Z
pdata_listppZpdatafieldvalpayloadZmturk_settingsr    r    r!   r<      s|   







zRESTGetSessionInfo.post)NNNr>   r    r    r    r!   rj      s    rj   c                   @   s   e Zd ZdZejZdS )RESTGetSessionInfoLegacyz/api/sessions/{code}N)r$   r%   r&   r'   rj   r<   r"   r    r    r    r!   rw      s    
rw   c                   @   r   )CreateBrowserBotsSessionz/create_browser_bots_sessionc                 C   sD   t ||d}tjjj|j|d |jt_t	j
dddid t|jS )N)session_config_namere   )Z
session_pkcase_numberZbrowser_bot_waitrZ   r[   r\   )r   r   ZbotsZbrowserZinitialize_sessionrT   r5   r	   "browser_bots_launcher_session_coder_   r`   r   )r   re   ry   rz   r;   r    r    r!   r<     s   
zCreateBrowserBotsSession.postNr>   r    r    r    r!   rx      r(   rx   c                   @   r   )CloseBrowserBotsSessionz/close_browser_bots_sessionc                 K   s   d t _tdS )Nok)r	   r{   r   )r   rP   r    r    r!   r<     s   zCloseBrowserBotsSession.postNr>   r    r    r    r!   r|     r(   r|   c                   @   r   )RESTAppsz	/api/appsc                 C   s>   ddl m} i }|D ]}t|}t|dd||< q
tt|S )Nr   )
OTREE_APPSdoc )Zotree.settingsr   r
   getattrr   r   )r   r   rc   ZappZmodels_moduler    r    r!   r"      s   zRESTApps.getNr#   r    r    r    r!   r~     r(   r~   )9rL   pathlibr   	importlibr   Zstarlette.requestsr   Zstarlette.responsesr   r   r   Zotree.bots.browserZotree.views.cbvr   Zotree.channelsr   r_   Zotree.commonr	   r
   Zotree.currencyr   Zotree.databaser   r   Zotree.modelsr   r   Zotree.models_concreter   Z
otree.roomr   Zotree.sessionr   r   r   Zotree.templatingr   Zcbvr   r   r)   r,   r2   r@   rB   rS   r   rV   rU   ri   rj   rw   Zlauncher_session_coderx   r|   r~   r    r    r    r!   <module>   sF    "	L