
    Ti9                        S r SSKJrJr  SSKJr  SSKJrJrJrJ	r	J
r
Jr  SSKrSSKJr  SSKJrJrJr  \\\\4   rS\S	\
\   4S
 jrSS jrS\\   S	\\   4S jrS\\   S	\4S jrS	\4S jrS\\\	\\4         S	\\   4S jrS	\\	\\4      4S jrS\\	\\4      S	\4S jrS\\	\\4      S	\4S jrS\	\\4   S	\4S jrS\	\\4   S	\4S jrSS\S\\   S	\ 4S jjr! " S S5      r"g) ub   IV. Registro de actividades (familia/comunidad/otras) con asistentes — tres tablas por sección.    )datetimedate)Enum)OptionalAnyListDictTypeUnionN)Session)CourseActivityFamilyModelCourseActivityCommunityModelCourseActivityOtherModelsecreturnc                 T    [        U 5      nUS:X  a  [        $ US:X  a  [        $ [        $ )N	communityother)!normalize_course_activity_sectionr   r   r   )r   ss     bC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\course_activity_record_class.py_model_for_sectionr      s-    )#.AK++G|''$$    c                     U c  g [        U [        5      (       a  U $ [        U S5      (       a  U R                  U5      $ [        U 5      $ )Nstrftime)
isinstancestrhasattrr   )vfmts     r   	_date_strr!      s@    y!Sq*zz#q6Mr   r   c                 8   U b*  [        U [        5      (       a  U R                  5       (       d  g [        U [        5      (       a  U $  [        R
                  " [        U 5      R                  5       S S S5      R                  5       $ ! [        [        4 a     g f = f)N
   z%Y-%m-%d)r   r   stripr   r   strptime
