ó
    ´ÉjŸl  ã                   ó0  • S r SSKrSSKJs  Jr  SSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKJr  SSKJrJrJrJrJr  SSKJrJrJr  \R@                  RC                  S/ SQ5      S	 5       r"S
 r#S r$S r%S r&S r'S r(S r) " S S\RT                  5      r+S r,S r-S r.S r/S r0S r1S r2S\34S jr4S r5S r6S r7S r8S  r9\Rt                  S! 5       r;\Rt                  S" 5       r<S# r=S$ r>S% r?S& r@S' rAS( rBS) rCS* rDS+ rES, rFS- rGS. rHS/ rIS0 rJS1 rKS2 rLS3 rMS4 rNS5 rOS6 rPS7 rQS8 rRS9 rSS: rTS; rUS< rVS= rWS> rXS? rYS@ rZSA r[\R@                  RC                  SBSCSD0SESF0SESG0SHSD0SESI0SDSJSK./5      SL 5       r\SM r]SN r^SO r_SP r`g)Quù   
Lector de QR / organizer (services/qr_detect.py, organizer_service.py, scan_service.py).

Reproduce las reglas de resiliencia de hec-photo-app (cada una naciÃ³ de una caÃ­da real) y la cascada de
lectura, con cÃ³digos QR REALES generados al vuelo.
é    N)Úconfig)Úorganizer_service)Úphotographer_serviceÚphoto_serviceÚ	qr_detectÚschool_serviceÚscan_service)Úplain_imageÚqr_imageÚ	save_jpegzraw,expected))úLMR-4827r   )z
 lmr-4827 r   )úMAR-4JC-IBDr   )ú)https://photos.meeconic.com/r/MAR-4JC-IBDr   )z)HTTPS://PHOTOS.MEECONIC.COM/R/MAR-4JC-IBDr   )z.https://photos.meeconic.com/?code=EMM-2931&x=1zEMM-2931)z%https://photos.meeconic.com/otra-cosaN)z../../etc/passwdN)z..\..\windowsN)zhttps://evil.test/r/../../xN)ÚPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN)Ú N)NNc                 ó  • [         R                  o"" U 5      o3U:H  oD(       GdX  [        R                  " SU4SX145      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p4g )	N©ú==)zR%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.extract_code
}(%(py3)s)
} == %(py7)sr   ÚrawÚexpected)Úpy0Úpy2Úpy3Úpy5Úpy7zassert %(py9)sÚpy9)
r   Úextract_codeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   r   Ú@py_assert1Ú@py_assert4Ú@py_assert6Ú@py_format8Ú@py_format10s          ÚWD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\tests\test_organizer.pyÚ<test_extract_code_rejects_anything_that_is_not_a_family_coder,      sÂ   € ô  ×!Ñ!Ð2Ð! #Ó&Ð2¨(Ñ2×2×2×2Ó2Ð&×2×2×2×2×2Õ2Œ9×2×2×2Ñ2Œ9×2×2Õ2Ð!×2×2×2×2×2Ô2 #×2×2×2Ñ2 #×2×2Õ2Ð&×2×2×2×2×2Ô2¨(×2×2×2Ñ2¨(×2×2×2×2×2×2Ö2ó    c                 ó’   • [         R                  " [        R                  " U R	                  S5      5      [         R
                  5      $ )NÚRGB)Úcv2ÚcvtColorÚnpÚarrayÚconvertÚCOLOR_RGB2BGR)Úpils    r+   Ú_bgrr7   0   s+   € Ü�<Š<œŸš §¡¨UÓ!3Ó4´c×6GÑ6GÓHÐHr-   c                  ó<  • [         R                  n Sn[        U5      n[        U5      nSo@" X4S9nSoeU:H  ow(       GdÑ  [        R
                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S	.
-  nS
SU0-  n	[        [        R                  " U	5      5      eS =n =n=n=n=n=n=pvg )Nr   F©Úuse_ocrr   )z¢%(py14)s
{%(py14)s = %(py2)s
{%(py2)s = %(py0)s.detect_qr
}(%(py10)s
{%(py10)s = %(py3)s(%(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})
}, use_ocr=%(py12)s)
} == %(py17)sr   r7   r   )
r   r   r   Úpy4Úpy6Úpy8Úpy10Úpy12Úpy14Úpy17úassert %(py19)sÚpy19)r   Ú	detect_qrr   r7   r   r   r    r!   r"   r#   r$   r%   )
r&   Ú@py_assert5Ú@py_assert7Ú@py_assert9Ú@py_assert11Ú@py_assert13Ú@py_assert16Ú@py_assert15Ú@py_format18Ú@py_format20s
             r+   Útest_reads_a_real_qr_cardrN   4   s$  € Ü×ÑÐ]¨]Ð]¤H¨]Ó$;Ð]œtÐ$;Ó<Ð]ÀeÐ]ÐÐ<ÑLÐ]ÐP]Ð]ÐP]Ñ]×]×]×]Ó]ÐL×]×]×]×]×]Õ]Œ9×]×]×]Ñ]Œ9×]×]Õ]Ð×]×]×]×]×]Ô]œt×]×]×]Ñ]œt×]×]×]×]×]Ö]¤H×]×]×]Ñ]¤H×]×]Õ]¨]×]×]Ó]Ð$;×]×]Ó]Ð<×]×]Ó]Àe×]×]Ó]ÐL×]×]Ó]ÐP]×]×]×]×]×]×]×]Ö]r-   c                  óì  • [         R                  " [        [        S5      5      SS9n [         R                  o" U 5      nSo2U:H  oD(       Gd"  [
        R                  " SU4SX#45      S[        R                  " 5       ;   d  [
        R                  " [         5      (       a  [
        R                  " [         5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      [
        R                  " U5      S	.-  nS
SU0-  n[        [
        R                  " U5      5      eS =n=n=pCg )Nr   Fr9   r   r   )zR%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.extract_code
}(%(py3)s)
} == %(py8)sr   r   )r   r   r   r   r=   zassert %(py10)sr>   )r   rD   r7   r   r   r   r   r    r!   r"   r#   r$   r%   )r   r&   r'   rF   r(   Ú@py_format9Ú@py_format11s          r+   Ú%test_reads_the_url_embedded_in_the_qrrR   8   sÌ   € Ü
×
Ò
œd¤8Ð,WÓ#XÓYÐchÑ
i€CÜ×!Ñ!Ð7Ð! #Ó&Ð7¨-Ð7¨-Ñ7×7×7×7Ó7Ð&×7×7×7×7×7Õ7Œ9×7×7×7Ñ7Œ9×7×7Õ7Ð!×7×7×7×7×7Ô7 #×7×7×7Ñ7 #×7×7Õ7Ð&×7×7Ó7¨-×7×7×7×7×7×7Ö7r-   c                  ó  • [         R                  n [        5       n[        U5      nSo0" X#S9nS oTUL of(       Gd¼  [        R
                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.	-  nS	S
U0-  n[        [        R                  " U5      5      eS =n =n=n=n=n=peg )NFr9   ©Úis)z™%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.detect_qr
}(%(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s()
})
}, use_ocr=%(py10)s)
} is %(py15)sr   r7   r
   ©	r   r   r   r;   r<   r=   r>   r?   Úpy15úassert %(py17)srA   )r   rD   r
   r7   r   r   r    r!   r"   r#   r$   r%   )	r&   rE   rF   rG   rH   Ú@py_assert14rI   Ú@py_format16rL   s	            r+   Ú2test_a_portrait_without_qr_is_rejected_at_the_gater[   =   s  € Ü×ÑÐJ¤K£MÐJœt MÓ2ÐJ¸EÐJÐÐ2ÑBÐJÀdÐJÀdÐJ×J×J×JÓJÐB×J×J×J×J×JÕJŒ9×J×J×JÑJŒ9×J×JÕJÐ×J×J×J×J×JÔJœt×J×J×JÑJœt×J×J×J×J×JÖJ¤K×J×J×JÑJ¤K×J×JÕJ M×J×JÓJÐ2×J×JÓJ¸E×J×JÓJÐB×J×JÓJÀd×J×J×J×J×J×J×JÔJr-   c                  óü  • [        SSSS9n [        R                  n[        R                  n[	        U 5      nSoB" X4S9oQ" U5      nSovU:H  oˆ(       Gd  [
        R                  " SU4SXg45      S	[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS	[
        R                  " U5      S	[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS	[
        R                  " U5      S
[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS
S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS=n=n=n=n=n=n=p‡g)zRLos preprocesados (CLAHE / Otsu / enfoque) rescatan tarjetas fotografiadas flojas.r   é   gš™™™™™á?)ÚblurÚcontrastFr9   r   ©zÄ%(py15)s
{%(py15)s = %(py2)s
{%(py2)s = %(py0)s.extract_code
}(%(py13)s
{%(py13)s = %(py5)s
{%(py5)s = %(py3)s.detect_qr
}(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}, use_ocr=%(py11)s)
})
} == %(py18)sr   r7   Úimg©r   r   r   r   r<   r   r   Úpy11Úpy13rW   Úpy18úassert %(py20)sÚpy20N©r   r   r   rD   r7   r   r   r    r!   r"   r#   r$   r%   ©ra   r&   r'   Ú@py_assert8Ú@py_assert10Ú@py_assert12rY   Ú@py_assert17rJ   Ú@py_format19Ú@py_format21s              r+   Ú$test_reads_a_blurred_low_contrast_qrrp   A   sY  € ä
�= q°4Ñ
8€CÜ×!Ñ!Ða¤)×"5Ñ"5Ða´d¸3³iÐaÈÐaÐ"5°iÑ"OÐaÐ!Ð"OÓPÐaÐTaÐaÐTaÑa×a×a×aÓaÐP×a×a×a×a×aÕaŒ9×a×a×aÑaŒ9×a×aÕaÐ!×a×a×a×a×aÔa¤)×a×a×aÑa¤)×a×aÕaÐ"5×a×a×a×a×aÔa´d×a×a×aÑa´d×a×a×a×a×aÖa¸3×a×a×aÑa¸3×a×aÕa°i×a×aÓaÈ×a×aÓaÐ"O×a×aÓaÐP×a×aÓaÐTa×a×a×a×a×a×a×aÖar-   c                  óü  • [        SSSS9n [        R                  n[        R                  n[	        U 5      nSoB" X4S9oQ" U5      nSovU:H  oˆ(       Gd  [
        R                  " SU4SXg45      S	[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS	[
        R                  " U5      S	[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS	[
        R                  " U5      S
