o
    i                     @   s   d Z 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 ddlmZmZ ddlmZ ddlmZ dd	lmZ d
ZdededefddZdedefddZdddee fddZG dd deZG dd deeeZ dS )z-Tornado handlers for frontend config storage.    N)Path)_tz)
APIHandler)ExtensionHandlerJinjaMixinExtensionHandlerMixin)url_path_join)web)LoggingConfigurablez.jupyterlab-workspace	directoryprefixreturnc                    s^   g }|   s|S  fdd|  D }|  |D ]}| | }|  r,t|}|| q|S )za
    Return the list of workspaces in a given directory beginning with the
    given prefix.
    c                    s(   g | ]}|j  r|j tr|qS  )name
startswithendswithWORKSPACE_EXTENSION).0itemr   r   _/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyterlab_server/workspaces_handler.py
<listcomp>    s    

z$_list_workspaces.<locals>.<listcomp>)existsiterdirsort_load_with_file_timesappend)r
   r   
workspacesitemsslugworkspace_path	workspacer   r   r   _list_workspaces   s   

r!   r   c                 C   sn   |   }| jdd#}t|}|d jt|j t|j	 d W d   |S 1 s0w   Y  |S )z
    Load workspace JSON from disk, overwriting the `created` and `last_modified`
    metadata with current file stat information
    utf-8encodingmetadata)last_modifiedcreatedN)
statopenjsonloadupdatetzutcfromtimestampst_mtime	isoformatst_ctime)r   r(   fidr    r   r   r   r   0   s   

r    T   c           	      C   s*  |  dr| nd|  } d}|r%| dd }dt|d dd  }| dr,|nd|  }|  } d}tt|t| }||k r]|| | | kr]|d7 }||k r]|| | | ksMt||d | }t	j
|}td	|d
dd
}tdd| }tdd|}|d|t|  | S )a  
    Use the common superset of raw and base values to build a slug shorter
    than max_length. By default, base value is an empty string.
    Convert spaces to hyphens. Remove characters that aren't alphanumerics
    underscores, or hyphens. Convert to lowercase. Strip leading and trailing
    whitespace.
    Add an optional short signature suffix to prevent collisions.
    Modified from Django utils:
    https://github.com/django/django/blob/master/django/utils/text.py
    /r3      N-r"      r   NFKCasciiignorez[^\w\s-]z[-\s]+)r   hashlibsha256encode	hexdigestlowerminlenujoinurllibparseunquoteunicodedata	normalizedecoderesubstrip)	rawbasesign
max_length	signaturedatacommonlimitvaluer   r   r   slugify?   s$    rV   c                       s^   e Zd ZdZ fddZdd ZdefddZd	ede	fd
dZ
d	ededefddZ  ZS )WorkspacesManagerzA manager for workspaces.c                    s$   t   |sd}t|t|| _dS )z9Initialize a workspaces manager with content in ``path``.zWorkspaces directory is not setN)super
ValueErrorr   workspaces_dir)selfpathmsg	__class__r   r   __init__`   s
   zWorkspacesManager.__init__c                 C   sD   t |}| j|t  }| sd|d|d}t||  dS )z"Remove a workspace ``space_name``.z
Workspace z (z) not foundN)rV   rZ   r   r   FileNotFoundErrorunlink)r[   
space_namer   r   r]   r   r   r   deleteh   s   zWorkspacesManager.deleter   c                 C   s   t ddd}t| j|S )zList all available workspaces.r3   F)rO   )rV   r!   rZ   )r[   r   r   r   r   list_workspacest   s   z!WorkspacesManager.list_workspacesrc   c                 C   sP   t |}| j|t  }| rt|S |dr|nd| }tt t|ddS )z"Load the workspace ``space_name``.r5   )id)rR   r%   )rV   rZ   r   r   r   r   dict)r[   rc   r   r   _idr   r   r   r+   y   s   zWorkspacesManager.loadrM   c           
   
   C   s   | j  s| j jdd i }zt }||}W n ty, } ztt||d}~ww |d d }|	dr:|nd| }t
j|}|d| krTd||}t|t|}| j |t  }	|	j|dd	 |	S )
z2Save the ``raw`` data as workspace ``space_name``.T)parentsNr%   rf   r5   z6Workspace metadata ID mismatch: expected {!r} got {!r}r"   r#   )rZ   r   mkdirr*   JSONDecoderrI   	ExceptionrY   strr   rD   rE   rF   formatrV   r   
write_text)
r[   rc   rM   r    decoderemetadata_idmessager   r   r   r   r   save   s.   
zWorkspacesManager.save)__name__
__module____qualname____doc__r`   rd   listre   rm   rg   r+   r   rt   __classcell__r   r   r^   r   rW   ]   s    rW   c                       sX   e Zd ZdZdeddf fddZejdd Zejdd
dZ	ejdddZ
  ZS )WorkspacesHandlerzA workspaces API handler.managerr   Nc                    s   t  | || _dS )zInitialize the handler.N)rX   
initializer|   )r[   r   r|   kwargsr^   r   r   r}      s   
zWorkspacesHandler.initializec              
   C   s|   |st ddz| j| | dW S  ty) } z	t dt||d}~w ty= } z	t dt||d}~ww )zRemove a workspace  z%Workspace name is required for DELETE   i  N  )r   	HTTPErrorr|   rd   
set_statusra   rm   rl   )r[   rc   rq   r   r   r   rd      s   zWorkspacesHandler.deleter3   c              
   C   s   z;|s-| j  }g }g }|D ]}||d d  || q| td||diW S | j |}| t|W S  tyP } z	t	dt
||d}~ww )zGet workspace(s) datar%   rf   r   )idsvaluesr   N)r|   re   r   finishr*   dumpsr+   rl   r   r   rm   )r[   rc   r   r   r   r    rq   r   r   r   get   s   
zWorkspacesHandler.getc              
   C   s   |st dd| jj d}z	| j|| W n) ty/ } z	t dt	||d}~w t
yC } z	t dt	||d}~ww | d dS )zUpdate workspace datar   z#Workspace name is required for PUT.r"   Nr   r   )r   r   requestbodyrL   rI   r|   rt   rY   rm   rl   r   )r[   rc   rM   rq   r   r   r   put   s   zWorkspacesHandler.put)r3   )ru   rv   rw   rx   rW   r}   r   authenticatedrd   r   r   rz   r   r   r^   r   r{      s    
r{   )!rx   r<   r*   rJ   rG   rD   pathlibr   jupyter_serverr   r-   jupyter_server.base.handlersr    jupyter_server.extension.handlerr   r   jupyter_server.utilsr   rC   tornador   traitlets.configr	   r   rm   ry   r!   rg   r   rB   rV   rW   r{   r   r   r   r   <module>   s&    K