
    7j                        d Z ddlZddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlZddlmZmZmZmZmZmZ  eded      Zej*                  j-                  ej*                  j/                  e            Zej*                  j5                  ed	      Zej*                  j5                  ed
      Zg dZg dZi Z ej@                         Z!d Z"d Z#d Z$d Z%d Z&d Z'ejQ                  d      d        Z)ejQ                  ddg      d        Z*ejQ                  ddg      d        Z+ejQ                  ddg      d        Z,y)a  Blueprint Flask del modulo "Estequiometria" (4.1.5-4.1.7) - actividad a libro abierto.

Rutas:
    GET  /estequiometria          Pagina del modulo (teoria + evaluacion).
    POST /iniciar-estequiometria  Crea sesion (token) tras identificar al estudiante.
    POST /incidente-estequiometria Registra una incidencia anti-trampa.
    POST /guardar-estequiometria  Califica en servidor y guarda 1 fila (nota unificada).
    N)datetime)	Blueprintjsonifyrender_templaterequest)CARRERAS_PERMITIDASMAX_APELLIDOSMAX_NOMBRESMAX_TEXTO_CORTOTEMASTIPOS_INCIDENTE_VALIDOSestequiometria	templates)template_folderzestequiometria_resultados.csvzestequiometria_incidencias.csv)No	ApellidosNombresCarreraPuntosPosiblesNota)fechatoken
estudiantetipoc                 j    t        | t              sy | j                         }|rt        |      |kD  ry |S N)
isinstancestrstriplen)valormaximolimpios      I   /home/adonis/Público/Cursos/Quimica/estequiometria/estequiometria_cdt.py_texto_validor&   *   s0    eS![[]FS[6)M    c                     t         5  t        | t              rt        j	                  |       nd cd d d        S # 1 sw Y   y xY wr   )_bloqueor   r   	_sesionesget)r   s    r%   _obtener_sesionr,   3   s5    	 H'1%'=y}}U#4H H Hs	   '8Ac                     t        |       }|j                  dd      j                  dd      }|j                  d      rd|z   }|S )zANeutraliza inyeccion de formulas CSV (=,+,-,@) y saltos de linea.
 )=+-@')r   replace
startswith)r"   textos     r%   _escapar_celdar9   8   sE    JEMM$$,,T37E,-eLr'   c           	      4   t         j                  j                  |       }t        | ddd      5 }t	        j
                  |      }|s|j                  |       |j                  |D cg c]  }t        |       c}       d d d        y c c}w # 1 sw Y   y xY w)Na 	utf-8-sig)newlineencoding)ospathexistsopencsvwriterwriterowr9   )ruta_csv
encabezadofilaexistearchivoescritorceldas          r%   _agregar_filarN   A   s    WW^^H%F	hR+	> E'::g&j)dCU>%0CD	E E D	E Es   8B'B	
9B	BBc                     t         j                  j                  t              syt	        t        d      5 } t        j                  |       }t        |d       t        d |D              }ddd       |dz   S # 1 sw Y   dz   S xY w)zDCorrelativo `No` por ESTUDIANTE = numero de estudiantes previos + 1.   r=   )r?   Nc              3   &   K   | ]	  }|sd   yw)rP   N ).0rI   s     r%   	<genexpr>z)_siguiente_correlativo.<locals>.<genexpr>Q   s     7$!7s   )	r@   rA   rB   CSV_RESULTADOSrC   rD   readernextsum)rK   lectorestudiantess      r%   _siguiente_correlativor[   J   sq    77>>.)	n{	3 8wG$VT7778 ?	8 ?s   4A77Bc                 h   | j                  d      xs i }t        |t              si S ddddd}i }t        D ]x  }|j                  |      }t        |t              si ||<   *i }|j	                         D ]5  \  }}t        |t
              s||   |||   v s$|||<   *|dt         ||<   7 |||<   z |S )z7Construye un payload confiable {tema: {indice: valor}}.