[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS
S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS =n=n=n=n=n=n=p‡g )Nr   )i¸  iÐ  éð   ©ÚsizeÚqr_pxFr9   r   r`   r   r7   ra   rb   rf   rg   rh   ri   s              r+   Ú)test_reads_a_small_qr_far_from_the_camerarv   G   sY  € Ü
�= |¸3Ñ
?€CÜ×!Ñ!Ða¤)×"5Ñ"5Ða´d¸3³iÐaÈÐaÐ"5°iÑ"OÐaÐ!Ð"OÓPÐaÐTaÐaÐTaÑa×a×a×aÓaÐP×a×a×a×a×aÕaŒ9×a×a×aÑaŒ9×a×aÕaÐ!×a×a×a×a×aÔa¤)×a×a×aÑa¤)×a×aÕaÐ"5×a×a×a×a×aÔa´d×a×a×aÑa´d×a×a×a×a×aÖa¸3×a×a×aÑa¸3×a×aÕa°i×a×aÓaÈ×a×aÓaÐ"O×a×aÓaÐP×a×aÓaÐTa×a×a×a×a×a×a×aÖar-   c                  óX  • [        SSSS9n [        SSSS9R                  S5      nU R                  US5        [        R                  n[        R
                  n[        U 5      nSoS" XES	9ob" U5      nSS1o‡U;   o™(       Gd  [        R                  " S
U	4SXx45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p˜g )Nr   )i`	  i°  é�  rs   zMAR-ZZZ-999)é„  rx   iÜ  i   )éÈ   éd   Fr9   ©Úin)zÄ%(py15)s
{%(py15)s = %(py2)s
{%(py2)s = %(py0)s.extract_code
}(%(py13)s
{%(py13)s = %(py5)s
{%(py5)s = %(py3)s.detect_qr
}(%(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}, use_ocr=%(py11)s)
})
} in %(py18)sr   r7   ra   rb   rf   rg   )r   ÚcropÚpaster   r   rD   r7   r   r   r    r!   r"   r#   r$   r%   )ra   Úsecondr&   r'   rj   rk   rl   rY   rm   rJ   rn   ro   s               r+   Ú1test_reads_one_card_when_several_are_in_the_photor�   L   s‡  € Ü
�= |¸3Ñ
?€CÜ�m¨,¸cÑB×GÑGÐH]Ó^€FØ‡I�Iˆf�jÔ!Ü×!Ñ!Ðr¤)×"5Ñ"5Ðr´d¸3³iÐrÈÐrÐ"5°iÑ"OÐrÐ!Ð"OÓPÐrÐUbÐdqÐTrÐrÐTrÑr×r×r×rÓrÐP×r×r×r×r×rÕrŒ9×r×r×rÑrŒ9×r×rÕrÐ!×r×r×r×r×rÔr¤)×r×r×rÑr¤)×r×rÕrÐ"5×r×r×r×r×rÔr´d×r×r×rÑr´d×r×r×r×r×rÖr¸3×r×r×rÑr¸3×r×rÕr°i×r×rÓrÈ×r×rÓrÐ"O×r×rÓrÐP×r×rÓrÐTr×r×r×r×r×r×r×rÖrr-   c                   ó   • \ rS rSrSrg)Ú_FakeTesseractéU   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r…   r-   r+   rƒ   rƒ   U   s   † Úr-   rƒ   c                 ó¶   ^• [         R                  " S5      nU4S jUl        U R                  [        R
                  SU5        [        R                  " 5         U$ )NÚpytesseractc                  ó   >• T$ ©Nr…   )ÚaÚkÚtexts     €r+   Ú<lambda>Ú#_fake_pytesseract.<locals>.<lambda>[   s   ø€ ©4r-   )ÚtypesÚ
ModuleTypeÚimage_to_stringÚsetitemÚsysÚmodulesr   Úreset_ocr_state)Úmonkeypatchr‘   Úfakes    ` r+   Ú_fake_pytesseractr�   Y   sB   ø€ Ü×Ò˜MÓ*€DÜ/€DÔØ×ÑœŸ™ ]°DÔ9Ü×ÒÔØ€Kr-   c                 ó&  • [        U S5        [        R                  n[        5       n[	        U5      nS1oA" X45      nSoeU:H  ow(       Gd¼  [
        R                  " SU4SXV45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S	.	-  nS
SU0-  n	[        [
        R                  " U	5      5      eS =n=n=n=n=n=pvg )Nzalgo de ruido
MAR 4JC IBD
otroÚMARr   r   ©z�%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.ocr_code
}(%(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s()
})
}, %(py10)s)
} == %(py15)sr   r7   r
   rV   rX   rA   ©r�   r   Úocr_coder
   r7   r   r   r    r!   r"   r#   r$   r%   ©
r›   r&   rE   rF   rG   rH   rY   rI   rZ   rL   s
             r+   Ú>test_ocr_rescue_reads_the_printed_code_with_the_schools_prefixr¤   a   s  € Ü�kÐ#EÔFÜ×ÑÐL¤;£=ÐLœd =Ó1ÐL°E°7ÐLÐÐ1Ó;ÐL¸}ÐL¸}ÑL×L×L×LÓLÐ;×L×L×L×L×LÕLŒ9×L×L×LÑLŒ9×L×LÕLÐ×L×L×L×L×LÔLœd×L×L×LÑLœd×L×L×L×L×LÖL¤;×L×L×LÑL¤;×L×LÕL =×L×LÓLÐ1×L×LÓL°7×L×LÓLÐ;×L×LÓL¸}×L×L×L×L×L×L×LÔLr-   c                 ó.  • [        U S5        [        R                  n[        5       n[	        U5      nS1oA" X45      nSoeUL ow(       Gd¼  [
        R                  " SU4SXV45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S	.	-  nS
SU0-  n	[        [
        R                  " U	5      5      eS=n=n=n=n=n=pv[        R                  n[        5       n[	        U5      nS1oA" X45      nSoeU:H  ow(       Gd¼  [
        R                  " SU4SXV45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S	.	-  nS
SU0-  n	[        [
        R                  " U	5      5      eS=n=n=n=n=n=pvg)uW   Antes llevaba HEC escrito a mano: para cualquier otro colegio no podÃ­a acertar jamÃ¡s.zHEC 4JC IBDrŸ   NrT   ©z�%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.ocr_code
}(%(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s()
})
}, %(py10)s)
} is %(py15)sr   r7   r
   rV   rX   rA   ÚHECzHEC-4JC-IBDr   r    r¡   r£   s
             r+   Ú1test_ocr_rescue_ignores_prefixes_of_other_schoolsr¨   f   s$  € ä�k =Ô1Ü×ÑÐC¤;£=ÐCœd =Ó1ÐC°E°7ÐCÐÐ1Ó;ÐC¸tÐC¸tÐC×C×C×CÓCÐ;×C×C×C×C×CÕCŒ9×C×C×CÑCŒ9×C×CÕCÐ×C×C×C×C×CÔCœd×C×C×CÑCœd×C×C×C×C×CÖC¤;×C×C×CÑC¤;×C×CÕC =×C×CÓCÐ1×C×CÓC°7×C×CÓCÐ;×C×CÓC¸t×C×C×C×C×C×C×CÓCÜ×ÑÐL¤;£=ÐLœd =Ó1ÐL°E°7ÐLÐÐ1Ó;ÐL¸}ÐL¸}ÑL×L×L×LÓLÐ;×L×L×L×L×LÕLŒ9×L×L×LÑLŒ9×L×LÕLÐ×L×L×L×L×LÔLœd×L×L×LÑLœd×L×L×L×L×LÖL¤;×L×L×LÑL¤;×L×LÕL =×L×LÓLÐ1×L×LÓL°7×L×LÓLÐ;×L×LÓL¸}×L×L×L×L×L×L×LÔLr-   c                 ó$  • [        U S5        [        R                  n[        5       n[	        U5      nS1oA" X45      nS oeUL ow(       Gd¼  [
        R                  " SU4SXV45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.	-  nS	S
U0-  n	[        [
        R                  " U	5      5      eS =n=n=n=n=n=pvg )NzMAR MAR IBDrŸ   rT   r¦   r   r7   r
   rV   rX   rA   r¡   r£   s
             r+   Ú3test_ocr_rejects_a_repeated_word_that_is_not_a_coderª   m   s  € Ü�k =Ô1Ü×ÑÐC¤;£=ÐCœd =Ó1ÐC°E°7ÐCÐÐ1Ó;ÐC¸tÐC¸tÐC×C×C×CÓCÐ;×C×C×C×C×CÕCŒ9×C×C×CÑCŒ9×C×CÕCÐ×C×C×C×C×CÔCœd×C×C×CÑCœd×C×C×C×C×CÖC¤;×C×C×CÑC¤;×C×CÕC =×C×CÓCÐ1×C×CÓC°7×C×CÓCÐ;×C×CÓC¸t×C×C×C×C×C×C×CÔCr-   c                 ó`  ^• / m[        U S5      nU4S jUl        [        R                  n[	        5       n[        U5      n[        5       oR" XE5      nS ovUL oˆ(       Gd  [        R                  " SU4SXg45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [
        5      (       a  [        R                  " [
        5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.
-  n	S
SU	0-  n
[        [        R                  " U
5      5      eS =n=n=n=n=n=p‡/ nTU:H  o"(       d¦  [        R                  " SU4STU45      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =p+g )NúMAR 4JC IBDc                  ó8   >• TR                  S5      =(       d    S$ )Né   r¬   )Úappend)r�   r�   Úcalleds     €r+   r’   Ú<test_ocr_is_skipped_without_known_prefixes.<locals>.<lambda>u   s   ø€ ¨6¯=©=¸Ó+;×+L¸}Ð+Lr-   rT   )z¨%(py13)s
{%(py13)s = %(py2)s
{%(py2)s = %(py0)s.ocr_code
}(%(py8)s
{%(py8)s = %(py3)s(%(py6)s
{%(py6)s = %(py4)s()
})
}, %(py11)s
{%(py11)s = %(py9)s()
})
} is %(py16)sr   r7   r
   Úset)
r   r   r   r;   r<   r=   r   rc   rd   Úpy16úassert %(py18)sre   r   ©z%(py0)s == %(py3)sr°   ©r   r   úassert %(py5)sr   )r�   r–   r   r¢   r
   r7   r²   r   r   r    r!   r"   r#   r$   r%   )r›   rœ   r&   rE   rF   rk   rl   rK   rY   Ú@py_format17rn   Ú@py_assert2Ú@py_format4Ú@py_format6r°   s                 @r+   Ú*test_ocr_is_skipped_without_known_prefixesr¼   r   s¨  ø€ Ø€FÜ˜[¨-Ó8€DÜL€DÔÜ×ÑÐA¤;£=ÐAœd =Ó1ÐA´3³5ÐAÐÐ1Ó9ÐA¸TÐA¸TÐA×A×A×AÓAÐ9×A×A×A×A×AÕAŒ9×A×A×AÑAŒ9×A×AÕAÐ×A×A×A×A×AÔAœd×A×A×AÑAœd×A×A×A×A×AÖA¤;×A×A×AÑA¤;×A×AÕA =×A×AÓAÐ1×A×A×A×A×AÔA´3×A×A×AÑA´3×A×AÕA°5×A×AÓAÐ9×A×AÓA¸T×A×A×A×A×A×A×AÓAØÐˆ6�R‰<×××Òˆ6�R×××××Õˆ6×××Ñˆ6××Õ�R××××××Òr-   c                 óf  • U R                  [        R                  SS5        [        R                  " 5         [        R
                  n[        5       n[        U5      nS1oA" X45      nSoeUL ow(       Gd¼  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S	.	-  nS
SU0-  n	[        [        R                  " U	5      5      eS=n=n=n=n=n=pv[        R                   nSo¡U
L o»(       dÂ  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pº[        R                  " 5         g)uD   Es el paso mÃ¡s caro: si no puede funcionar, no se paga foto a foto.rŒ   NrŸ   rT   r¦   r   r7   r
   rV   rX   rA   T)z8%(py2)s
{%(py2)s = %(py0)s._ocr_unavailable
} is %(py5)s©r   r   r   úassert %(py7)sr   )r—   r˜   r™   r   rš   r¢   r
   r7   r   r   r    r!   r"   r#   r$   r%   Ú_ocr_unavailable)r›   r&   rE   rF   rG   rH   rY   rI   rZ   rL   r'   Ú@py_assert3r»   r)   s                 r+   Ú7test_ocr_is_disabled_for_good_when_tesseract_is_missingrÂ   z   s¯  € à×ÑœŸ™ ]°DÔ9Ü×ÒÔÜ×ÑÐC¤;£=ÐCœd =Ó1ÐC°E°7ÐCÐÐ1Ó;ÐC¸tÐC¸tÐC×C×C×CÓCÐ;×C×C×C×C×CÕCŒ9×C×C×CÑCŒ9×C×CÕCÐ×C×C×C×C×CÔCœd×C×C×CÑCœd×C×C×C×C×CÖC¤;×C×C×CÑC¤;×C×CÕC =×C×CÓCÐ1×C×CÓC°7×C×CÓCÐ;×C×CÓC¸t×C×C×C×C×C×C×CÓCÜ×%Ñ%Ð-¨Ð-¨Ð-×-×-×-Ò-Ð%×-×-×-×-×-Õ-Œ9×-×-×-Ñ-Œ9×-×-Õ-Ð%×-×-Ó-¨×-×-×-×-×-×-Ó-Ü×ÒÕr-   c           	      ó‚  • U S-  S-  R                  SS9  U S-  S-  R                  5         U S-  S-  R                  5         U S-  S-  R                  5         [        R                  nSo!" X 5      n1 S	koCU:H  oU(       Gd7  [        R                  " S
U4SX445      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=pTg )NÚxavierzMAR-ABC-123T©ÚparentszSTADE-XYZ-111Ú_no_qrz.trashÚom>   ÚOMrŸ   ÚSTADEr   )z^%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.valid_prefixes
}(%(py4)s, %(py5)s)
} == %(py10)sr   Útmp_path)r   r   r;   r   r   r>   úassert %(py12)sr?   )Úmkdirr   Úvalid_prefixesr   r   r    r!   r"   r#   r$   r%   )rË   r&   rÁ   r(   rG   rj   rQ   Ú@py_format13s           r+   ÚGtest_valid_prefixes_come_from_config_and_from_the_cards_already_on_diskrÐ   ƒ   s!  € Ø�Ñ˜=Ñ(×/Ñ/¸Ð/Ñ=Ø�Ñ˜?Ñ*×1Ñ1Ô3Ø�Ñ˜8Ñ#×*Ñ*Ô,Ø�Ñ˜8Ñ#×*Ñ*Ô,Ü×#Ñ#ÐM DÐMÐ# DÓ3ÐMÒ7MÐMÐ7MÑM×M×M×MÓMÐ3×M×M×M×M×MÕMŒ9×M×M×MÑMŒ9×M×MÕMÐ#×M×MÓM D×M×M×M×M×MÔM¨(×M×M×MÑM¨(×M×MÕMÐ3×M×MÓMÐ7M×M×M×M×M×M×M×MÐMr-   Úreturnc                 ó¸   • [         R                  " 5       nU R                  USSS9  S[        R                  " UR                  5       5      R                  5       -   $ )NÚJPEGr„   )Úqualityzdata:image/jpeg;base64,)ÚioÚBytesIOÚsaveÚbase64Ú	b64encodeÚgetvalueÚdecode)r6   Úbufs     r+   Ú	_data_urlrÝ   �   sD   € Ü
�*Š*‹,€CØ‡H�HˆS�& "€HÑ%Ø$¤v×'7Ò'7¸¿¹»Ó'G×'NÑ'NÓ'PÑPÐPr-   c                  óx  • [         R                  n SnSnSn[        XUS9n[        U5      oP" U5      nSSS.ovU:H  oˆ(       Gdç  [        R
                  " SU4SUU45      S	[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS	[        R                  " U 5      S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS =n =n=n=n=n=n=n=p‡g )Nr   ©ry   i¼  é,  rs   Úqr©ÚcodeÚmethodr   )z±%(py16)s
{%(py16)s = %(py2)s
{%(py2)s = %(py0)s.scan_frame
}(%(py14)s
{%(py14)s = %(py3)s(%(py12)s
{%(py12)s = %(py4)s(%(py6)s, size=%(py8)s, qr_px=%(py10)s)
})
})
} == %(py19)sr	   rÝ   r   )r   r   r   r;   r<   r=   r>   r?   r@   r³   rC   úassert %(py21)sÚpy21)r	   Ú
scan_framer   rÝ   r   r   r    r!   r"   r#   r$   r%   )r&   rE   rF   rG   rH   rI   rK   Ú@py_assert18rm   rM   Ú@py_format22s              r+   Útest_scan_frame_reads_qrrê   “   s  € Ü×"Ñ"ð 0°mð 0È*ð 0Ð\_ð 0¬X°mÐ\_Ñ-`ð 0¤9Ð-`Ó#að 0Ð"Ð#aÓbð 0Ø¨$Ñ/ð0Ø/ñ0÷ 0ô 0ß/Ñ/ô0ÐbØ/÷0ò 0ß)/©÷0õ 0ß/Ñ/ð0Œ<÷ 0ö 0ß&/¡ið0Œ<÷ 0ò 0ß&/¡ið0Ð"÷ 0ñ 0ß)/©÷0õ 0ß/Ñ/ð0¤9÷ 0ö 0ß&/¡ið0¤9÷ 0ó 0ß)/©÷0õ 0ß/Ñ/ð0¬X÷ 0ö 0ß&/¡ið0¬X÷ 0ò 0ß&/¡ið0°m÷ 0ð 0ß&/¡ið0È*÷ 0ð 0ß&/¡ið0Ð\_÷ 0ð 0ß&/¡ið0Ð-`÷ 0ð 0ß&/¡ið0Ð#a÷ 0ð 0ß&/¡ið0Ðb÷ 0ð 0ß&/¡ið0Ø/÷0÷ 0÷ 0ñ 0ß/Ñ/÷0÷ 0÷ 0ô 0r-   c                 óÞ  • [        U S5        [        R                  " [        [	        S5      5      S15      nSSS.o!U:H  o3(       d¥  [
        R                  " SU4SX45      S	[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS	[
        R                  " U5      S
.-  nSSU0-  n[        [
        R                  " U5      5      eS =p2g )Nr¬   rß   rŸ   r   r‘   râ   r   rµ   Úresr¶   r·   r   )r�   r	   rç   rÝ   r
   r   r   r    r!   r"   r#   r$   r%   )r›   rì   r¹   r&   rº   r»   s         r+   Ú&test_scan_frame_falls_back_to_text_ocrrí   ˜   sŒ   € Ü�k =Ô1Ü
×
!Ò
!¤)¬K¸
Ó,CÓ"DÀuÀgÓ
N€CØ(°FÑ;Ð;Ð;Ñ;×;×;×;Ò;ˆ3×;×;×;×;×;Õ;ˆ3×;×;×;Ñ;ˆ3×;×;Õ;Ð;×;×;×;×;×;×;Ò;r-   c                  óN  • [         R                  n Sn[        U5      n[        U5      o0" U5      nS S S.oTU:H  of(       Gd¼  [        R
                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.	-  nS	S
U0-  n[        [        R                  " U5      5      eS =n =n=n=n=n=pe[         R                  n So�" U	5      nS S S.o¡U
:H  o"(       dì  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U	5      [        R                  " U5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n =n	=n=p*g )Nrß   râ   r   )z‘%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.scan_frame
}(%(py10)s
{%(py10)s = %(py3)s(%(py8)s
{%(py8)s = %(py4)s(%(py6)s)
})
})
} == %(py15)sr	   rÝ   r
   rV   rX   rA   zesto no es base64 ni imagen)zP%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.scan_frame
}(%(py4)s)
} == %(py9)s)r   r   r;   r<   r   zassert %(py11)src   )r	   rç   r
   rÝ   r   r   r    r!   r"   r#   r$   r%   )r&   rE   rF   rG   rH   rY   rI   rZ   rL   rÁ   rj   r*   Ú@py_format12s                r+   Ú6test_scan_frame_with_nothing_readable_or_garbage_inputrð   ž   sÂ  € Ü×"Ñ"Ðh¸Ðh¬[¸Ó-DÐh¤9Ð-DÓ#EÐhÐ"Ð#EÓFÐhÐSWÐcgÑJhÐhÐJhÑh×h×h×hÓhÐF×h×h×h×h×hÕhŒ<×h×h×hÑhŒ<×h×hÕhÐ"×h×h×h×h×hÔh¤9×h×h×hÑh¤9×h×h×h×h×hÖh¬[×h×h×hÑh¬[×h×hÕh¸×h×hÓhÐ-D×h×hÓhÐ#E×h×hÓhÐF×h×hÓhÐJh×h×h×h×h×h×h×hÓhÜ×"Ñ"ÐcÐ#@ÐcÐ"Ð#@ÓAÐcÈdÐ^bÑEcÐcÐEcÑc×c×c×cÒcÐA×c×c×c×c×cÕcŒ<×c×c×cÑcŒ<×c×cÕcÐ"×c×cÓcÐ#@×c×cÓcÐA×c×cÓcÐEc×c×c×c×c×c×c×cÐcr-   c              ƒ   ó–  #   • U R                  SS[        [        SSSS95      0S9I S h  v•N n/ o!R                  nSoCU:H  oUoe(       a  UR	                  5       S	   nSo‡U:H  o™nU(       GdS  [
        R                  " S
U4SX445      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
SSU
0-  o²R                  U5        U(       aa  [
        R                  " S
W	4SWW45      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  oÒR                  U5        [
        R                  " US5      0 -  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=n=n=n=n=p˜U R                  SSSS-  0S9I S h  v•N ofR                  nSnUU:H  nU(       d…  [
        R                  " S
U4SUU45      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=nnU R                  S0 S9I S h  v•N ofR                  nSnUU:H  nU(       d…  [
        R                  " S
U4SUU45      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=nnSSKJn  SnS nSnU" X#U5      nU(       + nU(       dÄ  S!S"[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS"[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S#.-  n[        [
        R                  " U5      5      eS =n=n=n=nng  GN GN^ GN£7f)$Nú/api/portal/scanÚimager   rß   rà   rs   ©Újsonrz   rã   r   ©z3%(py4)s
{%(py4)s = %(py2)s.status_code
} == %(py7)sÚr©r   r;   r   ú%(py9)sr   ©z%(py12)s == %(py15)s©r?   rW   ú%(py17)srA   r   rf   rg   Úxi z i¦  ©z3%(py3)s
{%(py3)s = %(py1)s.status_code
} == %(py6)s©Úpy1r   r<   úassert %(py8)sr=   )Ú
is_blockedúportal-scan:127.0.0.1éx   zBassert not %(py8)s
{%(py8)s = %(py0)s(%(py2)s, %(py4)s, %(py6)s)
}r  )r   r   r;   r<   r=   )ÚpostrÝ   r   Ústatus_coderõ   r   r   r    r!   r"   r#   r¯   Ú_format_boolopr$   r%   Úcore.rate_limitr  )Úclientr÷   r&   rÁ   r(   rE   Ú@py_assert0rH   rY   rI   r)   r*   rZ   rL   rn   ro   r¹   r'   Ú@py_format7rP   r  rF   rG   s                          r+   ÚFtest_portal_scan_endpoint_is_public_validates_size_and_is_rate_limitedr  £   sœ  é € Ø�k‰kÐ,°G¼YÄxÐP]ÐdnÐvyÑGzÓ={Ð3|ˆkÐ}×}€AÙE�=‰=ÐE˜CÐE˜CÑ×E A§F¡F£H¨VÑ$4ÐE¸ÐE¸Ñ$E×E×E×EÕEˆ=×E×E×E×E×EÕEˆ1×E×E×EÑEˆ1×E×EÕEˆ=×E×EÓE˜C×E×E×E×E×E×E×EÒEÐ$4¸×E×EÔEÐ$4×E×EÓE¸×E×E×E×E×E×E×E×E×E×E×E×E×EÖEØ—+‘+Ð0¸ÀÀyÁÐ7Q�+ÐR×RÐf×_Ñ_ÐfÐcfÐfÐ_ÐcfÑf×f×f×fÓfÐ_Ðcf×f×fÔfÐR×f×fÓfÐ_×f×fÓfÐcf×f×f×f×f×f×fÖfØ—+‘+Ð0°r�+Ð:×:ÐN×GÑGÐNÈ3ÐNÐGÈ3ÑN×N×N×NÓNÐGÈ3×N×NÔNÐ:×N×NÓNÐG×N×NÓNÈ3×N×N×N×N×N×NÖNÝ*Ø1Ð<°3Ð<¸Ð<‰zÐ1¸Ó<Ð<Ð<Ô<Ð<Ö<×<×<×<×<×<Ñ<ˆz×<×<×<Ñ<ˆz×<×<Õ<Ð1×<×<Ó<°3×<×<Ó<¸×<×<Ó<Ð<×<×<×<×<×<×<Ò<ò 	~âRÚ:ùs6   ‚(Q	ªQ «F:Q	Ç%QÇ&B=Q	Ê#QÊ$FQ	ÑQ	ÑQ	c           	   ƒ   óV  #   • SSK Jn  [        S5       H  nU" S5        M     U R                  SS[	        [        S5      5      0S9I S h  v•N nUR                  nS	oTU:H  of(       dº  [        R                  " S
U4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peg  NÜ7f)Nr   )Ú
record_hitr  r  rò   ró   )rà   rà   rô   i­  r   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sr÷   r¾   r¿   r   )r  r  Úranger  rÝ   r
   r  r   r   r    r!   r"   r#   r$   r%   )	r	  r  Ú_r÷   r&   r'   rÁ   r»   r)   s	            r+   Útest_portal_scan_rate_limitr  ¬   sº   é € Ý*Ü�3ŽZˆÙÐ*Ö+ñ à�k‰kÐ,°G¼YÄ{ÐS]ÓG^Ó=_Ð3`ˆkÐa×a€AØ�=‰=Ð˜CÐ˜CÑ×××Òˆ=×××××Õˆ1×××Ñˆ1××Õˆ=××Ó˜C××××××Ôñ 	bùs   ‚AD)Á
D'ÁCD)c                  óz   • S[         R                  " 5       R                  S S  3n [        R                  " SU S9  U $ )Nzorg-é   zOrganizer Test©Úslug)ÚuuidÚuuid4Úhexr   Úcreate_school)Úsids    r+   Úschoolr  ¶   s8   € à”—’“×!Ñ! " 1Ð%Ð&Ð
'€CÜ× Ò Ð!1¸Ò<Ø€Jr-   c                 ó  • UR                  [        SS5        UR                  [        SS5        [        R                  R	                  U S 5        US-  US-  U -  pCUR                  SS9  [        R                  " XU5      nX5l        U$ )NÚFTP_STABLE_SECSç        ÚPURGE_MIN_AGE_SECSÚincomingÚphotosTrÅ   )Úsetattrr   ÚOÚ_status_by_schoolÚpoprÍ   ÚPhotoOrganizerÚincoming_dir)r  rË   r›   r!  ÚoutputÚ	organizers         r+   Úorgr+  ½   s€   € à×ÑœÐ 1°3Ô7Ø×ÑœÐ 4°cÔ:Ü×Ñ×Ñ˜F DÔ)Ø *Ñ,¨h¸Ñ.AÀFÑ.JˆfØ‡N�N˜4€NÑ Ü× Ò  °6Ó:€IØ%ÔØÐr-   c                 ó2   • [        X R                  U-  5      $ rŽ   )r   r!  )r+  Únamera   s      r+   Ú_dropr.  É   s   € Ü�SŸ,™,¨Ñ-Ó.Ð.r-   c                 ó`   ^ • [        U 4S jT R                  R                  S5       5       5      $ )Nc              3   ó¸   >#   • U  HO  oR                  5       (       d  M  [        UR                  TR                  5      5      R	                  S S5      v •  MQ     g7f)Ú\Ú/N)Úis_fileÚstrÚrelative_tor)  Úreplace)Ú.0Úpr+  s     €r+   Ú	<genexpr>Ú_tree.<locals>.<genexpr>Î   sA   øé € ÐrÒMbÈ×foÑfo×fqÓC”#�a—m‘m C§J¡JÓ/Ó0×8Ñ8¸¸s×CÐCÒMbùs
   ƒAŸ;AÚ*)Úsortedr)  Úrglob)r+  s   `r+   Ú_treer>  Í   s$   ø€ ÜÔrÈSÏZÉZ×M]ÑM]Ð^aÔMbÓrÓrÐrr-   c           
   ƒ   óô  #   • [        U S[        S5      5        [        U S[        SS95        [        U S[        SS95        U R                  5       I S h  v•N   [	        U 5      n/ SQo!U:H  o3(       Gd  [
        R                  " S	U4S
X45      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=p2U R                  oR                  nSoc" U5      n[        U5      oˆ(       + o™(       Gd,  SS[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OSS[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  n
[        [
        R                  " U
5      5      eS =n=n=n=n=p‰g  GN¡7f)NúDSC_0001.JPGr   úDSC_0002.JPGr®   ©ÚseedúDSC_0003.JPGr]   )ú)photographer/MAR-4JC-IBD/.qr/DSC_0001.JPGú%photographer/MAR-4JC-IBD/DSC_0002.JPGú%photographer/MAR-4JC-IBD/DSC_0003.JPGr   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr>  r+  ©r   r   r   r<   r  r=   z*.JPGzˆassert not %(py11)s
{%(py11)s = %(py0)s(%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.incoming
}.glob
}(%(py7)s)
})
}Úlist)r   r   r   r   r   r   rc   )r.  r   r
   Úprocess_pendingr>  r   r   r    r!   r"   r#   r$   r%   r!  ÚglobrJ  )r+  r¹   rE   r'   r  rP   r(   rj   rk   rl   rÏ   s              r+   Ú@test_card_photo_goes_to_dot_qr_and_following_photos_hang_from_itrM  Ñ   s  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ü	ˆ#ˆ~œ{°Ñ2Ô3Ü	ˆ#ˆ~œ{°Ñ2Ô3Ø
×
Ñ
Ó
×ÐÜ�‹:ð ò ð ð ñ ÷ ô ïé ô	ˆ:÷ ò ïé ÷	õ ïé ð	Œ5÷ ö ïé ð	Œ5÷ ó ïé ÷	õ ïé ð	�÷ ö ïé ð	�÷ ò ïé ð	ˆ:÷ ð ïé ð	ð ÷ ÷ ÷ ñ ïé ÷	÷ ð
 —L‘LÐ/×%Ñ%Ð/ gÐ/Ð% gÓ.Ð/ŒtÐ.Ó/Ð/Ô/Ð/Ö/×/×/×/×/×/Ñ/Œt×/×/×/Ñ/Œt×/×/×/×/×/Ö/�C×/×/×/Ñ/�C×/×/Õ/�L×/×/Ó/Ð%×/×/Ó/ g×/×/Ó/Ð.×/×/Ó/Ð/×/×/×/×/×/×/Ó/ò  ùs   ‚AK8ÁK5ÁJ!K8c              ƒ   óÂ  #   • [        U S[        5       5        U R                  5       I S h  v•N   [        U 5      nS/o!U:H  o3(       Gd  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=p2g  GN17f)
Nr@  ú photographer/_no_qr/DSC_0001.JPGr   rH  r>  r+  rI  r  r=   )r.  r
   rK  r>  r   r   r    r!   r"   r#   r$   r%   ©r+  r¹   rE   r'   r  rP   s         r+   Ú/test_photos_before_the_first_card_wait_in_no_qrrQ  Þ   sÁ   é € Ü	ˆ#ˆ~œ{›}Ô-Ø
×
Ñ
Ó
×ÐÜ�‹:Ð=Ð<Ð=Ð=Ð=Ñ=×=×=×=Ó=ˆ:×=×=×=×=×=Õ=Œ5×=×=×=Ñ=Œ5×=×=×=×=×=Ö=�×=×=×=Ñ=�×=×=Õ=ˆ:×=×=Ó=Ð=×=×=×=×=×=×=Ô=ò  ùs   ‚)E«E¬D1Ec              ƒ   óÄ  #   • [        U S[        S5      5        U R                  5       I S h  v•N   [        U 5      nS/o!U:H  o3(       Gd  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=p2g  GN17f)Nr@  r   rE  r   rH  r>  r+  rI  r  r=   )r.  r   rK  r>  r   r   r    r!   r"   r#   r$   r%   rP  s         r+   Ú$test_card_url_is_reduced_to_its_coderS  ä   sÅ   é € Ü	ˆ#ˆ~œxÐ(SÓTÔUØ
×
Ñ
Ó
×ÐÜ�‹:ÐFÐEÐFÐFÐFÑF×F×F×FÓFˆ:×F×F×F×F×FÕFŒ5×F×F×FÑFŒ5×F×F×F×F×FÖF�×F×F×FÑF�×F×FÕFˆ:×F×FÓFÐF×F×F×F×F×F×FÔFò  ùs   ‚*E ¬E­D1E c              ƒ   óT  #   • [        U S[        S5      5        U R                  5       I S h  v•N   S [        U 5       5       n[	        U5      o"(       d¢  SS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =p[        U 5      nS/oTU:H  of(       Gd  [        R                  " SU4S	XE45      S
[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peg  GNù7f)Nr@  z../../../etc/passwdc              3   ó,   #   • U  H
  nS U;  v •  M     g7f)z..Nr…   ©r7  Úts     r+   r9  ÚZtest_a_qr_that_is_not_a_family_code_is_ignored_and_not_used_as_a_folder.<locals>.<genexpr>í   s   é € Ð1¢j ˆt˜1Ž}¢jùs   ‚z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©r   r   r;   rO  r   rH  r>  r+  rI  r  r=   )r.  r   rK  r>  rY  r    r!   r   r"   r#   r$   r%   r   )	r+  r&   rÁ   Ú@py_format5r¹   rE   r'   r  rP   s	            r+   ÚGtest_a_qr_that_is_not_a_family_code_is_ignored_and_not_used_as_a_folderr\  ê   s.  é € Ü	ˆ#ˆ~œxÐ(=Ó>Ô?Ø
×
Ñ
Ó
×ÐÙ1¤e¨C¤jÓ1Ð1Œ3Ð1Ó1Ð1Õ1×1×1×1×1×1Ñ1Œ3×1×1×1Ñ1Œ3×1×1Õ1Ð1×1×1Ó1Ð1×1×1×1×1×1Ò1Ü�‹:Ð=Ð<Ð=Ð=Ð=Ñ=×=×=×=Ó=ˆ:×=×=×=×=×=Õ=Œ5×=×=×=Ñ=Œ5×=×=×=×=×=Ö=�×=×=×=Ñ=�×=×=Õ=ˆ:×=×=Ó=Ð=×=×=×=×=×=×=Ô=ò  ùs   ‚*H(¬H%­G9H(c           	   ƒ   ó^  #   • [         R                  " USSS.5        [        U S[        S5      5        [        U S[        S5      5        [        U S[	        S	S
95        [        U S[	        SS
95        U R                  5       I S h  v•N   [        U 5      nSo3U;   oD(       d¥  [        R                  " SU4SX245      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p4So3U;   oD(       d¥  [        R                  " SU4SX245      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p4S U 5       n[        U5      oˆ(       + o™(       d¢  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=p‰[         R                   nSo§" X5      nSoËU:H  oÝ(       Gd7  [        R                  " SU4SX¼45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n
=n=pÜg  GN¦7f) NrÄ   Úcarlos©ÚDSCÚCARr@  zMAR-AAA-111zCAR_0001.JPGzMAR-BBB-222rA  r®   rB  zCAR_0002.JPGr]   zxavier/MAR-AAA-111/DSC_0002.JPGr|   )z%(py1)s in %(py3)sÚtree)r   r   r·   r   zcarlos/MAR-BBB-222/CAR_0002.JPGc              3   óD   #   • U  H  nS U;   =(       d    SU;   v •  M     g7f)zxavier/MAR-BBBzcarlos/MAR-AAANr…   rV  s     r+   r9  ÚCtest_each_photographer_keeps_their_own_sticky_qr.<locals>.<genexpr>û   s$   é € ÐPÊ4ÀaÐ# qÑ(×AÐ,<ÀÑ,AÔAÊ4ùs   ‚ z0assert not %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}ÚanyrZ  r   ©z]%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.get_sticky_qr
}(%(py3)s, %(py5)s)
} == %(py10)sr   r  ©r   r   r   r   r   r>   rÌ   r?   )r   Úupdate_photographer_mapr.  r   r
   rK  r>  r   r   r#   r    r!   r"   r$   r%   re  Úget_sticky_qr)r+  r  rb  r
  r¹   rº   r»   r&   rÁ   rE   r'   r(   rG   rj   rQ   rÏ   s                   r+   Ú0test_each_photographer_keeps_their_own_sticky_qrrj  ñ   se  é € Ü×0Ò0°ÀÐRZÑ9[Ô\Ü	ˆ#ˆ~œx¨Ó6Ô7Ü	ˆ#ˆ~œx¨Ó6Ô7Ü	ˆ#ˆ~œ{°Ñ2Ô3Ü	ˆ#ˆ~œ{°Ñ2Ô3Ø
×
Ñ
Ó
×ÐÜ�‹:€DØ,Ð4°Ñ4×4×4×4Ò4Ð,×4×4Ô4Ð,×4×4×4×4×4Ô4°×4×4×4Ñ4°×4×4×4×4×4×4Ó4Ø,Ð4°Ñ4×4×4×4Ò4Ð,×4×4Ô4Ð,×4×4×4×4×4Ô4°×4×4×4Ñ4°×4×4×4×4×4×4Ó4ÙPÉ4ÓPÐPŒsÐPÓPÐPÔPÐPÕP×P×P×P×P×PÑPŒs×P×P×PÑPŒs×P×PÕPÐP×P×PÓPÐP×P×P×P×P×PÔPÜ×-Ñ-ÐP°hÐPÐ-¨fÓ?ÐPÀ=ÐPÀ=ÑP×P×P×PÓPÐ?×P×P×P×P×PÕPÔ×P×P×PÑPÔ×P×PÕPÐ-×P×P×P×P×PÔP¨f×P×P×PÑP¨f×P×PÕP°h×P×PÓPÐ?×P×PÓPÀ=×P×P×P×P×P×P×PÐPò  ùs   ‚BP-ÂP*ÂN&P-c              ƒ   óv  #   • [        U S[        S5      5        U R                  5       I S h  v•N   [        R                  " XR
                  U R                  5      n[        US[        SS95        UR                  5       I S h  v•N   Sn[        U5      oTU;   of(       Gd  [        R                  " SU4SXE45      [        R                  " U5      S	[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS	S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=peg  GN‡ GN37f)Nr@  r   rA  é   rB  rF  r|   ©z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r>  Úfresh©r   r   r;   r<   r  r=   )r.  r   rK  r$  r'  r!  r)  r
   r>  r   r   r#   r    r!   r"   r$   r%   )	r+  r  rË   rn  r
  rE   r¹   r  rP   s	            r+   Ú!test_sticky_qr_survives_a_restartrp  ÿ   s  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ø
×
Ñ
Ó
×ÐÜ×Ò˜V§\¡\°3·:±:Ó>€EÜ	ˆ%�¤°!Ñ!4Ô5Ø
×
Ñ
Ó
!×!Ð!Ø2ÐB´e¸E³lÐB°lÑB×B×B×BÓBÐ2×B×BÔBÐ2×B×B×B×B×BÔB´e×B×B×BÑB´e×B×B×B×B×BÖB¸E×B×B×BÑB¸E×B×BÕB°l×B×B×B×B×B×BÔBò	  ò "ùs#   ‚*F9¬F3­AF9ÂF6ÂD0F9Æ6F9c           	   ƒ   ó  #   • [         R                  " USS05        [        U S[        5       5        U R	                  5       I S h  v•N   U R
                  nSo2U-  nSoTU-  ofR                  ow" 5       oˆ(       dÙ  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n	[        [        R                  " U	5      5      eS =n=n=n=n=n=px[        U 5      n
/ oJU:H  o»(       Gd  [        R                  " SU4S	X¤45      S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=p´g  GNE7f)Nr`  rÄ   zIMG_0001.JPGÚ_errorsú{assert %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = ((%(py2)s
{%(py2)s = %(py0)s.incoming
} / %(py4)s) / %(py7)s).exists
}()
}r+  ©r   r   r;   r   r>   r?   r   rH  r>  rI  r  r=   )r   rh  r.  r
   rK  r!  Úexistsr    r!   r   r"   r#   r$   r%   r>  r   )r+  r  r&   rÁ   rE   r(   rj   rG   rH   rÏ   r¹   r'   r  rP   s                 r+   Ú5test_unknown_prefix_goes_to_errors_without_being_lostrv    sy  é € Ü×0Ò0°¸%ÀÐ9JÔKÜ	ˆ#ˆ~œ{›}Ô-Ø
