
    &6j?                    0   S r SSKJr  SSKrSSKrSSKJrJr  SSKJr  SSK	J
r
JrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJr  SSKJr  SSKJrJr  SSKJrJr  SSK J!r!J"r"J#r#J$r$J%r%  SSK&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  Sr.SS jr/1 Skr0SS jr1 " S S5      r2g)z;Plantillas de pruebas informales reutilizables por colegio.    )annotationsN)datedatetime)Path)AnyDictListOptional)escape)Session)colors)	TA_CENTER
TA_JUSTIFYTA_LEFT)A4)getSampleStyleSheetParagraphStyle)cminch)SimpleDocTemplate	ParagraphSpacerTable
TableStyle)FolderModelInformalTestTemplateModel!InformalTestTemplateQuestionModelInformalTestSubmissionModelStudentAcademicInfoModelStudentModelStudentPersonalInfoModel+   c                <    [        U c  S5      $ [        U 5      5      $ )zOEscape text for ReportLab Paragraph (XML subset); prevents errors on <, &, etc. )r   str)values    bC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\informal_test_template_class.py_reportlab_paragraph_textr(   !   s    "663u:66    >   r   number	long_text
short_textsingle_choicemultiple_choicec                b    U c  g [        U S5      (       a  U R                  5       $ [        U 5      $ )N	isoformat)hasattrr0   r%   )vs    r'   _isor3   0   s,    yq+{{}q6Mr)   c                      \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrS S jrS!S jrS"S jrS S jr  S#               S$S jjrS%S jrS&S jrS&S jrSrg)'InformalTestTemplateClass8   c                    Xl         g Ndb)selfr:   s     r'   __init__"InformalTestTemplateClass.__init__9   s    r)   c                    U R                   R                  [        5      R                  [        R                  U:H  [        R
                  R                  S 5      5      $ r8   )r:   queryr   filter	school_iddeleted_dateis_)r;   rA   s     r'   _query_templates*InformalTestTemplateClass._query_templates<   sD    GGMM34V)33y@)66::4@	
