
    {j"                    ,   S r SSKJ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  \R                  " S\R                  5      rSrSS	 jrSS
 jrSSS.         SS jjrSSSSS.             SS jjrSSSSS.             SS jjrg)uS   Respuestas de formularios dinámicos (psicopedagogía) para el contexto del agente.    )annotationsN)Any)Session)DynamicFormModelDynamicFormSubmissionModelStudentModelz^(.+?):\s*\[(.+)\]\s*$u   PROHIBIDO copiar al Word las etiquetas LOGRADO, EN PROCESO o REQUIERE APOYO: tradúcelas a prosa profesional sobre el desempeño del estudiante.c                R   [        U R                  S5      =(       d    S5      R                  5       n[        U R                  S5      =(       d    S5      R                  5       nU(       aX  [        R                  " SU[        R
                  5      nX(       a  UR                  S5      R                  5       OU=(       d    S4$ [        R	                  U5      nU(       a>  UR                  S5      R                  5       UR                  S5      R                  5       4$ SU=(       d    S4$ )Nsection questionz
^\[(.+)\]$   (Sin texto)   )strgetstriprematchSgroup_BRACKET_RE)fieldr
   rawinnerr   s        _C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_dynamic_form_context.py_parse_questionr      s    %))I&,"-335G
eii
#)r
*
0
0
2CRTT25Q--/cSmSSc"E{{1~##%u{{1~';';'===s#m##    c                    U c  g[        U [        5      (       a  SR                  S U  5       5      $ [        U 5      R	                  5       $ )Nr   z, c              3     #    U  H>  n[        U5      R                  5       (       d  M#  [        U5      R                  5       v   M@     g 7f)N)r   r   ).0vs     r   	<genexpr>'_format_answer_value.<locals>.<genexpr>)   s*     IA#a&,,.Qs
   "A A)
isinstancelistjoinr   r   )values    r   _format_answer_valuer(   %   s?    }%yyIIIIu:r   )	school_idperiod_yearc                  U(       a  [        U5      S:  a  gU R                  [        R                  5      R	                  [        R
                  [        U5      :H  5      nUb+  UR	                  [        R                  [        U5      :H  5      nUb+  UR	                  [        R                  [        U5      :H  5      nUR                  5       SL$ )uM   True si el estudiante tiene al menos una respuesta en formularios dinámicos.r   FN)	intqueryr   idfilter
student_idr*   r)   first)dbr0   r)   r*   qs        r    student_has_dynamic_form_answersr4   -   s     Z1,
+../66"--Z@	A HH/;;s;?OOPHH/99S^KL779D  r   )student_namestudent_rutr)   r*   c          	     "   [        U UUUUUS9nU(       d  g[        U5      nUnUcp  U R                  [        5      R	                  [        R
                  U:H  5      R                  5       n	U	(       a&  U	R                  (       a  [        U	R                  5      nU R                  [        [        5      R                  [        [        R
                  [        R                  :H  5      R	                  [        R                  U:H  5      R	                  [        R                  R                  S5      5      n
Ub+  U
R	                  [        R                  [        U5      :H  5      n
Ub+  U
R	                  [        R                  [        U5      :H  5      n
/ nU
R!                  [        R
                  R#                  5       5      R%                  5        H  u  p UR&                  (       a   [(        R*                  " UR&                  5      O0 n[-        U[.        5      (       d  0 nUR5                  UR
                  UR6                  =(       d    SR9                  5       =(       d    SUR
                   3UR
                  UR                  =(       d    UR                  US.5        M     UU=(       d    SR9                  5       =(       d    SU=(       d    SR9                  5       =(       d    SUUS[;        U5      S.$ ! [(        R0                  [2        4 a    0 n Nf = f)uT   
Datos estructurados de respuestas de formularios para MCP.
None si no hay envíos.
)r0   r5   r6   r)   r*   Nr   Formulario #)formIdformNamesubmissionId
periodYearanswersdynamic_forms)	studentIdstudentName
studentRutformscontextsourcechars) build_dynamic_form_answers_blockr,   r-   r   r/   r.   r1   r)   r   r   r&   dynamic_form_idr0   deleted_dateis_r*   order_bydescallanswers_jsonjsonloadsr$   dictJSONDecodeError	TypeErrorappendnamer   len)r2   r0   r5   r6   r)   r*   blocksidresolved_schoolstudentr3   	forms_outsubformr=   s                  r   $collect_dynamic_form_answers_payloadr]   A   sl    -
!E 
j/CO((<(//30FGMMOw((!'"3"34O 	+-=>	#=#M#MM

 
*55<	=	 --11$7	8  HH/;;s;?OOP"HH%//33GGH&(IZZ : = = B B DEIIK		696F6Fdjj!1!12BGgt,, 	''!YY_"335Q<y9Q #!ooA1A1A"	
 L$ $*113;t"(b//19T!U  $$i0 	G	s   A
K//LLc          	        U(       a  [        U5      S:  a  g[        U5      nUnUcp  U R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       a&  UR                  (       a  [        UR                  5      nU R                  [        [        5      R                  [        [        R                  [        R                  :H  5      R                  [        R                  U:H  5      R                  [        R                  R                  S5      5      n	Ub+  U	R                  [        R                  [        U5      :H  5      n	Ub+  U	R                  [        R                  [        U5      :H  5      n	U	R                  [        R                  R!                  5       5      R#                  5       n
U
(       d  gU=(       d    SR%                  5       =(       d%    U=(       d    SR%                  5       =(       d    SU 3nS[&         3SU SU S3S	[)        U
5       3/nU
 GH  u  p UR*                  (       a   [,        R.                  " UR*                  5      O0 n[1        U[2        5      (       d  0 n UR8                  (       a   [,        R.                  " UR8                  5      O/ n[1        U[:        5      (       d  / nUR<                  =(       d    SR%                  5       =(       d    S
UR                   3nUR                  =(       d    UR                  =(       d    Sn[?        USS5      =(       d    SR%                  5       n[?        USS5      =(       d    SR%                  5       nSUR                   SU 3nU(       a  USU 3-  nU(       a  USU 3-  nURA                  SU SU S35        U Vs0 s HI  n[1        U[2        5      (       d  M  URC                  S5      c  M.  [E        URC                  S5      5      U_MK     nn/ nSn[G        5       nU Vs/ s HH  n[1        U[2        5      (       d  M  URC                  S5      c  M.  [E        URC                  S5      5      PMJ     nn[;        URI                  5       5       H/  n[E        U5      nUU;  d  M  UU;  d  M  URA                  U5        M1     U H  nUU;   a  M  URK                  U5        [M        URC                  U5      5      nU(       d  M?  URC                  U5      =(       d    0 n[O        [1        U[2        5      (       a  UO0 5      u  n n!U!(       a  U!S:X  a  Un!U (       a  U U:w  a  U nURA                  SU  35        URA                  SU! SU 35        M     U(       a1  URA                  SR                  U5      R%                  5       5        GM  URA                  S5        GM     SR                  U5      R%                  5       $ ! [,        R4                  [6        4 a    0 n GNf = f! [,        R4                  [6        4 a    / n GNrf = fs  snf s  snf )u   
Bloque de contexto con respuestas del formulario (Inf. Eval. Psicopedagógica → Formularios).
Se usa cuando el Excel/Files del agente no trae la fila del estudiante.
r   r   Nzstudent_id=uy  RESPUESTAS DEL FORMULARIO PIE360 (Inf. Eval. Psicopedagógica / Formularios). Fuente MCP: get_student_psychopedagogical_form_answers. Si hay VARIOS envíos del mismo estudiante (distinta área/especialidad), DEBES integrar TODOS en el informe psicopedagógico: detalla por área (p. ej. Fonoaudiología vs Terapia Ocupacional), coincidencias y diferencias; no ignores ninguna. zEstudiante: z (student_id=)u-   Cantidad de respuestas/áreas en formulario: r8   u   —	specialtyrespondent_namezid=u   , período u   , área=z, responde=z### Formulario: z (r.   r   u
   
Ámbito: z- z: 
u*   (Sin respuestas con valor en este envío.)z

)(r,   r-   r   r/   r.   r1   r)   r   r   r&   rG   r0   rH   rI   r*   rJ   rK   rL   r   _SCALE_HINTrU   rM   rN   rO   r$   rP   rQ   rR   fields_jsonr%   rT   getattrrS   r   r   setkeysaddr(   r   )"r2   r0   r5   r6   r)   r*   rW   rX   rY   r3   rowswhosectionsr[   r\   r=   fields	form_nameperiodareawho_respmetaffield_by_idlinescurrent_sectionseenordered_idsfidsid_keyr'   r   domainr   s"                                     r   rF   rF      s9    Z1,
j/CO((<(//30FGMMOw((!'"3"34O 	+-=>	#=#M#MM

 
*55<	=	 --11$7	8  HH/;;s;?OOP"HH%//33GGH::03388:;??AD2
$
$
&
\;+<"*C*C*E
\;WZV[I\C	 -	 se=Q/
7D	{C
H 		696F6Fdjj!1!12BGgt,,	595E5ETZZ 0 012Ffd++ YY_"++-I<y1I	=D$4$4=[$/52<<>C!2D9?RFFHTWWI[1htf%%Dk(,,D*9+RvQ?@ 
!T"  '(uuT{  Cda 	 

 17kA:a;N'STSXSXY]S^'s155;'k'C#hGd"wk'A""7+ (
 Cd{HHSM(S)9:EOOC(.BE.
5$8O8OuUWXFHx=8&O3"({6(34LL2hZr%12   OODIIe,2245OOHIw z ;;x &&((q $$i0 	G	 $$i0 	F	
 lsJ   =A
XA
X%Y$Y8Y+YYYX"!X"%YY)r   zdict[str, Any]returnztuple[str, str])r'   r   r{   r   )
r2   r   r0   r,   r)   
int | Noner*   r|   r{   bool)r2   r   r0   r,   r5   
str | Noner6   r~   r)   r|   r*   r|   r{   zdict[str, Any] | None)r2   r   r0   r,   r5   r~   r6   r~   r)   r|   r*   r|   r{   r   )__doc__
__future__r   rN   r   typingr   sqlalchemy.ormr   app.backend.db.models.pie_corer   r   r   compiler   r   rc   r   r(   r4   r]   rF    r   r   <module>r      sI   Y "  	  "  jj2BDD9J 	$ !"!! ! 	!
 ! 
!0  $" "GG G 	G
 G G G G\  $" "s)s) s) 	s)
 s) s) s) 	s)r   