
    Xh                       d Z ddlm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 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dZddZddd ee      z
  f	 	 	 	 	 	 	 	 	 ddZ G d de      Z  G d deee      Z!y)z-Tornado handlers for frontend config storage.    )annotationsN)Path)Any)_tz)
APIHandler)ExtensionHandlerJinjaMixinExtensionHandlerMixin)url_path_join)web)LoggingConfigurablez.jupyterlab-workspacec                x   g }| j                         s|S | j                         D cg c]>  }|j                  j                  |      r!|j                  j	                  t
              r|@ }}|j                          |D ]4  }| |z  }|j                         st        |      }|j                  |       6 |S c c}w )za
    Return the list of workspaces in a given directory beginning with the
    given prefix.
    )	existsiterdirname
startswithendswithWORKSPACE_EXTENSIONsort_load_with_file_timesappend)	directoryprefix
workspacesitemitemsslugworkspace_path	workspaces           X/var/www/html/myenv/lib/python3.12/site-packages/jupyterlab_server/workspaces_handler.py_list_workspacesr       s    
 J %%'99'DII,>,>?R,S 	E 
 
JJL )(4/  "-n=Ii(	) s   AB7c                x   | j                         }| j                  d      5 }t        j                  |      }|d   j	                  t        j                  |j                        j                         t        j                  |j                        j                                ddd       |S # 1 sw Y   S xY w)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   s       r   r   r   3   s    
  D			g		. 
#IIcN	*$$--dmm<FFH''6@@B 	% 	

 
 s   BB//B9 T   c                   | j                  d      r| nd| z   } d}|r=| dd }dt        j                  |j                  d            j	                         dd z   }|j                  d      r|nd|z   j                         }| j                         } d}t        t        |      t        |             }||k  r!||   | |   k(  r|dz  }||k  r||   | |   k(  rt        ||d |       }t        j                  j                  |      }t        j                  d	|      j                  d
d      j                  d
      }t        j                   dd|      j#                         }t        j                   dd|      }|d|t        |      z
   |z   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values	            r   slugifyrW   B   sm    $##)CI12w'..W)=>HHJ2ANN	OOC(DcDj??AD
))+CFD	3s8$E
5.T&\S[8! 5.T&\S[8$vw-%ELL  'E!!&%077JQQRYZEFF;E*002EFF9c5)E.:I./);;    c                  D     e Zd ZdZd fdZddZd	dZd
dZddZ xZ	S )WorkspacesManagerzA manager for workspaces.c                X    t                |sd}t        |      t        |      | _        y)z9Initialize a workspaces manager with content in ``path``.zWorkspaces directory is not setN)super
ValueErrorr   workspaces_dir)selfpathmsg	__class__s      r   __init__zWorkspacesManager.__init__e   s&    3CS/!"4jrX   c                    t        |      }| j                  |t        z   z  }|j                         sd|d|d}t	        |      |j                          y)z"Remove a workspace ``space_name``.z
Workspace z (z) not foundN)rW   r^   r   r   FileNotFoundErrorunlink)r_   
space_namer   r   ra   s        r   deletezWorkspacesManager.deletem   s[    z",,7J0JK$$&znBthkBC#C(( 	rX   c                H    t        dd      }t        | j                  |      S )zList all available workspaces.r3   F)rP   )rW   r    r^   )r_   r   s     r   list_workspacesz!WorkspacesManager.list_workspacesy   s!    %( 3 3V<<rX   c                    t        |      }| j                  |t        z   z  }|j                         rt	        |      S |j                  d      r|nd|z   }t        t               t        |            S )z"Load the workspace ``space_name``.r6   )id)rS   r%   )rW   r^   r   r   r   r   dict)r_   rg   r   r   _ids        r   r+   zWorkspacesManager.load~   se    z",,7J0JK  "(88&11#6jC*<L$#,77rX   c                *   | j                   j                         s| j                   j                  d       i }	 t        j                         }|j                  |      }|d   d   }|j                  d      r|nd|z   }t        j                  j                  |      }|d|z   k7  rd|d|}t        |      t        |      }| j                   |t        z   z  }	|	j                  |d	
       |	S # t        $ r}t        t        |            |d}~ww xY w)z2Save the ``raw`` data as workspace ``space_name``.T)parentsNr%   rl   r6   z)Workspace metadata ID mismatch: expected z got r"   r#   )r^   r   mkdirr*   JSONDecoderrJ   	Exceptionr]   strr   rE   rF   rG   rW   r   
write_text)
r_   rg   rN   r   decoderemetadata_idmessager   r   s
             r   savezWorkspacesManager.save   s   ""))+%%d%3		,&&(Gs+I  
+D1%0%;%;C%@kcKFWll**;7#
**A*uU`TcdGW%%z",,7J0JK 	!!#!8%  	,SV$!+	,s   %C/ /	D8DD)r`   rt   returnNonerg   rt   r{   r|   )r{   list)rg   rt   r{   rm   )rg   rt   rN   rt   r{   r   )
__name__
__module____qualname____doc__rc   rh   rj   r+   rz   __classcell__rb   s   @r   rZ   rZ   b   s    #)
 =
	8rX   rZ   c                       e Zd ZdZd fdZej                  dd       Zej                  dd	d       Zej                  ddd       Z	 xZ
S )
WorkspacesHandlerzA workspaces API handler.c                2    t         |   |       || _        y)zInitialize the handler.N)r\   
initializemanager)r_   r   r   kwargsrb   s       r   r   zWorkspacesHandler.initialize   s    4 rX   c                F   |st        j                  dd      	 | j                  j                  |       | j	                  d      S # t
        $ r%}t        j                  dt        |            |d}~wt        $ r%}t        j                  dt        |            |d}~ww xY w)zRemove a workspace  z%Workspace name is required for DELETE   i  N  )r   	HTTPErrorr   rh   
