
    iw[                     $   d Z ddlmZmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZmZ d Zdee   d	ee   fd
ZdZdZ ed      Zh dZdeded	efdZded	ee   fdZded	ee   fdZded	ee   fdZded	efdZded	efdZ G d d      Zy)uR   Document 27: Psychopedagogical Evaluation Information – info + scale (VII/VIII).    )datetimedate)Path)OptionalAnyList)Session)$PsychopedagogicalEvaluationInfoModel%PsychopedagogicalEvaluationScaleModelFolderModelc                 ^    | y t        | d      r| j                         S | rt        |       S d S )N	isoformat)hasattrr   str)vs    _/var/www/pie360backend.cl/public_html/app/backend/classes/psychopedagogical_evaluation_class.py_serialize_dater      s1    yq+{{}3q6 D     sreturnc                    |  t        | t              r| j                         sy t        | t              r| S 	 t	        j
                  | j                         d d d      j                         S # t        t        f$ r Y y w xY w)N
   z%Y-%m-%d)
isinstancer   stripr   r   strptime
ValueError	TypeError)r   s    r   _parse_dater      sn    yZ3'	!T  3B<AACC	" s   4A, ,A>=A>)pedagogicalsocial_communicative)123N/Ozfiles/system/students>   .bmp.gif.jpg.png.jpeg.webp
student_idfilenamec                     |xs dj                         }|r$t        |      j                  |k7  sd|v sd|v sd|v ryt        |      j                  j	                         t
        vry|j                  |  d      S )N z../\F_)r   r   namesuffixlower_DOC27_COGNITIVE_IMAGE_EXTS
startswith)r+   r,   fns      r   !_psychoped_iv_image_filename_safer8   (   sn    
.b			!Bb"$
cRi42:Bx&AA==J<q)**r   valuec                 t    | yt        | t              r| n
t        |       }|j                         }|dk(  rdS |S )u:   Cortos (nombres, códigos): trim extremos; vacío -> None.Nr.   )r   r   r   r9   r   s     r   _optional_short_strr<   1   s:    }E3'SZA		A74!!r   c                 T    | yt        | t              r| n
t        |       }|dk(  rdS |S )z
    Textos largos y HTML (TipTap): sin strip() para no perder espacios/saltos al inicio/fin ni NBSP.
    Solo '' o None se guardan como NULL.
    Nr.   )r   r   r;   s     r   _optional_longtextr>   :   s1    
 }E3'SZA74!!r   datac                    | j                  d      r)t        | d   t              rt        | d         dkD  r| d   S g }t	        dd      D ]  }d| }| j                  |      }|t        |      j                         dk7  s9t        |      j                         }|j                         dk(  s|dk(  rd}|j                  d||d	        t	        dd      D ]  }d
| }| j                  |      }|t        |      j                         dk7  s9t        |      j                         }|j                         dk(  s|dk(  rd}|j                  d||d	        |S )zwConstruye el array scales desde claves planas del frontend (pedagogical_scale_1..10, social_communicative_scale_1..10).scalesr         pedagogical_scale_r.   r$   r   )
scale_typeindicator_numberr9   social_communicative_scale_r    )	getr   listlenranger   r   upperappend)r?   rA   ikeyvalr   s         r   _build_scales_from_flatrQ   E   sN   xxjh>3tH~CVYZCZH~F1b\ \"1#&hhsm?s3x~~/25C AwwyE!Q%ZMMAXYZ[\ 1b\ e+A3/hhsm?s3x~~/25C AwwyE!Q%ZMM)?UVabcde Mr   rowc                 X   i d| j                   d| j                  d| j                  d| j                  dt	        | j
                        d| j                  dt	        | j                        d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                   d| j"                  | j$                  | j&                  | j(                  | j*                  | j,                  | j.                  | j0                  | j2                  | j4                  | j6                  | j8                  | j:                  | j<                  t	        | j>                        t	        | j@                        dS )Nidr+   social_nameageevaluation_date	diagnosisdiagnosis_issue_dateadmission_typeadmission_type_otherinstruments_appliedschool_history_backgroundcognitive_analysiscognitive_quantitative_matrixcognitive_general_scales!cognitive_quantitative_image_filepersonal_analysismotor_analysis)cognitive_synthesispersonal_synthesismotor_synthesissuggestions_to_schoolsuggestions_to_classroom_teamsuggestions_to_studentsuggestions_to_familyother_suggestions
