
    'Xi7-                     v    d 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mZ d Zde
defd	Z G d
 d      Zy)ui   Lógica de adecuaciones curriculares por curso: tipos, course_curricular_adequacies, subjects y students.    )datetime)OptionalAnyList)Session)CurricularAdequacyTypeModelCourseCurricularAdequacyModel$CourseCurricularAdequacySubjectModel$CourseCurricularAdequacyStudentModelc                 ^    | 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_curricular_adequacy_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curricular_adequacy_type_idapplied
scope_textstrategies_text
added_dateupdated_datedeleted_date)
r   r   r   r   r   r   r   r   r   r   )r   s    r   _adequacy_to_dictr       s^    dd[['('D'D99ll,,%all3'7'7
 
r   c                       e Zd ZdefdZ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
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e   ddfdZy)CourseCurricularAdequacyClassdbc                     || _         y )N)r#   )selfr#   s     r   __init__z&CourseCurricularAdequacyClass.__init__%   s	    r   r   c           	         	 | j                   j                  t              j                  t        j                  j                  d            j                  t        j                        j                         }d|D cg c]1  }|j                  |j                  |j                  |j                  d3 c}dS c c}w # t        $ r}dt        |      g dcY d}~S d}~ww xY w)u_   Lista tipos de adecuación curricular activos (deleted_date is None), ordenados por sort_order.Nsuccessr   keylabel
sort_orderstatusdataerrorr.   messager/   )r#   queryr   filterr   is_order_byr,   allr   r*   r+   	Exceptionr   )r%   rowsr   es       r   	get_typesz'CourseCurricularAdequacyClass.get_types(   s    	F9:3@@DDTJK5@@A	  $ " 44q||\ 
  	F%#a&"EE	Fs0   A;B= =6B83B= 8B= =	CCCCr   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                        }g }	g }
|r| j                   j                  t        j                        j                  t        j                   |j                  k(        j                         D cg c]  }|d   	 }	}| j                   j                  t"        j$                        j                  t"        j                   |j                  k(        j                         D cg c]  }|d   	 }
}|j'                  |j                  |j(                  |j*                  |j                  d|rt-        |      nd|r|j.                  nd|r|j0                  nd|r|j2                  nd|	|
d        d|dS c c}w c c}w c c}w # t4        $ r}dt7        |      g dcY d}~S d}~ww xY w)	zzEstructura completa para el curso: cada tipo con su fila (applied, scope_text, strategies_text, subject_ids, student_ids).Nr   r)   )typeadequacyr   r   r   subject_idsstudent_idsr(   r-   r0   r1   )r#   r3   r   r4   r   r5   r6   r,   r7   r	   r   r   getr   r
   
subject_idcourse_curricular_adequacy_idr   
student_idappendr*   r+   r    r   r   r   r8   r   )r%   r   
types_rows
adequaciesaadj_by_typeresulttadjr?   r@   sr:   s                r   get_by_course_idz.CourseCurricularAdequacyClass.get_by_course_id;   sT   -	F9:3@@DDTJK5@@A	  ;<1;;yH1>>BB4H   FPP188!;PKPF !ooadd+   "&/S/^/^!_ D b bfiflfl lm	# !#K # "&/S/^/^!_ D b bfiflfl lm	# !#K # #$44WXWcWcd:= 1# 64.1s{{q47#..T>As':':t#.#. #4 (889 Q##   	F%#a&"EE	FsK   C%J 'J;BJ 	JA%J :JBJ J 	J>%J93J>9J>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<   | j                   j                  t        j                        j                  t        j                  |k(        j                         D cg c]  }|d   	 c}|d<   d|d	S c c}w c c}w # t        $ r}dt        |      ddcY d}~S d}~ww xY w)
u=   Obtiene una adecuación por id con subject_ids y student_ids.r0   Registro no encontrado.Nr1   r   r?   r@   r(   r-   )r#   r3   r	   r4   r   firstr    r
   rB   rC   r7   r   rD   r8   r   )r%   r   rowr/   rM   r:   s         r   	get_by_idz'CourseCurricularAdequacyClass.get_by_idl   s?   	H;<588B>? 
 ")6OY]^^$S)D 'K'V'VW<ZZ^``a	# !#D 'K'V'VW<ZZ^``a	# !#D (66##  	H%#a&$GG	HsD   AE A$E ;D=AE &E2
E =
E 	E)E$E)$E)r/   c           
      Z   	 |j                  d      }|j                  d      }||dddS t        |      }t        |      }|j                  d      }|dv rd	nd
}|j                  d      xs dj                         xs d}|j                  d      xs dj                         xs d}|j                  d      xs g }|j                  d      xs g }	t        j                         }
| j
                  j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|rg||_        ||_        ||_        |
|_        d|_        | j
                  j#                          | j
                  j%                  |       |j&                  }d}nqt        ||||||
