
    'Xi8                     v    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
mZmZ d Zde
defdZ G d	 d
      Zy)    )datetime)OptionalAnyList)Session)DiversityCriterionModelDiversityStrategyOptionModelCourseDiversityResponseModel#CourseDiversityResponseStudentModelCourseDiversityObservationModelc                 ^    | 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/course_diversity_response_class.py_serialize_dater      s1    yq+{{}3q6 D     rreturnc                    | j                   | j                  | j                  | j                  | j                  | j
                  t        | j                        t        | j                        t        | j                        d	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                       e Zd ZdefdZddee   dedefdZ	dedefd	Z
dedefd
ZdedefdZdedee   defdZdedefdZdedee   ddfdZdededefdZdedefdZy)CourseDiversityResponseClassdbc                     || _         y )N)r$   )selfr$   s     r   __init__z%CourseDiversityResponseClass.__init__$   s	    r   Nr   include_deletedr   c                    	 | j                   j                  t              }|s.|j                  t        j                  j                  d            }|'|dk7  r"|j                  t        j                  |k(        }|j                  t        j                  t        j                        j                         }d|D cg c]  }t        |       c}dS c c}w # t        $ r}dt        |      g dcY d}~S d}~ww xY w)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r-   messager.   )r$   queryr
   filterr    is_r   order_byr   allr!   	Exceptionr   )r&   r   r(   qrowsr   es          r   getz 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'PT1U12CA2F1UVV1U 	F%#a&"EE	Fs0   B9C ;CC C 	C9 C4.C94C9r   c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sddddS t        |      }| j                   j                  t        j                        j                  t        j                  |k(        j                         }|D cg c]  }|d   	 c}|d<   d|dS c c}w # t        $ r}dt        |      ddcY d}~S d}~ww xY w)	z3Obtiene una respuesta por id e incluye student_ids.r/   Registro no encontrado.Nr0   r   student_idsr+   r,   )r$   r2   r
   r3   r   firstr!   r   
student_idcourse_diversity_response_idr6   r7   r   )r&   r   rowr.   r>   sr:   s          r   	get_by_idz&CourseDiversityResponseClass.get_by_id4   s    	H:;4772=> 
 ")6OY]^^$S)DALLM;XX\^^_ 
 2="=A1Q4"=D'66 #> 	H%#a&$GG	Hs7   AC A&C =C	
C C 	C;"C60C;6C;c                    	 | j                   j                  t              j                  t        j                  j                  d            j                  t        j                        j                         }| j                   j                  t              j                  t        j                  |k(  t        j                  j                  d            j                         }|D ci c]  }|j                  | }}g }|D ]  }| j                   j                  t              j                  t        j                  |j                  k(  t        j                  j                  d            j                  t        j                        j                         }|j                  |j                        }	g }
|	rq| j                   j                  t        j                         j                  t        j"                  |	j                  k(        j                         D cg c]  }|d   	 }
}|j%                  |j                  |j&                  |j(                  |j                  d|D cg c]&  }|j                  |j(                  |j                  d( c}|	rt+        |	      nd|
d        | j                   j                  t,              j                  t,        j                  |k(        j/                         }|r|j0                  nd}d||dS c c}w c c}w c c}w # t2        $ r}dt5        |      g d	cY d}~S d}~ww xY w)
z]Estructura completa para el curso: criterios, opciones, respuesta por criterio y student_ids.Nr   )r   keylabel
sort_order)r   rG   rH   )	criterionoptionsresponser>   r+   )r-   r.   observationsr/   r0   )r$   r2   r   r3   r    r4   r5   rH   r6   r
   r   r   r	   r   r;   r   r@   rA   appendrF   rG   r!   r   r?   rL   r7   r   )r&   r   criteria	responsesr   response_by_criterionresultcrJ   respr>   rC   oobs_rowrL   r:   s                   r   get_by_course_idz-CourseDiversityResponseClass.get_by_course_idI   s   :	F56/<<@@FG1<<=	  :;0::iG0==AA$G   KT$TQQ%=%=q%@$T!$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	# !#K # dd uu!"&'ll	" ")   !ttaggQ\\R  <@ 1$ 7T#. ' D =>7AAYNO 
 4;7//L'VVS %U#   	F%#a&"EE	FsJ   C%L 'L;DL L%?L $+LA=L L 	L>%L93L>9L>c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }dd|r|j                  ndidS # t        $ r}dt        |      ddcY d}~S d}~ww xY w)zYDevuelve las observaciones de diversidad del curso (tabla course_diversity_observations).r+   rL   Nr,   r/   r0   )	r$   r2   r   r3   r   r?   rL   r7   r   )r&   r   rB   r:   s       r   get_observationsz-CourseDiversityResponseClass.get_observations   s|    	H=>7AAYNO 
 (.VY#BRBR_c1dee 	H%#a&$GG	Hs   A!A$ $	B-B;BBrL   c                 2   	 | j                   j                  t              j                  t        j                  |k(        j                         }t        j                         }||xs dj                         nd}|r|xs d|_	        ||_
        n,| j                   j                  t        ||xs d||             | j                   j                          dddS # t        $ r2}| j                   j                          dt        |      dcY d}~S d}~ww xY w)zFCrea o actualiza las observaciones del curso (una fila por course_id).N )r   rL   r   r   r+   zObservaciones guardadas.r-   r1   r/   )r$   r2   r   r3   r   r?   r   nowstriprL   r   addcommitr7   rollbackr   )r&   r   rL   rB   r\   textr:   s          r   set_observationsz-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$'DDDr.   c           
          	 |j                  d      }|j                  d      }||