conclusionprofessional_id"professional_identification_number professional_registration_numberprofessional_specialty
created_at
updated_at)!rT   r+   rU   rV   r   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rR   s    r   _info_to_dictrt   ]   s   !cff!cnn! 	s! 	sww	!
 	?3+>+>?! 	S]]! 	0H0H I! 	#,,! 	 8 8! 	s66! 	$S%B%B! 	c44! 	()J)J! 	#C$@$@! 	,S-R-R!  	S22!!" 	#,,#!$  #66!44..!$!:!:),)J)J"%"<"<!$!:!: 22nn...1.T.T,/,P,P"%"<"<%cnn5%cnn5A! !r   c                     | j                   | j                  | j                  | j                  | j                  t        | j                        dS )N)rT   $psychopedagogical_evaluation_info_idrE   rF   r9   rq   )rT   rv   rE   rF   r9   r   rq   rs   s    r   _scale_to_dictrw      s?    ff030X0Xnn00%cnn5 r   c            
          e Zd ZdefdZdedee   fdZdede	fdZ
dded	ede	fd
Z	 ddedededee   fdZdedededee   fdZdedee   ddfdZdeddfdZdede	fdZdedede	fdZdede	fdZdedee   fdZdede	fdZy) PsychopedagogicalEvaluationClassdbc                     || _         y N)rz   )selfrz   s     r   __init__z)PsychopedagogicalEvaluationClass.__init__   s	    r   eval_info_idr   c                 0   | j                   j                  t              j                  t        j                  |k(        j                  t        j                  t        j                        j                         }|D cg c]  }t        |       c}S c c}w r|   )
rz   queryr   filterrv   order_byrE   rF   allrw   )r}   r   rowsrs       r   _get_scalesz,PsychopedagogicalEvaluationClass._get_scales   so    GGMM?@V9^^bnnoX5@@5FF SU 	 ,00aq!000s   >BrT   c                 T   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sddddS t        |      }| j                  |j                        |d<   d|dS # t        $ r}dt        |      ddcY d}~S d}~ww xY w)u,   Obtiene evaluación por id (incluye scales).errorRegistro no encontrado.Nstatusmessager?   rA   successr   r?   )
rz   r   r
   r   rT   firstrt   r   	Exceptionr   )r}   rT   rR   r?   es        r   	get_by_idz*PsychopedagogicalEvaluationClass.get_by_id   s    	H''-- DELLMqMtMtxzMz{  B  B  DC")6OY]^^ %D!--cff5DN'66 	H%#a&$GG	Hs$   AB -B 	B'B"B'"B'r+   latest_onlyc                 `   	 | j                   j                  t              j                  t        j                  |k(        j                  t        j                  j                               }|rE|j                         }|sdddS t        |      }| j                  |j                        |d<   d|dS |j                         }g }|D ]<  }t        |      }| j                  |j                        |d<   |j                  |       > d|dS # t        $ r}	dt        |	      g dcY d}	~	S d}	~	ww xY w)uc   Lista evaluaciones del estudiante; si latest_only=True devuelve solo la más reciente (con scales).r   Nr   rA   r   r   )rz   r   r
   r   r+   r   rT   descr   rt   r   r   rM   r   r   )
r}   r+   r   qrR   r?   r   resultdr   s
             r   get_by_student_idz2PsychopedagogicalEvaluationClass.get_by_student_id   s   	FBCJJ4??:Mh;>>CCEF  ggi&/>>$S)!%!1!1#&&!9X"+T::557DF !!#&"..svv6(a ! (88 	F%#a&"EE	Fs+   BD -D 3AD 	D-D("D-(D-question_keyexclude_student_idlimitc                 X   t        t        |      sg S 	 t        t        |      }| j                  j	                  t              j                  t        j                  |k7  |j                  d      |dk7        j                  t        j                  j                               j                  |      j                         }g }|D ]S  }t        ||d      }|st        |t              s$|j                         s5|j!                  |j                                U |S # t"        $ r g cY S w xY w)u   
        Obtiene respuestas de otros estudiantes para la misma pregunta (campo),
        hasta un máximo de 20, para que la IA vea ejemplos y sepa qué contestar.
        Solo devuelve el texto del campo, sin datos que identifiquen al estudiante.
        Nr.   )r   r
   getattrrz   r   r   r+   isnotr   rT   r   r   r   r   r   r   rM   r   )	r}   r   r   r   columnr   outrR   rP   s	            r   !get_sample_responses_for_questionzBPsychopedagogicalEvaluationClass.get_sample_responses_for_question   s     ;\JI	A<PFBC8CCGYYLL&bL
 >AAFFHIu  C ,c<6:c3/CIIKJJsyy{+, J 	I	s$   CD D 'D 8"D D)(D)rE   rF   r9   c                 d    |t         vr	dt          S d|cxk  rdk  sy y|t        vr	dt         S y )Nzscale_type debe ser rB   r   z(indicator_number debe estar entre 1 y 10zvalue debe ser uno de )VALID_SCALE_TYPESVALID_VALUES)r}   rE   rF   r9   s       r   _validate_scalez0PsychopedagogicalEvaluationClass._validate_scale   sK    ..)*;)<==%++= ,=$+L>::r   rA   Nc           
      4   | j                   j                  t              j                  t        j                  |k(        j                  d       t        j                         }|xs g D ]  }|j                  d      xs dj                         }t        |j                  dd            }|j                  d      xs dj                         }| j                  |||      }|rt        |      | j                   j                  t        |||||              y )	NF)synchronize_sessionrE   r.   rF   r   r9   )rv   rE   rF   r9   rq   )rz   r   r   r   rv   deleter   utcnowrH   r   intr   r   add)	r}   r   rA   nowr   rE   rF   r9   errs	            r   _save_scalesz-PsychopedagogicalEvaluationClass._save_scales   s    ;<CC1VVZff	

&U&
+oo2 	A%%-3::<J"155);Q#?@UU7^)r002E&&z3CUKC o%GGKK=5A%!1 	r   r?   c                 (    d|vrd|v r	|d   |d<   yyy)uK   Asegura que motor_analysis esté en data (por si viene como moto_analysis).rc   moto_analysisN )r}   r?   s     r   _normalize_motor_analysisz:PsychopedagogicalEvaluationClass._normalize_motor_analysis   s*    4'Ot,C%)/%:D!" -D'r   c           
      
   	 | j                  |       t        |j                  d            }|sddddS | j                  j	                  t
              j                  t
        j                  |k(        j                  t
        j                  j                               j                         }|r| j                  |j                  |      S t        d)i d|dt        |j                  d            dt        |j                  d            dt        |j                  d            d	t        |j                  d	            d
t        |j                  d
            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            dt        |j                  d            d|j                  d      t        |d         nddt        |j                  d            d t        |j                  d             d!t        |j                  d!            d"t!        j"                         d#t!        j"                         }| j                  j%                  |       | j                  j'                          t)        |      }|r| j+                  |j                  |       | j                  j-                          | j                  j/                  |       t1        |      }| j3                  |j                        |d$<   d%d&|j                  |d'd(S # t4        $ r3}| j                  j7                          dt9        |      ddcY d}~S d}~wt:        $ r3}| j                  j7                          dt9        |      ddcY d}~S d}~ww xY w)*uo   Crea o actualiza evaluación por estudiante: si ya existe una para el student_id, se actualiza; si no, se crea.r+   r   zstudent_id es requerido.Nr   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rA   r   u   Evaluación creada.Tr   r   rT   r?   createdr   )r   r   rH   rz   r   r
   r   r+   r   rT   r   r   updater<   r   r>   r   r   r   flushrQ   r   commitrefreshrt   r   r   rollbackr   r   )r}   r?   r+   existingrR   rA   r   r   s           r   storez&PsychopedagogicalEvaluationClass.store  s   ?	H**40TXXl34J")6PZ^__ BC<GG:UV>AAFFHI	  {{8;;556  % /0GH  (8  !,DHH5F,G H	 
 .dhh{.CD  &1:P1Q%R   3488<L3MN  &9BX9Y%Z  %7txx@U7V$W  +=TXXFa=b*c  $6dhh?S6T#U  /AJiAj.k  *<DHHE_<`)a  3FdhhOrFs2t  #5TXX>Q5R"S    2$((;K2LM! " %7txx@U7V$W# $ $6dhh?S6T#U% & !3488<M3N O' ( '9BY9Z&[) * /AJiAj.k+ , (:$((C[:\']- . '9BY9Z&[/ 0 #5TXX>Q5R"S1 2 .dhh|.DE3 4 AEIZ@[@gD):$; <mq5 6 4GtxxPtGu3v7 8 2ETXXNpEq1r9 : (;488D\;]'^; < $??,= > $??,? CB GGKKGGMMO,T2F!!#&&&1GGNNGGOOC $C ,,SVV4CM'4IQTQWQWadquvv 	HGG%#a&$GG 	HGG%#a&$GG	Hs<   2S
 BS
 O>S
 
	U (T;U U (T;5U ;U c                   
 	 | j                         | j                  j                  t              j	                  t        j
                  |k(        j                         

sddddS 
fd}
fd}
fd}
fd} |d	d	        |d
d
        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |dd        |d d         |d!d!        |d"d"        |d#d#        |d$d$       t        j                         
