
    Mh                       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!dS )(z-Tornado handlers for frontend config storage.    )annotationsN)Path)Any)_tz)
APIHandler)ExtensionHandlerJinjaMixinExtensionHandlerMixin)url_path_join)web)LoggingConfigurablez.jupyterlab-workspace	directoryr   prefixstrreturnlist[dict[str, Any]]c                $   g }|                                  s|S fd|                                 D             }|                                 |D ]?}| |z  }|                                 r$t          |          }|                    |           @|S )za
    Return the list of workspaces in a given directory beginning with the
    given prefix.
    c                    g | ]=}|j                                       |j                             t                    ;|>S  )name
startswithendswithWORKSPACE_EXTENSION).0itemr   s     d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyterlab_server/workspaces_handler.py
<listcomp>z$_list_workspaces.<locals>.<listcomp>#   sZ       9'' -1I,>,>?R,S,S      )existsiterdirsort_load_with_file_timesappend)r   r   
workspacesitemsslugworkspace_path	workspaces    `     r   _list_workspacesr(      s    
 J    %%''  E
 
JJLLL ) )(4/  "" 	)-n==Ii(((r   r&   dictc                   |                                  }|                     d          5 }t          j        |          }|d                             t          j        |j                                                  t          j        |j	                                                             ddd           n# 1 swxY w 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&   r1   fidr'   s       r   r!   r!   3   s    
   D			g		.	. 
#IcNN	*$$-dm<<FFHH'66@@BB 	% 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 s   BB;;B?B? T   rawbasesignbool
max_lengthintc                   |                      d          r| nd| z   } d}|rN| dd         }dt          j        |                    d                                                    dd         z   }|                     d          r|nd|z                                   }|                                 } d}t          t          |          t          |                     }||k     r/||         | |         k    r|dz  }||k     r||         | |         k    t          ||d         |           }t          j
                            |          }t          j        d	|                              d
d                              d
          }t          j        dd|                                          }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
    /r<      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)	r>   r?   r@   rB   	signaturedatacommonlimitvalues	            r   slugifyrb   B   s    $$
3###)CI O122w'.W)=)=>>HHJJ2A2NN	OOC((8DDcDj??AAD
))++CFD		3s88$$E
5..T&\S[88! 5..T&\S[88$vww-%%EL  ''E!&%0077JJQQRYZZEF;E**0022EF9c5))E.:I../);;r   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.pathr   r   Nonec                r    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)selfre   msg	__class__s      r   __init__zWorkspacesManager.__init__e   s9     	"3CS//!"4jjr   
space_namec                    t          |          }| j        |t          z   z  }|                                sd|d|d}t	          |          |                                 dS )z"Remove a workspace ``space_name``.z
Workspace z (z) not foundN)rb   rj   r   r   FileNotFoundErrorunlink)rk   ro   r%   r&   rl   s        r   deletezWorkspacesManager.deletem   sv    z"",7J0JK$$&& 	)BzBBtBBBC#C((( 	r   listc                N    t          dd          }t          | j        |          S )zList all available workspaces.r<   F)r@   )rb   r(   rj   )rk   r   s     r   list_workspacesz!WorkspacesManager.list_workspacesy   s'    %((( 3V<<<r   r)   c                   t          |          }| j        |t          z   z  }|                                rt	          |          S |                    d          r|nd|z   }t          t                      t          |                    S )z"Load the workspace ``space_name``.rE   )id)r^   r.   )rb   rj   r   r   r!   r   r)   )rk   ro   r%   r&   _ids        r   r4   zWorkspacesManager.load~   s    z"",7J0JK  "" 	9(888&11#66LjjC*<L$#,,,7777r   r>   r   c                f   | j                                         s| j                             d           i }	 t          j                    }|                    |          }n/# t          $ r"}t          t          |                    |d}~ww xY w|d         d         }|	                    d          r|nd|z   }t          j                            |          }|d|z   k    rd|d|}t          |          t          |          }| j         |t          z   z  }	|	                    |d	
           |	S )z2Save the ``raw`` data as workspace ``space_name``.T)parentsNr.   rx   rE   z)Workspace metadata ID mismatch: expected z got r+   r,   )rj   r   mkdirr3   JSONDecoderrY   	Exceptionri   r   r   rT   rU   rV   rb   r   
write_text)
rk   ro   r>   r'   decoderemetadata_idmessager%   r&   s
             r   savezWorkspacesManager.save   sO   "))++ 	4%%d%333		,&((Gs++II 	, 	, 	,SVV$$!+	,
  
+D1%0%;%;C%@%@WkkcKFWl**;77#
***d*ddU`ddGW%%%z"",7J0JK 	!!#!888s   (A! !
B+BB)re   r   r   rf   ro   r   r   rf   )r   rt   )ro   r   r   r)   )ro   r   r>   r   r   r   )
__name__
__module____qualname____doc__rn   rs   rv   r4   r   __classcell__rm   s   @r   rd   rd   b   s        ##) ) ) ) ) )
  
  
  
 = = = =
	8 	8 	8 	8       r   rd   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.r   r   managerrd   kwargsr   r   rf   c                X    t                                          |           || _        dS )zInitialize the handler.N)rh   
