
    i9                     x    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	J
r
JrJr  S rS\
S\4S jr " S	 S
5      rg)    )datetime)OptionalAnyList)Session)DiversityCriterionModelDiversityStrategyOptionModelCourseDiversityResponseModel#CourseDiversityResponseStudentModelCourseDiversityObservationModelc                 t    U c  g [        U S5      (       a  U R                  5       $ U (       a  [        U 5      $ S $ )N	isoformat)hasattrr   str)vs    eC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\course_diversity_response_class.py_serialize_dater      s4    yq+{{}3q6 D     rreturnc                    U R                   U R                  U R                  U R                  U R                  U R
                  [        U R                  5      [        U R                  5      [        U R                  5      S.	$ )N)	id	course_iddiversity_criterion_idcriterion_selecteddiversity_strategy_option_idhow_text
added_dateupdated_datedeleted_date)
r   r   r   r   r   r   r   r   r   r    )r   s    r   _response_to_dictr!      s`    dd[["#":":22()(F(FJJ%all3'7'7
 
r   c                       \ rS rSrS\4S jrSS\\   S\S\	4S jjr
S	\S\	4S
 jrS\S\	4S jrS\S\	4S jrS\S\\   S\	4S jrS\S\	4S jrS\S\\   SS4S jrS	\S\S\	4S jrS	\S\	4S jrSrg)CourseDiversityResponseClass#   dbc                     Xl         g )Nr%   )selfr%   s     r   __init__%CourseDiversityResponseClass.__init__$   s    r   Nr   include_deletedr   c                     U R                   R                  [        5      nU(       d.  UR                  [        R                  R                  S5      5      nUb(  US:w  a"  UR                  [        R                  U:H  5      nUR                  [        R                  [        R                  5      R                  5       nSU Vs/ s H  n[        U5      PM     snS.$ s  snf ! [         a  nS[        U5      / S.s SnA$ SnAff = f)zLista respuestas. Filtro opcional por course_id (-1 o None = no filtrar). include_deleted=True devuelve todos (incl. borrados).Nsuccessstatusdataerrorr0   messager1   )r%   queryr
   filterr    is_r   order_byr   allr!   	Exceptionr   )r(   r   r+   qrowsr   es          r   get CourseDiversityResponseClass.get'   s    		F:;A"HH9FFJJ4PQ$bHH9CCyPQ:::DDFbFyFyz~~  AD'PT1UPT12CA2FPT1UVV1U 	F%#a&"EE	Fs0   C C! CC! C! !
D+C?9D?Dr   c                     U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  SSSS.$ [        U5      nU R                   R                  [        R                  5      R                  [        R                  U:H  5      R                  5       nU Vs/ s H  oUS   PM	     snUS'   SUS.$ s  snf ! [         a  nS[        U5      SS.s SnA$ SnAff = f)	z3Obtiene una respuesta por id e incluye student_ids.r2   Registro no encontrado.Nr3   r   student_idsr.   r/   )r%   r5   r
   r6   r   firstr!   r   
student_idcourse_diversity_response_idr9   r:   r   )r(   r   rowr1   rB   sr=   s          r   	get_by_id&CourseDiversityResponseClass.get_by_id4   s    	H:;4772=> 
 ")6OY]^^$S)DALLM;XX\^^_ 
 2="=AQ4"=D'66 #> 	H%#a&$GG	Hs7   AC  A&C  C
C  C   
D*C>8D>Dc                     U R                   R                  [        5      R                  [        R                  R                  S5      5      R                  [        R                  5      R                  5       nU R                   R                  [        5      R                  [        R                  U:H  [        R                  R                  S5      5      R                  5       nU Vs0 s H  oDR                  U_M     nn/ nU GH  nU R                   R                  [        5      R                  [        R                  UR                  :H  [        R                  R                  S5      5      R                  [        R                  5      R                  5       nUR                  UR                  5      n	/ n
U	(       at  U R                   R                  [        R                   5      R                  [        R"                  U	R                  :H  5      R                  5        Vs/ s H  nUS   PM
     n
nUR%                  UR                  UR&                  UR(                  UR                  S.U Vs/ s H'  nUR                  UR(                  UR                  S.PM)     snU	(       a  [+        U	5      OSU
S.5        GM     U R                   R                  [,        5      R                  [,        R                  U:H  5      R/                  5       nU(       a  UR0                  OSnSXnS.$ s  snf s  snf s  snf ! [2         a  nS[5        U5      / S	.s SnA$ SnAff = f)
z]Estructura completa para el curso: criterios, opciones, respuesta por criterio y student_ids.Nr   )r   keylabel
sort_order)r   rL   rM   )	criterionoptionsresponserB   r.   )r0   r1   observationsr2   r3   )r%   r5   r   r6   r    r7   r8   rM   r9   r
   r   r   r	   r   r>   r   rD   rE   appendrK   rL   r!   r   rC   rQ   r:   r   )r(   r   criteria	responsesr   response_by_criterionresultcrO   resprB   rG   oobs_rowrQ   r=   s                   r   get_by_course_id-CourseDiversityResponseClass.get_by_course_idI   s   :	F56/<<@@FG1<<=	  :;0::iG0==AA$G   KT$T)Q%=%=q%@)!$TFGGMM">?V4KKqttS4AAEEdK X:EEFSU  -006  "&/R/]/]!^ C ` `dhdkdk kl"#"A !"   # dd uu!"&'ll	" ") !(A  !ttaggQ\\R!(  <@ 1$ 7T#. ' D =>7AAYNO 
 4;7//L'VVS %U#   	F%#a&"EE	FsJ   C%L4 'L%=D#L4  L*/?L4 ..L/BL4 %L4 4
M>MMMc                     U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nSSU(       a  UR                  OS0S.$ ! [         a  nS[        U5      SS.s SnA$ SnAff = f)zYDevuelve las observaciones de diversidad del curso (tabla course_diversity_observations).r.   rQ   Nr/   r2   r3   )	r%   r5   r   r6   r   rC   rQ   r:   r   )r(   r   rF   r=   s       r   get_observations-CourseDiversityResponseClass.get_observations   s|    	H=>7AAYNO 
 (.VY#BRBR_c1dee 	H%#a&$GG	Hs   A&A) )
B3BBBrQ   c           	      X    U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       n[        R                  " 5       nUb  U=(       d    SR                  5       OSnU(       a  U=(       d    SUl	        XCl
        O.U R                   R                  [        UU=(       d    SUUS95        U R                   R                  5         SSS.$ ! [         a2  nU R                   R                  5         S[        U5      S.s SnA$ SnAff = f)zFCrea o actualiza las observaciones del curso (una fila por course_id).N )r   rQ   r   r   r.   zObservaciones guardadas.r0   r4   r2   )r%   r5   r   r6   r   rC   r   nowstriprQ   r   addcommitr:   rollbackr   )r(   r   rQ   rF   rc   textr=   s          r   set_observations-CourseDiversityResponseClass.set_observations   s    	:=>7AAYNO 
 ,,.C3?3KL&B--/QSD#'<4 #& ;'!%"!$	  GGNN'4NOO 	:GG%#a&99	:s   C*C- -
D)7'D$D)$D)r1   c                     UR                  S5      nUR                  S5      nUb  Ub  US:X  d  US:X  a  SSS.$ [        U5      n[        U5      nUR                  S5      nUS	;   a  S
OSn[        R                  " 5       nU R                  R                  [        5      R                  [        R                  U:H  [        R                  U:H  5      R                  5       nUS:X  a  U(       a  UR                  nSUl        Xgl        Xgl        SUl        SUl        U R                  R                  ["        5      R                  ["        R$                  U:H  5      R'                  SS9  U R                  R)                  5         SU;   a   U R+                  X!R                  S5      5        SSUSS.$ SU;   a   U R+                  X!R                  S5      5        SSSSS.$ UR                  S5      n	UR                  S5      n
UR                  S5      =(       d    / nU(       ad  S
Ul        Xl        Xl        Xgl        SUl        U R                  R)                  5         U R                  R-                  U5        UR                  nSnOn[        UUS
U	U
UUSS9nU R                  R/                  U5        U R                  R)                  5         U R                  R-                  U5        UR                  nSnU R1                  X5        U R                  R)                  5         SU;   a   U R+                  X!R                  S5      5        SX[3        U5      S.$ ! [4         a2  nU R                  R7                  5         S[9        U5      S.s SnA$ SnAff = f)uU  Por cada envío del front (course_id, diversity_criterion_id, criterion_selected, ...):
- criterion_selected == 1: si existe registro activo → solo actualizar estudiantes, opción y how_text; si no existe → crear (store) con added_date.
- criterion_selected == 0: actualizar ese criterio poniendo deleted_date y borrando sus estudiantes.r   r   Nra   r2   z2course_id y diversity_criterion_id son requeridos.rb   r   )T   1rl   r   Fsynchronize_sessionrQ   r.   z<Registro desmarcado (deleted_date) y estudiantes eliminados.)r0   r4   r   r1   zSin registro que borrar.r   r   rB   Registro actualizado.)r   r   r   r   r   r   r   r    zRegistro creado.)r>   intr   rc   r%   r5   r
   r6   r   r   rC   r   r   r    r   r   r   r   rE   deleterf   ri   refreshre   _sync_studentsr!   r:   rg   r   )r(   r1   r   r   cs_valr   rc   rF   response_idr   r   rB   msgr=   s                 r   store"CourseDiversityResponseClass.store   s#   O	:-I%)XX.F%G" $:$BiSUoYosuYu")6jkkII%()?%@"XX23F&,&>A,,.C :;0::iG0GGKaa   "Q&"%&&K-.C*'*$'*$7;C4#'CLGGMM"EFMM;XX\ggff7GGNN$%---i.9QR&/<z  CN  X\  ]  ]!T))))XXn5MN"+8RZ^hlmm ,0884R+S(xx
+H((=17RK)*&3O0'#& #'  $!ff-2'+A'(1M%"!$!%	 C  $!ff(9GGNN%%%i.1IJ'CTefiTjkk 	:GG%#a&99	:s0   8M E1M -,M E4M 
N'N NNrE   rB   c           	      D   U R                   R                  [        5      R                  [        R                  U:H  5      R                  SS9  [        R                  " 5       nU H9  nU(       d  M  U R                   R                  [        U[        U5      US95        M;     g)zCReemplaza los estudiantes asociados a la respuesta por student_ids.Frn   )rE   rD   r   N)
r%   r5   r   r6   rE   rr   r   rc   re   rq   )r(   rE   rB   rc   sids        r   rt   +CourseDiversityResponseClass._sync_students  sy    9:AA/LLPll	

&U&
+llnCGGKK;-Is8  r   c                     U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  SSS.$ SU;   a  US   (       a  SOSUl        SU;   a
  US   Ul        SU;   a
  US   Ul        [        R                  " 5       Ul        S	U;   a  U R                  XS	   =(       d    / 5        U R                   R                  5         U R                   R                  U5        S
SUR                  S.$ ! [         a2  nU R                   R!                  5         S[#        U5      S.s SnA$ SnAff = f)zFActualiza una respuesta por id. Opcional: student_ids para reemplazar.r2   rA   rb   r   rl   r   r   r   rB   r.   rp   )r0   r4   r   N)r%   r5   r
   r6   r   rC   r   r   r   r   rc   r   rt   rf   rs   r:   rg   r   )r(   r   r1   rF   r=   s        r   update#CourseDiversityResponseClass.update  s   	::;4772=> 
 ")6OPP#t+.23G.Ha&-5378V3W0T!#J/'||~C$##B](;(ArBGGNNGGOOC '4KSVSYSYZZ 	:GG%#a&99	:s%   AD B:D 
E 'EEEc                     U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  SSS.$ [        R                  " 5       Ul        [        R                  " 5       Ul	        U R                   R                  5         SSS.$ ! [         a2  nU R                   R                  5         S[        U5      S.s SnA$ SnAff = f)u$   Borrado lógico: setea deleted_date.r2   rA   rb   r.   zRegistro eliminado.N)r%   r5   r
   r6   r   rC   r   rc   r    r   rf   r:   rg   r   )r(   r   rF   r=   s       r   rr   #CourseDiversityResponseClass.delete+  s    
	:''-- <=DDEaEdEdhjEjkqqsC")6OPP'||~C'||~CGGNN'4IJJ 	:GG%#a&99	:s%   AB. AB. .
C*8'C%C*%C*r'   )NF)__name__
__module____qualname____firstlineno__r   r)   r   rq   boolr   r>   rH   r[   r^   r   ri   dictrx   r   rt   r~   rr   __static_attributes__ r   r   r#   r#   #   s    7 FXc] FD FUX FHC HC H*<F# <F# <F|
H# 
H# 
H:# :Xc] :s :4S:$ S:3 S:j3 TRUY [_ : :D :S :4: : :r   r#   N)r   typingr   r   r   sqlalchemy.ormr   app.backend.db.modelsr   r	   r
   r   r   r   r   r!   r#   r   r   r   <module>r      s@     & & " !5 $ T: T:r   