_	        d%v r3t        d%   t              r | j                  
j
                  d%          n)t              }|r| j                  
j
                  |       | j                  j                          | j                  j                  
       t!        
      }| j#                  
j
                        |d%<   d&d'||d(d)S # t$        $ r3}	| j                  j'                          dt)        |	      ddcY d}	~	S d}	~	wt*        $ r3}	| j                  j'                          dt)        |	      ddcY d}	~	S d}	~	ww xY w)*uD   Actualiza evaluación por id (y reemplaza scales si vienen en data).r   r   Nr   c                 B    | vry t        |t        |                 y r|   )setattrr<   rO   attrr?   rR   s     r   set_strz8PsychopedagogicalEvaluationClass.update.<locals>.set_strM  s#    d?T#6tCy#ABr   c                 B    | v rt        |t        |                 y y r|   )r   r>   r   s     r   set_longtextz=PsychopedagogicalEvaluationClass.update.<locals>.set_longtextR  s%    $;C'9$s)'DE r   c                 N    | v r |    t        |t        |                 y y y r|   )r   r   r   s     r   set_datez9PsychopedagogicalEvaluationClass.update.<locals>.set_dateV  s/    $;49#8C{49'=> $9;r   c                 P    | v r!t        ||    t        |          nd        y y r|   )r   r   r   s     r   set_intz8PsychopedagogicalEvaluationClass.update.<locals>.set_intY  s/    $;Cc9Ns49~TXY r   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rA   r   u   Evaluación actualizada.Fr   )r   rz   r   r
   r   rT   r   r   r   rr   r   rI   r   rQ   r   r   rt   r   r   r   r   r   )r}   rT   r?   r   r   r   r   rA   r   r   rR   s     `       @r   r   z'PsychopedagogicalEvaluationClass.updateE  s   D	H**40''-- DELLMqMtMtxzMz{  B  B  DC")6OY]^^C
F?Z M=1E5!&(9:K-+-CD$&67*,BC.0EF46QR-/CD8:YZ35OP79\],.AB)+;<.0EF-/CD*,=>02IJ8:YZ13KL02IJ,.AB|4%'898:^_68Z[,.FG%__.CN4JtH~t$D!!#&&$x.906%%cfff5GGNNGGOOC $C ,,SVV4CM'4NVXberwxx 	HGG%#a&$GG 	HGG%#a&$GG	Hs7   A%I *G2I 	K&(JKK (KKKc                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS | j                   j                  |       | j                   j                          dddS # t        $ r2}| j                   j                          dt        |      dcY d}~S d}~ww xY w)u2   Elimina evaluación por id (cascade borra scales).r   r   )r   r   r   u   Evaluación eliminada.N)rz   r   r
   r   rT   r   r   r   r   r   r   )r}   rT   rR   r   s       r   r   z'PsychopedagogicalEvaluationClass.delete  s    		:''-- DELLMqMtMtxzMz{  B  B  DC")6OPPGGNN3GGNN'4LMM 	:GG%#a&99	:s$   AB 9B 	C'C CCc                    | j                   j                  t              j                  t        j                  |k(        j                  t        j                  j                               j                         }|rat        |dd      xs dj                         }|r@t        ||      r4t        |z  }	 |j                         rt        |j                               S 	 | j                   j                  t"              j                  t"        j                  |k(  t"        j$                  dk(  t"        j&                  j)                  d      t"        j*                  j-                  d            j                  t"        j.                  j                               j1                         D ]  }|j&                  xs dj                         }|r)t3        |      j4                  j7                         t8        vrMt        ||      sZt        |z  }	 |j                         rt        |j                               c S  y# t         $ r Y dw xY w# t         $ r Y w xY w)u   
        Ruta absoluta de la imagen IV: primero `cognitive_quantitative_image_file` en la evaluación;
        si no hay o el archivo falta, la última imagen en `folders` para documento catálogo 27.
        ra   Nr.      )rz   r   r
   r   r+   r   rT   r   r   r   r   r8   _STUDENTS_FILES_DIRis_filer   resolveOSErrorr   document_idfiler   deleted_dateis_
version_idr   r   r3   r4   r5   )r}   r+   rR   r7   p
folder_rowfn2p2s           r   %get_cognitive_quantitative_image_pathzFPsychopedagogicalEvaluationClass.get_cognitive_quantitative_image_path  s    GGMM>?V8CCzQRX:==BBDEUW	 	 #BDIORVVXB7
BG'",yy{"199;// #
 GGMM+&V&&*4''2-  &&t,((,,T2	 Xk,,1134SU	J ??(b//1C$s)**002:UU4ZE$s*B::<rzz|,,  %	, 1  ,  s$   2(H4 (I4	I I	IIc                 V   	 | j                   j                  t              j                  t        j                  |k(        j                  t        j                  j                               j                         }|sddddS t        |dd      xs dj                         }|sddddS t        ||      sd	d
ddS d|_        t        j                         |_        t        j                         }| j                   j                  t               j                  t         j                  |k(  t         j"                  dk(  t         j$                  |k(  t         j&                  j)                  d            j+                         }|D ]  }||_        ||_         t.        |z  }	 |j1                         r|j3                          | j                   j7                          ddddS # t4        $ r Y +w xY w# t8        $ r3}| j                   j;                          d	t=        |      ddcY d}~S d}~ww xY w)z
        Quita la referencia en BD, marca como eliminadas las filas de `folders` asociadas
        al mismo nombre de archivo (doc 27) y borra el archivo en disco si existe.
        r   u   Sin evaluación.F)r   r   clearedra   Nr.   u   No había imagen registrada.r   u   Nombre de archivo no válido.r   zImagen eliminada.T)rz   r   r
   r   r+   r   rT   r   r   r   r   r8   ra   r   r   rr   r   r   r   r   r   r   updated_dater   r   unlinkr   r   r   r   r   )	r}   r+   rR   r7   r   folder_rowsfrfpr   s	            r   "clear_cognitive_quantitative_imagezCPsychopedagogicalEvaluationClass.clear_cognitive_quantitative_image  s   
,	LBC<GG:UV>AAFFHI	  "+8JW\]]#BDIORVVXB"+8Vchii4ZD")6Ubghh48C1%__.CN//#Ck***j8++r1$$*,,006	   " &"%"%& %r)B::<IIK GGNN'4GTXYY	  
  	LGG%#a&UKK	LsU   A?G, &G, )G, ;C!G,  G =G, 	G)&G, (G))G, ,	H(5(H#H(#H()T)   )__name__
__module____qualname__r	   r~   r   r   dictr   r   r   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   ry      sb   7 
1 
1T
 
1
HC 
HC 
HFC Fd Fc F0 HJ58AD	c@#  S U]^aUb  d4j T (;d ;t ;
AH$ AH3 AHFFH FHD FHS FHP: : :* *QT *X1LS 1LS 1Lr   ry   N) __doc__r   r   pathlibr   typingr   r   r   sqlalchemy.ormr	   app.backend.db.modelsr
   r   r   r   r   r   r   r   r   r5   r   r   r8   r<   r>   r   rQ   rt   rw   ry   r   r   r   <module>r      s    X #  & & " !8C= Xd^  < %23 P +# + + +"s "x} ""c "hsm "$ 4: 0"; " "J= $ jL jLr   