o
    [hE                      @   s   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 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mZ d d	lmZ d d
lmZ d dlmZ dZdZg Zdd ZG dd deZG dd deZ dZ!dZ"dd Z#G dd deZ$dS )    N)run_in_threadpool)FormData)HTTPEndpoint)Request)ResponseRedirectResponse)settings)CSRF_TOKEN_NAMEAUTH_COOKIE_NAMEAUTH_COOKIE_VALUErng)db)Session)renderALWAYS_UNRESTRICTEDUNRESTRICTED_IN_DEMO_MODEc                 C   s   t t| |d d S )N)Z
alert_typemsg)_admin_message_queueappenddict)Zbootstrap_alert_typer    r   v/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/views/cbv.pyenqueue_admin_message   s   r   c                   @   s   e Zd ZU dZeed< dZdZdZdd Z	dd Z
d'd	d
ZdefddZdef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efd%d&ZdS )(	AdminViewFrequestNc                 C   s   | j o|   S N)_requires_login_is_logged_inselfr   r   r   _is_unauthorized"   s   zAdminView._is_unauthorizedc                 C   s   | j jttkS r   )r   sessiongetr
   r   r   r   r   r   r   %      zAdminView._is_logged_inreturnc                    sf   t | j| jd | _}|j dkr| j I d H | _t| j	|I d H }|| j| j| j
I d H  d S )Nreceivepost)r   scoper&   r   methodlowerform
_form_datar   inner_dispatchsend)r   r   responser   r   r   dispatch(   s   zAdminView.dispatchc                 C   s   | j S r   )r,   r   r   r   r   get_post_data0   s   zAdminView.get_post_datac                 C   s   |   r	| dS | jdi |j}|r|S |j dkrL| jsBtdsB| 	 }|
t}|j
t}|r<|r<||krBtdddS | j|fi |jS | j
|fi |jS )NZLoginr'   ZOTREE_SKIP_CSRF  zCSRF verification failed)status_codecontentr   )r    redirectintercept_dispatchpath_paramsr)   r*   csrf_exemptosgetenvr1   r"   r	   r!   r   r'   )r   r   respZ	post_dataZ
form_tokencookier   r   r   r-   3   s   

zAdminView.inner_dispatchc                 K   s   d S r   r   r   kwargsr   r   r   r6   D   s   zAdminView.intercept_dispatchc                 K   s2   i }|   }|r||d< | jdi |}| |S )Nr+   r   )get_formget_context_datarender_to_response)r   r   r>   contextr+   r   r   r   r"   G   s   
zAdminView.getc                 C   s   | j r|   S d S r   )
form_classr   r   r   r   r?   O   s   zAdminView.get_formc                 O   s,   | j |  d}| r| |S | |S )N)Zformdata)rC   r1   validate
form_validform_invalid)r   r   argsr>   r+   r   r   r   r'   S   s   

