ó
    kÿËjv  ã                   ód  • S r SSKrSSKrSSKJr  SSKJrJr  SSKJ	r	  \R                  " \5      rSr\R                  " S5      r\R                  " S5      rSS
 jrS\S	\\\4   4S jrS\S	\\   4S jrS\S\\\4   S	\\\4   4S jrS\S\S	\\   4S jrS\S\S	\4S jrS\S\S\S	S4S jrg)uu  
photographer_service.py â€” fotÃ³grafos de un colegio y su "QR pegajoso".

Igual que en hec-photo-app, cada fotÃ³grafo se identifica por el PREFIJO del nombre de archivo de su
cÃ¡mara (p. ej. `DSC` â†’ "xavier", `CAR` â†’ "carlos"). Eso permite que dos fotÃ³grafos trabajen a la vez
sobre el mismo FTP sin pisarse: cada uno tiene SU Ãºltimo QR escaneado ("sticky"), asÃ­ que las fotos de
uno no acaban en la familia que estÃ¡ fotografiando el otro.

Sin fotÃ³grafos configurados el organizer usa uno implÃ­cito ("photographer") que acepta cualquier prefijo:
una instalaciÃ³n con un solo fotÃ³grafo funciona sin configurar nada.
é    N)ÚOptional)Úget_dbÚTABLE_OPTIONS)Ú
utcnow_isoÚphotographerz^[A-Z0-9_]{1,12}$z^[a-z0-9][a-z0-9_-]{0,39}$Úreturnc                  óœ   • [        5        n U R                  S[         35        U R                  5         S S S 5        g ! , (       d  f       g = f)Nab  
            CREATE TABLE IF NOT EXISTS photographers (
                school_id  VARCHAR(64) NOT NULL,
                prefix     VARCHAR(16) NOT NULL,
                name       VARCHAR(64) NOT NULL,
                last_qr    VARCHAR(64),
                created_at VARCHAR(40) NOT NULL,
                PRIMARY KEY (school_id, prefix)
            ) )r   Úexecuter   Úcommit)Úconns    Ú`D:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\services\photographer_service.pyÚinit_photographer_tabler      s;   € Ü	Œ�TØ�‰ð ô ˆoð!ô 	"ð 	�‰Œ÷ 
�Žús	   ‹)=½
AÚ	school_idc                 óÈ   • [        5        nUR                  SU 45      R                  5       nS S S 5        W Vs0 s H  o3S   US   _M     sn$ ! , (       d  f       N'= fs  snf )Nz8SELECT prefix, name FROM photographers WHERE school_id=?ÚprefixÚname)r   r
   Úfetchall©r   r   ÚrowsÚrs       r   Úget_photographer_mapr   )   sV   € Ü	Œ�TØ�|‰|ÐVÐYbÐXdÓe×nÑnÓpˆ÷ 
á,0Ó1ªD qˆh‰K˜˜6™Ò"©DÑ1Ð1÷ 
�üâ1s   ‹"A¹AÁ
Ac                 óÎ   • [        5        nUR                  SU 45      R                  5       nS S S 5        W Vs/ s H  n[        U5      PM     sn$ ! , (       d  f       N*= fs  snf )NzWSELECT prefix, name, last_qr FROM photographers WHERE school_id=? ORDER BY name, prefix)r   r
   r   Údictr   s       r   Úlist_photographersr   /   sU   € Ü	Œ�TØ�|‰|ÐuØ&˜Ló*ß*2©(«*ð 	÷ 
ñ "Ó"šT˜ŒD�ŽG™TÑ"Ð"÷ 
�üò #s   ‹"A¹A"Á
AÚnew_mapc                 óp  • 0 nUR                  5        HÍ  u  p4[        U5      R                  5       R                  5       [        U5      R                  5       R	                  5       peU(       d	  U(       d  Mb  [
        R                  U5      (       d  [        SU< S35      e[        R                  U5      (       d  [        SU< S35      eXR;   a  [        SU 35      eXbU'   MÏ     [        5       n[        5        nUR                  SU 45       V	s0 s H  o™S   U	S   _M     n
n	UR                  S	U 45        UR                  5        H)  u  pVUR                  S
XXjR                  U5      U45        M+     UR                  5         SSS5        [        R                  SX5        U$ s  sn	f ! , (       d  f       N+= f)uº   Sustituye el mapa del colegio (prefijo â†’ nombre). Valida antes de tocar nada y conserva el
Ãºltimo QR de los fotÃ³grafos que siguen existiendo. ValueError si algÃºn dato no es vÃ¡lido.zInvalid prefix: z (1-12 letters, digits or _)zInvalid name: z3 (lowercase, digits, - or _; it is the folder name)zPrefijo repetido: zQSELECT name, last_qr FROM photographers WHERE school_id=? AND last_qr IS NOT NULLr   Úlast_qrz+DELETE FROM photographers WHERE school_id=?z[INSERT INTO photographers (school_id, prefix, name, last_qr, created_at) VALUES (?,?,?,?,?)Nu(   [%s] Mapa de fotÃ³grafos actualizado: %s)ÚitemsÚstrÚstripÚupperÚlowerÚ
_PREFIX_REÚmatchÚ
ValueErrorÚ_NAME_REr   r   r
   Úgetr   ÚloggerÚinfo)r   r   Ú
normalizedÚkÚvr   r   Únowr   r   Úpreviouss              r   Úupdate_photographer_mapr/   6   sŠ  € ð "$€JØ—‘–‰ˆÜ˜1“v—|‘|“~×+Ñ+Ó-¬s°1«v¯|©|«~×/CÑ/CÓ/E�ÞždÙÜ×Ñ ×'Ñ'ÜÐ/°©uÐ4PÐQÓRÐRÜ�~‰~˜d×#Ñ#Ü˜~¨a©UÐ2eÐfÓgÐgØÓÜÐ1°&°Ð:Ó;Ð;Ø!�6Óñ  ô ‹,€CÜ	Œ�TØ59·\±\Ø_ÐbkÐamô6oó pò 6o°�f‘I˜q ™|Ò+ñ 6oˆð pà�‰ÐBÀYÀLÔQØ&×,Ñ,Ö.‰LˆFØ�L‰LÐvØ#¨T·<±<ÀÓ3EÀsÐKöMñ /ð 	�‰Œ÷ 
ô ‡K�KÐ:¸IÔRØÐùòp÷ 
�ús   Ã8F'ÄF"Ä A"F'Æ"F'Æ'
F5Úfilenamec                 óø   • [        U 5      nU(       d  [        $ UR                  5       n[        U[        SS9 H  nUR                  U5      (       d  M  X$   s  $    [        R                  SX[        U5      5        g)u    FotÃ³grafo de un archivo por el prefijo de su nombre (el mÃ¡s largo gana). None = prefijo desconocido.
Sin fotÃ³grafos configurados, uno implÃ­cito acepta todo.T)ÚkeyÚreversez1[%s] Prefijo no reconocido para %r (prefijos: %s)N)r   ÚIMPLICIT_PHOTOGRAPHERr!   ÚsortedÚlenÚ
startswithr(   Úwarning)r   r0   Úpmapr!   r   s        r   Úresolve_photographerr:   R   sl   € ô   	Ó*€DÞÜ$Ð$Ø�N‰NÓ€EÜ˜¤3°Ô5ˆØ×Ñ˜F×#Ó#Ø‘<Òñ 6ô ‡N�NÐFÈ	Ô]cÐdhÓ]iÔjØó    r   c                 ój  • [        5        nU[        :X  aW  [        U 5      (       dG  UR                  SSU  SU 345      R	                  5       nU(       a  US   OS =(       d    SsS S S 5        $ UR                  SX45      R	                  5       nS S S 5        W(       a  US   $ S$ ! , (       d  f       N= f)Nz$SELECT value FROM app_kv WHERE key=?ústicky:Ú:ÚvalueÚ_no_qrz^SELECT last_qr FROM photographers WHERE school_id=? AND name=? AND last_qr IS NOT NULL LIMIT 1r   )r   r4   r   r
   Úfetchone)r   r   r   Úrows       r   Úget_sticky_qrrC   `   s¦   € Ü	Œ�TØÔ(Ó(Ô1EÀi×1PÑ1PØ—,‘,ÐEÈ'ÐR[ÐQ\Ð\]Ð^bÐ]cÐHdÐGfÓg×pÑpÓrˆCÞ$'�C˜’L¨T×>°h÷ 
‰ð �l‰lÐ{Ø%Ð,ó.ß.6©h«jð 	÷	 
ö !ˆ3ˆy‰>Ð. hÐ.÷ 
�ús   ‹AB$Á-!B$Â$
B2Úcodec                 óþ   • [        5        nU[        :X  a+  [        U 5      (       d  UR                  SSU  SU 3U45        OUR                  SX U45        UR	                  5         SSS5        g! , (       d  f       g= f)uY   Persiste el Ãºltimo QR para TODOS los prefijos de ese fotÃ³grafo (sobrevive a reinicios).z7INSERT OR REPLACE INTO app_kv (key, value) VALUES (?,?)r=   r>   z?UPDATE photographers SET last_qr=? WHERE school_id=? AND name=?N)r   r4   r   r
   r   )r   r   rD   r   s       r   Úset_sticky_qrrF   j   sn   € ä	Œ�TØÔ(Ó(Ô1EÀi×1PÑ1PØ�L‰LÐRÐW^Ð_hÐ^iÐijÐkoÐjpÐUqÐswÐTxÕyà�L‰LÐZÐ]aÐnrÐ\sÔtØ�‰Œ÷ 
�Žús   ‹AA.Á.
A<)r   N)Ú__doc__ÚloggingÚreÚtypingr   Úcore.dbr   r   Úcore.timeutilr   Ú	getLoggerÚ__name__r(   r4   Úcompiler#   r&   r   r   r   r   Úlistr   r/   r:   rC   rF   © r;   r   Ú<module>rR      s
  ðñ
ó Û 	Ý ç )Ý $à	×	Ò	˜8Ó	$€à&Ð Ø�ZŠZÐ,Ó-€
à�:Š:Ð3Ó4€ôð2 Cð 2¨D°°c°©Nô 2ð# #ð #¨$¨t©*ô #ð sð °T¸#¸s¸(±^ð ÈÈSÐRUÈXÉô ð8 Cð °3ð ¸8ÀC¹=ô ð/˜Sð /¨ð /°ô /ð˜Sð ¨ð °3ð ¸4õ r;   