o
    [hV                      @   s   d dl 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mZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ d dlmZ ee Zd	Zd
ZdZdZdZ dZ!G dd de
Z"dS )    N)Path)run_in_threadpool)ServerErrorMiddlewareSTYLESJS)Request)MessageReceiveScopeSend)TemplateRenderingErrorTemplateLexingErrorErrorWithToken)ibis_loaderzV
<p><span class="frame-line">
<span class="lineno">{lineno}.</span> {line}</span></p>
zv
<p class="center-line"><span class="frame-line center-line">
<span class="lineno">{lineno}.</span> {line}</span></p>
z
<div class="ibis-error">
    <p class="frame-title">File <span class="frame-filename">{template_id}</span>,
    line <i>{line_number}</i>,
    in <b>{tag_name}</b>
    <div class="source-code">{code_context}</div>
</div>

a  
<div>
    <p class="frame-title {faded}">File <span class="frame-filename">{frame_filename}</span>,
    line <i>{frame_lineno}</i>,
    in <b>{frame_name}</b>
    <span class="collapse-btn" data-frame-id="{frame_filename}-{frame_lineno}" onclick="collapse(this)">{collapse_button}</span>
    </p>
    <div id="{frame_filename}-{frame_lineno}" class="source-code {collapsed}">
    {code_context}
    {locals_table}
    </div>
</div>
a  
<html>
    <head>
        <style type='text/css'>
            {styles}
            {otree_styles}
        </style>
        <title>{tab_title}</title>
    </head>
    <body>
        <h2>Application error (500)</h2>
        <h1>{error}</h1>
        {ibis_html}
        <div class="traceback-container">
            <p class="traceback-title">Traceback</p>
            <div>{exc_html}</div>
        </div>
        {js}
    </body>
</html>
z
.locals-table {
  border-collapse: collapse;
}

.locals-table td, th {
  border: 1px solid #999;
  padding: 0.5rem;
  text-align: left;
}

.faded {
    color: #888888;
}
c                   @   s\   e Zd ZdddZddededefdd	Zd
ej	defddZ
dedededdfddZdS )OTreeServerErrorMiddleware c           
      C   s   t |}g }t|jddddD ]/\}}||d kr@||d kr@t|dd|d}||kr3tnt}	|	|	j
di | qtj
|||d	|d
S )Nzutf-8)encoding   )start    z&nbsp)linelinenor   )template_idline_numbertag_namecode_context )r   Zsearch_template	enumerateopenhtmlescapereplaceIBIS_CENTER_LINE	IBIS_LINEappendformatIBIS_TEMPLATEjoin)
selfr   r   r   pathZ
html_linesir   valuesZtplr   r   v/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/otree/errorpage.pygenerate_ibis_htmlb   s    
z-OTreeServerErrorMiddleware.generate_ibis_html   exclimitreturnc              	   C   s   t |tr|j}| j|j|j|jd}nt |tr#| j|j|jd}nd}t |tr8|j	r8|j	}t |tr8|j	s-t
jj|dd}d}|j}|d ur]t||}t|D ]	}	|| |	7 }qSt|jj dtt| }
tjtt|
|
||tdS )N)r   r   r   )r   r   r   T)capture_localsz: )stylesjsZ	tab_titleerrorexc_html	ibis_htmlZotree_styles)
isinstancer   tokenr.   r   r   keywordr   r   	__cause__	tracebackTracebackExceptionfrom_exception__traceback__inspectgetinnerframesreversedgenerate_frame_htmlr    r!   exc_type__name__strTEMPLATEr&   r   r   OTREE_STYLES)r)   r0   r1   r:   r8   Ztraceback_objr7   exc_tracebackframesframer6   r   r   r-   generate_htmlw   sJ   

z(OTreeServerErrorMiddleware.generate_htmlrL   c           
         s  d  fddt jpg D }t j}t|jv o d jv}|rbz-g } jj	 D ]\}}|
d| dtt|d d  d q,d	d | d
 }W n ty[   d}Y nw |t}nd}tt| jt j||rvdnd|r{dnd|rdnd|d}	tjdi |	S )Nr   c                 3   s(    | ]\}} || j jV  qd S )N)Zformat_liner   index).0rN   r   rL   r)   r   r-   	<genexpr>   s
    
zAOTreeServerErrorMiddleware.generate_frame_html.<locals>.<genexpr>zsite-packagesz<tr><th>z	</th><td>d   z
</td></tr>z(<table class="locals-table source-code">z</table>	collapsedfadedz&#8210;+)frame_filenameZframe_linenoZ
frame_namer   rS   rT   Zcollapse_buttonlocals_tabler   )r(   r   r   r   filenameCWD_PATHparentsrL   f_localsitemsr%   r    r!   repr	Exceptionrelative_torG   r   functionFRAME_TEMPLATEr&   )
r)   rL   r   r*   Zis_expandedlocalskvrW   r,   r   rP   r-   rD      sB   
"



z.OTreeServerErrorMiddleware.generate_frame_htmlscopereceivesendNc              
      s   |d dkr|  ||I dH  dS d dtddf fdd}z|  |||I dH  W dS  ty{ } zA sut|}| jrF| ||}n&| jdu rR| ||}nt	| jrb| ||I dH }n
t
| j||I dH }|||I dH  |d}~ww )	zoTree just removed the 'from None'. everything else is the same
        Need this until https://github.com/encode/starlette/issues/1114 is fixedtypehttpNFmessager2   c                    s$   | d dkr	d | I d H  d S )Nrh   zhttp.response.startTr   )rj   Zresponse_startedrg   r   r-   _send   s   z2OTreeServerErrorMiddleware.__call__.<locals>._send)Zappr   r^   r   debugZdebug_responsehandlerZerror_responseasyncioiscoroutinefunctionr   )r)   re   rf   rg   rl   r0   requestresponser   rk   r-   __call__   s,   
z#OTreeServerErrorMiddleware.__call__)r   )r/   )rF   
__module____qualname__r.   r^   intrG   rM   rA   	FrameInforD   r
   r	   r   rs   r   r   r   r-   r   a   s
    
-.r   )#ro   r    rA   osr=   pathlibr   Zstarlette.concurrencyr   Zstarlette.middleware.errorsr   r   r   Zstarlette.requestsr   Zstarlette.typesr   r	   r
   r   Zotree.templating.errorsr   r   r   Zotree.templating.loaderr   getcwdrY   r$   r#   r'   ra   rH   rI   r   r   r   r   r-   <module>   s(    