|dk(  s|dk(  rdddS t        |      }t        |      }|j                  d      }|d	v rd
nd}t        j                         }| j                  j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|dk(  r|r|j                  }d|_        ||_        ||_        d|_        d|_        | j                  j                  t"              j                  t"        j$                  |k(        j'                  d       | j                  j)                          d|v r!| j+                  ||j                  d             dd|ddS d|v r!| j+                  ||j                  d             dddddS |j                  d      }	|j                  d      }
|j                  d      xs g }|rgd
|_        |	|_        |
|_        ||_        d|_        | j                  j)                          | j                  j-                  |       |j                  }d}nqt        ||d
|	|
||d      }| j                  j/                  |       | j                  j)                          | j                  j-                  |       |j                  }d}| j1                  ||       | j                  j)                          d|v r!| j+                  ||j                  d             d||t3        |      dS # t4        $ r2}| j                  j7                          dt9        |      dcY d}~S d}~ww xY w)ue  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   NrZ   r/   z2course_id y diversity_criterion_id son requeridos.r[   r   )T   1rd   r   Fsynchronize_sessionrL   r+   z<Registro desmarcado (deleted_date) y estudiantes eliminados.)r-   r1   r   r.   zSin registro que borrar.r   r   r>   Registro actualizado.)r   r   r   r   r   r   r   r    zRegistro creado.)r;   intr   r\   r$   r2   r
   r3   r   r   r?   r   r   r    r   r   r   r   rA   deleter_   rb   refreshr^   _sync_studentsr!   r7   r`   r   )r&   r.   r   r   cs_valr   r\   rB   response_idr   r   r>   msgr:   s                 r   storez"CourseDiversityResponseClass.store   s7   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*'*C$'*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))))TXXn5MN"+8RZ^hlmm ,0884R+S(xx
+H((=17RK)*&3O0'#& #'  $!ff-2'+A'(1M%"!$!%	 C  $!ff([9GGNN%%%i.1IJ'C{TefiTjkk 	:GG%#a&99	:s0   4M E,M $+M E1M 	M='M82M=8M=rA   r>   c           	      >   | j                   j                  t              j                  t        j                  |k(        j                  d       t        j                         }|D ]5  }|s| j                   j                  t        |t        |      |             7 y)zCReemplaza los estudiantes asociados a la respuesta por student_ids.Frf   )rA   r@   r   N)
r$   r2   r   r3   rA   rj   r   r\   r^   ri   )r&   rA   r>   r\   sids        r   rl   z+CourseDiversityResponseClass._sync_students  s~    9:AA/LLPll	

&U&
+lln 	CGGKK;-Is8 	r   c                 z   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS d|v r|d   rdnd|_        d|v r
|d   |_        d|v r
|d   |_        t        j                         |_        d	|v r| j                  ||d	   xs g        | j                   j                          | j                   j                  |       d
d|j                  dS # t        $ r2}| j                   j!                          dt#        |      dcY d}~S d}~ww xY w)zFActualiza una respuesta por id. Opcional: student_ids para reemplazar.r/   r=   r[   r   rd   r   r   r   r>   r+   rh   )r-   r1   r   N)r$   r2   r
   r3   r   r?   r   r   r   r   r\   r   rl   r_   rk   r7   r`   r   )r&   r   r.   rB   r:   s        r   updatez#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C? B(C? ?	D:'D5/D:5D:c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS t        j                         |_        t        j                         |_	        | j                   j                          dddS # t        $ r2}| j                   j                          dt        |      dcY d}~S d}~ww xY w)u$   Borrado lógico: setea deleted_date.r/   r=   r[   r+   zRegistro eliminado.N)r$   r2   r
   r3   r   r?   r   r\   r    r   r_   r7   r`   r   )r&   r   rB   r:   s       r   rj   z#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"0'CC"C")NF)__name__
__module____qualname__r   r'   r   ri   boolr   r;   rD   rV   rX   r   rb   dictrp   r   rl   rt   rj    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   rz   r!   r#   r{   r   r   <module>r      s@     & & " !5 $ T: T:r   