initializer   )rk   r   r   r   rm   s       r   r   zWorkspacesHandler.initialize   s&    4   r   ro   c                Z   |st          j        dd          	 | 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   rs   
set_statusrq   r   r~   )rk   ro   r   s      r   rs   zWorkspacesHandler.delete   s      	N-%LMMM	4L
+++??3'''  	4 	4 	4-SVV,,!3 	4 	4 	4-SVV,,!3	4s#   .A 
B*#A55B*#B%%B*r<   c                   K   	 |s| j                                         }g }g }|D ]8}|                    |d         d                    |                    |           9|                     t	          j        d||di                    S | j                             |          }|                     t	          j        |                    S # t          $ r(}t          j	        dt          |                    |d}~ww xY w)zGet workspace(s) datar.   rx   r#   )idsvaluesr   N)r   rv   r"   finishr3   dumpsr4   r~   r   r   r   )rk   ro   r#   r   r   r'   r   s          r   getzWorkspacesHandler.get   s     	4 _!\99;;
!+ - -IJJy4T:;;;MM),,,,{{4:|STZ=[=[.\#]#]^^^))*55I;;tz)44555 	4 	4 	4-SVV,,!3	4s   BC 
A C 
C=#C88C=c                   |st          j        dd          | j        j                                                            d          }	 | j                            ||           ne# t          $ r(}t          j        dt          |                    |d}~wt          $ r(}t          j        dt          |                    |d}~ww xY w|                     d           dS )zUpdate workspace datar   z#Workspace name is required for PUT.r+   Nr   r   )r   r   requestbodyr\   rY   r   r   ri   r   r~   r   )rk   ro   r>   r   s       r   putzWorkspacesHandler.put   s      	L-%JKKKl%%''..w77	4Lj#.... 	4 	4 	4-SVV,,!3 	4 	4 	4-SVV,,!3	4 	s$   
A& &
C0#BC #CC)r   r   r   rd   r   r   r   rf   r   )r<   )ro   r   r   r   )r   r   r   r   r   r   authenticatedrs   r   r   r   r   s   @r   r   r      s        ##     
 	4 4 4 4 	4 4 4 4 4$ 	        r   r   )r   r   r   r   r   r   )r&   r   r   r)   )
r>   r   r?   r   r@   rA   rB   rC   r   r   )"r   
__future__r   rL   r3   rZ   rW   rT   pathlibr   typingr   jupyter_serverr   r6   jupyter_server.base.handlersr    jupyter_server.extension.handlerr   r	   jupyter_server.utilsr
   rS   tornador   traitlets.configr   r   r(   r!   rR   rb   rd   r   r   r   r   <module>r      s   3 3 # " " " " "   				                  $ $ $ $ $ $ 3 3 3 3 3 3 ^ ^ ^ ^ ^ ^ ^ ^ 7 7 7 7 7 7       0 0 0 0 0 0 .    2     43M`IaIaCa< < < < <@D D D D D+ D D DN9 9 9 9 9-/I: 9 9 9 9 9r   