|
d      }| j
                  j)                  |       | j
                  j#                          | j
                  j%                  |       |j&                  }d}| j+                  ||       | j-                  ||	       | j
                  j#                          d||t/        |      dS # t0        $ r2}| j
                  j3                          dt5        |      dcY d}~S d}~ww xY w)ut   Crea o actualiza una adecuación por (course_id, curricular_adequacy_type_id). Sincroniza subject_ids y student_ids.r   r   Nr0   z7course_id y curricular_adequacy_type_id son requeridos.r.   r2   r   T   1rW   r   r    r   r?   r@   u   Adecuación actualizada.)r   r   r   r   r   r   r   r   u   Adecuación creada.r(   r.   r2   r   r/   )rA   intstripr   nowr#   r3   r	   r4   r   r   rQ   r   r   r   r   r   commitrefreshr   add_sync_subjects_sync_studentsr    r8   rollbackr   )r%   r/   r   r   applied_valr   r   r   r?   r@   r]   rR   response_idmsgr:   s                  r   storez#CourseCurricularAdequacyClass.store   sT   8	:-I*.((3P*Q' $?$G")6oppII*-.I*J'((9-K&.8aaG((<06B==?G4J#xx(9:@bGGIQTO((=17RK((=17RK,,.C ;<1;;yH1MMQll   %!+&5##& #'  $!ff03'0K#)$3"!$!%	 C  $!ff+[9[9GGNN'C{TefiTjkk 	:GG%#a&99	:s#   *I/ II/ /	J*8'J%J*%J*c                 D   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS d|v r|d   dv rdnd|_        d|v r |d   xs d	j                         xs d
|_        d|v r |d   xs d	j                         xs d
|_	        t        j                         |_        | j                   j                          d|v r| j                  ||d   xs g        d|v r| j                  ||d   xs g        | j                   j                          | j                   j!                  |       dd|t#        |      dS # t$        $ r2}| j                   j'                          dt)        |      dcY d
}~S d
}~ww xY w)uk   Actualiza una adecuación por id. Opcional: applied, scope_text, strategies_text, subject_ids, student_ids.r0   rP   rU   r   rV   rW   r   r   rY   Nr   r?   r@   r(   zRegistro actualizado.rZ   )r#   r3   r	   r4   r   rQ   r   r\   r   r   r   r]   r   r^   ra   rb   r_   r    r8   rc   r   )r%   r   r/   rR   r:   s        r   updatez$CourseCurricularAdequacyClass.update   s|   	:''-- =>EEFcFfFfjlFlmssuC")6OPPD #'	?n#Da!t#"&|"4":!A!A!C!Kt D('+,='>'D"&K&K&M&UQU#'||~CGGNN$##B](;(ArB$##B](;(ArBGGNNGGOOC '4KSU_pqt_uvv 	:GG%#a&99	:s%   AE$ DE$ $	F-'FFFc                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS t        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)u   Borrado lógico (deleted_date).r0   rP   rU   r(   zRegistro eliminado.)r.   r2   r   N)r#   r3   r	   r4   r   rQ   r   r]   r   r   r^   r8   rc   r   )r%   r   rR   r:   s       r   deletez$CourseCurricularAdequacyClass.delete   s    
	:''-- =>EEFcFfFfjlFlmssuC")6OPP'||~C"//CGGNN'4IQSTT 	:GG%#a&99	:s%   AB  A	B   	C)'CCCrC   r?   Nc           	      >   | j                   j                  t              j                  t        j                  |k(        j                  d       t        j                         }|D ]5  }|s| j                   j                  t        |t        |      |             7 y )NFsynchronize_session)rC   rB   r   )
r#   r3   r
   r4   rC   rk   r   r]   r`   r[   )r%   rC   r?   r]   sids        r   ra   z,CourseCurricularAdequacyClass._sync_subjects   ~    :;BB0NNRoo	

&U&
+lln 	CGGKK<.Ks8 	r   r@   c           	      >   | j                   j                  t              j                  t        j                  |k(        j                  d       t        j                         }|D ]5  }|s| j                   j                  t        |t        |      |             7 y )NFrm   )rC   rD   r   )
r#   r3   r   r4   rC   rk   r   r]   r`   r[   )r%   rC   r@   r]   ro   s        r   rb   z,CourseCurricularAdequacyClass._sync_students   rp   r   )__name__
__module____qualname__r   r&   r   r;   r[   rN   rS   dictrg   ri   rk   r   ra   rb    r   r   r"   r"   $   s    7 F3 F&/F# /F# /FbHC HC H6::$ ::3 ::x: :D :S :2: : :C dSVi \` C dSVi \` r   r"   N)__doc__r   typingr   r   r   sqlalchemy.ormr   app.backend.db.modelsr   r	   r
   r   r   ru   r    r"   rv   r   r   <module>r{      sC    o  & & " !6 4 ` `r   