
    pi)W              
       p   S SK JrJrJrJrJrJr  S SKJrJ	r	J
r
  S SKJrJr  S SKrS SKrS SKrS SKJr  S SK JrJr  S SKJr  SS	KJr  SS
KJrJrJr  SSKJr  SSKJ r!  SSKJ"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)  \" 5       r*\" S5      r+\+RY                  SSS9  1 Skr-\*R]                  S\SS9\" \5      4S\S\4S jj5       r/\*R]                  S\SS9\" \5      4S\S\0S\4S jj5       r1\*R]                  S\SS9\" \5      4S\S\0S\4S  jj5       r2\*Rg                  S!\
S"9\" \5      4S\S#\'S\4S$ jj5       r4\*Rg                  S%\
S"9\" \5      4S\S#\&S\4S& jj5       r5\*R]                  S'\
S"9\" \5      4S\S\4S( jj5       r6\*R]                  S)\S*S9\" \5      4S\S\4S+ jj5       r7\*R]                  S,\S-S9\" \5      4S\S\4S. jj5       r8\*R]                  S/\S0S9\" \5      4S\S\0S\4S1 jj5       r9\*Rg                  S2\
S"9\" S35      4S\S4\4S5 jj5       r:\" S65      r;\;RY                  SSS9  1 S7kr<\*Rg                  S8\
S"9\" S35      4S\S4\4S9 jj5       r=\*R]                  S:\
S"9\" \5      S4S\S\S;\\>   4S< jj5       r?\*Rg                  S:\
S"9\" \5      4S\S#\"S\4S= jj5       r@\*R                  S>\
S"9\" \5      4S\S\0S#\#S\4S? jj5       rB\*R                  S>\
S"9\" \5      4S\S\0S\4S@ jj5       rD\*R]                  SA\
S"9\" \5      4S\S\0S\4SB jj5       rE\*Rg                  SA\
S"9\" \5      4S\S#\(S\4SC jj5       rF\*R                  SD\
S"9\" \5      4S\SE\0S#\)S\4SF jj5       rG\*R                  SD\
S"9\" \5      4S\SE\0S\4SG jj5       rH\*R]                  SH\
S"9\" \5      4S\S\0S\4SI jj5       rI\*Rg                  SH\
S"9\" \5      4S\S#\$S\4SJ jj5       rJ\*R                  SK\
S"9\" \5      4S\S\0S#\%S\4SL jj5       rK\*R                  SK\
S"9\" \5      4S\S\0S\4SM jj5       rLg)N    )	APIRouterRequestFormHTTPExceptionQueryDepends)HTMLResponseRedirectResponseJSONResponse)OptionalListN)Path)
UploadFileFile)Session   )	templates)current_userrequire_adminrequire_docente_or_admin)get_db)academy_crud   )CourseCreateCourseUpdateLessonCreateLessonUpdateProgressUpdateEnrollmentCreateSectionCreateSectionUpdatez$app/static/uploads/miniaturas_cursosT)parentsexist_ok>   .gif.jpg.png.jpeg.webpz	/academiaacademia_home)response_classnamerequestdbc           
      .  #    [        U 5      nU(       d
  [        SSS9$ [        SU;   a  US   OS5      R                  5       n US   nUS;  a   U(       d  [        R                  " S	XS
.5      $ US   S:X  a  [        R                  " U5      nO[        R                  " USS9n/ nU GH5  nUR                  UR                  UR                  UR                  UR                  UR                  UR                   UR"                  S.n[        R$                  " U['        US   5      UR                  5      n	XS'   U	(       a  [        R(                  " U['        US   5      UR                  5      n
[        R*                  " XR                  5      n[-        U5      n[/        S U
 5       5      nUS:  a  X-  S-  OSnXUS.US'   O	SSSS.US'   UR1                  U5        GM8     [        R                  " SXUS.5      $ ! [        [
        4 a    Sn GNf = f7f)zMain academia page for students/login/  urlstatus_coderole is_mvp90Fadmindocenteacademia/academia_locked.htmlr,   userr8   	publishedstatus)idtitledescription	thumbnailr?   
created_at
updated_atorder_indexr@   enrolledc              3   J   #    U  H  oR                   (       d  M  S v   M     g7f)r   N)	completed).0ps     :/home/mario/Escritorio/thel4footbal/app/academia/routes.py	<genexpr> academia_home.<locals>.<genexpr>M   s     G'7!;;AA'7s   #	#r   d   )totalrI   
percentageprogresszacademia/academia.htmlr,   r<   courses)r   r
   strlowerKeyError
IndexErrorr   TemplateResponsecrudget_all_coursesr@   rA   rB   rC   r?   rD   rE   rF   is_user_enrolledintget_user_progress_for_courseget_lessons_by_courselensumappend)r,   r-   r<   	user_roleis_mvprT   courses_datacoursecourse_dictrG   progress_recordslessonsrP   rI   rQ   s                  rL   r)   r)      s      DH#>> FdNDL;AACIj! ,,V))+.
 	
 F|w&&r*&&r+> L))\\!--))mm ++ ++!--	
 ((Sd_fiiH"*J #@@Sd_V\V_V_`00YY?GLEG'7GGI6;ai)+c1QJ05]g&hK
#01QR&SK
#K(7 : %% lC [ j! s+   AHG< 	F3H<HHHHz/academia/curso/{course_id}academia_course	course_idc           
        #    [        U 5      nU(       d
  [        SSS9$ [        SU;   a  US   OS5      R                  5       n US   nUS;  a   U(       d  [        R                  " S	XS
.5      $ [        R                  " X!5      nU(       d
  [        SSS9eUR                  S:w  a  US   S:w  a
  [        SSS9eUS   S:X  a  [        R                  " X!5      nO[        R                  " X!SS9n[        R                  " U[        US   5      U5      nU V	s0 s H"  oR                  [!        U	R"                  5      _M$     n
n	/ nU Hi  nUR$                  UR&                  UR(                  UR*                  UR                  U
R-                  UR$                  S5      S.nUR/                  U5        Mk     [        R0                  " U[        US   5      U5      n[        R2                  " U[        US   5      U5      n[        R                  " SU U[        R4                  " U5      UUUS.5      $ ! [        [
        4 a    Sn GNf = fs  sn	f 7f)zView course details and lessonsr/   r0   r1   r4   r5   r6   Fr7   r:   r;     Curso no encontrador3   detailr=   r8     u#   Este curso aún no está disponibler>   r@   )r@   rA   rB   duration_minutesr?   rI   zacademia/curso.html)r,   r<   rf   ri   rG   rR   )r   r
   rU   rV   rW   rX   r   rY   rZ   get_course_by_idr   r?   r_   get_user_progressr]   	lesson_idboolrI   r@   rA   rB   rr   getrb   r\   get_course_progress_statscourse_to_dict)r,   rk   r-   r<   rc   rd   rf   ri   user_progressrK   progress_maplessons_datalessonlesson_dictrG   statss                   rL   rj   rj   Z   s.      DH#>> FdNDL;AACIj! ,,V))+.
 	

 ""21F4IJJ }}#V(?4YZZ F|w,,R;,,R;O **2s4:	JM<IJMqKKakk!22MLJ L))\\!-- & 7 7mm%))&))U;
 	K(  $$RT$Z)DH **2s4:	JE%%))&1# 	

 
[ j! 0 Ks8   AI
H, 	CI
)I?C-I
,I>I
II
z/academia/leccion/{lesson_id}academia_lessonru   c                   #    [        U 5      nU(       d
  [        SSS9$ [        SU;   a  US   OS5      R                  5       n US   nUS;  a   U(       d  [        R                  " S	XS
.5      $ [        R                  " X!5      nU(       d
  [        SSS9eUR                  S:w  a  US   S:w  a
  [        SSS9e[        R                  " U[        UR                  5      5      nU(       d
  [        SSS9eUS   S:X  a+  [        R                  " U[        UR                  5      5      nO)[        R                  " U[        UR                  5      SS9nU V	s/ s H  n	[        U	R                   5      PM     n
n	[        U5      U
;   a  U
R#                  [        U5      5      OSnUS:  a  XS-
     OSnU[%        U
5      S-
  :  a  XS-      OSn[        R&                  " U[        US   5      [        UR                  5      5      nU Vs0 s H"  oR(                  [+        UR,                  5      _M$     nnUR/                  [        U5      S5      n UR0                  (       a   [2        R4                  " UR0                  5      O0 n[        R                  " SU U[        R6                  " U5      [        R8                  " U5      UUUUS.5      $ ! [        [
        4 a    Sn GNf = fs  sn	f s  snf !   0 n Nq= f7f)zView a lessonr/   r0   r1   r4   r5   r6   Fr7   r:   r;   rm      Lección no encontradaro   r=   r8   rq   u&   Esta lección aún no está disponiblern   r>   r   r   Nr@   zacademia/leccion.html)r,   r<   r}   rf   content_datarI   prev_lesson_idnext_lesson_id)r   r
   rU   rV   rW   rX   r   rY   rZ   get_lesson_by_idr   r?   rs   r]   rk   r_   r@   indexr`   rt   ru   rv   rI   rw   r   jsonloadslesson_to_dictry   )r,   ru   r-   r<   rc   rd   r}   rf   all_lessonsl
lesson_idscurrent_idxr   r   rz   rK   r{   rI   r   s                      rL   r   r      s      DH#>> FdNDL;AACIj! ,,V))+.
 	

 ""21F4LMM }}#V(?4\]]""2s6+;+;'<=F4IJJ F|w00S9I9I5JK00S9I9I5JS^_ &11[#add)[J169)n
6R*""3y>2XZK4?!OZa0N4?#j/TUBU4UZa0[_N **2s4:FDTDT@UVM<IJMqKKakk!22MLJ  Y7I:@:M:Mtzz&"5"56SU %%))&1))&1(",,		
 Y j! 6 2 Ks]   AK4K 	DK4K!4BK4)K&/K43K+  AK4KK4KK4+K1/K4z/api/academia/enroll)r*   payloadc                 *  #    [        U 5      nU(       d
  [        SSS9e[        R                  " X!R                  5      nU(       a  UR
                  S:w  a
  [        SSS9e[        R                  " U[        US   5      UR                  5      nSUS	.$ 7f)
zEnroll in a course  No autenticadoro   r=   rm   rn   r@   T)okenrollment_id)r   r   rZ   rs   rk   r?   enroll_userr]   )r,   r   r-   r<   rf   r   s         rL   
api_enrollr      s       D4DEE""2'8'89FV]]k14IJJ$$RT$Z':K:KLM77s   BBz/api/academia/progressc                   #    [        U 5      nU(       d
  [        SSS9e[        R                  " X!R                  5      nU(       d
  [        SSS9e[        R
                  " U[        US   5      UR                  UR                  5      n[        R                  " X!R                  5      n[        R                  " U[        US   5      UR                  5      nUS   S:H  nS	UUR                  UUS   S
.$ 7f)zUpdate lesson progressr   r   ro   rm   r   r@   rQ   rO   T)r   progress_idrI   course_completedrQ   )
r   r   rZ   r   ru   update_progressr]   rI   rx   rk   )r,   r   r-   r<   r}   r   r   r   s           rL   api_update_progressr      s       D4DEE""2'8'89F4LMM&&r3tDz?G<M<MwO`O`aK ""2'8'89F**2s4:@P@PQE\*c1 "&&,L) s   C2C4z/api/academia/my-coursesc                   #    [        U 5      nU(       d
  [        SSS9e[        R                  " U[	        US   5      5      n/ nU H  nUR
                  (       d  M  UR
                  n[        R                  " U5      nUR                  US'   [        R                  " U[	        US   5      [	        UR                  5      5      nXS'   UR                  U5        M     U$ 7f)zGet user's enrolled coursesr   r   ro   r@   enrolled_atrR   )r   r   rZ   get_user_enrollmentsr]   rf   ry   r   rx   r@   rb   )	r,   r-   r<   enrollmentsre   
enrollmentrf   rg   r   s	            rL   api_my_coursesr     s       D4DEE++BDJ@KL!
  ""))&1%/%;%;M"..r3tDz?C		NS"'JK( " s   CCz/gestion-academiagestion_academiac                    #    [        U 5      n[        R                  " U5      n[        R                  " SXU Vs/ s H  n[        R
                  " U5      PM     snS.5      $ s  snf 7f)z(Admin panel for managing academy contentzacademia/gestion-academia.htmlrS   )r   rZ   r[   r   rY   ry   )r,   r-   r<   rT   cs        rL   r   r   )  sb      $G,D ""2&G%%(W^6_W^RSt7J7J17MW^6_` 6_s   8A( A#A(z/gestion-academia/curso/nuevogestion_academia_nuevo_cursoc                 T   #    [        U 5      n[        R                  " SXSS.5      $ 7f)zNew course creation pageacademia/editar-curso.htmlNr,   r<   rf   )r   r   rY   )r,   r-   r<   s      rL   r   r   6  s/      $G,D%%$T:    &(z*/gestion-academia/curso/{course_id}/editargestion_academia_editar_cursoc                    #    [        U 5      n[        R                  " X!5      nU(       d
  [        SSS9e[        R
                  " SX[        R                  " U5      S.5      $ 7f)zCourse edit pagerm   rn   ro   r   r   )r   rZ   rs   r   r   rY   ry   )r,   rk   r-   r<   rf   s        rL   r   r   @  s[      $G,D""21F4IJJ%%$T5H5H5PQ s   A!A#z/api/academia/upload-thumbnail.filec                   #    [        U 5        [        UR                  5      R                  R	                  5       nU[
        ;  a   [        SSSR                  [
        5       3S9e[        R                  " 5        U 3n[        U-  n UR                  5       I Sh  vN n[        US5       nUR                  U5        SSS5        SSU 3S	.$  N2! , (       d  f       N= f! [         a  n[        S
S[        U5       3S9eSnAff = f7f)zUpload course thumbnail imagei  zFormato no permitido. Use: z, ro   NwbTz"/static/uploads/miniaturas_cursos/)r   r2     Error al subir archivo: )r   r   filenamesuffixrV   ALLOWED_EXTENSIONSr   joinuuiduuid4
UPLOAD_DIRreadopenwrite	ExceptionrU   r,   r   file_extunique_filename	file_pathcontentfes           rL   upload_thumbnailr   Q  s      W% DMM"))//1H))0;M1N0OP
 	
 xj1O_,IY		#)T"aGGG # %GGX#YZZ $""
  Y6NsSTvh4WXXYsT   BD	C! CC! ,C>C! D	C! 
CC! !
D+DDD	z"app/static/uploads/adjuntos-cursos>   .7z.avi.docr%   .mov.mp3.mp4.pdfr&   .ppt.rar.txt.xls.zip.docxr'   .pptx.xlsxz/api/academia/upload-attachmentc                   #    [        U 5        [        UR                  5      R                  R	                  5       nU[
        ;  a   [        R                  " 5        U 3n[        U-  n UR                  5       I Sh  vN n[        US5       nUR                  U5        SSS5        SSU 3UR                  S.$  N=! , (       d  f       N#= f! [         a  n[        SS[        U5       3S9eSnAff = f7f)	zUpload course attachment fileNr   Tz /static/uploads/adjuntos-cursos/)r   r2   r   r   r   ro   )r   r   r   r   rV   ALLOWED_ATTACHMENT_EXTENSIONSr   r   UPLOAD_ATTACHMENTS_DIRr   r   r   r   r   rU   r   s           rL   upload_attachmentr   w  s      W% DMM"))//1H44 	 xj1O&8IY		#)T"aGGG #
 5o5FG
 	
 $""  Y6NsSTvh4WXXYsT   A&C5)C <B:=C B<C 9C5:C <
C
C 
C2C--C22C5z/api/academia/coursesr?   c                 T  #    [        U 5        [        R                  " XS9nU Vs/ s Hs  oDR                  UR                  UR
                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  S.
PMu     sn$ s  snf 7f)zGet all courses (admin)r>   )
r@   rA   rB   rC   r?   rD   rE   rF   resource_urlresource_name)r   rZ   r[   r@   rA   rB   rC   r?   rD   rE   rF   r   r   )r,   r-   r?   rT   r   s        rL   api_get_coursesr     s      W%""25G Y`  a  Y`  TU44!''!--VWVaVamnmumu  FG  FR  FR  bc  bn  bn  @  L  L  ^_  ^l  ^l  @  N  N  O  Y`  a  a  as   $B(A:B# B(c           	         #    [        U 5      n[        R                  " UUR                  [	        US   5      UR
                  UR                  UR                  S9nSUS.$ 7f)zCreate a course (admin)r@   )r-   rA   
created_byrB   rC   r?   Tr   rk   )r   rZ   create_courserA   r]   rB   rC   r?   )r,   r   r-   r<   rk   s        rL   api_create_courser     s\      $G,D""mmtDz?''##~~I Y//s   AA z!/api/academia/courses/{course_id}c                    #    [        U 5        UR                  SS9n[        R                  " X140 UD6nU(       d
  [	        SSS9eSUS.$ 7f)zUpdate a course (admin)Texclude_unsetrm   rn   ro   r   )r   dictrZ   update_courser   )r,   rk   r   r-   updatessuccesss         rL   api_update_courser     sP      W%lll.G  :':G4IJJY//   AA
c                 T   #    [        U 5        [        R                  " X!5        SS0$ 7f)zDelete a course (admin)r   T)r   rZ   delete_course)r,   rk   r-   s      rL   api_delete_courser     s'      W%r%$<r   z/api/academia/sectionsc                   #    [        U 5        [        R                  " X!5      nU Vs/ s HR  oDR                  UR                  UR
                  UR                  UR                  UR                  UR                  S.PMT     sn$ s  snf 7f)z!Get sections for a course (admin))r@   rk   rA   rB   rF   rD   rE   )
r   rZ   get_sections_by_courser@   rk   rA   rB   rF   rD   rE   )r,   rk   r-   sectionsss        rL   api_get_sectionsr     s      W%**29H CK  L  CK  ~44akkAGGTUTaTarsrr  PQ  P\  P\  lm  lx  lx  y  CK  L  L  Ls   &B	ABB	c                    #    [        U 5        [        R                  " UUR                  UR                  UR
                  UR                  =(       d    SS9nSUS.$ 7f)zCreate a section (admin)r   )r-   rk   rA   rB   rF   Tr   
section_id)r   rZ   create_sectionrk   rA   rB   rF   )r,   r   r-   r   s       rL   api_create_sectionr     sV      W%$$##mm'''',1J j11s   AAz#/api/academia/sections/{section_id}r   c                    #    [        U 5        UR                  SS9n[        R                  " X140 UD6nU(       d
  [	        SSS9eSUS.$ 7f)zUpdate a section (admin)Tr   rm   u   Sección no encontradaro   r   )r   r   rZ   update_sectionr   )r,   r   r   r-   r   r   s         rL   api_update_sectionr     sP      W%lll.G!!"<G<G4LMMj11r   c                 T   #    [        U 5        [        R                  " X!5        SS0$ 7f)zDelete a section (admin)r   T)r   rZ   delete_section)r,   r   r-   s      rL   api_delete_sectionr     s'      W%'$<r   z/api/academia/lessonsc                   #    [        U 5        [        R                  " X!5      nU Vs/ s H  oDR                  UR                  UR
                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  UR                   S.PM     sn$ s  snf 7f)z Get lessons for a course (admin))r@   rk   r   rA   rB   content_typer   rr   rF   r?   rD   rE   attachment_urlattachment_name)r   rZ   r_   r@   rk   r   rA   rB   r   r   rr   rF   r?   rD   rE   r   r   )r,   rk   r-   ri   r   s        rL   api_get_lessonsr    s9     W%((7G el  m  el  `a44akkXYX_X_pqp}p}  PQ  P^  P^  pq  p~  p~  TU  Tf  Tf  wx  wD  wD  PQ  PX  PX  hi  ht  ht  DE  DP  DP  de  dt  dt  IJ  IZ  IZ  [  el  m  m  ms   &CB&CCc                 h  #    [        U 5        [        R                  " UUR                  UR                  UR
                  UR                  UR                  UR                  UR                  UR                  =(       d    SUR                  =(       d    SUR                  UR                  S9nSUS.$ 7f)zCreate a lesson (admin)r   r=   )r-   rk   r   rA   rB   r   r   rr   rF   r?   r   r   Tr   ru   )r   rZ   create_lessonrk   r   rA   rB   r   r   rr   rF   r?   r   r   )r,   r   r-   ru   s       rL   api_create_lessonr    s      W%""##%%mm'')))) 11'',1~~,--//I Y//s   B0B2z!/api/academia/lessons/{lesson_id}c                    #    [        U 5        UR                  SS9n[        R                  " X140 UD6nU(       d
  [	        SSS9eSUS.$ 7f)zUpdate a lesson (admin)Tr   rm   r   ro   r  )r   r   rZ   update_lessonr   )r,   ru   r   r-   r   r   s         rL   api_update_lessonr    sP      W%lll.G  :':G4LMMY//r   c                    #     [        U 5        [        R                  " X!5        SS0$ ! [         a1  n[	        SU SU 35        [        SS[        U5      S.S9s S	nA$ S	nAff = f7f)
zDelete a lesson (admin)r   TzError deleting lesson z: r   F)r   error)r3   r   N)r   rZ   delete_lessonr   printr   rU   )r,   ru   r-   r   s       rL   api_delete_lessonr    sk     	
 )2)d| 
&ykA378 3q62
 	

s0   A'$) A'
A$&AA$A'A$$A')Mfastapir   r   r   r   r   r   fastapi.responsesr	   r
   r   typingr   r   r   osr   pathlibr   r   r   sqlalchemy.ormr   databaser   	auth.depsr   r   r   models.baser   modelsr   rZ   r   r   r   r   r   r   r    r!   routerr   mkdirr   rw   r)   r]   rj   r   postr   r   r   r   r   r   r   r   r   r   rU   r   r   putr   deleter   r   r   r   r   r  r  r  r       rL   <module>r     s   K K J J !  	   $ "   M M   )  
 
 89
 
    -?  K?K8? : :g : L:x ),M^_JQRX/ A7 As A A `AF +LO`aJQRX/ B7 Bs B B bBL #LAPWX^P_ 8g 80@ 8g 8 B8 %lCW^_eWf w  W  D2 &|D9@ ' w  E6 CUV;B6? 
G 
 
 W
 +LOmnGNv  W  o 8\{|X_`fXg  S g  }  -lK@DS	 YG Y: Y LY8 BC    TD  9!  .|LAEc YW YJ Y MY@ #LA:A&/cg a7 a aS[\_S` a Ba $\BSZ[aSb 0W 0| 0 0 C0 /Mcjkqcr 
0W 
0 
0| 
0Y` 
0 N
0 2<PLSTZO W  '  Q $\BKRSY? LG L L L CL %lCU\]cUd 2g 2 27 2 D2 1,Ofmntfu 
2g 
23 
2 
2\c 
2 P
2 4\RNUV\o g 3 G  S #LAJQRX/ m7 ms m m Bm $\BSZ[aSb 0W 0| 0 0 C0( /Mcjkqcr 
0W 
0 
0| 
0Y` 
0 N
0 2<PLSTZO 
W 
 
' 
 Q
r  