set_statusre   rt   rs   )r_   rg   rw   s      r   rh   zWorkspacesHandler.delete   s     --%LMM	4LL
+??3''  	4--SV,!3 	4--SV,!3	4s#   +A 	B  A//B ; BB c                  K   	 |sv| j                   j                         }g }g }|D ]*  }|j                  |d   d          |j                  |       , | j                  t	        j
                  d||di            S | j                   j                  |      }| j                  t	        j
                  |            S # t        $ r%}t        j                  dt        |            |d}~ww xY ww)zGet workspace(s) datar%   rl   r   )idsvaluesr   N)r   rj   r   finishr*   dumpsr+   rs   r   r   rt   )r_   rg   r   r   r   r   rw   s          r   getzWorkspacesHandler.get   s     	4!\\99;
!+ -IJJy4T:;MM),- {{4::|STZ=[.\#]^^))*5I;;tzz)455 	4--SV,!3	4s5   C,A7B; ;C,<>B; :C,;	C) C$$C))C,c                   |st        j                  dd      | j                  j                  j	                         j                  d      }	 | j                  j                  ||       | j                  d       y# t        $ r%}t        j                  dt        |            |d}~wt        $ r%}t        j                  dt        |            |d}~ww xY w)zUpdate workspace datar   z#Workspace name is required for PUT.r"   Nr   r   )r   r   requestbodyrM   rJ   r   rz   r]   rt   rs   r   )r_   rg   rN   rw   s       r   putzWorkspacesHandler.put   s     --%JKKll%%'..w7	4LLj#. 	  	4--SV,!3 	4--SV,!3	4s$   A; ;	C B$$C0 CC)r   rt   r   rZ   r   r   r{   r|   r}   )r3   )rg   rt   r{   r   )r   r   r   r   r   r   authenticatedrh   r   r   r   r   s   @r   r   r      sY    #
 	4 4 	4 4$ 	 rX   r   )r   r   r   rt   r{   zlist[dict[str, Any]])r   r   r{   rm   )
rN   rt   rO   rt   rP   boolrQ   intr{   rt   )"r   
__future__r   r=   r*   rK   rH   rE   pathlibr   typingr   jupyter_serverr   r-   jupyter_server.base.handlersr    jupyter_server.extension.handlerr   r	   jupyter_server.utilsr
   rD   tornador   traitlets.configr   r   r    r   rC   rW   rZ   r    rX   r   <module>r      s    3 #   	     $ 3 ^ 7  0 . 2  43M`IaCa<	<<$(<=@<<@D+ DN9-/I: 9rX   