zAdminView.postc                 C   s   |  |  S r   )r5   get_success_url)r   r+   r   r   r   rE   Y      zAdminView.form_validc                 C   s   | j |d}| |S )N)r+   )r@   rA   )r   r+   rB   r   r   r   rF   \   s   
zAdminView.form_invalidc                 K   sx   | j jt}|sttdd}|| j jt< dt d| d}||t< |j| tt	j
| jj| j jd ||   |S )Ni ʚ;l    d(	 z<input type="hidden" name="z	" value="z">)viewZadmin_message_queueZis_debugZcurrent_page_nameurl_for)r   r!   r"   r	   strr   randintupdater   r   DEBUG	__class____name__rK   vars_for_template)r   r>   Z
csrf_valueZtoken_inputr   r   r   r@   `   s    zAdminView.get_context_datac                 C   s   i S )z
        simpler to use vars_for_template, but need to use get_context_data when:
        -   you need access to the context produced by the parent class,
            such as the form
        r   r   r   r   r   rR   u   s   zAdminView.vars_for_templatec                 C   s   t |  |S r   )r   get_template_name)r   rB   r   r   r   rA   }   rI   zAdminView.render_to_responsec                 C   s   | j jS r   )r   urlr   r   r   r   rH      s   zAdminView.get_success_urlc                 C   s   d | jjS )Nzotree/{}.html)formatrP   rQ   r   r   r   r   rS      rI   zAdminView.get_template_namec                 K   s   t | jj|fi |ddS )Ni.  r3   )r   r   rK   )r   Zurl_namer>   r   r   r   r5      s   zAdminView.redirectr$   N)rQ   
__module____qualname__r8   r   __annotations__r   rC   r,   r    r   r0   r   r1   r-   r6   r"   r?   r'   rE   rF   r@   rR   rA   rH   rS   r   r5   r   r   r   r   r      s.   
 
r   c                       s>   e Zd ZU eed< edd Z fddZ fddZ  Z	S )AdminSessionPager!   c                 C   s
   d| j  S )Nz
/%s/{code})rQ   )clsr   r   r   url_pattern   s   
zAdminSessionPage.url_patternc                    s   t  jdd| ji|S )Nr!   r   )superr@   r!   r=   rP   r   r   r@      s   z!AdminSessionPage.get_context_datac                    s"   t jt|jd d| _t |S )Ncode)r`   )r   Z
get_or_404r   r7   r!   r^   r-   )r   r   r_   r   r   r-      s   zAdminSessionPage.inner_dispatch)
rQ   rX   rY   r   rZ   classmethodr]   r@   r-   __classcell__r   r   r_   r   r[      s   
 
r[   ZOTREE_REST_KEYzotree-rest-keyc                 C   s   t | ddS )Nr2   rV   r   )r   r   r   r   _HttpResponseForbidden      rd   c                   @   sB   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dS )BaseRESTViewz
    async so that i can get request.json().
    inner_post should also call group_send, at there are complications with doing sync_group_send.

    r$   Nc                    sn   t | j| jd }| _| I d H }|rt|}ni }|| _t| j	|I d H }|| j| j| j
I d H  d S )Nr%   )r   r(   r&   r   bodyjsonloads_payloadr   r-   r.   )r   r   rg   payloadr/   r   r   r   r0      s   zBaseRESTView.dispatchc              
   C   s   t jdv r0tt}|stdt dS |jt}|s$tdt dS ||kr0tdt dS z|j	
 dkr=|  W S |  W S  tyY } ztt|W  Y d }~S d }~ww )N)ZDEMOZSTUDYzEnv var z  must be defined to use REST APIzHTTP Request Header z is missingz is incorrectr'   )r   Z
AUTH_LEVELr9   r:   REST_KEY_NAMErd   headersr"   REST_KEY_HEADERr)   r*   
outer_post	outer_get	TypeErrorrL   )r   r   ZREST_KEYZsubmitted_rest_keyexcr   r   r   r-      s.   






zBaseRESTView.inner_dispatchc                 C      | j di | jS Nr   )r"   rj   r   r   r   r   rp      s   zBaseRESTView.outer_getc                 C   rs   rt   )r'   rj   r   r   r   r   ro      r#   zBaseRESTView.outer_postc                 K      t dddS NzMethod not allowedi  rV   rc   r=   r   r   r   r"      re   zBaseRESTView.getc                 K   ru   rv   rc   r=   r   r   r   r'      re   zBaseRESTView.postrW   )
rQ   rX   rY   __doc__r0   r-   rp   ro   r"   r'   r   r   r   r   rf      s    
	rf   )%asyncior9   rh   Zstarlette.concurrencyr   Zstarlette.datastructuresr   Zstarlette.endpointsr   Zstarlette.requestsr   Zstarlette.responsesr   r   Zotreer   Zotree.commonr	   r
   r   r   Zotree.databaser   Zotree.modelsr   Zotree.templatingr   r   r   r   r   r   r[   rl   rn   rd   rf   r   r   r   r   <module>   s.    q