
    K{j!                        S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	KJr  S
rSrSrSS jrSSS.       SS jjrSS jr\S.       SS jjr\\S.         SS jjrSSSS.               SS jjrg)uV   Texto del informe psicopedagógico (u otro doc) desde la ficha/carpeta del estudiante.    )annotationsN)Path)Any)Session)settings)FolderModel)agents_file_context   )
psicopedagevaluacion_psicou   evaluación_psicozevaluacion psicinforme_psicozinforme psico2__e_psychopedagogiPF  c                     [        [        R                  =(       d    S5      n U S-  S-  [        S5      S-  S-  /nU H  nUR                  5       (       d  M  Us  $    US   $ )Nfilessystemstudentsr   )r   r   	files_diris_dir)base
candidatescs      aC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_student_folder_context.py_student_files_dirr       se    ""-g.D 	x*$W :-J 88::H  a=    student_namestudent_rutc               $  ^
 U =(       d    SR                  5       n[        U5      S:  a  gUR                  5       m
[        U
4S j[         5       5      (       d  Sn[        U
4S jU 5       5      (       d  g[
        R                  " SU=(       d    SR                  5       [
        R                  S9 Vs/ s H  n[        U5      S	:  d  M  UPM     nnU(       a/  [        U
4S
 jU 5       5      nU[        S[        U5      5      :  a  g[
        R                  " SSU=(       d    S5      n[        U5      S:  a'  [
        R                  " SST
5      n	X;   d	  USS U	;   a  g[        U5      S:  =(       a    [        U
4S j[         5       5      $ s  snf )uT   True si el contexto de Files del agente ya trae un psicopedagógico usable del caso.   Fc              3  ,   >#    U  H	  oT;   v   M     g 7fN .0mlows     r   	<genexpr>6files_context_has_student_psychoped.<locals>.<genexpr>8   s     9!8ACx!8   )u   evaluación psicopedagógicazevaluacion psicopedagogicau'   informe de evaluación psicopedagógicau   área pedagógicazarea pedagogicazinstrumentos aplicadosc              3  ,   >#    U  H	  oT;   v   M     g 7fr#   r$   )r&   hr(   s     r   r)   r*   B   s     0Z8Zr+   u   [^\wáéíóúñü]+)flags   c              3  6   >#    U  H  oT;   d  M
  S v   M     g7f)   Nr$   )r&   tr(   s     r   r)   r*   K   s     6k#X11ks   		   Tz\D   Ni	  c              3  ,   >#    U  H	  oT;   v   M     g 7fr#   r$   r%   s     r   r)   r*   V   s     $O7N!#X7Nr+   )striplenlowerany_PSYCHOPED_PATH_MARKERSresplit
IGNORECASEsumminsub)files_blockr   r   text
body_hintsr2   name_tokenshits
rut_digitscompactr(   s             @r   #files_context_has_student_psychopedrI   -   sN    2$$&D
4y3
**,C9!8999

 0Z000 1L4FB3M3M3OWYWdWdeeAq6Q; 	
e  
 6k663q#k*++r;#4"5J
:!&&C( JsOw$> t9O$O7N$O!OO#s   3F
Fc                    U =(       d    SR                  5       R                  SS5      R                  S5      S   nU(       a  US;   a  g [        5       U-  nUR	                  5       (       a  U$ g )Nr    \/r5   >   ...)r7   replacer=   r   is_file)filenamenamepaths      r    resolve_student_folder_file_pathrT   Y   s^    N!!#++D#6<<SA"ED4;&$&D||~~r   )document_idc                  SSK Jn  U R                  [        5      R	                  [        R
                  [        U5      :H  [        R                  [        U5      :H  [        R                  R                  S5      [        R                  S:g  5      n UR	                  [        R                  R                  S5      5      nUR                  [        R                  [        R                  5      nUR!                  UR#                  5       [        R$                  R#                  5       [        R&                  R#                  5       5      R)                  5       $ ! [         a     Nf = f)u   
Devuelve el ÚLTIMO archivo de la ficha para ese estudiante + document_id.

Criterio (si hay varios): más reciente por updated_date / added_date,
luego version_id, luego id.
r   )funcNr    )
sqlalchemyrW   queryr   filter
student_idintrU   fileisnotdeleted_dateis_	Exceptioncoalesceupdated_date
added_dateorder_bydesc
version_ididfirst)dbr[   rU   rW   q
last_touchs         r   get_latest_folder_filerm   c   s     
$$#j/13{#33t$B		AHH[--11$78
 {779O9OPJ::##% eg	  s   .E 
E! E!)rU   	max_charsc                  [        U5      S:  a  SSSS.$ [        U [        U5      [        U5      S9nU(       a(  UR                  =(       d    SR                  5       (       d  SS[        U5       S	3S
S.$ [	        UR                  5      R                  5       n[        U5      nU(       d!  SSU S3S
UUR                  UR                  S.$  [        R                  " U5      =(       d    SR                  5       nU(       d  SSU S3S
US.$ Sn	[        U5      U:  a
  USU S-   nSn	[        USS5      n
[        USS5      nU=(       d    U
n[        US5      (       a  UR                  SSS9O[	        U=(       d    S5      nS[        U5       SU SUR                   SU=(       d    S S 3	nSS![        U5      [        U5      [        UR                  5      [        UR                  =(       d    S5      US"U 3[        U
S5      (       a  U
R                  5       OS[        US5      (       a  UR                  5       OSU	[        U5      X-   USS#.$ ! [         a  nSSU 3SUS.s SnA$ SnAff = f)$u   
Lee el ÚLTIMO archivo de la ficha (folders) para student_id + document_id.
Si hay varias versiones, usa la más reciente (fecha / version_id).
Por defecto document_id=27 (informe psicopedagógico).
r1   Fu   student_id inválido.r!   )okmessagehttp_statusr[   rU   r    z;No hay archivo en la ficha del estudiante para document_id=uA    (sube el informe psicopedagógico en la carpeta del estudiante).i  u   El archivo «u-   » figura en la ficha pero no está en disco.)rp   rq   rr   rQ   folderId	versionIdz(No se pudo leer el archivo de la ficha: i  )rp   rq   rr   rQ   Nu   » no tiene texto extraíble.u   
… [contenido truncado]Trd   rc   	isoformat seconds)septimespecuA   INFORME PSICOPEDAGÓGICO DESDE FICHA DEL ESTUDIANTE (document_id=z
, archivo=u   , versión=u   , último_cargado=zn/du   ). Es la ÚLTIMA versión en la ficha (si había varias). No estaba (o no era usable) en Files del agente; usa ESTE texto como fuente principal de los campos narrativos del Informe a la Familia.

u%   Último documento de la ficha leído.z/files/system/students/)rp   rq   	studentId
documentIdrt   ru   rQ   downloadUrl	addedDateupdatedDate	truncatedcharscontextrC   isLatest)r\   rm   r]   r7   strrT   rh   rg   file_ctxextract_file_textra   r8   getattrhasattrrv   )rj   r[   rU   rn   rowrQ   rS   contentexcr   addedupdatedwhenwhen_sheaders                  r   %extract_student_catalog_document_textr      s    :(?PSTT
 JSQ\M]
^Csxx~2,,..McR]N^M_ `S S 
 	
 388}""$H+H5D&xj0]^ 
 	

--d39r@@B &xj0MN 	
 	
 I
7|i*9%(DD	Ct,Ec>40GeD<CD+<V<VT^^i^8\_`d`jhj\kF	K()H: >NN##5fo5F GA	A  :_+&K,1-0
;*1%*E*EU__&4.5g{.K.Kw((*QUW# E  
A#G 	
 	

s   -I 
I,	I'!I,'I,F)r   r   forcec               ^   U(       a  [        U5      S:  a  gUb  [        U5      OSnU=(       d    US:H  nU(       d  g[        UUUS9(       a  g[        U [        U5      [        S9n	U	R	                  S5      (       d  g[        U	R	                  S5      =(       d    S5      R                  5       $ )	u   
Si Files no trae psicopedagógico del estudiante, inyecta el de la ficha (doc 27).

Se usa cuando:
- force=True, o
- document_id es Informe a la Familia (7), o
- document_id aún no está definido (None) — típico del agente Familia.
r1   r    N   r   rs   rp   r   )r\   rI   r   PSYCHOPED_CATALOG_DOCUMENT_IDgetr   r7   )
rj   r[   rU   rB   r   r   r   docallowresults
             r   !maybe_build_ficha_psychoped_blockr      s    $ Z1,)5#k
4C SAXE*!
 2
z?1F
 ::dvzz)$*+1133r   )returnr   )rB   r   r   
str | Noner   r   r   bool)rQ   r   r   zPath | None)rj   r   r[   r\   rU   r\   r   zFolderModel | None)
rj   r   r[   r\   rU   r\   rn   r\   r   zdict[str, Any])rj   r   r[   
int | NonerU   r   rB   r   r   r   r   r   r   r   r   r   )__doc__
__future__r   r<   pathlibr   typingr   sqlalchemy.ormr   app.backend.core.configr   app.backend.db.models.pie_corer   app.backend.utilsr	   r   r   r;   
_MAX_CHARSr   rI   rT   rm   r   r   r$   r   r   <module>r      sM   \ " 	   " , 6 = !# 	  

   $"	)P)P )P 	)P
 
)PX 5	  	
 L 5ZZ Z 	Z
 Z ZF  $"*4*4 *4 	*4
 *4 *4 *4 *4 	*4r   