ValueError	TypeError)r   s    r   _parse_dater(   (   s{    yZ3''		!T  Q!4jAFFHH	" s   >B BBr   c           
         U c  g[        U [        5      (       a  g[        U [        5      (       a  [        U R                  5      $ [        U [
        [        [        [        [        S5      45      (       d1  [        U S5      (       a    [        U SS5      nUb  XLa  [        U5      $ [        U [        [        45      (       a  [        U R                  SSS95      $ [        U [        5      (       a)  U [        U 5      :X  a  [        U 5      S;   a  [        U 5      n [        U [        5      (       a  SSS	S.R                  U S5      $ [        U 5      R!                  5       R#                  5       R!                  S
5      nSU;   a@  UR%                  SS5      S   R#                  5       nUS;   a  U$ US;   a  gUS;   a  gUS;   a  g	US;   a  gUS;   a  gUS;   a  g	US;   a  U$ US;   a  gUS;   a  gUS;   a  g	g! [         a     GNYf = f)u   
Mapea la sección del registro IV/V a BD: family | community | other.

UI / lógica: 1=familia, 2=comunidad, 3=otras/acta (V).
Acepta enteros, strings "1"/"2"/"3", ENUM de MySQL/SQLAlchemy y nombres en inglés.
Nfamilyvaluezutf-8replace)errors)         r   r   z'".r.   r*   r   r   )101)202)303)familiafamiliar)	comunidad)otrosotraotroacta	reuniones)r   boolr   r   r+   r   bytesintfloattyper   getattr	Exception	bytearraydecodegetr$   lowerrsplit)r   innerr   tails       r   r   r   3   s    	y!T!T099a#uc5$t*=>>71gCVCV	Aw-E U^8?? !eY'((0')1TUU!USVA)0CF!S8<<QIIA$$U+A
axxxQ#))+33K;;;KKK,,##N::E  		s   G1 1
G?>G?c                 l    U c  g [        U 5      nUS:X  a  gUS:X  a  gg! [        [        4 a     gf = f)zH1 = Apoderado, 2 = Profesional del establecimiento (coincide con BD/UI). r.   	Apoderador/   zProfesional del establecimiento)rD   r'   r&   )r   pts     r   _participant_type_labelrT   k   sJ    yV 
Qw	Qw0 z" s     33c                    U c  g/ nU  GH   n[        U[        5      (       d  M  [        UR                  S5      =(       d    S5      R	                  5       nU(       d  MU  UR                  SS5      n Ub  [        U5      OSnXCS.nUR                  S5      nUb   [        U5      US'   [        UR                  S5      =(       d    UR                  S	5      =(       d    S5      R	                  5       n[        UR                  S
5      =(       d    UR                  S5      =(       d    S5      R	                  5       n[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R	                  5       n	[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R	                  5       n
U(       a  XuS'   U(       a  XS
'   U	(       a  XS'   U
(       a  XS'   UR                  U5        GM     U(       a  [        R                  " USS9$ S$ ! [        [        4 a    Sn GNf = f! [        [        4 a     GNf = f)uX   Serializa asistentes [{id, name, participant_type?, phone?, …}] a JSON string para BD.NnamerQ   idr   rW   rV   participant_typeroletipophonetelefonoemailmailrutidentification_numberF)ensure_ascii)r   dictr   rK   r$   rD   r&   r'   appendjsondumps)r   cleanitemrV   attendee_idrowrS   rZ   r\   r^   r`   s              r   _parse_attendeesrk   z   s   y"$EdD!!txx'-2.446D((4+K 2=2Ic+.q *5"CC,-B~.1"gC*+ txx'A488F+;ArBHHJD)GTXXj-AGRHNNPE)CTXXf-=CDJJLEdhhuoP2I)JPbQWWYC"F$G$G E
LL; < 5:4::e%0CtC- 	*    #I. s$   1H,I,IIIIc                    U b*  [        U [        5      (       a  U R                  5       (       d  / $ [        U [        5      (       a  U $  [        U [        5      (       a  [        R
                  " U 5      O/ n[        U[        5      (       d  / $ / nU GH   n[        U[        5      (       d  M  [        UR                  S5      =(       d    S5      R                  5       nU(       d  MU  UR                  SS5      n Ub  [        U5      OSnXTS.nUR                  S5      nUb   [        U5      US'   [        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       n[        UR                  S	5      =(       d    UR                  S
5      =(       d    S5      R                  5       n	[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       n
[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       nU(       a  XS'   U	(       a  XS	'   U
(       a  XS'   U(       a  XS'   UR                  U5        GM     U$ ! [        R                  [        4 a    / s $ f = f! [        [        4 a    Sn GNf = f! [        [        4 a     GNf = f)NrV   rQ   rW   r   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   )r   r   r$   listre   loadsJSONDecodeErrorr'   rc   rK   rD   r&   rd   )r   dataoutrh   rV   ri   rj   rS   rZ   r\   r^   r`   s               r   _load_attendeesrr      sR   yZ3''			!T *1c 2 2tzz!} dD!!	 "C$%%488F#)r*002hhtQ'	.9.E#k*1K &1?XX()>*-b'&' 488F#=txx'7=2>DDFDHHW%C*)=CDJJLDHHW%?&)9?R@FFH$((5/LTXX.E%FL"MSSUK L LJ

3= > JI   ), 	 I& 	K	 	* s6   -J 8J9!KJ65J69KKK&%K&	attendeesc                 B   / nU  H  n[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       nU(       d  [        UR                  S5      5      nUR	                  U(       a  UOS5        M     SR                  U5      $ )uI   Texto para columna «apoderado o profesional» (mismo orden que nombres).rZ   r[   rQ   rY      —; )r   rK   r$   rT   rd   join)rs   partsars       r   attendees_rafcnia_liner{      sv    Ef4v4"5;;='.@(ABA!Q'	 
 99Ur   c                 8   / nU  GH  n[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       n[        UR                  S5      =(       d    UR                  S5      =(       d    S5      R                  5       nU(       a  U(       a  UR                  U SU 35        M  U(       a  UR                  U5        M  U(       a  UR                  U5        M  UR                  S5        GM     SR	                  U5      $ )	u<   Texto para columna teléfono/mail (mismo orden que nombres).r\   r]   rQ   r^   r_   z / ru   rv   )r   rK   r$   rd   rw   )rs   rx   ry   r\   r^   s        r   attendees_rafcnit_liner}      s    EAEE'N=aeeJ&7=2>DDFAEE'N9aeeFm9r:@@BULLE7#eW-.LLLLLL  99Ur   ry   c                     [        U R                  S5      =(       d    U R                  S5      =(       d    S5      R                  5       nU(       a  U$ S$ )z%Columna RUT en acta de reuniones (V).r`   ra   rQ   ru   r   rK   r$   )ry   rz   s     r   attendee_rut_cellr      s>    AEE%L@AEE"9:@bAGGIA1ur   c                     [        U R                  S5      =(       d    U R                  S5      =(       d    S5      R                  5       nU(       a  U$ S$ )u7   Columna teléfono en acta de reuniones (V), sin correo.r\   r]   rQ   ru   r   )ry   ps     r   attendee_phone_cellr      s=    AEE'N5aeeJ/526<<>A1ur   rz   sectionc                    Ub  [        U5      OSnSSSS.U   nU R                  U R                  UUU R                  (       a  U R                  R	                  5       OS [        U R                  5      U R                  U R                  U R                  U R                  [        U R                  5      [        U R                  5      S.$ )Nr*   r.   r/   r0   r3   )rW   	course_idr   
section_idr   rs   
objectives
activities
agreementsresults
created_at
updated_at)r   rW   r   r   	isoformatrr   rs   r   r   r   r   r!   r   r   )rz   r   r   r   s       r   _row_to_dictr      s    8?8K
+G
4QYCA:3?Jdd[[ &'ff  "$$Q[[1llllll99-- r   c                       \ rS rSrS\4S jrSS\S\\   S\	4S j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rg)CourseActivityRecordClassi	  dbc                     Xl         g Nr   )selfr   s     r   __init__"CourseActivityRecordClass.__init__
  s    r   Nr   r   r   c           	          Ub  [        U5      R                  5       S:w  a  [        U5      n[        U5      nU R                  R                  U5      R                  UR                  U:H  5      R                  UR                  R                  5       UR                  R                  5       5      R                  5       nSU Vs/ s H  n[        Xc5      PM     snS.$ / nS[        4S[        4S[         44 Hc  u  pU R                  R                  U5      R                  UR                  U:H  5      R                  5        H  nUR#                  X45        M     Me     UR%                  S S	S
9  SU VVs/ s H  u  p[        Xh5      PM     snnS.$ s  snf s  snnf ! [&         a  n	S[        U	5      / S.s Sn	A	$ Sn	A	ff = f)zVLista registros del curso, opcionalmente filtrados por section=family|community|other.NrQ   successstatusrp   r*   r   r   c                 ~    U S   R                   =(       d    [         R                  U S   R                  =(       d    S4$ )Nr.   r   )r   minrW   )ts    r   <lambda><CourseActivityRecordClass.get_by_course_id.<locals>.<lambda>'  s&    qtyy4DHHadgglCr   T)keyreverseerrorr   messagerp   )r   r$   r   r   r   queryfilterr   order_byr   descrW   allr   r   r   r   rd   sortrH   )
r   r   r   wantModelrowsrz   mergedr   es
             r   get_by_course_id*CourseActivityRecordClass.get_by_course_id  s    	F"s7|'9'9';r'A8A*40GGMM%(VEOOy89Xejjoo/ASU	  #,UY5ZUYPQl16KUY5Z[[?AF45:;23
 GGMM%(VEOOy89SU 
 MM3(+	 KKC  
 $<BCF&#a-FC # 6[& D 	F%#a&"EE	FsC   C F FF BF 3F
F F 
F>%F93F>9F>rW   c                 <    [        U5      n[        U5      nU R                  R                  U5      R	                  UR
                  U:H  5      R                  5       nU(       d  SSS S.$ S[        XT5      S.$ ! [         a  nS[        U5      S S.s S nA$ S nAff = f)Nr   Registro no encontrado.r   r   r   )
r   r   r   r   r   rW   firstr   rH   r   )r   rW   r   r   r   rj   r   s          r   	get_by_id#CourseActivityRecordClass.get_by_id1  s    	H&w/E4W=D''--&--ehh"n=CCEC")6OY]^^'c1HII 	H%#a&$GG	Hs$   A'A8 *A8 8
BBBBrp   c                 
    [        UR                  S5      5      n[        UR                  S5      5      n[        U5      n[	        UR                  S5      5      n[        UR                  S5      5      nUR                  S5      =(       d    SR                  5       =(       d    S nUR                  S5      =(       d    SR                  5       =(       d    S nUR                  S5      =(       d    SR                  5       =(       d    S n	UR                  S	5      =(       d    SR                  5       =(       d    S n
[        R                  " 5       nU" UUUUUU	U
UUS
9	nU R                  R                  U5        U R                  R                  5         U R                  R                  U5        SSUR                  [        X5      S.$ ! [         a2  nU R                  R!                  5         S[#        U5      S.s S nA$ S nAff = f)Nr   r   r   rs   r   rQ   r   r   r   )	r   r   rs   r   r   r   r   r   r   r   zRegistro creado.r   r   rW   rp   r   r   r   )rD   rK   r   r   r(   rk   r$   r   nowr   addcommitrefreshrW   r   rH   rollbackr   )r   rp   r   r   r   date_valrs   r   r   r   r   r   rj   r   s                 r   storeCourseActivityRecordClass.store<  s   "	:DHH[12I3DHHY4GHC&s+E"488F#34H(+)>?I((<06B==?G4J((<06B==?G4J((<06B==?G4Jxx	*0b779ATG,,.C##%%%
C GGKKGGNNGGOOC #-ff$S.	   	:GG%#a&99	:s   GG 
H'G=7H=Hc                     [        U5      n[        U5      nU R                  R                  U5      R	                  UR
                  U:H  5      R                  5       nU(       d  SSS.$ SU;   a  [        UR                  S5      5      Ul	        SU;   a  [        UR                  S5      5      Ul        SU;   a6  UR                  S5      =(       d    SR                  5       =(       d    S Ul        SU;   a6  UR                  S5      =(       d    SR                  5       =(       d    S Ul        S	U;   a6  UR                  S	5      =(       d    SR                  5       =(       d    S Ul        S
U;   a6  UR                  S
5      =(       d    SR                  5       =(       d    S Ul        ["        R$                  " 5       Ul        U R                  R)                  5         U R                  R+                  U5        SSU[-        Xe5      S.$ ! [.         a2  nU R                  R1                  5         S[3        U5      S.s S nA$ S nAff = f)Nr   r   r   r   rs   r   rQ   r   r   r   r   zRegistro actualizado.r   )r   r   r   r   r   rW   r   r(   rK   r   rk   rs   r$   r   r   r   r   r   r   r   r   r   r   rH   r   r   )r   rW   rp   r   r   r   rj   r   s           r   update CourseActivityRecordClass.updatea  s   	:&w/E4W=D''--&--ehh"n=CCEC")6OPP~&txx'78d" 0+1F Gt#"&((<"8">B!E!E!G!O4t#"&((<"8">B!E!E!G!O4t#"&((<"8">B!E!E!G!O4D #xx	28b??AIT%\\^CNGGNNGGOOC #2$S/	   	:GG%#a&99	:s%   A&H )FH 
H>'H93H>9H>c                     [        U5      nU R                  R                  U5      R                  UR                  U:H  5      R                  5       nU(       d  SSS.$ U R                  R                  U5        U R                  R                  5         SSUS.$ ! [         a2  nU R                  R                  5         S[        U5      S.s S nA$ S nAff = f)Nr   r   r   r   zRegistro eliminado.)r   r   rW   )r   r   r   r   rW   r   deleter   rH   r   r   )r   rW   r   r   rj   r   s         r   r    CourseActivityRecordClass.delete  s    
	:&w/E''--&--ehh"n=CCEC")6OPPGGNN3GGNN'4IQSTT 	:GG%#a&99	:s$   AB :B 
C#'C
CCr   r   )__name__
__module____qualname____firstlineno__r   r   rD   r   r   r   r   r   rc   r   r   r   __static_attributes__ r   r   r   r   	  s    7 "F# "F "FQT "FH	HC 	H# 	H# 	H#:$ #:3 #:J: :D :3 :3 :@: :s :s :r   r   )z%Y-%m-%d %H:%M:%Sr   )#__doc__r   r   enumr   typingr   r   r   r	   r
   r   re   sqlalchemy.ormr   app.backend.db.modelsr   r   r   CourseActivityRowModelr   r   r!   r(   r   rT   rk   rr   r{   r}   r   r   rc   r   r   r   r   r   <module>r      s   h #  9 9  "    %C %D)?$@ %8C= Xd^ 5# 53 5p# #Dd38n!56 #D8C= #DL+$tCH~. +\d4S>&: s d4S>&: s "c3h C 4S> c * Xc] d &C: C:r   