respuestas)ABCDN)z4.1.5z4.1.6z4.1.7ACT)r+   r   dictr   itemsr   r   )	datosr
permitidossanotemabloquer$   indicer"   s	            r%   _sanear_respuestas_por_temarl   U   s    		,%2Aa	%#	J D t&$'DJ#\\^ 	9MFEeS)$+Jt,,%*F6N!&'7!8v	9 T
 Kr'   z/estequiometriac                      t        d      S )Nzestequiometria.html)r   rR   r'   r%   pagina_estequiometriarn   w   s    011r'   z/iniciar-estequiometriaPOST)methodsc                     t        j                  d      xs i } t        | j                  d      t              }t        | j                  d      t
              }| j                  d      }|r|st        ddd      d	fS |t        vrt        dd
d      d	fS t        j                  d      }t        5  |||g ddt        |<   d d d        t        d|d      S # 1 sw Y   xY w)NTsilent	apellidosnombrescarreraFzIdentificacion incompleta.okerror  zCarrera no permitida.   )rt   ru   rv   
incidentesenviado)rx   r   )r   get_jsonr&   r+   r	   r
   r   r   secrets	token_hexr)   r*   )re   rt   ru   rv   r   s        r%   iniciar_estequiometriar   |   s    D)/REeii4mDIEIIi0+>Gii	"GGe.JKLcQQ))e.EFGLLb!E	 
"
	%
 $/00
 
s   1CC z/incidente-estequiometriac            
      B   t        j                  d      xs i } t        | j                  d            }|t	        ddd      dfS | j                  d      }|t
        vrt	        dd	d      dfS t        5  |d
   j                  |       t        |d
         }|d    d|d    }d d d        t        t        t        t        j                         j                  d      t        | j                  d            d d |g       t	        dd|z  d      S # 1 sw Y   pxY w)NTrr   r   FSesion invalida.rw   rz   r   zTipo de incidente desconocido.r|   rt   z, ru   z%Y-%m-%d %H:%M:%S      )rx   r|   	descuento)r   r~   r,   r+   r   r   r)   appendr!   rN   CSV_INCIDENCIASENCABEZADO_INCIDENCIASr   nowstrftimer   )re   sesionr   totalr   s        r%   incidente_estequiometriar      s3   D)/REUYYw/0F~e.@ABCGG99VD**e.NOPRUUU	 C|##D)F<(){+,Bvi/@.AB
C /		 	 !4	5s599W;M7NrPQ7R	T	
 $e!"U, - -C Cs   60DDz/guardar-estequiometriac                     t        j                  d      xs i } t        | j                  d            }|t	        ddd      dfS t
        5  |d   rt	        dd	d      d
fcd d d        S 	 d d d        t        |       }t
        5  t        |d         }d d d        t        j                  |      }t
        5  t               }d|d<   d d d        d}d}t        D ]+  }t        j                  |||         }	||	d   z  }||	d   z  }- t        t        t        |d   |d   |d   |||d   g       t	        d|d      S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)NTrr   r   Fr   rw   rz   r}   zEsta actividad ya fue enviada.i  r|   r   puntosposiblesrt   ru   rv   
nota_final)rx   	resultado)r   r~   r,   r+   r   r)   rl   r!   estequiometria_gradercalificar_examenr[   r   calificar_temarN   rU   ENCABEZADO_RESULTADOS)
re   r   r]   n_incidentesr   numerototal_puntostotal_posiblesri   resumens
             r%   guardar_estequiometriar      s   D)/REUYYw/0F~e.@ABCGG	 M)%%EG HILMM MM
 -U3J	 16,/01%66z<PI	 !') y!
 LN .'66tZ=MN))'*--. -	$fY&7			L.	<	 	" $Y788;M M1 1! !s$   D?E9E?EEE )-__doc__rD   r@   r   	threadingr   flaskr   r   r   r   r   estequiometria_configr   r	   r
   r   r   r   __name__bprA   dirnameabspath__file__
DIR_ACTUALjoinrU   r   r   r   r*   Lockr)   r&   r,   r9   rN   r[   rl   routern   r   r   r   rR   r'   r%   <module>r      sT    	    > >   ;GWW__RWW__X67
j*IJ'',,z+KL7 A 	9>>H
ED 
2 2 
#fX61 71, 
%x8- 9-, 
#fX6"9 7"9r'   