
    'Xi	%                     r    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 d Zde
defd	Z G d
 d      Zy)ua   Lógica de ajustes por curso: adjustment_aspects, course_adjustments, course_adjustment_students.    )datetime)OptionalAnyList)Session)AdjustmentAspectModelCourseAdjustmentModelCourseAdjustmentStudentModelc                 ^    | y t        | d      r| j                         S | rt        |       S d S )N	isoformat)hasattrr   str)vs    T/var/www/pie360backend.cl/public_html/app/backend/classes/course_adjustment_class.py_serialize_dater      s1    yq+{{}3q6 D     rreturnc           
          | j                   | j                  | j                  | j                  | j                  t        | j                        t        | j                        t        | j                        dS )N)id	course_idadjustment_aspect_idother_aspect_textvalue
added_dateupdated_datedeleted_date)	r   r   r   r   r   r   r   r   r   )r   s    r   _adjustment_to_dictr      sW    dd[[ ! 6 600%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y)CourseAdjustmentClassdbc                     || _         y )N)r!   )selfr!   s     r   __init__zCourseAdjustmentClass.__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)zRLista aspectos de ajuste 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_aspectsz!CourseAdjustmentClass.get_aspects&   s    	F34-::>>tDE/::;	  $ "   dd uu!"&'ll	   	F%#a&"EE	Fs0   A;B= =6B83B= 8B= =	CCCCr   c           	      r   	 | 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 }	|rq| 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|j,                  nd|	d        d|dS c c}w c c}
w # t.        $ r}dt1        |      g dcY d}~S d}~ww xY w)	zoEstructura completa para el curso: cada aspecto con su fila de ajuste (value, other_aspect_text) y student_ids.Nr   r'   )aspect
adjustmentr   r   student_idsr&   r+   r.   r/   )r!   r1   r   r2   r   r3   r4   r*   r5   r	   r   r   getr   r
   
student_idcourse_adjustment_idappendr(   r)   r   r   r   r6   r   )r#   r   aspectsadjustmentsaadj_by_aspectresultaspadjr=   sr8   s               r   get_by_course_idz&CourseAdjustmentClass.get_by_course_id>   s   )	F34-::>>tDE/::;	  34)33y@)66::4@   ALL1Q33Q6LMLF #''/  "&/K/V/V!W < Q QUXU[U[ [\	# !#K # !ff"ww!$&)nn	 ?B"5c":t*-SYY4BE)>)>4#. , (881 M#&  	F%#a&"EE	Fs>   C%H 'H
;BH HA6H 

H 	H6H1+H61H6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)	z4Obtiene un course_adjustment por id con student_ids.r.   Registro no encontrado.Nr/   r   r=   r&   r+   )r!   r1   r	   r2   r   firstr   r
   r?   r@   r5   r6   r   )r#   r   rowr-   rI   r8   s         r   	get_by_idzCourseAdjustmentClass.get_by_idk   s    	H34-00B67 
 ")6OY]^^&s+D 'C'N'NO4IIROP	# !#D (66#  	H%#a&$GG	Hs7   AC A$C ;C
C C 	C9 C4.C94C9r-   c           	      "   	 |j                  d      }|j                  d      }||dddS t        |      }t        |      }|j                  d      }|j                  d      }|j                  d	      xs g }t        j                         }| j                  j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|r|xs d
j                         xs d|_        |xs d
j                         xs d|_        ||_        d|_        | j                  j!                          | j                  j#                  |       |j$                  }	d}
nt        |||xs d
j                         xs d|xs d
j                         xs d||d      }| j                  j'                  |       | j                  j!                          | j                  j#                  |       |j$                  }	d}
| j)                  |	|       | j                  j!                          d|
|	t+        |      dS # t,        $ r2}| j                  j/                          dt1        |      dcY d}~S d}~ww xY w)zYCrea o actualiza un ajuste por (course_id, adjustment_aspect_id). Sincroniza student_ids.r   r   Nr.   z0course_id y adjustment_aspect_id son requeridos.r,   r0   r   r   r=    zAjuste actualizado.)r   r   r   r   r   r   r   zAjuste creado.r&   r,   r0   r   r-   )r>   intr   nowr!   r1   r	   r2   r   r   rM   stripr   r   r   r   commitrefreshr   add_sync_studentsr   r6   rollbackr   )r#   r-   r   r   r   r   r=   rU   rN   response_idmsgr8   s               r   storezCourseAdjustmentClass.store   s0   2	:-I#'88,B#C  $8$@")6hiiII#&';#<  $)< =HHW%E((=17RK,,.C 34)33y@)>>BVV   ):)@b(G(G(I(QT%"[b//19T	#& #'  $!ff++')='8'>B&E&E&G&O4 ;B--/74"!$!% C  $!ff&[9GGNN'C{TghkTlmm 	:GG%#a&99	:s#   *I H%I 	J'J	J	Jc                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS 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 r3| 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)zWActualiza un course_adjustment por id. Opcional: other_aspect_text, value, student_ids.r.   rL   rQ   r   rR   Nr   r=   r&   zRegistro actualizado.rS   )r!   r1   r	   r2   r   rM   rV   r   r   r   rU   r   rW   rZ   rX   r   r6   r[   r   )r#   r   r-   rN   r8   s        r   updatezCourseAdjustmentClass.update   s<   	:''-- 56==>S>V>VZ\>\]cceC")6OPP"d*)-.A)B)Hb(O(O(Q(YUY%$!']0b779AT	'||~CGGNN$##B](;(ArB GGOOC '4KSU_rsv_wxx 	:GG%#a&99	:s%   AD3 CD3 3	E.<'E)#E.)E.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)u5   Borrado lógico del course_adjustment (deleted_date).r.   rL   rQ   r&   zRegistro eliminado.)r,   r0   r   N)r!   r1   r	   r2   r   rM   r   rU   r   r   rW   r6   r[   r   )r#   r   rN   r8   s       r   deletezCourseAdjustmentClass.delete   s    
	:''-- 56==>S>V>VZ\>\]cceC")6OPP'||~C"//CGGNN'4IQSTT 	:GG%#a&99	:s%   AB  A	B   	C)'CCCr@   r=   Nc           	      >   | j                   j                  t              j                  t        j                  |k(        j                  d       t        j                         }|D ]5  }|s| j                   j                  t        |t        |      |             7 y)z>Reemplaza los estudiantes asociados al ajuste por student_ids.F)synchronize_session)r@   r?   r   N)
r!   r1   r
   r2   r@   rb   r   rU   rY   rT   )r#   r@   r=   rU   sids        r   rZ   z$CourseAdjustmentClass._sync_students   s~    23::(==AUU	

&U&
+lln 	CGGKK4%9s8 	r   )__name__
__module____qualname__r   r$   r   r9   rT   rJ   rO   dictr^   r`   rb   r   rZ    r   r   r    r    "   s    7 FS F0+F# +F# +FZHC HC H*4:$ 4:3 4:l: :D :S :*: : :3 T#Y SW r   r    N)__doc__r   typingr   r   r   sqlalchemy.ormr   app.backend.db.modelsr   r	   r
   r   ri   r   r    rj   r   r   <module>ro      sC    g  & & " !
0 
T 
D Dr   