Ë
    {Ìj·
  ã                   óþ   — d Z ddlZddlZddlZddlZ ej
                  e«      ZdZdZ	 ej                  d«      Z ej                  d«      Zddedefd	„Zd
edefd„Zdedefd„Zdedefd„Zdedefd„Zd
edefd„Zy)u   
Generador de cÃ³digos de familia alfanumÃ©ricos (mismo formato que hec-photo-app).

Formato: {PREFIJO}-{3 caracteres}-{3 caracteres}   â†’  ej: MAR-P8Y-D23

Charset sin caracteres ambiguos (0/O/1/I/L), pensado para leerse a ojo y para que
el OCR de rescate del organizer pueda recuperar un cÃ³digo cuando el QR no
descodifica. 31^6 â‰ˆ 887 millones de combinaciones por prefijo: adivinar el cÃ³digo
de otra familia deja de ser viable (el formato antiguo, 3 letras + 4 dÃ­gitos,
tenÃ­a solo 10 000 por prefijo).
é    NÚ23456789ABCDEFGHJKMNPQRSTUVWXYZé   z^[A-Z]{2,6}$z^[A-Z0-9][A-Z0-9-]{1,23}$ÚlengthÚreturnc                 ór   — dj                  t        j                  «       j                  t        | ¬«      «      S )NÚ )Úk)ÚjoinÚrandomÚSystemRandomÚchoicesÚCHARSET)r   s    ú//var/www/photos/backend/utils/code_generator.pyÚ_segmentr      s*   € Ø�7‰7”6×&Ñ&Ó(×0Ñ0´¸FÐ0ÓCÓDÐDó    Úprefixc                 ót   — | j                  «       j                  d«      } | › dt        «       › dt        «       › �S )u)   CÃ³digo candidato sin verificar unicidad.ú-)ÚupperÚstripr   )r   s    r   Ú
build_coder      s3   € à�\‰\‹^×!Ñ! #Ó&€FØˆX�Q”x“z�l !¤H£J <Ð0Ð0r   Úrawc                 ób   — | j                  «       j                  dd«      j                  dd«      S )uE   'MAR-P8Y-D23' â†’ 'MARP8YD23'. Para comparar sin guiones ni espacios.r   r   ú )r   Úreplace)r   s    r   Únormalize_coder   %   s(   € à�9‰9‹;×Ñ˜s BÓ'×/Ñ/°°RÓ8Ð8r   Úcodec                 óð   — | j                  «       j                  dd«      } d| v r| S t        j                  d| «      }|r7|j	                  d«      › d|j	                  d«      › d|j	                  d«      › �S | S )u?   'MARP8YD23' â†’ 'MAR-P8Y-D23' (lo que se enseÃ±a y se imprime).r   r   r   zP^([A-Z]{2,6})([23456789A-HJKMNPQRSTUVWXYZ]{3})([23456789A-HJKMNPQRSTUVWXYZ]{3})$é   é   é   )r   r   ÚreÚmatchÚgroup)r   Úms     r   Úformat_code_displayr&   *   sn   € à�:‰:‹<×Ñ  RÓ(€DØ
ˆd�{ØˆÜ
�‰ÐdÐfjÓk€AÙ89ˆa�g‰g�a‹jˆ\˜˜1Ÿ7™7 1›:˜, a¨¯©°«
 |Ð4ÐC¸tÐCr   Únamec                 óà   — dj                  d„ t        j                  d| xs d«      D «       «      }dj                  d„ |j                  «       D «       «      }|dd xs dj	                  dd«      S )	uT   Prefijo por defecto de un colegio: sus 3 primeras letras (sin acentos), MAYÃšSCULAS.r   c              3   óR   K  — | ]  }t        j                  |«      d k7  sŒ|–— Œ! y­w)ÚMnN)ÚunicodedataÚcategory©Ú.0Úcs     r   ú	<genexpr>z#prefix_from_name.<locals>.<genexpr>5   s$   è ø€ Òj˜Ì+×J^ÑJ^Ð_`ÓJaÐeiÓJi”1Ñjùs   ‚' 'ÚNFDc              3   ó>   K  — | ]  }d |cxk  rdk  sŒn n|–— Œ y­w)ÚAÚZN© r-   s     r   r0   z#prefix_from_name.<locals>.<genexpr>6   s   è ø€ ÒA˜A°¸´¸S¶”aÑAùs   ‚“
Nr!   ÚFOTÚX)r
   r+   Ú	normalizer   Úljust)r'   ÚbaseÚletterss      r   Úprefix_from_namer<   3   s_   € à�7‰7Ñjœk×3Ñ3°E¸4º:À2ÓFÔjÓj€DØ�g‰gÑA §¡£ÔAÓA€GØ�B�QˆKÒ ˜5×'Ñ'¨¨3Ó/Ð/r   c                 ó  — t        dt        dz   «      D ]U  }t        |«      }| j                  d|t	        |«      f«      j                  «       }|s|c S t        j                  d||«       ŒW t        d|› dt        › d�«      ‚)uS   CÃ³digo Ãºnico (global: el cÃ³digo identifica familia Y colegio) contra `families`.r   z=SELECT 1 FROM families WHERE code=? OR REPLACE(code,'-','')=?u)   ColisiÃ³n de cÃ³digo en el intento %d: %sz-Could not generate a unique code with prefix z after z	 attempts)	ÚrangeÚMAX_RETRIESr   Úexecuter   ÚfetchoneÚloggerÚwarningÚRuntimeError)Úconnr   Úattemptr   Útakens        r   Úgenerate_unique_coderH   :   s‹   € ä˜œK¨!™OÓ,ò SˆÜ˜&Ó!ˆØ—‘ØKØ”> $Ó'Ð(ó*ç*2©(«*ð 	ñ ØŠKÜ�‰ÐBÀGÈTÕRðSô ÐFÀvÀhÈgÔVaÐUbÐbkÐlÓ
mÐmr   )r!   )Ú__doc__Úloggingr   r"   r+   Ú	getLoggerÚ__name__rB   r   r?   ÚcompileÚ	PREFIX_REÚCODE_REÚintÚstrr   r   r   r&   r<   rH   r5   r   r   ú<module>rR      sÒ   ðñ
ó Û Û 	Û à	ˆ×	Ñ	˜8Ó	$€à
+€Ø€ØˆB�J‰J�Ó'€	ð ˆ"�*‰*Ð1Ó
2€ñE�Sð E ó Eð1�sð 1˜só 1ð9˜ð 9 ó 9ð
D˜cð D có Dð0˜3ð 0 3ó 0ð
n sð 
n¨sô 
nr   