B
    3\n                 @   s   d Z ddlZddlZddlZddlmZ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 dd	lmZ d
d Zdd Zdd ZG dd de
ZG dd de
ZdZde efdeef efgZdS )zTornado handlers for nbconvert.    N)webescape)app_log   )IPythonHandlerFilesRedirectHandler
path_regex)	from_dict)
cast_bytes)textc                s:   g }x0t | D ]"\ }}| fdd|D  qW |S )Nc                s   g | ]}t j |qS  )ospathjoin).0f)dirpathr   :lib/python3.7/site-packages/notebook/nbconvert/handlers.py
<listcomp>   s    z'find_resource_files.<locals>.<listcomp>)r   walkextend)Zoutput_files_dirfilesZdirnames	filenamesr   )r   r   find_resource_files   s    r   c             C   s   | dd}|sdS tj|d d }| | | dd | dd	 t }tj	|d
tj
d}tj|d |d  }||t|d x(| D ]\}	}
|tj|	|
 qW |  | |  dS )zZip up the output and resource files and respond with the zip file.

    Returns True if it has served a zip file, False if there are no resource
    files, in which case we serve the plain output file.
    ZoutputsNFr   z.zipzContent-Typezapplication/zipzCache-Controlz.no-store, no-cache, must-revalidate, max-age=0w)modeZcompressionoutput_extensionzutf-8T)getr   r   splitextset_attachment_header
set_headerioBytesIOzipfileZZipFileZZIP_DEFLATEDZwritestrr
   itemsbasenameclosefinishgetvalue)Zhandlernameoutput	resourcesZoutput_filesZzip_filenamebufferZzipfZoutput_filenamefilenamedatar   r   r   respond_zip   s     
r/   c          
   K   s   yddl m} W n2 tk
rB } ztdd| W dd}~X Y nX y|| }W n$ tk
rt   tdd|  Y nX y
|f |S  tk
r } z td| tdd| W dd}~X Y nX dS )	z+get an exporter, raising appropriate errorsr   )get_exporteri  zCould not import nbconvert: %sNi  zNo exporter for format: %sz Could not construct Exporter: %s)	Znbconvert.exporters.baser0   ImportErrorr   	HTTPErrorKeyError	Exceptionr   	exception)formatkwargsr0   eZExporterr   r   r   r0   9   s    "
r0   c                   s2   e Zd ZdZe fddZejdd Z  Z	S )NbconvertFileHandler)ZGETc                s   t t| jd S )Nz; sandbox allow-scripts)superr9   content_security_policy)self)	__class__r   r   r;   Q   s    
z,NbconvertFileHandler.content_security_policyc          
   C   s  t || j| jd}|d}t| jdrF| j|}tj	|\}}nd }| jj
|d}|d }|d dkrxt| |S |d }	| d	|d
  |d
 tj}
tj|d }||
d| jjd d}|r||d d< y|j|	|d\}}W nB tk
r0 } z"| jd| tdd| W d d }~X Y nX t| |||rFd S | dd dkr~tj|d |d  }| | |jr| dd|j  | dd | | d S )N)configlog/_get_os_path)r   r)   typeZnotebookcontentzLast-ModifiedZlast_modifiedr   )r)   Zmodified_date
config_dir)metadatarD   rE   r   )r+   znbconvert failed: %si  ZdownloadZfalsetruer   zContent-Typez%s; charset=utf-8zCache-Controlz.no-store, no-cache, must-revalidate, max-age=0)r0   r>   r?   striphasattrZcontents_managerrA   r   r   splitr   r   Zredirect_to_filesr    Zstrftimer   Zdate_formatr   applicationsettingsfrom_notebook_noder4   r5   r   r2   r/   Zget_argumentlowerr   output_mimetyper'   )r<   r6   r   exporterZos_pathZext_resources_dirr%   modelr)   ZnbZmod_dateZnb_titleZresource_dictr*   r+   r8   r-   r   r   r   r   X   sH    
"
zNbconvertFileHandler.get)
__name__
__module____qualname__SUPPORTED_METHODSpropertyr;   r   authenticatedr   __classcell__r   r   )r=   r   r9   M   s   r9   c                   s2   e Zd ZdZe fddZejdd Z  Z	S )NbconvertPostHandler)ZPOSTc                s   t t| jd S )Nz; sandbox allow-scripts)r:   rX   r;   )r<   )r=   r   r   r;      s    
z,NbconvertPostHandler.content_security_policyc       	   
   C   s   t || jd}|  }|dd}t|d }y6|j|d|d |d i| jjd dd\}}W n2 t	k
r } zt
d	d
| W d d }~X Y nX t| |||rd S |jr| dd|j  | | d S )N)r>   r)   znotebook.ipynbrC   .rD   )rE   rD   )r+   i  znbconvert failed: %szContent-Typez%s; charset=utf-8)r0   r>   Zget_json_bodyr   r	   rL   rfindrJ   rK   r4   r   r2   r/   rN   r    r'   )	r<   r6   rO   rP   r)   Znbnoder*   r+   r8   r   r   r   post   s     "zNbconvertPostHandler.post)
rQ   rR   rS   rT   rU   r;   r   rV   r[   rW   r   r   )r=   r   rX      s   rX   z(?P<format>\w+)z/nbconvert/%sz/nbconvert/%s%s)__doc__r!   r   r#   Ztornador   r   Ztornado.logr   Zbase.handlersr   r   r   Znbformatr	   Zipython_genutils.py3compatr
   Zipython_genutilsr   r   r/   r0   r9   rX   Z_format_regexZdefault_handlersr   r   r   r   <module>   s$   K)