×
Ñ
Ó
×ÐØ�L‰LÐ?˜9Ð?˜9Ñ$Ð? ~Ð? ~Ñ5Ð?×=Ñ=Ð?Ð=Ó?Ð?Õ?×?×?×?×?×?Ñ?ˆC×?×?×?Ñ?ˆC×?×?Õ?ˆL×?×?Ó?˜9×?×?Ó? ~×?×?Ó?Ð=×?×?Ó?Ð?×?×?×?×?×?×?Ô?Ü�‹:Ð˜Ð˜Ñ×××Óˆ:×××××ÕŒ5×××ÑŒ5×××××Ö�×××Ñ�××Õˆ:××Ó˜××××××Ôò  ùs   ‚AJÁJ	ÁIJc           	   ƒ   ó*  #   • U R                   S-  R                  S5        [        U S[        S5      5        U R	                  5       I S h  v•N   U R                   nSo!U-  nSoCU-  oUR
                  of" 5       ow(       dÙ  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=n=n=n=n=pg[        U 5      n	S	/o9U:H  oª(       Gd  [        R                  " S
U
4SX“45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n	=p£g  GNF7f)Nr@  s   esto no es un jpegrA  r   rr  rs  r+  rt  z)photographer/MAR-4JC-IBD/.qr/DSC_0002.JPGr   rH  r>  rI  r  r=   )r!  Úwrite_bytesr.  r   rK  ru  r    r!   r   r"   r#   r$   r%   r>  r   )r+  r&   rÁ   rE   r(   rj   rG   rH   rÏ   r¹   r'   r  rP   s                r+   Ú>test_unreadable_image_goes_to_errors_and_the_rest_is_organisedry    s…  é € Ø‡\�\�NÑ"×/Ñ/Ð0EÔFÜ	ˆ#ˆ~œx¨Ó6Ô7Ø
×
Ñ
Ó
×ÐØ�L‰LÐ?˜9Ð?˜9Ñ$Ð? ~Ð? ~Ñ5Ð?×=Ñ=Ð?Ð=Ó?Ð?Õ?×?×?×?×?×?Ñ?ˆC×?×?×?Ñ?ˆC×?×?Õ?ˆL×?×?Ó?˜9×?×?Ó? ~×?×?Ó?Ð=×?×?Ó?Ð?×?×?×?×?×?×?Ô?Ü�‹:ÐFÐEÐFÐFÐFÑF×F×F×FÓFˆ:×F×F×F×F×FÕFŒ5×F×F×FÑFŒ5×F×F×F×F×FÖF�×F×F×FÑF�×F×FÕFˆ:×F×FÓFÐF×F×F×F×F×F×FÔFò  ùs   ‚AJÁ
JÁIJc              ƒ   óœ  #   • [        U S[        S5      5        [        U S[        SS95        U R                  5       I S h  v•N   [        U S[        SS95        U R                  5       I S h  v•N   Sn[	        U 5      o!U;   o3(       Gd  [
        R                  " SU4S	X45      [
        R                  " U5      S