r)   c                ,   U(       d  / $  [         R                  " U5      n[	        U[
        5      (       d  / $ / nU H  n[	        U[        5      (       d  M  [        UR                  S5      =(       d    S5      R                  5       n[        UR                  S5      =(       d    S5      R                  5       nU(       d	  U(       d  M  UR                  U=(       d    UU=(       d    US.5        M     U$ ! [         R                  [        4 a    / s $ f = f)Nlabelr$   r&   rG   r&   )jsonloadsJSONDecodeError	TypeError
isinstancelistdictr%   getstripappend)r;   rawarroutxrG   r&   s          r'   _parse_options(InformalTestTemplateClass._parse_optionsE   s    I	**S/C #t$$I$&Aa&&g,"-335Eg,"-335EJJ%%.5IJ  
 $$i0 	I	s   C4 4DDc           
     ,   U R                   R                  [        5      R                  [        R                  U:H  5      R                  [        R                  R                  5       [        R                  R                  5       5      R                  5       n/ nU Hv  nUR                  UR                  UR                  =(       d    SUR                  =(       d    S[        UR                  5      U R                  UR                   5      S.5        Mx     U$ )Nr$   r,   )idquestion_textquestion_typerequiredoptions)r:   r?   r   r@   template_idorder_byquestion_orderascrZ   allrR   r[   r\   boolr]   rW   options_json)r;   r_   rowsrU   rs        r'   _questions_for_template1InformalTestTemplateClass._questions_for_templateY   s    GGMM;<V5AA[PQX7FFJJLNoNrNrNvNvNxySU	 	 %'AJJ$$%&__%:%&__%D $QZZ 0#221>>B  
r)   c                   U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  gUR                  =(       d    SR                  5       nUR                  =(       d    SR                  5       nUR                  =(       d    SR                  5       nU SU 3R                  5       nU SU 3R                  5       $ )zUDisplay name from student_personal_data (StudentModel has no given names on the row).r$    )
r:   r?   r!   r@   
student_idfirstnamesrQ   father_lastnamemother_lastname)r;   rl   personal_inforn   fathermother	lastnamess          r'   _get_student_display_name3InformalTestTemplateClass._get_student_display_namem   s     GGMM23V,77:EFUW 	
 $$*113//52<<>//52<<>hax(..0	)%++--r)   c                   U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       aK  UR                  =(       d    SR                  5       (       a#  UR                  =(       d    SR                  5       $ U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       aK  UR                  =(       d    SR                  5       (       a#  UR                  =(       d    SR                  5       $ gNr$   )
r:   r?   r!   r@   rl   rm   identification_numberrQ   r    rZ   )r;   rl   rq   student_rows       r'   "_get_student_identification_number<InformalTestTemplateClass._get_student_identification_number|   s    GGMM23V,77:EFUW 	
 mAAGRNNPP!77=2DDFFggmmL188J9VW]]_K==CJJLL55;BBDDr)   c                2   Ub  US:X  a  g  [        U[        5      (       a  UR                  5       $ [        U[        5      (       a  U$ [        U5      R	                  5       S S n[        R
                  " US5      R                  5       $ ! [         a     g f = f)Nr$   
   z%Y-%m-%d)rM   r   r   r%   rQ   strptime	Exception)r;   birth_date_rawss      r'   _parse_birth_date+InformalTestTemplateClass._parse_birth_date   s    !^r%9	.(33%**,,.$//%%N#))+CR0A$$Q
388:: 		s   $B	 B	 A B	 	
BBc           	        U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  gU R                  UR                  5      nU(       d  g[        R                  " 5       nX4:  a  gUR                  UR                  -
  S-  UR                  UR                  -
  -   nUR                  UR                  :  a  US-  nUS-  nUS-  nUS:  a  gSS jnSS jn	US:X  a  US:X  a  gU SU" U5       3$ U(       a  U SU	" U5       SU SU" U5       3$ U SU	" U5       3$ )	zu
Age at PDF build time, as years and months (same idea as in documents).
Birth date: student_personal_data.born_date
r$         r   c                    U S:X  a  S$ S$ )Nr   mesmeses counts    r'   _month_unit_wordTInformalTestTemplateClass._format_student_age_years_months.<locals>._month_unit_word   s    !QJ53G3r)   c                    U S:X  a  S$ S$ )Nr   u   añou   añosr   r   s    r'   _year_unit_wordSInformalTestTemplateClass._format_student_age_years_months.<locals>._year_unit_word   s    "aZ64W4r)   rk   )r   intreturnr%   )r:   r?   r!   r@   rl   rm   r   	born_dater   todayyearmonthday)
r;   rl   rq   
birth_dater   total_monthsyearsmonthsr   r   s
             r'    _format_student_age_years_months:InformalTestTemplateClass._format_student_age_years_months   sL    GGMM23V,77:EFUW 	
 ++M,C,CD




Z__4:ekkJL\L\>\]99z~~%AL""19	4	5 A:{XQ/7899WAoe45Qvha@PQW@X?YZZ/%0122r)   c           	        UR                   UR                  UR                  =(       d    SUR                  =(       d    SU R	                  UR                   5      [        UR                  5      [        UR                  5      S.$ )Nr$   )rZ   rA   namedescription	questions
added_dateupdated_date)rZ   rA   r   r   rh   r3   r   r   )r;   rows     r'   _template_to_dict+InformalTestTemplateClass._template_to_dict   s]    &&HHN??0b55cff=s~~. !1!12
 	
r)   c                   / n[        U=(       d    / 5       GH'  u  p4[        U[        5      (       d  M  [        UR	                  S5      =(       d    S5      R                  5       n[        UR	                  S5      =(       d    S5      R                  5       n[        UR	                  S5      5      nUR	                  S5      =(       d    / nU(       d  [        SUS-    S35      eU[        ;  a  [        S	US-    S
35      e/ n	US;   Ga   [        U[        5      (       d  [        SUS-    S35      eU H  n
[        U
[        5      (       d  M  [        U
R	                  S5      =(       d    S5      R                  5       n[        U
R	                  S5      =(       d    S5      R                  5       nU(       d	  U(       d  M  U	R                  U=(       d    UU=(       d    US.5        M     [        U	5      S:  a  [        SUS-    S35      eUR                  US-   UUUU	(       a  [        R                  " U	SS9OS S.5        GM*     U$ )Nr[   r$   r\   r]   r^   zLa pregunta #r   z no tiene texto.u   Tipo inválido en pregunta #.)r-   r.   z requiere opciones.rG   r&   rH      z requiere al menos 2 opciones.Fensure_ascii)ra   r[   r\   r]   re   )	enumeraterM   rO   r%   rP   rQ   rd   
ValueError_VALID_QUESTION_TYPESrN   rR   lenrI   dumps)r;   r   rU   iqr[   r\   r]   options_rawr^   oprG   r&   s                r'   _normalize_questions.InformalTestTemplateClass._normalize_questions   s   $&io2.DAa&&o 6 <"=CCEMo 6 <"=CCEMAEE*-.H%%	*0bK  =Q7G!HII$99 #?Awa!HII,.G DD!+t44$}QUG;N%OPP%B%b$// w 526<<>Ew 526<<>E  NNU^eenu#UV & w<!#$}QUG;Y%Z[[JJ&'!e%2%2 (OVDJJwU$K\`3 /D 
r)   c                    U R                  U5      R                  [        R                  R	                  5       5      R                  5       nU Vs/ s H  o0R                  U5      PM     sn$ s  snf r8   )rD   r`   r   rZ   descrc   r   )r;   rA   rf   rg   s       r'   get_all!InformalTestTemplateClass.get_all   sW    $$Y/889R9U9U9Z9Z9\]aac3784a&&q)4888s   A,c                    U R                  U5      R                  [        R                  U:H  5      R	                  5       nU(       d  SSS S.$ SU R                  U5      S.$ )NerrorPlantilla no encontrada.statusmessagedatasuccessr   r   )rD   r@   r   rZ   rm   r   )r;   rZ   rA   r   s       r'   	get_by_id#InformalTestTemplateClass.get_by_id   s[    ##I.556O6R6RVX6XY__a%2LVZ[[#T-C-CC-HIIr)   c                    [        UR                  S5      =(       d    S5      R                  5       n[        UR                  S5      =(       d    S5      R                  5       =(       d    S n[        UR                  S5      =(       d    S5      =(       d    S n[        UR                  S5      =(       d    S5      =(       d    Sn[        UR                  S5      =(       d    S5      =(       d    S n[        UR                  S5      =(       d    S5      R                  5       =(       d    S nU(       d  S	S
S S.$ U R	                  UR                  S5      5      n	[
        R                  " 5       n
[        UUUU
U
S9nU R                  R                  U5        U R                  R                  5         U	 HE  nU R                  R                  [        UR                  US   US   US   US   US   U
U
S95        MG     U(       GaK  U R                  R                  [        5      R                  [        R                  U:H  5      R!                  5       nU(       Ga  U R                  R                  ["        5      R                  ["        R$                  U:H  ["        R&                  [(        :H  ["        R*                  R-                  S 5      5      R/                  ["        R0                  R3                  5       ["        R                  R3                  5       5      R!                  5       nU R                  R                  [4        5      R                  [4        R$                  U:H  5      R/                  [4        R                  R3                  5       5      R!                  5       n[        U=(       d    S5      =(       dE    [        [7        USS5      =(       d    S5      =(       d    [        [7        USS5      =(       d    S5      n[        [7        USS5      =(       d    S5      =(       di    [        [7        USS5      =(       d    S5      =(       dC    [        U=(       d    S5      =(       d(    [        [7        USS5      =(       d    S5      =(       d    S nUS;  a  [        U5      R                  5       OS =(       d[    U(       a6  [7        USS 5      (       a$  [        [7        USS5      5      R                  5       OS =(       d    [        U
R8                  5      n[;        UR                  UUU[<        R>                  " 0 SS9U
U
S S9nU R                  R                  U5        U R                  R                  5         U R                  R                  ["        5      R                  ["        R$                  U:H  ["        R&                  [(        :H  5      R/                  ["        R0                  R3                  5       5      R!                  5       nU(       a  UR0                  S-   OSnU R                  R                  [#        UUU[(        UUR                  USUU
U
S S95        U R                  RA                  5         U R                  RC                  U5        SSUR                  S .$ ! [D         a3  nU R                  RG                  5         S	[        U5      S S.s S nA$ S nAf[H         a3  nU R                  RG                  5         S	[        U5      S S.s S nA$ S nAff = f)!Nr   r$   r   rl   r   professional_idsession_course_idsession_period_yearr   El nombre es obligatorio.r   r   )rA   r   r   r   r   ra   r[   r\   re   r]   r_   ra   r[   r\   re   r]   r   r   rA   	course_idrx   period_yearFr   informal_test_template_idrA   rl   r   answers_jsonr   r   rB   r   informal_test_submissionrA   r   rl   document_id
version_id	detail_idr   filer   r   r   rB   r   zPlantilla creada.r   r   rZ   )%r%   rP   rQ   r   r   r   utcnowr   r:   addflushr   rZ   r?   r    r@   rm   r   rl   r    INFORMAL_TEST_FOLDER_DOCUMENT_IDrB   rC   r`   r   r   r   getattrr   r   rI   r   commitrefreshr   rollbackr   )r;   payloadrA   r   r   rl   r   r   r   r   nowr   r   studentlatest_folderstudent_academicresolved_school_idresolved_course_idresolved_period_yearempty_submissionlast_versionnew_versiones                          r'   storeInformalTestTemplateClass.store   s   s	Hw{{6*0b1779Dgkk-8>B?EEGO4KW[[6;!<DJ!'++.?"@"EAFK!O #GKK0C$D$I J Rd"%gkk2G&H&NB"O"U"U"W"_[_")6Q[_``11'++k2JKI//#C+#' C GGKKGGMMO5$'FF'()9':&'&8&'&8%&~%6!":#&%(	  ''--5<<\__PZ=Z[aack2'22j@'337WW'4488>
 "+"8"8"="="?ATATAVW " &>? 8 C Cz QR!":"="="B"B"DE	 % IN+ LwwQ?D1ELw}k1EJK ' GG[!<AB  w'7aHMAN 05A6  w}k1EJK    ' =PWa<a/0668gk,' S`dkly  |I  KO  eP  ePGM="EFLLN  VZ,' SXX	 )
 (C25&&"4#-(7%)ZZ%G#&%(%)	($ GGKK 01GGMMOk2'22j@'337WW "+"8"8"="="?@ ! DP<#:#:Q#>UVKGGKK#&8&8'1(H'2&6&9&9,;!;(<'*),)-  GGNNGGOOC '4GsvvVV 	HGG%#a&$GG 	HGG%#a&$GG	Hs7   D5Z 8UZ 
\
([
\

\
(\?\
\
c                    U R                  U5      R                  [        R                  U:H  5      R	                  5       nU(       d  SSS S.$ SU;   aD  [        UR                  S5      =(       d    S5      R                  5       nU(       d  SSS S.$ XTl        SU;   a?  [        UR                  S5      =(       d    S5      R                  5       =(       d    S Ul	        SU;   a  U R                  UR                  S5      5      nU R                  R                  [        5      R                  [        R                  UR                  :H  5      R                  S	S
9  [         R"                  " 5       nU HE  nU R                  R%                  [        UR                  US   US   US   US   US   UUS95        MG     [         R"                  " 5       Ul        U R                  R)                  5         SSUR                  S.$ ! [*         a3  n	U R                  R-                  5         S[        U	5      S S.s S n	A	$ S n	A	f[.         a3  n	U R                  R-                  5         S[        U	5      S S.s S n	A	$ S n	A	ff = f)Nr   r   r   r   r$   r   r   r   F)synchronize_sessionra   r[   r\   re   r]   r   r   zPlantilla actualizada.r   )rD   r@   r   rZ   rm   r%   rP   rQ   r   r   r   r:   r?   r   r_   deleter   r   r   r   r   r   r   r   )
r;   rZ   r   rA   r   r   r   r   r   r   s
             r'   update InformalTestTemplateClass.updateo  s   &	H''	299:S:V:VZ\:\]cceC")6PZ^__ 7;;v.4"5;;=&-:U_cdd'"%gkk-&@&FB"G"M"M"O"WSWg% 55gkk+6NO	?@GG5AASVVK&U&3oo'"AGGKK9(++,-=+>*+O*<*+O*<)*>):%&z]'*),	 #  (0CGGNN'4LTWTZTZ[[ 	HGG%#a&$GG 	HGG%#a&$GG	Hs>   AG= AG= E*G= =
I5(H5/I55I5(I0*I50I5c                    U R                  U5      R                  [        R                  U:H  5      R	                  5       nU(       d  SSS S.$ [
        R                  " 5       Ul        [
        R                  " 5       Ul        U R                  R                  5         SSS.$ ! [         a3  nU R                  R                  5         S[        U5      S S.s S nA$ S nAff = f)Nr   r   r   r   zPlantilla eliminada.)r   r   )rD   r@   r   rZ   rm   r   r   rB   r   r:   r   r   r   r%   )r;   rZ   rA   r   r   s        r'   r    InformalTestTemplateClass.delete  s    
	H''	299:S:V:VZ\:\]cceC")6PZ^__'0C'0CGGNN'4JKK 	HGG%#a&$GG	Hs%   AB! AB! !
C+(CCCNc                    U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  SSS S.$ U R                   R                  [        5      R                  [        R                  U:H  [        R                  R                  S 5      5      R                  [        R                  R                  5       [        R                  R                  5       5      R                  5       n	U R                   R                  [        5      R                  [        R                  U:H  5      R                  [        R                  R                  5       5      R                  5       n
[        U=(       d    S5      =(       dE    [        [        USS5      =(       d    S5      =(       d    [        [        U	SS5      =(       d    S5      n[        [        USS5      =(       d    S5      =(       di    [        [        U
SS5      =(       d    S5      =(       dC    [        U=(       d    S5      =(       d(    [        [        U	SS5      =(       d    S5      =(       d    S nUS;  a  [!        U5      R#                  5       OS =(       dn    U	(       a6  [        U	SS 5      (       a$  [!        [        U	SS	5      5      R#                  5       OS =(       d(    [!        [$        R&                  " 5       R(                  5      n[        U=(       d    S5      =(       d    SnU R+                  U5      R                  [,        R                  U:H  5      R                  5       nU(       d  SS
S S.$ [$        R&                  " 5       n[/        U[0        5      (       a  UO0 nU R                   R                  [2        5      R                  [2        R4                  U:H  [2        R6                  U:H  [2        R                  U:H  [2        R                  R                  S 5      5      R                  [2        R                  R                  5       5      R                  5       nU(       a)  UUl        [:        R<                  " USS9Ul        UUl         OX[3        UUUU[:        R<                  " USS9UUS S9nU R                   RC                  U5        U R                   RE                  5         U R                   R                  [        5      R                  [        R                  U:H  [        RF                  [H        :H  [        RJ                  UR                  :H  [        R                  R                  S 5      5      R                  [        R                  R                  5       [        R                  R                  5       5      R                  5       nU(       a+  UUl        UUl&        UUl        UUl'        SUl(        UUl         OU R                   R                  [        5      R                  [        R                  U:H  [        RF                  [H        :H  5      R                  [        R                  R                  5       5      R                  5       nU(       a  UR                  S-   OSn[        UUU[H        UUR                  USUUUS S9nU R                   RC                  U5        U R                   RS                  5         U R                   RU                  U5        SSUR                  S.$ ! [V         a3  nU R                   RY                  5         S[!        U5      S S.s S nA$ S nAff = f)Nr   zEstudiante no encontrado.r   r   rA   r   rx   r   r$   r   Fr   r   r   r   r   r   zRespuestas guardadas.r   )-r:   r?   r    r@   rZ   rm   r   rl   rB   rC   r`   r   r   r   r   r   r%   rQ   r   r   r   rD   r   rM   rO   r   r   rA   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r;   r_   rA   rl   r   answersr   r   r   r   r   r   r   r   resolved_professional_idtemplater   r   r   linked_folderr   r   
folder_rowr   s                           r'   submit_answers(InformalTestTemplateClass.submit_answers  s   A	Hl+:56 
 ")6Q[_`` k***j8,,006 +005579L9L9NO  670;;zIJ255::<=	  IN# DwwQ7<1=Dw}k1=BC  GG[!49: w/a@EAF(-A. w}k1=BC   5Hz4Y'(..0_c$- KX\cdq  tA  CG  ]H  ]HGM="=>DDF  NR$- X__&++,	 !
 (+?+?a'@'EA$,,-?@GGHaHdHdhsHstzz|H")6PZ^__//#C!+GT!:!:gG9:/II[X/99=OO/::jH/<<@@F	 588==?@  &>##'::gE#J #& 1.90)$<!%G%!H"!$!%	 C  k***j8++/OO))SVV3,,006	 +005579L9L9NO  *<'*<'0H-,@)%?"-0* GGMM+.V#..*<#//3SS Xk4499;<UW  @L|66:QR(00) @*!ff$<3 4"!$!%
 J'GGNNGGOOC '4KSVSYSYZZ 	HGG%#a&$GG	Hs,   A\$ L\$ 5N.\$ $
]!.(]]!]!c                <   U R                   R                  [        [        5      R	                  [        [        R
                  [        R                  :H  5      R	                  [        [        R                  [        R
                  :H  5      R                  [        R                  U:H  [        R                  U:H  [        R                  R                  S 5      [        R                  R                  S 5      [        R                  U:H  [        R                  [        :H  [        R                  R                  S 5      5      R!                  [        R
                  R#                  5       5      R%                  5       n0 nU H  u  pV['        UR
                  5      nXt;   a  M!  UR
                  UR
                  UR(                  =(       d    SUR
                   3UR*                  =(       d    S[-        UR.                  5      S.XG'   M     [1        UR3                  5       5      $ )NzPrueba r$   )submission_idr_   r   r   r   )r:   r?   r   r   joinrZ   r   r   r   r@   rA   rl   rB   rC   r   r   r`   r   rc   r   r   r   r3   r   rN   values)r;   rA   rl   rf   latest_by_template
submissionr   t_ids           r'   get_student_submissions1InformalTestTemplateClass.get_student_submissions2  s   GGMM57PQT)),,0K0e0ee T%%)D)G)GG V+55B+66*D+88<<TB)66::4@&&*4''+KK((,,T2 X14499;<SU) 	, 9;$( Jx{{#D)!+'{{ @78;;-)@'339r":#8#89($	 %) &--/00r)   c                   U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  [        R                  U:H  [        R                  R                  S 5      5      R                  [        R                  R                  5       5      R                  5       nU(       d  SS S.$  [        R                  " UR                  =(       d    S5      n[%        U[&        5      (       d  0 nSUR                  U[)        UR*                  5      S.S.$ ! [        R                   ["        4 a    0 n N[f = f)Nr   r   {})rZ   r   r   )r:   r?   r   r@   rA   r   rl   rB   rC   r`   rZ   r   rm   rI   rJ   r   rK   rL   rM   rO   r3   r   )r;   rA   r_   rl   r   r   s         r'   get_latest_submission_answers7InformalTestTemplateClass.get_latest_submission_answersW  s   GGMM56V+55B+EET+66*D+88<<TB	 X14499;<UW 	 '66	jj!1!1!9T:G '4((Gff" $S%5%5 6
 	
	 $$i0 	G	s   )D. .EEc                >   U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  [        R                  R                  S5      5      R                  [        R                  R                  5       5      R                  5       nU(       d  SSSS.$ [        UR                  =(       d    S5      =(       d    [        U=(       d    S5      nU(       d  SSSS.$ U R                  U5      R                  [        R                  U:H  5      R                  5       nU(       d  SSSS.$  [         R"                  " UR$                  =(       d    S5      n[+        U[,        5      (       d  0 nU R/                  U5      nU R1                  U5      n	U R3                  U5      n
UR4                  =(       d    S	R7                  5       =(       d    S
nU R9                  U5      n [:        R<                  " SSS9n[?        UR4                  5      nURA                  5         [C        [E        U5      [F        S[H        -  S[H        -  S[H        -  S[H        -  S9n[K        5       n[M        SUS   S[N        RP                  " S5      S[R        SS9n[M        SUS   S[N        RP                  " S5      SSS[T        [N        RP                  " S5      SS9
n[M        SUS   S[N        RP                  " S5      [V        S S!9nSCS" jnS#[H        -  S$[H        -  /n/ nURY                  [[        []        U5      U5      5        URY                  [_        S%S&[`        -  5      5        URY                  [[        S'U5      5        URY                  [_        S%S([`        -  5      5        S)[[        []        U	=(       d    S*5      U5      /S+[[        []        U=(       d    S*5      U5      /S,[[        []        U
=(       d    S*5      U5      /S-[[        []        [b        Rd                  " 5       Rg                  S.5      5      U5      //n[i        UUS/9nURk                  U" 5       5        URY                  U5        URY                  [_        S%S0[`        -  5      5        URY                  [[        S1U5      5        URY                  [_        S%S([`        -  5      5        / nU(       d&  URY                  S2[[        []        S35      U5      /5        [m        US%5       GHe  u  nn[E        URo                  S45      =(       d    S5U 35      nURo                  U5      n[+        U[p        5      (       aU  S6Rs                  U Vs/ s H.  n[E        U5      R7                  5       (       d  M#  [E        U5      PM0     sn5      =(       d    S*nO<Ub7  [E        U5      R7                  5       (       a  [E        U5      R7                  5       OS*nURo                  S75      =(       d    S	R7                  5       =(       d    S*n URY                  S8U S93[[        []        U 5      U5      /5        URY                  S:[[        []        U5      U5      /5        GMh     [i        UUS/9n!U!Rk                  U" 5       5        URY                  U!5        URu                  U5        S>U S?U S3n#S@[E        U5      U#SA.SB.$ ! [         R&                  [(        4 a    0 n GNzf = fs  snf ! [v         a  n"SS;[E        U"5       3S<SS=.s Sn"A"$ Sn"A"ff = f)Du   
Genera PDF de la última submission del estudiante para la plantilla.
No exige que school_id coincida con el del estudiante: se toma el de la submission (o respaldo).
Nr   z7No se encontraron respuestas para generar el documento.r   r   u3   No se pudo determinar el colegio de la evaluación.r   r	  r$   	DocumentoFz.pdf)r   suffixr   )pagesizerightMargin
leftMargin	topMarginbottomMarginInformalPdfTitleHeading1   z#000000   Helvetica-Bold)parentfontSize	textColor
spaceAfter	alignmentfontNameInformalPdfSectionNormalr      z#E8E8E8   )	r  r  r  r  spaceBeforer  r  	backColorborderPaddingInformalPdfNormalr~      )r  r  r  r  leadingc                     [        SSS[        R                  " S5      4SSS[        R                  4SSS	S
SSSSS[        R                  4S/	5      $ )N
BACKGROUNDr   r   r   z#f0f0f0	TEXTCOLORr-  r-  )ALIGNr+  r/  LEFT)FONTNAMEr+  r,  r  )FONTSIZEr+  r/  r~   )BOTTOMPADDINGr+  r/     )
TOPPADDINGr+  r/  r5  GRIDr   )VALIGNr+  r/  TOP)r   r   HexColorblackr   r)   r'   _table_styleGInformalTestTemplateClass.generate_submission_pdf.<locals>._table_style  s]    !%vw	8RS$fhE;G:>;1fllC;
 r)         r   g333333?u   I. IDENTIFICACIÓNg333333?zRUT:-zEstudiante:zEdad:zFecha:z%d/%m/%Y %H:%M)	colWidthsg      ?zII. RESPUESTAS DEL CUESTIONARIOzNota:z.Esta plantilla no tiene preguntas registradas.rZ   q_z, r[   z	Pregunta :z
Respuesta:zError al generar el PDF: i  )r   r   http_statusr   informal_test__r   )	file_pathfilenamer   )r   r   )<r:   r?   r   r@   r   rl   rB   rC   r`   rZ   r   rm   r   rA   rD   r   rI   rJ   r   rK   rL   rM   rO   ru   r{   r   r   rQ   rh   tempfileNamedTemporaryFiler   closer   r%   r   r   r   r   r   r:  r   r   r   rR   r   r(   r   r   r   r   strftimer   setStyler   rP   rN   r  buildr   )$r;   rA   r_   rl   r  resolved_schooltemplate_rowr   student_namestudent_identification_numberstudent_ageheader_titler   tmptmp_pathdocstylestitle_stylesection_stylenormal_styler<  
col_widthsstory	meta_rows
meta_tablequestion_rowsidxquestionkeyrS   rV   r&   r[   questions_tabler   rH  s$                                       r'   generate_submission_pdf1InformalTestTemplateClass.generate_submission_pdft  s'    GGMM56V+EET+66*D+88<<TB
 X14499;<UW 	 %2kuyzzj227a8OC	Q<O%2gquvv !!/2V-00K?@UW 	
 %2LVZ[[	jj!8!8!@DAG '4((G55jA(,(O(OPZ([%;;JG$))/R668GK00=	E	--U6JCCHH~HIIK $HFr6b&VC )*F("j) //)4#)K +$h' //)4)! //)4M *#h' //)4$L b&"r'*JELL#<\#JKXYLL3:./LL#7GHLL4$;/0 #<=Z=a^a#bdpqr	*CLDWTW*XZf gh78JsK\Z
 1(,,.2I2IJZ2[\$$I yJ?J/LL$LL4$;/0LL#DmTULL4$;/0')M$$!";<l"mo{| "+9a!8X(,,t,:"SE
;kk#&c4(( IIs&Ms!c!fllnvs1vs&MNURUE03CHNNDTDTCHNN,Z]E!)o!>!D" K K M TQT$$#C5*!";M"JLY $$$!";E"BLQ "9* $MZHO$$\^4LL)IIe $J<qTB ]$
 	
i $$i0 	G	j 'N,  	!6s1vh?"	 	sJ   	)[ :M/[5 )"[0
[0
D[5 [-,[-0[5 5
\?\\\r9   )r:   r   )rA   r   )rS   Optional[str]r   zList[Dict[str, str]])r_   r   r   List[Dict[str, Any]])rl   r   r   r%   )r   r   r   zOptional[date])r   r   r   Dict[str, Any])r   zOptional[List[Dict[str, Any]]]r   rh  )rA   r   r   rh  )rZ   r   rA   r   r   r   )r   ri  rA   r   r   r   )rZ   r   r   ri  rA   r   r   r   )NN)r_   r   rA   r   rl   r   r   Optional[int]r   ri  r   rj  r   rg  r   r   )rA   r   rl   r   r   rh  )rA   r   r_   r   rl   r   r   ri  )__name__
__module____qualname____firstlineno__r<   rD   rW   rh   ru   r{   r   r   r   r   r   r   r   r   r   r   r  r
  re  __static_attributes__r   r)   r'   r5   r5   8   s    
((.&3P	
$L9JtHl'HRH( ,0-1KHKH KH 	KH
 'KH  KH )KH +KH 
KHZ#1J
:z
r)   r5   )r&   r   r   r%   )r2   r   r   rg  )3__doc__
__future__r   rI   rI  r   r   pathlibr   typingr   r   r	   r
   xml.sax.saxutilsr   sqlalchemy.ormr   reportlab.libr   reportlab.lib.enumsr   r   r   reportlab.lib.pagesizesr   reportlab.lib.stylesr   r   reportlab.lib.unitsr   r   reportlab.platypusr   r   r   r   r   app.backend.db.modelsr   r   r   r   r   r    r!   r   r(   r   r3   r5   r   r)   r'   <module>r}     sp    A "   #  , , # "   > > & D ( V V   $&  7
 v
 v
r)   