ó
    8˜jý4  ã                  ó
  • S r SSKJr  SSKrSSKrSSKJrJr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S
KJrJrJrJrJrJrJrJr  SSKJrJrJr  \R>                  " \ 5      r!Sr"SS jr#SS jr$SS jr% " S S5      r&g)uJ   Persistencia y ejecuciÃ³n de la cola Drive para documentos de estudiantes.é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)ÚPath)ÚAny)Úor_)ÚSession)Úsettings)ÚCourseModelÚDocumentModelÚFolderModelÚSchoolModelÚStudentAcademicInfoModelÚStudentDriveSyncJobModelÚStudentModelÚStudentPersonalInfoModel)Údownload_drive_fileÚfind_student_document_file_idÚupload_student_document_tree)ÚpendingÚretryc                 ód   • [         R                  " [        R                  5      R	                  S S9$ )N)Útzinfo)r   Únowr   ÚutcÚreplace© ó    Ú^c:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\student_drive_sync_class.pyÚ_utcnowr!   $   s#   € Ü�<Š<œŸ™Ó%×-Ñ-°TÐ-Ð:Ð:r   c                 ód   • [        [        R                  5      S-  S-  n U R                  SSS9  U $ )NÚsystemÚstudentsT)ÚparentsÚexist_ok)r   r   Ú	files_dirÚmkdir)Úpaths    r    Ústudent_files_dirr*   (   s1   € Ü”×"Ñ"Ó# hÑ.°Ñ;€DØ‡J�J�t d€JÑ+Ø€Kr   c                óÜ  • [        U 5      nUR                  5       (       aS   UR                  5       R                  [        [        R
                  5      R                  5       5      R                  5       $ UR                  5       R                  S5      nUR                  S5      (       a  USS nSU;  a  S[        U5      R                   3$ U$ ! [         a    UR                  5       s $ f = f)zKGuarda una referencia estable relativa a FILES_DIR siempre que sea posible.Ú/zfiles/é   Nzsystem/students/)r   Úis_absoluteÚresolveÚrelative_tor   r'   Úas_posixÚ
ValueErrorÚlstripÚ
startswithÚname)Ú	file_pathÚrawÚ
normalizeds      r    Ú_relative_student_file_pathr9   .   sÉ   € ä
ˆy‹/€CØ
‡�×Ñð	"Ø—;‘;“=×,Ñ,¬T´(×2DÑ2DÓ-E×-MÑ-MÓ-OÓP×YÑYÓ[Ð[ð —‘“×&Ñ& sÓ+€JØ×Ñ˜X×&Ñ&Ø  �^ˆ
Ø
�*ÓØ!¤$ zÓ"2×"7Ñ"7Ð!8Ð9Ð9ØÐøô ó 	"Ø—<‘<“>Ò!ð	"ús   ¢AC ÃC+Ã*C+c                  ó¤   • \ rS rSrSS jrSS.           SS jjrSS jrSS jr\SS j5       r	SS	 jr
SS
 jrSSS.       SS jjrSrg)ÚStudentDriveSyncClassé>   c                ó   • Xl         g )N©Údb)Úselfr?   s     r    Ú__init__ÚStudentDriveSyncClass.__init__?   s   € Ø�r   N)Ú	mime_typec               ó  • [        U5      n[        5       nU R                  R                  [        5      R                  [        R                  [        U5      :H  [        R                  U:H  [        R                  R                  [        5      5      R                  [        R                  R                  5       5      R                  5       nU(       a7  U=(       d    UR                   Ul        SUl	        Xxl        SUl        Xxl        Un	OH[	        [        U5      [        U5      [        U5      UUSSUUUS9
n	U R                  R)                  U	5        U R                  R+                  5         U R                  R-                  U	5        U	$ )uD   Encola solo archivos creados despuÃ©s de instalar esta integraciÃ³n.r   Nr   )
Ú	folder_idÚ
student_idÚdocument_idr6   rC   ÚstatusÚattemptsÚnext_attempt_atÚ
created_atÚ
updated_at)r9   r!   r?   Úqueryr   ÚfilterrE   Úintr6   rH   Úin_Ú_ACTIVE_STATUSESÚorder_byÚidÚdescÚfirstrC   rJ   Ú
last_errorrL   ÚaddÚcommitÚrefresh)
r@   rE   rF   rG   r6   rC   Úrelative_pathr   ÚexistingÚjobs
             r    ÚenqueueÚStudentDriveSyncClass.enqueueB   s/  € ô 4°IÓ>ˆÜ‹iˆà�G‰G�M‰MÔ2Ó3ß‰VÜ(×2Ñ2´c¸)³nÑDÜ(×2Ñ2°mÑCÜ(×/Ñ/×3Ñ3Ô4DÓEó÷
 ‰XÔ.×1Ñ1×6Ñ6Ó8Ó9ß‰U‹Wð 	ö Ø!*×!@¨h×.@Ñ.@ˆHÔØ'ˆHŒOØ'*Ô$Ø"&ˆHÔØ"%ÔØ‰Cä*Ü˜i›.Ü˜z›?Ü Ó,Ø'Ø#Ø ØØ #ØØñˆCð �G‰G�K‰K˜ÔØ�‰�‰ÔØ�‰�‰˜ÔØˆ
r   c                óv  • [        5       nU[        SS9-
  nU R                  R                  [        5      R                  [        [        R                  R                  [        5      [        R                  U:*  -  [        R                  S:H  [        R                  U:*  -  5      5      R                  [        R                  R                  5       [        R                  R                  5       5      n UR                  SS9R!                  5       nU(       d  U R                  R%                  5         gSUl        Xl        Xl        U R                  R)                  5         [+        UR                  5      $ ! ["         a;    U R                  R%                  5         UR                  5       R!                  5       n N¨f = f)zDReclama una tarea con bloqueo de fila; es seguro con varios workers.é   ©ÚminutesÚ
processingT)Úskip_lockedN)r!   r   r?   rM   r   rN   r	   rH   rP   rQ   rJ   Ú	locked_atrR   ÚascrS   Úwith_for_updaterU   Ú	ExceptionÚrollbackrL   rX   rO   )r@   r   Ústale_atrM   r\   s        r    Úclaim_due_jobÚ#StudentDriveSyncClass.claim_due_jobq   s[  € ä‹iˆØœ¨2Ñ.Ñ.ˆà�G‰G�M‰MÔ2Ó3ß‰VÜä0×7Ñ7×;Ñ;Ô<LÓMÜ3×CÑCÀsÑJñLô 2×8Ñ8¸LÑHÜ3×=Ñ=ÀÑIñKó	ó÷ ‰XÜ(×8Ñ8×<Ñ<Ó>Ü(×+Ñ+×/Ñ/Ó1óð 	ð&	2Ø×'Ñ'°DÐ'Ð9×?Ñ?ÓAˆCö Ø�G‰G×ÑÔØØ!ˆŒ
ØŒØŒØ�‰�‰ÔÜ�3—6‘6‹{Ðøô ó 	2Ø�G‰G×ÑÔØ×'Ñ'Ó)×/Ñ/Ó1ŠCð	2ús   Ã2E3 Å3AF8Æ7F8c                ó\  • U R                   R                  [        5      R                  [        R                  [        U5      :H  5      R                  5       nU(       d  SSS.$  U R                  U5      nU R                  UR                  5      nUR                  5       nUR                  R                  5       R                  S5      =(       d    Sn[        U R                   US   US   US   US	   US
   US   UUUR                  =(       d#    [         R"                  " UR$                  5      S   S9
nSUl        [        UR*                  =(       d    S5      S-   Ul        URE                  S5      Ul#        URE                  S5      Ul$        S Ul        S Ul        [1        5       Ul%        [1        5       Ul        U R                   R?                  5         SUS.$ ! [&         GaH  nU R                   R)                  5         U R                   R                  [        5      R                  [        R                  [        U5      :H  5      R                  5       nU(       a£  [        UR*                  =(       d    S5      S-   n	[-        SS[-        U	S5      -  5      n
SUl        X’l        [1        5       [3        U
S9-   Ul        S Ul        [9        U5      S S Ul        [1        5       Ul        U R                   R?                  5         [@        RC                  SX5        S[9        U5      S.s S nA$ S nAff = f)NFzTarea de Drive no encontrada)ÚokÚmessageÚ.ÚbinÚcustomer_idÚschool_nameÚyearÚcourse_nameÚstudent_rutÚdocument_type_namer   )
r?   rr   rs   rt   ru   rv   rw   ÚdataÚfile_extensionrC   é   ih  é   é   r   ra   i   z!Drive pendiente para tarea %s: %sÚ	completedÚfile_idÚ
drive_pathT)rn   rx   )&r?   rM   r   rN   rS   rO   rU   Ú	_metadataÚ_absolute_filer6   Ú
read_bytesÚsuffixÚlowerr3   r   rC   Ú	mimetypesÚ
guess_typer5   rh   ri   rI   ÚminrH   r!   r   rJ   re   ÚstrrV   rL   rX   ÚloggerÚwarningÚgetÚdrive_file_idr   Úcompleted_at)r@   Újob_idr\   ÚmetadataÚ
local_pathrx   Ú	extensionÚpayloadÚexcrI   Údelay_minutess              r    ÚprocessÚStudentDriveSyncClass.process–   s†  € à�G‰G�M‰MÔ2Ó3ß‰VÔ,×/Ñ/´3°v³;Ñ>Ó?ß‰U‹Wð 	ö
 ØÐ,JÑKÐKð#	6Ø—~‘~ cÓ*ˆHØ×,Ñ,¨S¯]©]Ó;ˆJØ×(Ñ(Ó*ˆDØ"×)Ñ)×/Ñ/Ó1×8Ñ8¸Ó=×FÀˆIÜ2Ø—7‘7Ø$ ]Ñ3Ø$ ]Ñ3Ø˜fÑ%Ø$ ]Ñ3Ø$ ]Ñ3Ø#+Ð,@Ñ#AØØ(ØŸ-™-×S¬9×+?Ò+?À
ÇÁÓ+PÐQRÑ+SñˆGð@ !ˆŒ
Ü˜3Ÿ<™<×,¨1Ó-°Ñ1ˆŒØ#ŸK™K¨	Ó2ˆÔØ Ÿ™ \Ó2ˆŒØˆŒØˆŒÜ"›9ˆÔÜ ›ˆŒØ�‰�‰ÔØ GÑ,Ð,øô; ô 	6Ø�G‰G×ÑÔà—‘—‘Ô6Ó7ß‘Ô0×3Ñ3´s¸6³{ÑBÓCß‘“ð ö
 Ü˜sŸ|™|×0¨qÓ1°AÑ5�Ü # C¨¬c°(¸AÓ.>Ñ)>Ó ?�Ø$�”
Ø'”Ü&-£i´)ÀMÑ2RÑ&R�Ô#Ø $�”Ü!$ S£¨%¨4 �”Ü!(£�”Ø—‘—‘Ô Ü�N‰NÐ>ÀÔLØ¬C°«HÑ5Õ5ûð%	6ús    Á$CG ÇL+Ç#D=L&Ì L+Ì&L+c                ó>  • [        U 5      nUR                  5       (       a  U/O<[        [        R                  5      U-  [	        5       UR
                  -  [        U 5      /nU H*  nUR                  5       (       d  M  UR                  5       s  $    [        SU  35      e)NzArchivo local no encontrado: )	r   r.   r   r'   r*   r5   Úis_filer/   ÚFileNotFoundError)r6   r7   Ú
candidatesÚ	candidates       r    r�   Ú$StudentDriveSyncClass._absolute_fileÏ   s‹   € ä�9‹oˆØ!Ÿo™o×/Ñ/�c‘UÜ”×#Ñ#Ó$ sÑ*ÜÓ #§(¡(Ñ*Ü�‹Oð6
ˆ
ó
 $ˆIØ× Ñ ×"Ó"Ø ×(Ñ(Ó*Ò*ñ $ô  Ð"?À	¸{Ð KÓLÐLr   c                ó  • U R                   R                  [        5      R                  [        R                  [        U5      :H  5      R                  5       nU(       d  [        S5      eU R                   R                  [        5      R                  [        R                  [        U5      :H  [        R                  R                  S5      [        R                  S:H  5      R                  [        R                  R                  5       5      R                  5       nU R                  U5      nU(       a  UR                  OS=(       d    SnU(       dŠ  [!        UR"                  =(       d    S5      R$                  nU(       a$  [!        U5      R&                  R)                  S5      OSn[+        U R                   US   US   US	   US
   US   US   U=(       d    SS9nU(       d  [        S5      e[-        U R                   US   [/        U5      S9nUS   n	[!        UR"                  =(       d    UR1                  S5      =(       d    SU 35      R$                  n
UR1                  S5      =(       d"    [2        R4                  " U
5      S   =(       d    Sn [7        5       U
-  nUR9                  5       (       d  UR;                  U	5        U	U
U[/        U5      SS.$ ! [<         a!  n[>        RA                  SUU5         SnAN7SnAff = f)uÕ   
Obtiene el archivo de una versiÃ³n (folder) desde Google Drive.
1) Job de sync completado con drive_file_id
2) BÃºsqueda en el Ã¡rbol Liceo/AÃ±o/Curso/RUT
Opcionalmente deja copia local en files/system/students.
zDocumento no encontradoNr}   Ú rp   rq   rr   rs   rt   ru   rv   rw   )r?   rr   rs   rt   ru   rv   rw   ry   z7Archivo no encontrado en el servidor ni en Google Drive)r?   rr   r~   rx   ÚfilenameÚ
documento_rC   r   zapplication/octet-streamz7No se pudo cachear localmente folder %s desde Drive: %sÚgoogle_drive)rx   rŸ   rC   rŒ   Úsource)!r?   rM   r   rN   rS   rO   rU   r™   r   rE   rŒ   ÚisnotrH   rR   rT   Ú_metadata_for_folderr   Úfiler5   rƒ   r3   r   r   rˆ   r‹   r…   r†   r*   r˜   Úwrite_bytesrh   r‰   rŠ   )r@   rE   Úfolderr\   r�   rŒ   Ú
local_nameÚextr’   rx   rŸ   ÚmimeÚ
cache_pathr“   s                 r    Údownload_for_folderÚ)StudentDriveSyncClass.download_for_folderÜ   s€  € ð �G‰G�M‰Mœ+Ó&ß‰V”K—N‘N¤c¨)£nÑ4Ó5ß‰U‹Wð 	ö
 Ü#Ð$=Ó>Ð>ð �G‰G�M‰MÔ2Ó3ß‰VÜ(×2Ñ2´c¸)³nÑDÜ(×6Ñ6×<Ñ<¸TÓBÜ(×/Ñ/°;Ñ>ó÷
 ‰XÔ.×1Ñ1×6Ñ6Ó8Ó9ß‰U‹Wð 	ð ×,Ñ,¨VÓ4ˆÞ.1˜×*Ò*°t×DÀˆÞÜ˜fŸk™k×/¨RÓ0×5Ñ5ˆJÞ9C”$�zÓ"×)Ñ)×0Ñ0°Ô5ÈˆCÜ9Ø—7‘7Ø$ ]Ñ3Ø$ ]Ñ3Ø˜fÑ%Ø$ ]Ñ3Ø$ ]Ñ3Ø#+Ð,@Ñ#AØ"Ÿ| eñ	ˆMö Ü#ØIóð ô &Ø�w‰wØ  Ñ/Ü˜Ó&ñ
ˆð
 ˜f‘oˆÜ˜Ÿ™×Z w§{¡{°:Ó'>×ZÀJÈyÈkÐBZÓ[×`Ñ`ˆØ�{‰{˜;Ó'×j¬9×+?Ò+?ÀÓ+IÈ!Ñ+L×jÐPjˆð		Ü*Ó,¨xÑ7ˆJØ×%Ñ%×'Ñ'Ø×&Ñ& tÔ,ð Ø ØÜ  Ó/Ø$ñ
ð 	
øô ó 	Ü�N‰NØIØØ÷ñ ûð	ús   Ê3K Ë
K?ËK:Ë:K?c                óT  • U R                   R                  [        5      R                  [        R                  [        UR                  5      :H  5      R                  5       nU(       d  [        S5      eU R                  U[        UR                  5      [        UR                  5      S9$ )Nú1Faltan datos del documento, estudiante o carpeta.©rF   rG   )r?   rM   r   rN   rS   rO   rE   rU   r2   r¤   rF   rG   )r@   r\   r§   s      r    r€   ÚStudentDriveSyncClass._metadata'  s~   € à�G‰G�M‰Mœ+Ó&ß‰V”K—N‘N¤c¨#¯-©-Ó&8Ñ8Ó9ß‰U‹Wð 	ö
 ÜÐPÓQÐQØ×(Ñ(ØÜ˜3Ÿ>™>Ó*Ü˜CŸO™OÓ,ð )ð 
ð 	
r   r°   c               óz	  • [        U=(       d    UR                  =(       d    S5      n[        U=(       d    UR                  =(       d    S5      nU R                  R	                  [
        5      R                  [
        R                  U:H  5      R                  5       nU R                  R	                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a  U(       a  U(       d  [        S5      eU R                  R	                  [        5      R                  [        R                  [        UR                  5      :H  5      R                  [        R                  R                  5       5      R                  5       n[        UR                  =(       d    UR                  =(       d    S5      n	[        UR                  =(       d    [!        USS5      =(       d    S5      n
U	(       aM  U R                  R	                  ["        5      R                  ["        R                  U	:H  5      R                  5       OS nU
(       aM  U R                  R	                  [$        5      R                  [$        R                  U
:H  5      R                  5       OS nUR&                  =(       d     [!        USS 5      =(       d    UR&                  nU R                  R	                  [(        5      R                  [(        R                  [        UR                  5      :H  5      R                  [(        R                  R                  5       5      R                  5       n[!        USS 5      =(       d    UR*                  nU(       a#  [        UR,                  =(       d    S5      (       d  [        S5      eU(       d  [        S5      eU(       a,  [/        U5      R1                  5       R3                  5       (       d  [        S5      eU(       d  [        S	5      e[        UR,                  5      UR4                  =(       d    S
UR                   3[        [/        U5      R1                  5       5      UR6                  =(       d    SUR                   3[/        U5      UR8                  =(       d    SUR                   3S.$ )Nr   r¯   Ú	course_idÚperiod_yearÚidentification_numberz8No se pudo determinar el liceo o cliente del estudiante.z.No se pudo determinar el curso del estudiante.u4   No se pudo determinar el aÃ±o escolar del documento.z&El estudiante no tiene RUT registrado.zLiceo zCurso z
Documento )rr   rs   rt   ru   rv   rw   )rO   rF   rG   r?   rM   r   rN   rS   rU   r   r2   r   rR   rT   Ú	school_idr³   Úgetattrr   r   r´   r   rµ   rr   rˆ   ÚstripÚisdigitrs   ru   Údocument)r@   r§   rF   rG   ÚsidÚdidÚstudentrº   Úacademicr¶   r³   ÚschoolÚcourseÚyear_rawÚpersonalÚruts                   r    r¤   Ú*StudentDriveSyncClass._metadata_for_folder5  sI  € ô �*×6 × 1Ñ 1×6°QÓ7ˆÜ�+×8 ×!3Ñ!3×8°qÓ9ˆà�G‰G�M‰Mœ,Ó'ß‰V”L—O‘O sÑ*Ó+ß‰U‹Wð 	ð �G‰G�M‰Mœ-Ó(ß‰V”M×$Ñ$¨Ñ+Ó,ß‰U‹Wð 	ö
 žW®HÜÐPÓQÐQð �G‰G�M‰MÔ2Ó3ß‰VÔ,×7Ñ7¼3¸w¿z¹z»?ÑJÓKß‰XÔ.×1Ñ1×6Ñ6Ó8Ó9ß‰U‹Wð	 	ô ˜×(Ñ(×B¨G×,=Ñ,=×BÀÓCˆ	Ü˜×(Ñ(×R¬G°H¸kÈ1Ó,M×RÐQRÓSˆ	ö ð �G‰G�M‰Mœ+Ó&×-Ñ-¬k¯n©nÀ	Ñ.IÓJ×PÑPÔRàð 	ö ð �G‰G�M‰Mœ+Ó&×-Ñ-¬k¯n©nÀ	Ñ.IÓJ×PÑPÔRàð 	ð
 ×%Ñ%×d¬°¸ÈÓ)M×dÐQX×QdÑQdˆà�G‰G�M‰MÔ2Ó3ß‰VÔ,×7Ñ7¼3¸w¿z¹z»?ÑJÓKß‰XÔ.×1Ñ1×6Ñ6Ó8Ó9ß‰U‹Wð	 	ô �hÐ 7¸Ó>×_À'×B_ÑB_ˆÞœS ×!3Ñ!3×!8°q×9Ñ9ÜÐWÓXÐXÞÜÐMÓNÐNÞœs 8›}×2Ñ2Ó4×<Ñ<×>Ñ>ÜÐSÓTÐTÞÜÐEÓFÐFô ˜v×1Ñ1Ó2Ø!×-Ñ-×E°6¸&¿)¹)¸Ð1EÜœ˜H›×+Ñ+Ó-Ó.Ø!×-Ñ-×E°6¸&¿)¹)¸Ð1EÜ˜s›8Ø"*×"3Ñ"3×"Q¸ÀHÇKÁKÀ=Ð7Qñ
ð 	
r   r>   )r?   r
   )rE   rO   rF   rO   rG   rO   r6   ú
str | PathrC   z
str | NoneÚreturnr   )rÆ   ú
int | None)rŽ   rO   rÆ   údict[str, Any])r6   rˆ   rÆ   r   )rE   rO   rÆ   rÈ   )r\   r   rÆ   rÈ   )r§   r   rF   rÇ   rG   rÇ   rÆ   rÈ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rA   r]   rk   r•   Ústaticmethodr�   r¬   r€   r¤   Ú__static_attributes__r   r   r    r;   r;   >   sº   † ôð !%ñ-ð ð-ð ð	-ð
 ð-ð ð-ð ð-ð 
"õ-ô^#ôJ7-ðr ó
Mó ð
MôI
ôV
ð$ "&Ø"&ñ@
àð@
ð ð	@
ð
  ð@
ð 
÷@
ð @
r   r;   )rÆ   r   )rÆ   r   )r6   rÅ   rÆ   rˆ   )'Ú__doc__Ú
__future__r   Úloggingr…   r   r   r   Úpathlibr   Útypingr   Ú
sqlalchemyr	   Úsqlalchemy.ormr
   Úapp.backend.core.configr   Úapp.backend.db.modelsr   r   r   r   r   r   r   r   Ú&app.backend.utils.google_drive_storager   r   r   Ú	getLoggerrÉ   r‰   rQ   r!   r*   r9   r;   r   r   r    Ú<module>rÚ      sr   ðÙ På "ã Û ß 2Ñ 2Ý Ý å Ý "å ,÷	÷ 	ó 	÷ñ ð 
×	Ò	˜8Ó	$€Ø'Ð ô;ôô÷ w
ò w
r   