a
    Db                     @   s   d Z ddlZddlmZmZ ddlmZ zddlmZ W n e	yV   ddlm
Z Y n0 ddlmZmZ dd	lmZ G d
d deZG dd deZdZde efdefgZdS )zTornado handlers for the sessions web service.

Preliminary documentation at https://github.com/ipython/ipython/wiki/IPEP-16%3A-Notebook-multi-directory-dashboard-and-URL-mapping#sessions-api
    N)genweb   )
APIHandler)json_default)date_default)maybe_futureurl_path_join)NoSuchKernelc                   @   s4   e Zd Zejejdd Zejejdd ZdS )SessionRootHandlerc                 c   s,   | j }t| V }| tj|td d S )Ndefault)session_managerr   Zlist_sessionsfinishjsondumpsr   )selfsmsessions r   Blib/python3.9/site-packages/notebook/services/sessions/handlers.pyget   s    zSessionRootHandler.getc                 c   s  | j }|  }|d u r"tddd|v rZd|d v rZ| jd |d d |d< d|d< z|d }W n2 ty } ztdd|W Y d }~n
d }~0 0 z|d }W n2 ty } ztdd|W Y d }~n
d }~0 0 |d	d }|d
i }|d	d }|dd }	|	s&|s&| jd d }t	|j
|dV }
|
rRt	|j|dV }nxzt	|j|||	||dV }W nX ty   d| }d| }| jd|  | d | tt||d Y d S 0 t| jdd|d }| d| | d | tj|td d S )N  No JSON data providednotebookpath.Sessions API changed, see updated swagger docstypez Missing field in JSON data: pathz Missing field in JSON data: typenamekernelidz)No kernel specified, using default kernel)r   )r   kernel_name	kernel_idr   r   zfThe '%s' kernel is not available. Please pick another suitable kernel instead, or install that kernel.z%s not foundzKernel not found: %si  )messageZshort_messageZapir   ZLocation   r   )r   get_json_bodyr   	HTTPErrorlogwarningKeyErrorr   debugr   Zsession_existsget_sessionZcreate_sessionr
   
set_statusr   r   r   dictr	   Zbase_urlZ
set_headerr   )r   r   modelr   eZmtyper   r   r!   r"   existsmsgZ
status_msglocationr   r   r   post"   s\    $$


zSessionRootHandler.postN)	__name__
__module____qualname__r   authenticatedr   	coroutiner   r3   r   r   r   r   r      s   r   c                   @   sH   e Zd Zejejdd Zejejdd Zejejdd Z	dS )SessionHandlerc                 c   s0   | j }t|j|dV }| tj|td d S )N
session_idr   )r   r   r+   r   r   r   r   )r   r;   r   r.   r   r   r   r   _   s    zSessionHandler.getc           	      c   s  | j }| j}|  }|du r(tddt|j|dV }i }d|v rvd|d v rv| jd |d d |d< d|d< d|v r|d |d< d	|v r|d	 |d	< d|v r|d |d< d
|v rF|d
 	ddur|d
 d }||vrtdd| ||d< nJ|d
 	d	durF|d
 d	 }|j
|||d	 |d |d dV }||d< t|j|fi |V  t|j|dV }|d
 d |d
 d krt||d
 d V  | tj|td dS )zPatch updates sessions:

        - path updates session to track renamed paths
        - kernel.name starts a new kernel with a given kernelspec
        Nr   r   r:   r   r   r   r   r   r   r    zNo such kernel: %sr"   )r!   r   r   r   r   )r   Zkernel_managerr%   r   r&   r   r+   r'   r(   r   Zstart_kernel_for_sessionZupdate_sessionZshutdown_kernelr   r   r   r   )	r   r;   r   Zkmr.   ZbeforeZchangesr"   r!   r   r   r   patchg   sJ    


zSessionHandler.patchc              
   c   sd   | j }zt||V  W n2 tyL } ztdd|W Y d }~n
d }~0 0 | d |   d S )Ni  zKernel deleted before session   )r   r   Zdelete_sessionr)   r   r&   r,   r   )r   r;   r   r/   r   r   r   delete   s    $
zSessionHandler.deleteN)
r4   r5   r6   r   r7   r   r8   r   r<   r>   r   r   r   r   r9   ]   s   3r9   z#(?P<session_id>\w+-\w+-\w+-\w+-\w+)z/api/sessions/%sz/api/sessions)__doc__r   Ztornador   r   Zbase.handlersr   Zjupyter_client.jsonutilr   ImportErrorr   Znotebook.utilsr   r	   Zjupyter_client.kernelspecr
   r   r9   Z_session_id_regexZdefault_handlersr   r   r   r   <module>   s   EQ
