
    J5j                    *   S r SSKJr  SSKrSSKrSSKJrJr  SSKJr  \R                  " S5      r
SS jr1 Skr1 S	kr " S
 S\5      rSS jrSS jrSS jrSS jrSS jrSS jrSS jrS S jrS!S jrS"S jrS#S jrS$S jrS%S jrS&S jrS'S jrg)(z/Rutas en disco para archivos de agentes PIE360.    )annotationsN)datetimetimezone)Pathz^[a-zA-Z0-9_-]+$c                 v     SSK Jn   [        U R                  5      S-  $ ! [         a    [        S5      s $ f = f)Nr   settingsagentszfiles/agents)app.backend.core.configr	   r   	files_dir	Exceptionr   s    OC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agent_files.py_agents_rootr      s:    $4H&&'(22 $N##$s     88>   .md.csv.doc.pdf.txt.docx.xlsx>   r   r   r   .xlsr   r   c                      \ rS rSrSrg)AgentFileError)    N)__name__
__module____qualname____firstlineno____static_attributes__r       r   r   r   )   s    r!   r   c                ^    U (       a  [         R                  U 5      (       d  [        S5      eU $ )Nu   ID de agente inválido)AGENT_ID_PATTERNmatchr   agent_ids    r   validate_agent_idr'   -   s'    +11(;;566Or!   c                .    [        5       [        U 5      -  $ )N)r   r'   r%   s    r   	agent_dirr)   3   s    >-h777r!   c                R    [        U 5      nUR                  SSS9  [        U 5        U$ )NTparentsexist_ok)r)   mkdirensure_responses_dir)r&   	directorys     r   ensure_agent_dirr1   7   s*    (#IOOD4O0"r!   c                    [        U 5      S-  $ )N	responses)r)   r%   s    r   responses_dirr4   >   s    X,,r!   c                r    [        U 5      nUR                  SSS9  [        U 5      nUR                  SSS9  U$ )zOCrea files/agents/{id}/responses si no existe (informes generados por el chat).Tr+   )r)   r.   r4   )r&   
agent_pathr0   s      r   r/   r/   B   s?    8$JTD1h'IOOD4O0r!   c                    [        U 5      n[        U5      R                  R                  5       nU(       a  U[        ;  a  [        SU 35      e[        R                  " 5       R                  SS nU SU 3nSU 3nXQ4$ )z5Devuelve (id relativo responses/..., nombre visible).u&   Extensión de respuesta no permitida: N
   _z
responses/)	safe_display_namer   suffixlowerRESPONSE_EXTENSIONSr   uuiduuid4hex)filename	safe_leafr;   tokenstored_leafstorage_paths         r   build_response_storage_pathrF   K   s    !(+I)_##))+F& 33EfXNOOJJLSb!EG1YK(K}-L""r!   c                    [        U =(       d    S5      R                  R                  5       n[        R                  " SSU5      nUS S =(       d    S$ )Narchivo#   [^\w.\- ()áéíóúÁÉÍÓÚñÑ]r9      )r   namestripresub)rA   rawcleaneds      r   r:   r:   X   sD    
x$9
%
*
*
0
0
2Cff;S#FG4C=%I%r!   c                j    [         R                  " SSU R                  5       5      nUS S =(       d    S$ )NrI   r9   d   carpeta)rM   rN   rL   )rK   rP   s     r   safe_folder_partrT   ^   s,    ff;S$**,OG4C=%I%r!   c                    U (       d  [        S5      eU R                  SS5      R                  5       R                  S5      nU(       a  SUR	                  S5      ;   a  [        S5      eU$ )Nu   Ruta de archivo inválida\/..)r   replacerL   lstripsplit)rO   
normalizeds     r   normalize_upload_pathr]   c   s\    899T3'--/66s;J!1!1#!66899r!   c                   [        U 5      nUR                  S5      nUS   n[        U5      R                  R	                  5       nU(       a  U[
        ;  a  [        SU 35      e[        U5      n[        R                  " 5       R                  SS nU SU 3n[        U5      S:X  a  UnX4$ USS  V	s/ s H  n	[        U	5      PM     n
n	SR                  X/-   5      nX4$ s  sn	f )z2Devuelve (ruta relativa en disco, nombre visible).rW   u   Extensión no permitida: Nr8   r9      )r]   r[   r   r;   r<   ALLOWED_EXTENSIONSr   r:   r>   r?   r@   lenrT   join)relative_pathr\   partsleafr;   rB   rC   rD   rE   partfolder_partss              r   build_agent_storage_pathri   l   s    &}5JS!E9D$Z$$&F& 228ABB!$'IJJLSb!EG1YK(K
5zQ"
 ## <A":F:4(.:Fxx} <=## Gs   3C!c                   U R                  SS5      R                  5       R                  S5      nU(       a  SUR                  S5      ;   a  [	        S5      eSU;   a  U$ [        U 5      R                  nU(       a  X :w  a  [	        S5      eU$ )NrV   rW   rX   u   Nombre de archivo inválido)rY   rL   rZ   r[   r   r   rK   )stored_namer\   rK   s      r   validate_stored_filenamerl      s    $$T3/557>>sCJ!1!1#!66:;;
j!!D4&:;;Kr!   c                    U R                  SS5      R                  5       R                  S5      nU(       a  SUR                  S5      ;   a  [        S5      eU$ )NrV   rW   rX   u   Ruta de carpeta inválida)rY   rL   r[   r   )folder_pathr\   s     r   validate_folder_pathro      sO    $$T3/557==cBJ!1!1#!66899r!   c                    U R                  SS5      R                  5       R                  S5      n[        U5      nX#:H  =(       d    UR                  U S35      $ )NrV   rW   )rY   rL   ro   
startswith)pathrn   r\   folders       r   path_in_folderrt      sO    dC(..066s;J!+.FF:#8#8F81#FFr!   c                D   U R                  5       n[        R                  " UR                  [        R
                  S9R                  5       nSU R                  ;   a  U R                  R                  SS5      S   OU R                  nU R                  UUR                  US.$ )N)tzr9   r`   )idrK   size
uploadedAt)
statr   fromtimestampst_mtimer   utc	isoformatrK   r[   st_size)rr   rz   uploaded_atdisplay_names       r   file_recordr      sx    99;D((8<<HRRTK14		1A499??3*1-tyyLii!	 r!   c                    [        U 5      nUR                  5       (       d  / $ UR                  5        Vs/ s H$  o"R                  5       (       d  M  [	        U5      PM&     nnUR                  S SS9  U$ s  snf )Nc                    U S   $ )Nry   r   )items    r   <lambda>"list_agent_files.<locals>.<lambda>   s	    \ 2r!   T)keyreverse)r)   is_diriterdiris_filer   sort)r&   r0   pfiless       r   list_agent_filesr      sg    (#I	%.%6%6%8H%8IIK^[^%8EH	JJ2DJAL Is   A5A5)returnr   )r&   strr   r   )r&   r   r   r   )rA   r   r   tuple[str, str])rA   
str | Noner   r   )rK   r   r   r   )rO   r   r   r   )rd   r   r   r   )rk   r   r   r   )rn   r   r   r   )rr   r   rn   r   r   bool)rr   r   r   dict)r&   r   r   z
list[dict])__doc__
__future__r   rM   r>   r   r   pathlibr   compiler#   r   ra   r=   
ValueErrorr   r'   r)   r1   r4   r/   rF   r:   rT   r]   ri   rl   ro   rt   r   r   r   r!   r   <module>r      s    5 " 	  ' ::12 $  	Z 	8-
#&&
$*	G	r!   