[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS
S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=p2Sn[	        U 5      o!U;   o3(       Gd  [
        R                  " SU4S	X45      [
        R                  " U5      S
[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS
S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=p2g  GN† GN]7f)Nr@  r   rA  r®   rB  r]   rF  r|   rm  r>  r+  ro  r  r=   z'photographer/MAR-4JC-IBD/DSC_0002_1.JPG)r.  r   r
   rK  r>  r   r   r#   r    r!   r"   r$   r%   )r+  r
  rE   r¹   r  rP   s         r+   Ú.test_duplicate_filenames_are_never_overwrittenr{    sŠ  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ü	ˆ#ˆ~œ{°Ñ2Ô3Ø
×
Ñ
Ó
×ÐÜ	ˆ#ˆ~œ{°Ñ2Ô3Ø
×
Ñ
Ó
×ÐØ2Ð@´e¸C³jÐ@°jÑ@×@×@×@Ó@Ð2×@×@Ô@Ð2×@×@×@×@×@Ô@´e×@×@×@Ñ@´e×@×@×@×@×@Ö@¸C×@×@×@Ñ@¸C×@×@Õ@°j×@×@×@×@×@×@Ó@Ø4ÐB¼¸c»
ÐB¸
ÑB×B×B×BÓBÐ4×B×BÔBÐ4×B×B×B×B×BÔB¼×B×B×BÑB¼×B×B×B×B×BÖB¸c×B×B×BÑB¸c×B×BÕB¸
×B×B×B×B×B×BÔBò	  âùs$   ‚>KÁ KÁ+KÁ,K	Á-IKË	Kc              ƒ   óÒ  #   • SSK nSSKn[        U S[        S5      5      n[        U S[	        SS95      nUR                  X2R                  5       S-
  UR                  5       S-
  45        UR                  XBR                  5       S	-
  UR                  5       S	-
  45        U R                  5       I Sh  v•N   [        U 5      nS
S/oeU:H  ow(       Gd  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS=n=pvg GN27f)uf   La tarjeta se fotografÃ­a ANTES que las fotos de esa familia: el orden lo da EXIF/mtime, no el nombre.r   NzZZZ_card.JPGr   zAAA_photo.JPGr®   rB  r{   é
   z)photographer/MAR-4JC-IBD/.qr/ZZZ_card.JPGz&photographer/MAR-4JC-IBD/AAA_photo.JPGr   rH  r>  r+  rI  r  r=   )ÚosÚtimer.  r   r
   ÚutimerK  r>  r   r   r    r!   r"   r#   r$   r%   )
r+  r~  r  ÚcardÚphotor¹   rE   r'   r  rP   s
             r+   Ú<test_photos_are_organised_in_shooting_order_not_alphabeticalrƒ  "  s0  é € ãÛÜ��n¤h¨}Ó&=Ó>€DÜ�#�¬¸Ñ(;Ó<€EØ‡H�HˆT—I‘I“K #Ñ% t§y¡y£{°SÑ'8Ð9Ô:Ø‡H�HˆU—Y‘Y“[ 2Ñ% t§y¡y£{°RÑ'7Ð8Ô9Ø
×
Ñ
Ó
×ÐÜ�‹:ÐpÐEÐGoÐpÐpÐpÑp×p×p×pÓpˆ:×p×p×p×p×pÕpŒ5×p×p×pÑpŒ5×p×p×p×p×pÖp�×p×p×pÑp�×p×pÕpˆ:×p×pÓpÐp×p×p×p×p×p×pÔpò  ùs   ‚B0G'Â2G$Â3D2G'c              ƒ   ó  #   • [        U S[        S5      5        UR                  U SS 5        [        R                  " [
        5         U R                  5       I S h  v•N   S S S 5        [        R                  " U R                  5      S   nSo2UL oD(       do  [        R                  " SU4SX#45      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pCUR                  5         UR                  [         SS5        U R                  5       I S h  v•N   [#        U 5      nS/otU:H  oˆ(       Gd  [        R                  " SU4SXG45      S[$        R&                  " 5       ;   d  [        R(                  " ["        5      (       a  [        R                  " ["        5      OSS[$        R&                  " 5       ;   d  [        R(                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=p‡g  GN! , (       d  f       GN= f GNF7f)Nr@  r   Ú_purge_unprocessablec                  óD   • S S 5       R                  [        S5      5      $ )Nc              3   ó$   #   • U  H  ov •  M     g 7frŽ   r…   ©r7  r  s     r+   r9  Ú[test_a_crash_in_a_pass_does_not_leave_processing_stuck.<locals>.<lambda>.<locals>.<genexpr>2  s   é € ¸_ÊÀA¼aÊùs   ‚r…   u   base caÃ­da)ÚthrowÚRuntimeErrorr…   r-   r+   r’   ÚHtest_a_crash_in_a_pass_does_not_leave_processing_stuck.<locals>.<lambda>2  s   € ¹_É»_×=RÑ=RÔS_Ð`mÓSnÔ=or-   Ú
processingFrT   ©z%(py1)s is %(py4)s©r   r;   úassert %(py6)sr<   r  r  rE  r   rH  r>  r+  rI  r  r=   )r.  r   r#  ÚpytestÚraisesr‹  rK  r$  Ú_status_forÚ	school_idr   r   r#   r$   r%   Úundor   r>  r    r!   r"   )
r+  r›   r
  rÁ   r¹   r[  r  rE   r'   rP   s
             r+   Ú6test_a_crash_in_a_pass_does_not_leave_processing_stuckr–  0  s…  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ø×Ñ˜Ð3Ñ5oÔpÜ	�Š”|Õ	$Ø×!Ñ!Ó#×#Ð#÷ 
%ä�=Š=˜Ÿ™Ó'¨Ñ5Ð>¸Ð>¸Ð>×>×>×>Ò>Ð5×>×>Ô>Ð5×>×>Ó>¸×>×>×>×>×>×>Ó>Ø×ÑÔØ×ÑœÐ 1°3Ô7Ø
×
Ñ
Ó
×ÐÜ�‹:ÐFÐEÐFÐFÐFÑF×F×F×FÓFˆ:×F×F×F×F×FÕFŒ5×F×F×FÑFŒ5×F×F×F×F×FÖF�×F×F×FÑF�×F×FÕFˆ:×F×FÓFÐF×F×F×F×F×F×FÔFò 	$÷ 
%Ö	$úò
  ùs>   ‚AJÁI8ÁI5ÁI8Á C$JÅJ
ÅD0JÉ5I8É8
JÊ	Jc              ƒ   ó¬  ^#   • [        U S[        S5      5        [        U S[        SS95        [        U S[        SS95        [        R                  mS%U4S jjnUR                  [        S	U5        U R                  5       I S h  v•N   [        U 5      n/ nS
oUU;   ofov(       a  SoˆU;   o™nU(       Gdt  [        R                  " SU4SXS45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n
SSU
0-  o´R                  U5        U(       a—  [        R                  " SW	4SWU45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  oÔR                  U5        [        R                  " US5      0 -  nSSU0-  n[!        [        R"                  " U5      5      eS =n=n=n=n=p‰U R$                  nSnUU-  nUR&                  nU" 5       nU(       dÄ  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[!        [        R"                  " U5      5      eS =n=n=n=nn[        R(                  " U R*                  5      n/ nSnUS   nUU;   ofov(       a  US   nUnU(       dÕ  [        R                  " SU4SUU45      [        R                  " U5      [        R                  " U5      S.-  nS S!U0-  nUR                  U5        U(       a,  S"S#[        R                  " W5      0-  nUR                  U5        [        R                  " US5      0 -  nS$SU0-  n[!        [        R"                  " U5      5      eS =n=n=n=n=nng  GNÍ7f)&Nr@  r   rA  r®   rB  rD  r]   c                 óJ   >• U R                   S:X  a  [        S5      eT" X5      $ )NrA  u   anÃ¡lisis reventado)r-  r‹  )ÚpathÚprefixesÚreals     €r+   ÚflakyÚ=test_one_bad_file_does_not_take_down_the_batch.<locals>.flakyB  s&   ø€ Ø�9‰9˜Ó&ÜÐ4Ó5Ð5Ù�DÓ#Ð#r-   Ú_analyze_filerE  rG  r|   )z%(py3)s in %(py5)srb  )r   r   ú%(py7)sr   )z%(py10)s in %(py12)s)r>   r?   z%(py14)sr@   r   rX   rA   úkassert %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = (%(py2)s
{%(py2)s = %(py0)s.incoming
} / %(py4)s).exists
}()
}r+  ©r   r   r;   r   r   Úfailed_filesÚ
last_error)z%(py3)s in %(py6)s©r   r<   ú%(py8)sr=   z%(py11)src   úassert %(py14)srŽ   )r.  r   r
   r$  rž  r#  rK  r>  r   r   r#   r    r!   r"   r¯   r  r$   r%   r!  ru  Úget_organizer_statusr”  )r+  r›   rœ  rb  r&   r¹   r'   r
  rG   rH   r»   r)   rÏ   Ú@py_format15rZ   rL   rÁ   rE   r(   rj   r*   Ústrk   r  rP   rï   r›  s                             @r+   Ú.test_one_bad_file_does_not_take_down_the_batchrª  <  s‹  øé € Ü	ˆ#ˆ~œx¨Ó6Ô7Ü	ˆ#ˆ~œ{°Ñ2Ô3Ü	ˆ#ˆ~œ{°Ñ2Ô3Ü�?‰?€D÷$ð
 ×Ñœ˜?¨EÔ2Ø
×
Ñ
Ó
×ÐÜ�‹:€DÙrÐ6Ðr¸$Ñ>×rÐCjÐrÐnrÑCr×r×r×rÕrÐ6×r×rÔrÐ6×r×r×r×r×rÔr¸$×r×r×rÑr¸$×r×r×r×r×r×r×rÔrÐCjÐnr×r×rÔrÐCj×r×r×r×r×rÔrÐnr×r×r×rÑrÐnr×r×r×r×r×r×r×r×r×r×r×r×r×rÔrØ�L‰LÐ3˜>Ð3ˆL˜>Ñ)Ð3Ð)×1Ñ1Ð3Ñ1Ó3Ð3Ö3×3×3×3×3×3Ñ3ˆC×3×3×3Ñ3ˆC×3×3Õ3ˆL×3×3Ó3˜>×3×3Ó3Ð1×3×3Ó3Ð3×3×3×3×3×3×3Ñ3Ü	
×	Ò	 §¡Ó	.€BÙDˆ>ÐD˜R Ñ/ÐDˆ>Ð/Ñ/×D°B°|Ñ4DÐDÐ4D×D×D×DÓDˆ>Ð/×D×DÔDˆ>×D×DÓDÐ/×D×D×D×D×D×D×DÑDÐ4D×D×D×D×D×D×D×D×D×D×D×D×DÕDò  ùs   ƒBQÂQÂOQc              ƒ   óÔ  #   • [        U S[        S5      5        UR                  U SS 5        U R                  5       I S h  v•N   [        R
                  " U R                  5      nUS   nSoCU:H  oU(       do  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pTSo2S   oCU;   oU(       do  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=pTU R                  nSoHU-  o™R                  oª" 5       o»(       dÄ  SS[        R                  " 5       ;   d  [        R                   " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U
5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=n=n	=p«g  GN%7f)Nr@  r   Ú_movec                 ó   • g©NFr…   ©ÚsrcÚdsts     r+   r’   ÚItest_a_failed_move_is_reported_not_counted_as_organised.<locals>.<lambda>R  ó   € °ur-   Úlast_processed_countr   r   )z%(py1)s == %(py4)sr�  r�  r<   r¢  r|   )z%(py1)s in %(py4)sr   r+  r¡  )r.  r   r#  rK  r$  r§  r”  r   r   r#   r$   r%   r!  ru  r    r!   r"   )r+  r›   r©  r
  rÁ   r¹   r[  r  r&   rE   r(   rj   r*   s                r+   Ú7test_a_failed_move_is_reported_not_counted_as_organisedrµ  P  s„  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ø×Ñ˜˜WÑ&<Ô=Ø
×
Ñ
Ó
×ÐÜ	
×	Ò	 §¡Ó	.€BØÐ$Ñ%Ð*¨Ð*¨Ñ*×*×*×*Ò*Ð%×*×*Ô*Ð%×*×*Ó*¨×*×*×*×*×*×*Ó*ØÐ/ Ñ/Ð/Ð/Ñ/×/×/×/Ò/ˆ>×/×/Ô/ˆ>×/×/Ó/Ð/×/×/×/×/×/×/Ó/Ø�L‰LÐ3˜>Ð3˜>Ñ)Ð3×1Ñ1Ð3Ð1Ó3Ð3Õ3×3×3×3×3×3Ñ3ˆC×3×3×3Ñ3ˆC×3×3Õ3ˆL×3×3Ó3˜>×3×3Ó3Ð1×3×3Ó3Ð3×3×3×3×3×3×3Ñ3ò	  ùs   ‚>I(Á I%ÁH%I(c              ƒ   ó¤  #   • [        U S[        S5      5        UR                  U SS 5        U R                  5       I S h  v•N   [        R
                  " U R                  5      S   o"(       d:  SS[        R                  " U5      0-  n[        [        R                  " U5      5      eS nUR                  5         UR                  [        SS	5        U R                  5       I S h  v•N   [        R
                  " U R                  5      n/ oTS   nS ovUL oˆo((       a  US
   n	So©U
:H  o»o+(       a  US   n/ oÜU:H  oînU(       Gds  [        R                  " SU4SXg45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       aË  [        R                  " SW4SW	W
45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  nUR                  U5        U(       ab  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n	=n=n
=n=píg  GNŠ GNé7f)Nr@  r   r¬  c                 ó   • gr®  r…   r¯  s     r+   r’   Ú9test_status_recovers_after_a_clean_pass.<locals>.<lambda>\  r³  r-   r£  zassert %(py1)sr   r  r  Úconsecutive_errorsr   r¢  rT   ©z%(py3)s is %(py6)sr¤  r¥  r=   r   ©z%(py11)s == %(py14)s©rc   r@   ú%(py16)sr³   )z%(py19)s == %(py22)s)rC   Úpy22z%(py24)sÚpy24úassert %(py27)sÚpy27)r.  r   r#  rK  r$  r§  r”  r   r#   r$   r%   r•  r   r   r¯   r  )r+  r›   r
  Ú@py_format2r©  r&   r¹   rE   r'   rk   rI   rl   rè   Ú@py_assert21Ú@py_assert20r  rP   r¨  r¸   Ú@py_format23Ú@py_format25Ú@py_format26Ú@py_format28s                          r+   Ú'test_status_recovers_after_a_clean_passrÉ  Z  sÈ  é € Ü	ˆ#ˆ~œx¨Ó6Ô7Ø×Ñ˜˜WÑ&<Ô=Ø
×
Ñ
Ó
×ÐÜ×!Ò! #§-¡-Ó0°Ñ>Ð>Õ>×>×>Ñ>Ð>×>×>×>×>×>Ð>Ø×ÑÔØ×ÑœÐ 1°3Ô7Ø
×
Ñ
Ó
×ÐÜ	
×	Ò	 §¡Ó	.€BÙbˆlÑÐb˜tÐb˜tÐ#×b¨Ð+?Ñ(@ÐbÀAÐbÀAÑ(E×bÈ"È^ÑJ\ÐbÐ`bÐbÐ`bÑJb×b×b×bÕbÐ×b×bÔbÐ×b×bÓb˜t×b×b×b×b×b×b×bÓbÐ(@ÀA×b×bÔbÐ(@×b×bÓbÀA×b×b×b×b×b×b×bÓbÐJ\Ð`b×b×bÔbÐJ\×b×bÓbÐ`b×b×b×b×b×b×b×b×b×b×b×b×b×b×bÖbò  ò  ùs%   ‚>KÁ K
ÁB#KÃ$KÃ%G&KËKc              ƒ   óZ  ^^^#   • [        U S[        S5      5      mUR                  [        SS5        SS0m[        R
                  R                  mUUU4S jnUR                  [        R
                  SU5        U R                  5       I S h  v•N   / nTS   nS	oTU:H  ofov(       a+  [        U 5      n/ o˜U	:H  oªoz(       a  TR                  o»" 5       oÌnU(       Gd;  [        R                  " S
U4SXE45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oãR                  U5        U(       Ga“  [        R                  " S
W
4SWW	45      S[        R                  " 5       ;   d  [        R                   " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                   " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  nUR                  U5        U
(       aŒ  SS[        R                  " 5       ;   d  [        R                   " T5      (       a  [        R                  " T5      OS[        R                  " W5      [        R                  " W5      S.-  nUR                  U5        [        R"                  " US5      0 -  nSSU0-  n[%        [        R&                  " U5      5      eS =n=n=n=n=n=n=n
=n	=p¼g  GN›7f)Nr@  r   r  çš™™™™™©?Únr   c                 óž   >• T" U 5        [        TS5       nUR                  S5        S S S 5        TS==   S-  ss'   g ! , (       d  f       N= f)NÚabs
             rÌ  r®   )ÚopenÚwrite)ÚsecsÚfhÚfÚgrewÚ
real_sleeps     €€€r+   Úsleep_and_growÚHtest_files_still_uploading_defer_the_whole_batch.<locals>.sleep_and_growm  s<   ø€ Ù�4ÔÜ�!�TŒ]˜bØ�H‰H�ZÔ ÷ àˆS‹	�Q‰Œ	÷ �]ús	   –>¾
AÚsleepr®   r   ©z%(py3)s == %(py6)sr¤  r¥  r=   )z5%(py13)s
{%(py13)s = %(py10)s(%(py11)s)
} == %(py16)sr>  r+  )r>   rc   rd   r³   ú%(py18)sre   z?%(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s.exists
}()
}rÓ  )rg   r¾  r¿  rÀ  rÁ  )r.  r   r#  r   r$  r  rØ  rK  r>  ru  r   r   r#   r¯   r    r!   r"   r  r$   r%   )r+  r›   rÖ  r&   r¹   rE   r'   r
  rl   rK   rY   rÃ  Ú@py_assert23r  rP   r¸   rn   rÆ  rÇ  rÈ  rÓ  rÔ  rÕ  s                       @@@r+   Ú0test_files_still_uploading_defer_the_whole_batchrÜ  f  s¼  úé € Üˆc�>¤8¨MÓ#:Ó;€AØ×ÑœÐ 1°4Ô8à�ˆ8€DÜ—‘—‘€J÷ð ×ÑœŸ™ ¨Ô8Ø
×
Ñ
Ó
×ÐÙ=ˆ4�‰9Ð=˜Ð=˜‰>×=œe C›jÐ=¨BÐ=¨BÑ.×=°1·8±8Ð=°8³:×=×=×=Õ=ˆ9×=×=Ô=ˆ9×=×=Ó=˜×=×=×=×=×=×=×=Ó=˜j¨B×=×=×=×=×=Õ=œe×=×=×=Ñ=œe×=×=×=×=×=Ö= C×=×=×=Ñ= C×=×=Õ=˜j×=×=Ó=¨B×=×=×=×=×=×=×=×=×=×=Ñ=°1×=×=×=Ñ=°1×=×=Õ=°8×=×=Ó=°:×=×=×=×=×=×=×=×=×=×=×=×=×=Õ=ò  ùs   …BL+ÂL(ÂJL+c                 ó¨  • SS K nSS KnUR                  5       S-
  nS HA  nU R                  U-  R                  S5        UR	                  U R                  U-  X345        MC     U R                  5         [        S U R                  R                  5        5       5      nSS/oeU:H  ow(       d¥  [        R                  " SU4S	XV45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvg )Nr   é  )úDSC_0001.NEFz	resto.tmpúNC_FLLST.DATú	DSC_9.JPGó   xc              3   óf   #   • U  H'  oR                  5       (       d  M  UR                  v •  M)     g 7frŽ   )r3  r-  )r7  r8  s     r+   r9  ÚUtest_purge_removes_raw_leftovers_but_keeps_images_and_camera_index.<locals>.<genexpr>€  s   é € ÐHÒ"8˜Q¿I¹I¿K“&�!—&–&Ò"8ùs   ‚1ž1rá  rà  r   rµ   Úleftr¶   r·   r   )r~  r  r!  rx  r€  r…  r<  Úiterdirr   r   r    r!   r"   r#   r$   r%   )
r+  r~  r  Úoldr-  rå  r¹   r&   rº   r»   s
             r+   ÚBtest_purge_removes_raw_leftovers_but_keeps_images_and_camera_indexrè  x  sà   € ÛÛØ
�)‰)‹+˜Ñ
€CÛJˆØ	�‰˜Ñ	×)Ñ)¨$Ô/Ø
�‰�—‘ Ñ$ s jÖ1ñ Kð ×ÑÔÜÑH #§,¡,×"6Ñ"6Ô"8ÓHÓH€DØ Ð0Ð0Ð0Ñ0×0×0×0Ò0ˆ4×0×0×0×0×0Õ0ˆ4×0×0×0Ñ0ˆ4×0×0Õ0Ð0×0×0×0×0×0×0Ò0r-   c                 óz  • UR                  [        SS5        U R                  S-  R                  S5        U R	                  5         U R                  nSo2U-  oDR
                  oU" 5       of(       dÄ  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=n=n=pVg )Nr   g      >@rß  râ  r   r+  r¡  )r#  r   r!  rx  r…  ru  r    r!   r   r"   r#   r$   r%   )r+  r›   r&   rÁ   rE   r(   rj   r*   s           r+   Ú5test_purge_does_not_touch_a_file_still_being_uploadedrê  „  sÉ   € Ø×ÑœÐ 4°dÔ;Ø‡\�\�NÑ"×/Ñ/°Ô5Ø×ÑÔØ�L‰LÐ3˜>Ð3˜>Ñ)Ð3×1Ñ1Ð3Ð1Ó3Ð3Õ3×3×3×3×3×3Ñ3ˆC×3×3×3Ñ3ˆC×3×3Õ3ˆL×3×3Ó3˜>×3×3Ó3Ð1×3×3Ó3Ð3×3×3×3×3×3×3Ñ3r-   c              ƒ   ól  ^#   • UR                  [        SUS-  5        UR                  [        SUS-  5        UR                  [        SS5        UR                  [        SS5        [        R                  R	                  U S5        S	S
0mU4S jnUR                  [        R
                  SU5        [        R                  " [        R                  " U 5      5      n[        S5       H,  n[        R                  " S5      I Sh  v•N   TS	   S:”  d  M,    O   UR                  of" 5       ow(       + oˆ(       d±  [        R                  " S5      S-   S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " U5      [        R"                  " U5      S.-  n	[%        [        R&                  " U	5      5      eS=n=px/ nTS	   n
SoŠU:„  o»oË(       a  [        R(                  " U 5      S   nSoíUL oÿnU(       Gd
  [        R*                  " SU4SX¨45      [        R"                  " U
5      [        R"                  " U5      S.-  nSSU0-  nUR-                  U5        U(       ab  [        R*                  " SW4SWW45      [        R"                  " U5      [        R"                  " U5      S.-  nSSU0-  nUR-                  U5        [        R.                  " US
5      0 -  nS S!U0-  n[%        [        R&                  " U5      5      eS=n=n=n
=n=n=n=pþUR1                  5         [2        R4                  " [        R6                  5         UI Sh  v•N   SSS5        [        R(                  " U 5      S   nS"o|UL oª(       do  [        R*                  " SU
4S#XÇ45      [        R"                  " U5      [        R"                  " U5      S$.-  nS%S&U0-  n[%        [        R&                  " U5      5      eS=n=p§g GN N¨! , (       d  f       N¬= f7f)'u\   El `while True` vive fuera del try: una caÃ­da de la base retrasa el trabajo, no lo cancela.ÚINCOMING_DIRÚincÚ
PHOTOS_DIRÚphÚORGANIZER_RETRY_SECSç{®Gáz„?ÚORGANIZER_POLL_SECSNrÌ  r   c              “   óP   >#   • TS==   S-  ss'   TS   S::  a  [        S5      eg 7f)NrÌ  r®   é   u   MySQL caÃ­do©r‹  )ÚselfÚcallss    €r+   rœ  ÚNtest_the_loop_survives_failing_passes_with_backoff_and_recovers.<locals>.flaky”  s.   øé € Øˆc‹
�a‰‹
Ø�‰:˜‹?Ü˜~Ó.Ð.ð ùs   ƒ#&rK  rz   rË  rô  u2   una excepciÃ³n de la pasada NO debe matar el buclezE
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.done
}()
}ÚtaskrZ  ÚaliveT©Ú>)z%(py3)s > %(py6)sr¤  r¥  r=   rT   ©z%(py11)s is %(py14)sr¼  r½  r³   rB   rC   FrŽ  r�  r�  r<   )r#  r   r$  r%  r&  r'  ÚasyncioÚcreate_taskÚrun_organizerr  rØ  Údoner   Ú_format_assertmsgr    r!   r"   r#   r$   r%   r“  r   r¯   r  Úcancelr‘  r’  ÚCancelledError)r  rË   r›   rœ  rù  r  r&   rÁ   rE   r»   r¹   r'   r
  rk   rI   rl   r  rP   r¨  r¸   rL   rM   r[  r÷  s                          @r+   Ú?test_the_loop_survives_failing_passes_with_backoff_and_recoversr  ‹  s•  øé € à×Ñœ °¸5Ñ0@ÔAØ×Ñœ ¨h¸©oÔ>Ø×ÑœÐ 6¸Ô=Ø×ÑœÐ 5°tÔ<Ü×Ñ×Ñ˜F DÔ)Ø�!ˆH€Eõ/ð
 ×Ñœ×(Ñ(Ð*;¸UÔCÜ×ÒœqŸš¨vÓ6Ó7€DÜ�3ŽZˆÜ�mŠm˜DÓ!×!Ð!Ø�‰:˜�>Ùñ ð �y‰yÐPˆy‹{ÐPŒ?ÐP�?×P×PÐP×P×P×P×P×P×Pˆt×P×P×PÑPˆt×P×PÕPˆy×P×PÓPˆ{×P×P×P×P×PÔPÙDˆ5�‰:ÐD˜ÐD˜‰>×DœaŸmšm¨FÓ3°GÑ<ÐDÀÐDÀÐD×D×D×DÕDˆ:×D×DÔDˆ:×D×DÓD˜×D×D×D×D×D×D×DÓDÐ<À×D×DÔDÐ<×D×DÓDÀ×D×D×D×D×D×D×D×D×D×D×D×D×D×DØ‡K�K„MÜ	�Š”w×-Ñ-Õ	.Ø�
ˆ
÷ 
/ä�=Š=˜Ó  Ñ)Ð2¨UÐ2¨UÐ2×2×2×2Ò2Ð)×2×2Ô2Ð)×2×2Ó2¨U×2×2×2×2×2×2Ô2ò 	"ñ 	÷ 
/Õ	.üsD   ƒC?P4ÄPÄP4ÄI P4Í2P#Í8P!Í9P#Í=B"P4Ð!P#Ð#
P1Ð-P4c              ƒ   ó   #   • UR                  [        SS5        S [        S5       5       u  p#X#4 H  n[        R                  " SU-   US9  M     [
        R                  " X S-  U S-  5      n[
        R                  " X0S	-  U S
-  5      nS[
        R                  " U5      S'   [        [        S5      UR                  S-  5        UR                  5       I S h  v•N   S
opU-  nSo˜U	-  n
SoºU-  nSoÜU-  nSoþU-  nUR                  nU" 5       nU(       Gd  SS[        R                  " 5       ;   d  [        R                   " U 5      (       a  [        R"                  " U 5      OS[        R"                  " U5      [        R"                  " U	5      [        R"                  " U5      [        R"                  " U5      [        R"                  " U5      [        R"                  " U5      [        R"                  " U5      S.-  n[%        [        R&                  " U5      5      eS =n=n=n	=n
=n=n=n=n=n=n=nnS[
        R                  " U5      S'   g  GNs7f)Nr  r  c              3   ól   #   • U  H*  nS [         R                  " 5       R                  SS  3v •  M,     g7f)ziso-Nrl  )r  r  r  rˆ  s     r+   r9  ÚUtest_state_is_per_school_one_failing_school_does_not_block_another.<locals>.<genexpr>©  s+   é € Ð<²8¨aˆd”4—:’:“<×#Ñ# B QÐ'Ð(Õ)²8ùs   ‚24r]   zAislado r  ÚiaÚpaÚibÚpbTr�  r   r@  Úphotographerz.qrzƒassert %(py19)s
{%(py19)s = %(py17)s
{%(py17)s = (((((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s) / %(py11)s) / %(py14)s).exists
}()
}rË   )r   r   r   r=   rc   r@   rA   rC   F)r#  r   r  r   r  r$  r'  r“  r   r   r!  rK  ru  r    r!   r   r"   r#   r$   r%   )rË   r›   r�   Úbr  ÚoaÚobr&   rÁ   r'   r(   rF   rG   rk   rl   rI   rK   rJ   rè   rM   s                       r+   ÚBtest_state_is_per_school_one_failing_school_does_not_block_anotherr  §  s´  é € Ø×ÑœÐ 1°3Ô7Ù<´5¸´8Ó<�D€AØ‹vˆÜ×$Ò$ Z°#Ñ%5¸CÔ@ñ ä	
×	Ò	˜!¨™_¨h¸©oÓ	>€BÜ	
×	Ò	˜!¨™_¨h¸©oÓ	>€BØ%)„A‡M‚M�!Ó�\Ñ"ÜŒh�}Ó% r§{¡{°^Ñ'CÔDØ
×
Ñ
Ó
×ÐØÐ_�t‰OÐ_˜nÐ_˜nÑ,Ð_¨}Ð_¨}Ñ<Ð_¸uÐ_¸uÑDÐ_À~Ð_À~ÑUÐ_ÐU×]Ñ]Ð_Ñ]Ó_Ð_×_×_×_×_×_×_Ñ_ˆH×_×_×_Ñ_ˆH×_×_Õ_�t×_×_Ó_˜n×_×_Ó_¨}×_×_Ó_¸u×_×_Ó_À~×_×_Ó_Ð]×_×_Ó_Ð_×_×_×_×_×_×_×_×_Ø%*„A‡M‚M�!Ó�\Ò"ò ùs   ‚CIÃIÃE3Ic              ƒ   óè  ^#   • UR                  [        SS5        [        R                  " 5       mU4S jnUR                  U SU5        [        R
                  " U [        R                  " 5       5      n[        R                  " SS9n[        S5       H,  n[        R                  " UR                  U5      I Sh  v•N   M.     [        R                  " TR                  5       S	S
9I Sh  v•N   g N4 N7f)zVwatchdog llama desde SU hilo: todo debe entrar al event loop con call_soon_threadsafe.ÚWATCHDOG_DEBOUNCE_SECSrË  c               “   ó.   >#   • T R                  5         g 7frŽ   )r²   )Úrans   €r+   Ú	fake_passÚJtest_watchdog_events_from_another_thread_trigger_a_pass.<locals>.fake_passº  s   øé € Ø�‰�	ùs   ƒrK  F©Úis_directoryrl  Nr]   )Útimeout)r#  r   rþ  ÚEventr$  Ú_HandlerÚget_running_loopr”   ÚSimpleNamespacer  Ú	to_threadÚ
on_createdÚwait_forÚwait)r+  r›   r  ÚhandlerÚeventr  r  s         @r+   Ú7test_watchdog_events_from_another_thread_trigger_a_passr%  µ  sµ   øé € à×ÑœÐ 8¸$Ô?Ü
�-Š-‹/€Cõð ×Ñ˜Ð.°	Ô:Ü�jŠj˜œg×6Ò6Ó8Ó9€GÜ×!Ò!¨uÑ5€EÜ�1ŽXˆÜ×Ò × 2Ñ 2°EÓ:×:Ò:ñ ä
×
Ò
˜3Ÿ8™8›:¨qÑ
1×1Ñ1ñ 	;Ù1ùs$   ƒB6C2Â9C.Â:.C2Ã(C0Ã)C2Ã0C2c              ƒ   ó¨  #   • UR                  [        SS5        S nUR                  U SU5        [        R                  " U [        R
                  " 5       5      n[        R                  " UR                  [        R                  " SS95      I S h  v•N   [        R                  " S5      I S h  v•N   Sn/ n[        R                  " U R                  5      S	   ofov(       d  S
oˆnXG;   o™(       dÒ  SS[        R                  " U5      0-  o¥R                  U
5        U(       d+  SS[        R                  " W5      0-  oµR                  U5        [        R                   " US5      0 -  n[        R"                  " SU	4SXG45      [        R                  " U5      US.-  nSSU0-  n[%        [        R&                  " U5      5      eS =n=n	=n=n=phg  GN< GN!7f)Nr  rñ  c               “   ó    #   • [        S5      e7f)Núpasada rotarõ  r…   r-   r+   ÚboomÚItest_pass_error_from_the_watchdog_is_recorded_not_swallowed.<locals>.boomÈ  s   é € Ü˜=Ó)Ð)ùs   ‚rK  Fr  gš™™™™™É?r(  r£  r   ú%(py6)sr<   rù   r   r®   r|   )z%(py1)s in (%(py12)s))r   r?   r¦  r@   )r#  r   r$  r  rþ  r  r  Úon_modifiedr”   r  rØ  r§  r”  r   r#   r¯   r  r   r$   r%   )r+  r›   r)  r#  r
  r'   rE   rÁ   rj   r¹   r  r*   rQ   rÏ   r¨  s                  r+   Ú;test_pass_error_from_the_watchdog_is_recorded_not_swallowedr-  Å  s"  é € Ø×ÑœÐ 8¸$Ô?ò*ð ×Ñ˜Ð.°Ô5Ü�jŠj˜œg×6Ò6Ó8Ó9€GÜ
×
Ò
˜G×/Ñ/´×1FÒ1FÐTYÑ1ZÓ
[×[Ð[Ü
�-Š-˜Ó
×ÐØÒWœQ×3Ò3°C·M±MÓBÀ<ÑPÑWÕPÐTVÑWˆ=ÑW×W×W×WÐWÐP×W×W×WÖP×W×WÑWÐTV×W×W×W×W×W×W×W×WÕWˆ=×W×WÔWˆ=×W×W×W×W×W×W×WÓWò \Úùs%   ‚BGÂGÂGÂ.GÂ/DGÇGc                 óè  • [         R                  R                  U S 5        [         R                  " U 5      n/ o!S   nSoCUL oUoe(       a  US   nSo‡UL o™nU(       Gd  [        R
                  " SU4SX445      [        R                  " U5      [        R                  " U5      S.-  n
SS	U
0-  o²R                  U5        U(       aa  [        R
                  " SW	4S
WW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÒR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p˜g )NÚstalledTrú  FrT   rº  r¤  r¥  r=   rý  r¼  r½  r³   r   rB   rC   )r$  r%  r&  r§  r   r   r#   r¯   r  r$   r%   )r  r©  r&   r¹   rE   r'   r
  rk   rI   rl   r  rP   r¨  r¸   rL   rM   s                   r+   Ú,test_status_is_stalled_when_the_loop_is_deadr0  Ô  sÒ   € Ü×Ñ×Ñ˜F DÔ)Ü	
×	Ò	 Ó	'€BÙ9ˆi‰=Ð9˜DÐ9˜DÐ ×9 R¨¡[Ð9°EÐ9°EÐ%9×9×9×9Õ9ˆ=×9×9Ô9ˆ=×9×9Ó9˜D×9×9×9×9×9×9×9Ò9 [°E×9×9Ô9 [×9×9Ó9°E×9×9×9×9×9×9×9×9×9×9×9×9×9×9r-   c                 óâ  • [         R                  R                  U S 5        [         R                  " U 5      R	                  S[         R
                  " 5       S9  [         R                  " U 5      S   nSo!UL o3(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=p2g )
NT)rú  Ú
started_atr/  FrT   rŽ  r�  r�  r<   )r$  r%  r&  r“  ÚupdateÚ
utcnow_isor§  r   r   r#   r$   r%   )r  r
  rÁ   r¹   r[  r  s         r+   Ú.test_status_is_not_stalled_when_alive_and_idler5  Ú  s•   € Ü×Ñ×Ñ˜F DÔ)Ü‡M‚M�&Ó× Ñ  t¼¿º»Ð ÑGÜ×!Ò! &Ó)¨)Ñ4Ð=¸Ð=¸Ð=×=×=×=Ò=Ð4×=×=Ô=Ð4×=×=Ó=¸×=×=×=×=×=×=Ô=r-   c                 óô  ^• SSK Jn  [        R                  R	                  U S 5        US-  m[        [        S5      TS-  5        UR                  [        SU4S j5        [        R                  " 5       U" [        R                  S-   S	9-
  R                  5       n[        R                  " U 5      R                  S
XDS9  [        R                  " U 5      n/ oeS   nSo‡U:H  o™o©(       a,  US   nS
oËUL oÝo­(       a  US   n[        R                  oþU:„  nUn
U
(       GdÇ  [        R                   " SU	4SXx45      [        R"                  " U5      [        R"                  " U5      S.-  nSSU0-  nUR%                  U5        U	(       Ga  [        R                   " SW4SWW45      [        R"                  " U5      [        R"                  " U5      S.-  nSSU0-  nUR%                  U5        U(       aµ  [        R                   " SW4SWW45      [        R"                  " U5      S[&        R(                  " 5       ;   d  [        R*                  " [        5      (       a  [        R"                  " [        5      OS[        R"                  " U5      S.-  nSSU0-  nUR%                  U5        [        R,                  " US5      0 -  nS S!U0-  n[/        [        R0                  " U5      5      eS =n
=n=n=n	=n=n=n=n=n=nng )"Nr   )Ú	timedeltarí  )rz   rz   r@  Úincoming_dir_forc                 ó   >• T$ rŽ   r…   )r  rí  s    €r+   r’   ÚJtest_status_is_stalled_when_files_wait_and_nothing_moves.<locals>.<lambda>å  s   ø€ ¹3r-   é<   )ÚsecondsT)rú  r2  Úlast_run_atÚpending_countr®   r/  Úseconds_since_last_runr   rÙ  r¤  r¥  r=   rT   rý  r¼  r½  r³   rû  )z?%(py19)s > %(py23)s
{%(py23)s = %(py21)s.ORGANIZER_STALL_SECS
}r   )rC   ræ   Úpy23ú%(py25)sÚpy25zassert %(py28)sÚpy28)Údatetimer7  r$  r%  r&  r   r
   r#  Úutcnowr   ÚORGANIZER_STALL_SECSÚ	isoformatr“  r3  r§  r   r   r#   r¯   r    r!   r"   r  r$   r%   )r  rË   r›   r7  Úlong_agor©  r&   r¹   rE   r'   r
  rk   rI   rl   rè   Ú@py_assert22rÄ  r  rP   r¨  r¸   Ú@py_format24rÇ  Ú@py_format27Ú@py_format29rí  s                            @r+   Ú8test_status_is_stalled_when_files_wait_and_nothing_movesrM  à  sÌ  ø€ Ý"Ü×Ñ×Ñ˜F DÔ)Ø
�UÑ
€CÜŒk˜*Ó% s¨^Ñ';Ô<Ø×ÑœÐ-¬Ô?Ü—’“
™Y¬v×/JÑ/JÈRÑ/OÑPÑP×[Ñ[Ó]€HÜ‡M‚M�&Ó× Ñ  t¸Ð ÑWÜ	
×	Ò	 Ó	'€BÙ|ˆoÑÐ| !Ð| !Ñ#×|¨¨9©Ð|¸Ð|¸Ð(=×|À"ÐE]ÑB^Ð|Ôag×a|Ña|Ð|Ða|ÑB|×|×|×|Ö|Ð×|×|Ô|Ð×|×|Ó| !×|×|×|×|×|×|×|Ô|¨¸×|×|Ô|¨×|×|Ó|¸×|×|×|×|×|×|×|Ó|ÐB^Ða|×|×|Ô|ÐB^×|×|×|×|×|Ô|Ôag×|×|×|Ñ|Ôag×|×|Õ|Ða|×|×|×|×|×|×|×|×|×|×|×|×|×|×|×|r-   c                 óÖ  • [         R                  R                  U S 5        [         R                  " U 5      nUR	                  SS9  SUS   S'   [         R
                  " U 5        [         R                  " U 5      n/ nS oBULoUoe(       a  US   S   nSo‡U:H  o™nU(       Gd>  [        R                  " SU4SX$45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S	.-  n
S
SU
0-  o³R                  U5        U(       aa  [        R                  " SW	4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÓR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                   " U5      5      eS =n=n=n=n=n=p˜g )NF)rú  zMAR-PUB-001Ústicky_by_photographerrÄ   )úis not)z%(py2)s is not %(py5)sÚstored)r   r   rŸ  r   r   )z%(py10)s == %(py13)s)r>   rd   z%(py15)srW   r   r´   re   )r$  r%  r&  r“  r3  Ú_publish_statusÚ_read_publishedr   r   r    r!   r"   r#   r¯   r  r$   r%   )r  r©  rQ  r&   r'   rÁ   r
  rG   rl   rH   r»   r)   Ú@py_format14rZ   r¸   rn   s                   r+   Ú*test_status_is_published_for_other_workersrU  ì  s)  € Ü×Ñ×Ñ˜F DÔ)Ü	
�Š�vÓ	€BØ‡I�I�E€IÑØ-:€BÐÑ  Ñ*Ü×Ò�fÔÜ×Ò˜vÓ&€FÙ]˜Ð]˜Ð×] &Ð)AÑ"BÀ8Ñ"LÐ]ÐP]Ð]ÐP]Ñ"]×]×]×]Õ]ˆ6×]×]×]×]×]Õ]ˆ6×]×]×]Ñ]ˆ6×]×]Õ]˜×]×]×]×]×]×]×]Ò]Ð"LÐP]×]×]Ô]Ð"L×]×]Ó]ÐP]×]×]×]×]×]×]×]×]×]×]×]×]×]Õ]r-   c              ƒ   ó8	  ^^#   • U R                  [        SS5        / / smmUU4S jnU R                  [        SU5        S[        R                  " 5       R
                  S S  3n[        R                  " SUS9  [        R                  " [        R                  " 5       5      n[        R                  " S	5      I S h  v•N   / oBT;   oUoe(       a  TR                  ow" U5      nS
o˜U	:H  oªnU(       Gd!  [        R                  " SU4SUT45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OSS[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OSS.-  nSSU0-  oÄR'                  U5        U(       Ga  [        R                  " SW
4SWW	45      S[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OS[        R$                  " W5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      [        R$                  " U	5      S.-  nSSU0-  oäR'                  U5        [        R(                  " US5      0 -  nSSU0-  n[+        [        R,                  " U5      5      eS =n=n=n=n=n=p©[        R.                  " USS9  [        R                  " S	5      I S h  v•N   UT;   oD(       dÜ  [        R                  " SU4SUT45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OSS[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OSS.-  nSS U0-  n[+        [        R,                  " U5      5      eS nUR1                  5         [2        R4                  " [        R6                  5         UI S h  v•N   S S S 5        g  GNÆ GN9 N! , (       d  f       g = f7f)!NÚORGANIZER_RESCAN_SECSrË  c              “   óÆ   >#   • TR                  U 5         [        R                  " S5      I S h  v•N   g  N! [        R                   a    TR                  U 5        e f = f7f)NrÞ  )r¯   rþ  rØ  r  )r  ÚstartedÚstoppeds    €€r+   Úfake_runÚ[test_manager_starts_one_organizer_per_active_school_and_stops_deactivated.<locals>.fake_runü  sL   øé € Ø�‰�sÔð	Ü—-’- Ó%×%Ó%øÜ×%Ñ%ó 	Ø�N‰N˜3ÔØð	üs%   ƒA!–7 ¯5°7 ´A!µ7 ·'AÁA!r   zmgr-rl  ÚGestorr  g333333Ó?r®   r|   )z%(py2)s in %(py4)sr  rY  )r   r;   r+  r<   r   )zQ%(py13)s
{%(py13)s = %(py10)s
{%(py10)s = %(py8)s.count
}(%(py11)s)
} == %(py16)s)r=   r>   rc   rd   r³   rÚ  re   r   rå   ræ   F)Úactive)z%(py0)s in %(py2)srZ  )r   r   zassert %(py4)sr;   )r#  r   r$  r  r  r  r   r  rþ  rÿ  Úrun_all_organizersrØ  Úcountr   r   r    r!   r"   r#   r¯   r  r$   r%   Úupdate_schoolr  r‘  r’  r  )r›   r[  r  rù  r&   rÁ   r
  rG   rl   rK   rY   r[  r  r¸   rn   rM   ré   Ú@py_format3rY  rZ  s                     @@r+   ÚItest_manager_starts_one_organizer_per_active_school_and_stops_deactivatedrc  ø  s”  ùé € Ø×ÑœÐ 7¸Ô>Ø˜2Ð€GˆWöð ×Ñœ˜?¨HÔ5Ø”—’“×!Ñ! " 1Ð%Ð&Ð
'€CÜ× Ò  °Ò4Ü×Òœq×3Ò3Ó5Ó6€DÜ
�-Š-˜Ó
×ÐÙ5�'‰>×5˜gŸm™mÐ5˜m¨CÓ0Ð5°AÐ5°AÑ5×5×5×5Õ5ˆ3�'×5×5×5×5×5Õ5ˆ3×5×5×5Ñ5ˆ3×5×5×5×5×5Ö5�'×5×5×5Ñ5�'×5×5×5×5×5×5×5Õ5Ð0°A×5×5×5×5×5Õ5˜g×5×5×5Ñ5˜g×5×5Õ5˜m×5×5×5×5×5Ô5¨C×5×5×5Ñ5¨C×5×5Õ5Ð0×5×5Ó5°A×5×5×5×5×5×5×5×5×5×5×5×5×5Ô5Ü× Ò  ¨UÒ3Ü
�-Š-˜Ó
×ÐØ�'‰>×××Òˆ3�'×××××Õˆ3×××Ñˆ3×××××Ö�'×××Ñ�'××××××ÒØ‡K�K„MÜ	�Š”w×-Ñ-Õ	.Ø�
ˆ
÷ 
/Ð	.ò ò ñ 	÷ 
/Õ	.üsP   „B7RÂ;RÂ<JRÍRÍD!RÑ-R	Ñ3RÑ4R	Ñ8
RÒRÒR	Ò	
RÒRc           
      óH  • SSK Jn  U" 5        nUR                  S5        UR                  5         S S S 5        [        R
                  nSoC" U5      n[        R                  oeU:H  ow(       Gd?  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S	.-  nS
SU0-  n	[        [        R                  " U	5      5      eS =n=n=n=pv[        R
                  nSoC" U5      n[        R                  nSo¦U
-  oµU:H  ow(       GdT  [        R                  " SU4SX[45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=p«U" 5        nUR                  S5        UR                  5         S S S 5        g ! , (       d  f       GNX= f! , (       d  f       g = f)Nr   )Úget_dbzWINSERT OR REPLACE INTO app_kv (key, value) VALUES ('legacy_school_id', 'colegio-viejo')zcolegio-viejor   )zz%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.incoming_dir_for
}(%(py4)s)
} == %(py10)s
{%(py10)s = %(py8)s.INCOMING_DIR
}r$  r   )r   r   r;   r<   r=   r>   rÌ   r?   Úotro)z‡%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.incoming_dir_for
}(%(py4)s)
} == (%(py10)s
{%(py10)s = %(py8)s.INCOMING_DIR
} / %(py12)s))r   r   r;   r<   r=   r>   r?   zassert %(py15)srW   z/DELETE FROM app_kv WHERE key='legacy_school_id')Úcore.dbre  ÚexecuteÚcommitr$  r8  r   rì  r   r   r    r!   r"   r#   r$   r%   )r›   re  Úconnr&   rÁ   rE   rG   rF   rQ   rÏ   rH   rI   rT  rZ   s                 r+   ÚDtest_legacy_school_keeps_the_root_of_incoming_others_get_a_subfolderrk    s   € ÝÙ	Œ�TØ�‰ÐnÔoØ�‰Œ÷ 
ô ×ÑÐE˜oÐEÐ˜oÓ.ÐE´&×2EÑ2EÐEÐ2EÑE×E×E×EÓEÐ.×E×E×E×E×EÕEŒ1×E×E×EÑEŒ1×E×EÕEÐ×E×EÓE˜o×E×EÓEÐ.×E×E×E×E×EÔE´&×E×E×EÑE´&×E×EÕEÐ2E×E×E×E×E×E×E×EÜ×ÑÐE˜fÐEÐ˜fÓ%ÐE¬×)<Ñ)<ÐE¸vÐE¸vÑ)EÐEÐ)EÑE×E×E×EÓEÐ%×E×E×E×E×EÕEŒ1×E×E×EÑEŒ1×E×EÕEÐ×E×EÓE˜f×E×EÓEÐ%×E×E×E×E×EÔE¬×E×E×EÑE¬×E×EÕEÐ)<×E×EÓE¸v×E×E×E×E×E×E×EÓEÙ	Œ�TØ�‰ÐFÔGØ�‰Œ÷ 
ˆ÷ 
Žú÷
 
�ús   Ž"NÍ"NÎ
NÎ
N!c           	      óš  • [         R                  " U SSS.5        [         R                  nSo!" X5      nSoCU:H  oU(       Gd7  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=n=n=pT[         R                  nSo!" X5      nSoCU:H  oU(       Gd7  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=n=n=pT[         R                  nSo!" X5      nS oCUL oU(       Gd7  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=n=n=pTg )NÚcortoÚlargo)ÚDSr`  zdsc_0001.jpgr   ©zd%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.resolve_photographer
}(%(py3)s, %(py5)s)
} == %(py10)sr   r  rg  rÌ   r?   z	DSX_1.jpgz	IMG_1.jpgrT   )zd%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.resolve_photographer
}(%(py3)s, %(py5)s)
} is %(py10)s)r   rh  Úresolve_photographerr   r   r    r!   r"   r#   r$   r%   ©r  r&   r'   r(   rG   rj   rQ   rÏ   s           r+   Ú<test_longest_prefix_wins_and_unknown_prefix_resolves_to_noners     sX  € Ü×0Ò0°ÀÐPWÑ9XÔYÜ×4Ñ4ÐW¸^ÐWÐ4°VÓLÐWÐPWÐWÐPWÑW×W×W×WÓWÐL×W×W×W×W×WÕWÔ×W×W×WÑWÔ×W×WÕWÐ4×W×W×W×W×WÔW°V×W×W×WÑW°V×W×WÕW¸^×W×WÓWÐL×W×WÓWÐPW×W×W×W×W×W×W×WÜ×4Ñ4ÐT¸[ÐTÐ4°VÓIÐTÈWÐTÈWÑT×T×T×TÓTÐI×T×T×T×T×TÕTÔ×T×T×TÑTÔ×T×TÕTÐ4×T×T×T×T×TÔT°V×T×T×TÑT°V×T×TÕT¸[×T×TÓTÐI×T×TÓTÈW×T×T×T×T×T×T×TÜ×4Ñ4ÐQ¸[ÐQÐ4°VÓIÐQÈTÐQÈTÐQ×Q×Q×QÓQÐI×Q×Q×Q×Q×QÕQÔ×Q×Q×QÑQÔ×Q×QÕQÐ4×Q×Q×Q×Q×QÔQ°V×Q×Q×QÑQ°V×Q×QÕQ¸[×Q×QÓQÐI×Q×QÓQÈT×Q×Q×Q×Q×Q×Q×QÐQr-   c           	      óÐ  • [         R                  nSo!" X5      nSoCU:H  oU(       Gd7  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=n=n=pTg )
NzLO_QUE_SEA.JPGr  r   rp  r   r  rg  rÌ   r?   )
r   rq  r   r   r    r!   r"   r#   r$   r%   rr  s           r+   ÚHtest_with_no_photographers_configured_an_implicit_one_accepts_everythingru  '  sÈ   € Ü×4Ñ4Ð`Ð=MÐ`Ð4°VÓNÐ`ÐR`Ð`ÐR`Ñ`×`×`×`Ó`ÐN×`×`×`×`×`Õ`Ô×`×`×`Ñ`Ô×`×`Õ`Ð4×`×`×`×`×`Ô`°V×`×`×`Ñ`°V×`×`Õ`Ð=M×`×`Ó`ÐN×`×`Ó`ÐR`×`×`×`×`×`×`×`Ð`r-   Úbadr   rý   r`  z../fueraz	con/barrazD S CzA BÚy)r`  Údscc                 ó˜   • [         R                  " [        5         [        R                  " X5        SSS5        g! , (       d  f       g= f)z7El nombre es una CARPETA: nada de separadores ni rutas.N)r‘  r’  Ú
ValueErrorr   rh  )r  rv  s     r+   Ú+test_photographer_map_rejects_unsafe_valuesr{  +  s*   € ô 
�Š”zÕ	"Ü×4Ò4°VÔA÷ 
#×	"Ö	"ús	   ›;»
A	c           	      ó2  • [         R                  " U SS05        [         R                  " U SS5        [         R                  " U SSS.5        [         R                  nSo!" X5      nSoCU:H  oU(       Gd7  [        R
                  " SU4SX445      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S	[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS	[        R                  " U5      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=pT[         R                  nSo!" X5      nSoCU:H  oU(       Gd7  [        R
                  " SU4SX445      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S	[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS	[        R                  " U5      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=pTg )Nr`  rÄ   zMAR-KEP-001r^  r_  r   rf  r   r  rg  rÌ   r?   rÇ   )r   rh  Úset_sticky_qrri  r   r   r    r!   r"   r#   r$   r%   rr  s           r+   ÚCtest_updating_the_map_keeps_the_sticky_of_photographers_that_remainr~  3  s¾  € Ü×0Ò0°¸%ÀÐ9JÔKÜ×&Ò& v¨x¸ÔGÜ×0Ò0°ÀÐRZÑ9[Ô\Ü×-Ñ-ÐP°hÐPÐ-¨fÓ?ÐPÀ=ÐPÀ=ÑP×P×P×PÓPÐ?×P×P×P×P×PÕPÔ×P×P×PÑPÔ×P×PÕPÐ-×P×P×P×P×PÔP¨f×P×P×PÑP¨f×P×PÕP°h×P×PÓPÐ?×P×PÓPÀ=×P×P×P×P×P×P×PÜ×-Ñ-ÐK°hÐKÐ-¨fÓ?ÐKÀ8ÐKÀ8ÑK×K×K×KÓKÐ?×K×K×K×K×KÕKÔ×K×K×KÑKÔ×K×KÕKÐ-×K×K×K×K×KÔK¨f×K×K×KÑK¨f×K×KÕK°h×K×KÓKÐ?×K×KÓKÀ8×K×K×K×K×K×K×KÐKr-   c              ƒ   óÒ  #   • U R                  SSSSS.0US9I S h  v•N n/ o2R                  nSoTU:H  ofov(       a  UR                  5       S   nS	SS
.o˜U	:H  oªnU(       GdS  [        R                  " SU4SXE45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÃR                  U5        U(       aa  [        R                  " SW
4SWW	45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  oãR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p©U R                  SUS9I S h  v•N R                  5       n/ nUS    Vs1 s H  nUS   iM
     nnSS1nUU:H  nUnU(       a  US   nSn
UU
L nUnU(       Gd  [        R                  " SU4SUU45      [        R                  " U5      [        R                  " U5      S.-  nS S!U0-  nUR                  U5        U(       ab  [        R                  " S"W4S#WU
45      [        R                  " U5      [        R                  " U
5      S$.-  nS%S&U0-  nUR                  U5        [        R                  " US5      0 -  nS'S(U0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=nn
U R                  SSSS)00US9I S h  v•N nUR                  nS*nUU:H  oD(       d»  [        R                  " SU4S+UU45      S,[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS,[        R                  " U5      [        R                  " U5      S-.-  nS.S/U0-  n[        [        R                  " U5      5      eS =n=nnU R                  SS0 0US9I S h  v•N   g  GN; GN…s  snf  GN N7f)0Nú/api/admin/photographersÚphotographersÚXavierr^  )rx  Úcar)rõ   Úheadersrz   ÚmaprÄ   r_  r   rö   r÷   rø   rù   r   rú   rû   rü   rA   r   rf   rg   ©r„  Úprefixr`  ra  ÚimplicitFrÙ  r¤  r¥  r=   rT   rý  r¼  r½  r³   rB   rC   z../xrx   r  rv  r¾   r¿   r   )Úputr  rõ   r   r   r    r!   r"   r#   r¯   r  r$   r%   Úget)r	  Úadmin_headersr÷   r&   rÁ   r(   rE   r
  rH   rY   rI   r)   r*   rZ   rL   rn   ro   Úgotr8  r¹   r'   rk   rl   r  rP   r¨  r¸   rM   rv  r»   s                                 r+   Ú/test_photographers_api_roundtrip_and_validationr�  =  sÎ  é € Ø�j‰jÐ3¸?ÐT\ÐemÑLnÐ:oØ!.ð ð 0÷ 	0€AáY�=‰=ÐY˜CÐY˜CÑ×Y A§F¡F£H¨U¡OÐY¸xÐPXÑ7YÐYÐ7YÑ$Y×Y×Y×YÕYˆ=×Y×Y×Y×Y×YÕYˆ1×Y×Y×YÑYˆ1×Y×YÕYˆ=×Y×YÓY˜C×Y×Y×Y×Y×Y×Y×YÒY OÐ7Y×Y×YÔY O×Y×YÓYÐ7Y×Y×Y×Y×Y×Y×Y×Y×Y×Y×Y×Y×Y×YÖYØ—‘Ð6À�ÐN×N×
TÑ
TÓ
V€CÙe  _Ò!5Ó6Ò!5˜AˆAˆhŒKÑ!5ÐeÐ6¸5À%¸.ÐeÐ6¸.ÑH×eÑeÈSÐQ[É_ÐeÐ`eÐeÈ_Ð`eÐMe×e×e×eÖeÐ6¸.×e×eÔeÐ6×e×eÓe¸.×e×e×e×e×e×e×eÓeÈ_Ð`e×e×eÔeÈ_×e×eÓeÐ`e×e×e×e×e×e×e×e×e×e×e×e×e×e×eÐeØ—
‘
Ð5¸_ÈuÐV\ÈoÐ<^Ðhu�
Ðv×
v€CØ�?‰?Ð!˜cÐ!ˆ?˜cÑ!×!×!×!Ò!ˆ?˜c×!×!×!×!×!Õ!ˆ3×!×!×!Ñ!ˆ3×!×!Õ!ˆ?×!×!Ó!˜c×!×!×!×!×!×!Ô!Ø
�*‰*Ð/°ÈÐ6KÐUbˆ*Ð
c×cÑcò	0ò OùÚ6Ú
vácùsT   ‚Q'œQ�F8Q'ÇQÇQ'Ç1QÈ EQ'ÍQ"ÍC4Q'ÑQ%ÑQ'ÑQ'ÑQ'Ñ%Q'c              ƒ   óz  #   • U R                  SUS9I S h  v•N o"R                  nSoCU:H  oU(       d„  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTU R                  S	US9I S h  v•N o"R                  nSoCU:H  oU(       d„  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTU R                  S	5      I S h  v•N o"R                  nS
oCU:H  oU(       d„  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTg  GN GNf N­7f)Nr€  r†  i“  r   rþ   rÿ   r  r=   ú/api/admin/organizer/statusi‘  )rŠ  r  r   r   r#   r$   r%   )r	  Údirector_headersr
  r¹   rE   r'   r  rP   s           r+   Ú8test_photographers_and_organizer_status_require_operatorr‘  H  sh  é € Ø—*‘*Ð7ÐAQ�*ÐR×RÐf×_Ñ_ÐfÐcfÐfÐcfÑf×f×f×fÒfÐ_×f×fÔfÐR×f×fÓfÐ_×f×fÓfÐcf×f×f×f×f×f×fÕfØ—*‘*Ð:ÐDT�*ÐU×UÐi×bÑbÐiÐfiÐiÐfiÑi×i×i×iÒiÐb×i×iÔiÐU×i×iÓiÐb×i×iÓiÐfi×i×i×i×i×i×iÕiØ—*‘*Ð:Ó;×;ÐO×HÑHÐOÈCÐOÈCÑO×O×O×OÒOÐH×O×OÔOÐ;×O×OÓOÐH×O×OÓOÈC×O×O×O×O×O×OÖOò SÚUÙ;ùs6   ‚H;–H3—B9H;ÃH6ÃB:H;ÆH9ÆB(H;È6H;È9H;c              ƒ   óŠ
  #   • SSK Jn  [        R                  R	                  SS 5        U R                  SUS9I S h  v•N nUR                  5       n/ oSR                  nSovU:H  oˆo˜(       a/  US   n
SoºUL oÌoœ(       a  US	   nS
oíUL oÿoŸ(       a  US   nS nUUL nUn	U	(       Gd(  [        R                  " SU4SXg45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       Ga4  [        R                  " SW4SW
W45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       aË  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       ab  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSS U0-  n[!        [        R"                  " U5      5      eS =n	=n=n=n=n=n
=n=n=n=n=n=n=nnUR%                  SUR&                  [)        S!5      5        U R                  SUS9I S h  v•N R                  5       n/ oTS   S"   nS#nUU:H  nUn	U(       a  US   S$   nS%nUU:H  n U n	U	(       Gd  [        R                  " SU4S&UU45      [        R                  " U5      [        R                  " U5      S'.-  n!S(S)U!0-  n"UR                  U"5        U(       ab  [        R                  " SW 4S*WU45      [        R                  " U5      [        R                  " U5      S+.-  n#S,S-U#0-  n$UR                  U$5        [        R                  " US5      0 -  nS.S/U0-  n%[!        [        R"                  " U%5      5      eS =n	=n=n=n=n=n=n nUR+                  S5        U R                  SUS9I S h  v•N R                  5       S   n	S oiUL nU(       do  [        R                  " SU4S0X–45      [        R                  " U	5      [        R                  " U5      S1.-  n&S2S3U&0-  n![!        [        R"                  " U!5      5      eS =n	=nng  GNÿ GN N�7f)4Nr   )Ú	ai_healthz
ecole-testr�  r†  rz   r/  Trú  FÚair   rö   r÷   rø   rù   r   rT   )z%(py12)s is %(py15)srû   rü   rA   )z%(py20)s is %(py23)s)rg   r@  rA  rB  )z%(py28)s is %(py31)s)rC  Úpy31z%(py33)sÚpy33zassert %(py36)sÚpy36zinsufficient creditsrã   Ú
no_creditsrù  ÚheadsrÙ  r¤  r¥  r=   r»  r¼  r½  r³   rB   rC   rŽ  r�  r�  r<   )Úservicesr“  r$  r%  r&  rŠ  rõ   r  r   r   r    r!   r"   r#   r¯   r  r$   r%   Úrecord_failureÚ
TASK_HEADSr‹  Úrecord_success)'r	  r‹  r“  r÷   Úbodyr&   rÁ   r(   rE   r
  rH   rY   rI   Ú@py_assert19rI  rÃ  Ú@py_assert27Ú@py_assert30Ú@py_assert29r)   r*   rZ   rL   rJ  rÇ  Ú@py_format32Ú@py_format34Ú@py_format35Ú@py_format37r¹   r'   rk   rl   r  rP   r¨  r¸   rM   r[  s'                                          r+   Ú4test_organizer_status_endpoint_reports_health_and_air§  N  sB  é € Ý"Ü×Ñ×Ñ˜L¨$Ô/Ø�j‰jÐ6ÀˆjÐN×N€AØ�6‰6‹8€DÙm�=‰=Ðm˜CÐm˜CÑ×m D¨¡OÐm°tÐm°tÐ$;×mÀÀWÁÐmÐQVÐmÐQVÐ@V×mÐ[_Ð`dÑ[eÐmÐimÐmÐ[eÐimÐ[m×m×m×mÖmˆ=×m×m×m×m×mÕmˆ1×m×m×mÑmˆ1×m×mÕmˆ=×m×mÓm˜C×m×m×m×m×m×m×mÔm O°t×m×mÔm O×m×mÓm°t×m×m×m×m×m×m×mÓmÀÐQV×m×mÔmÀ×m×mÓmÐQV×m×m×m×m×m×m×mÓmÐ[eÐim×m×mÔmÐ[e×m×mÓmÐim×m×m×m×m×m×m×m×m×m×m×m×m×m×m×mÔmØ×Ñ˜\¨9×+?Ñ+?ÄÐNdÓAeÔfØ—*‘*Ð:ÀM�*ÐR×R×XÑXÓZ€DÙO�‰:�fÑÐO ÐOÐ Ñ-×OÑO°$°t±*¸VÑ2DÐOÈÐOÐ2DÈÑ2O×O×O×OÖOÐ ×O×OÔOÐ×O×OÓO ×O×O×O×O×O×O×OÓOÐ2DÈ×O×OÔOÐ2D×O×OÓOÈ×O×O×O×O×O×O×O×O×O×O×O×O×O×OÐOØ×Ñ˜\Ô*Ø—*‘*Ð:ÀM�*ÐR×R×XÑXÓZÐ[_Ñ`ÐhÐdhÐhÐdhÐh×h×h×hÓhÐ`×h×hÔhÐ`×h×hÓhÐdh×h×h×h×h×h×hÕhò 	Oò Sñ Sùs6   ‚:U¼T;½K"UÌT>Ì FUÒ#UÒ$BUÔ>UÕU)aÚ__doc__Úbuiltinsr    Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   rþ  rØ   rÕ   r˜   Ú	threadingr”   r  r0   Únumpyr2   r‘  Úcorer   rš  r   r$  r   r   r   r   r	   Úconftestr
   r   r   ÚmarkÚparametrizer,   r7   rN   rR   r[   rp   rv   r�   r  rƒ   r�   r¤   r¨   rª   r¼   rÂ   rÐ   r4  rÝ   rê   rí   rð   r  r  Úfixturer  r+  r.  r>  rM  rQ  rS  r\  rj  rp  rv  ry  r{  rƒ  r–  rª  rµ  rÉ  rÜ  rè  rê  r  r  r%  r-  r0  r5  rM  rU  rc  rk  rs  ru  r{  r~  r�  r‘  r§  r…   r-   r+   Ú<module>r´     s@  ðñ÷ „ ƒÛ Û 	Û 
Û Û Û ã 
Û Û å Ý +ß aÕ aß 5Ñ 5ð
 ‡�×Ñ˜ò *ó ñ3óð3òIò^ò8ò
Kòbòbò
sô	�U×*Ñ*ô 	òòMò
MòDò
ò òNðQ�cô Qò0ò
<òdò
=ò ð ‡�ñó ðð ‡�ñó ðò/òsò
0ò>òGò>òQòCòòGòCò	qò	GòEò(4ò	cò>ò$	1ò4ò3ò8+ò2ò 
Xò:ò>ò	}ò^òò4	òRòað ‡�×Ñ˜ " c ¨U°JÐ,?À%ÈÐAUÐX_ÐadÐWeÐhmÐotÐguØ),°SÑ!9ð!;ó <ñBó<ðBòLòdòPó
ir-   