
    4UhPR                        S SK r S SKrS SKJrJrJrJrJrJrJ	r	J
r
  S SKJrJ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  S S	KJr  S S
KJrJrJrJrJ r J!r!J"r"J#r#J$r$  S SK%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  S SK2J3r3  S SKJ4r4J5r5  S SK6J7r7J8r8  \" 5       r9\" 5         \Rt                  " SS5      r;\Rx                  R{                  \;S5      r>\Rx                  R{                  \;S5      r?\Rx                  R{                  \;S5      r@\Rx                  R{                  \;S5      rA\9R                  S5      \" S5      \" \5      4S\)S\S\C4S jj5       rD\9R                  S5      \" S5      \" \5      4S\FS\*S\S\C4S jj5       rG\9R                  S5      \" \5      4S\FS\C4S jj5       rI\9R                  S5      \" S5      \" \5      4S\JS \JS\S\C4S! jj5       rK\9R                  S"5      \	" S5      \	" S5      \" S5      \" \5      4S#\FS\JS \JS\S\C4
S$ jj5       rL\9R                  S"5      \" \5      4S#\FS\C4S% jj5       rM\9R                  S&5      \" \5      4S\FS\/S\C4S' jj5       rN\9R                  S(5      \	" S)5      \	" S)5      \" S5      \" \5      4S#\FS\JS*\FS\S\C4
S+ jj5       rO\9R                  S,5      \	" S5      \	" S5      \	" S5      \" S5      \" \5      4S-\FS\JS*\FS#\FS\S\C4S. jj5       rP\9R                  S,5      \" \5      4S-\FS\C4S/ jj5       rQ\9R                  S05      \" \5      4S-\FS\1S\C4S1 jj5       rR\9R                  S25      \	" S5      \" \5      4S3\FS\1S-\FS\C4S4 jj5       rS\9R                  S25      \" \5      4S3\FS\C4S5 jj5       rT\9R                  S65      \
" S)5      \" \5      4S-\FS\\.   S\C4S7 jj5       rU\9R                  S85      \" \5      4S-\FS9\FS\0S\C4S: jj5       rW\9R                  S85      \" \5      4S-\FS9\FS\C4S; jj5       rX\9R                  S<5      \" \5      4S\FS\C4S= jj5       rZg)>    N)	APIRouterDependsHTTPExceptionFile
UploadFilestatusFormBody)Pagepaginate)"disable_installed_extensions_check)descfunc)
joinedload)check_user_is_trainer)GeneralState)List)	UserProgramCourseModuleLessonQuestionAnswerRegistrationCourseProgram)UserBase
UserUpdateUserPasswordUpdateProgramCreateProgramUpdateCourseCreateModuleCreateLessonCreateQuestionCreateAddCoursesToProgramQuestionWithAnswersUpdateLessonRequest)send_otp_email)check_token_validitypwd_context)get_random_intgenerate_otpFILE_STORAGE_PATHfilesprogramcoursemodulelessonz	/programsdataimagedependenciesc                 x  #    Uu  p4[         R                  " [        SS9  S nU(       aj  [         R                  R	                  [        UR
                  5      n[        US5       nUR                  UR                  5       I S h  vN 5        S S S 5        [        U R                  U R                  U R                  U R                  U R                  U R                  U[         R"                  [$        R&                  " 5       [$        R&                  " 5       S9
nUR)                  U5        UR+                  5         UR-                  U5        SUR.                  UR                  UR                  UR                  UR                  UR0                  UR2                  UR4                  S.S.$  GN#! , (       d  f       GN$= f7f)NTexist_okwb)
namedurationdescriptionprerequisitespriceprice_discountr5   statepublication_date
updated_atu   Programme créé avec succès)idr;   r<   r?   r@   rA   rB   r5   messager0   )osmakedirsPROGRAM_IMAGE_PATHpathjoinfilenameopenwritereadr   r;   r<   r=   r>   r?   r@   r   ACTIVEdatetimenowaddcommitrefreshrD   rA   rB   r5   )r4   r5   r6   dbuser
image_pathfr0   s           =D:\kofCorporation\kof-academy-backend\app\routers\trainers.pycreate_programr[      sA     HB KK"T2JWW\\"4ennE
*d#qGG%**,&' $ YY$$((jj**!!!<<>G FF7OIIKJJw 3**LL((]]%44]] ' 8 8]]	
 ' ' $#s1   A!F:#F(F%
F(DF:%F((
F72F:z/programs/{program_id}
program_idc           
      f  #    Uu  pEUR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eUR                  SS9nUR                  5        H  u  p[        XhU	5        M     U(       a  [        R                  " [        SS9  [        R                  R                  [        UR                  5      n
[        U
S5       nUR!                  UR#                  5       I S h  vN 5        S S S 5        Xl        UR'                  5         UR)                  U5        SUR                  UR*                  UR,                  UR.                  UR0                  UR2                  UR4                  UR$                  S	.S
.$  N! , (       d  f       N= f7f)N  Programme introuvablestatus_codedetailT)exclude_unsetr8   r:   u"   Programme mis à jour avec succès)rD   r;   r<   r=   r?   r@   rA   r5   rE   )queryr   filterrD   firstr   dictitemssetattrrG   rH   rI   rJ   rK   rL   rM   rN   rO   r5   rT   rU   r;   r<   r=   r?   r@   rA   )r\   r4   r5   r6   rV   rW   r0   update_datakeyvaluerX   rY   s               rZ   update_programrm   N   sG     HBhhw&&wzzZ'?@FFHG4KLL ))$)/K!'')
e$ * 
&6WW\\"4ennE
*d#qGG%**,&' $"IIKJJw 8**LL(("..]]%44]]]]	
  ' $#s1   C'F1)F F
	F BF1F  
F.*F1c                   #    Uu  p#UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eSUl        UR                  5         UR                  U5        UR                  [        5      R                  [        R                  U :H  5      R                  SS9  UR                  5         SUR                  UR                  UR                  S.S	.$ 7f)
Nr^   r_   r`   DELETEDFsynchronize_sessionuK   Programme supprimé et toutes ses relations dans course_program suppriméesrD   titlerA   rE   )rd   r   re   rD   rf   r   rA   rT   rU   r   r\   deleters   )r\   r6   rV   rW   r0   s        rZ   delete_programru   z   s     HB hhw&&wzzZ'?@FFHG4KLL GMIIKJJw HH]""=#;#;z#IJQQfkQlIIK a**]]]]
    C:C<z/coursesrs   r=   c                 x  #    Uu  pES nU(       a  [         R                  " [        SS9  [         R                  R	                  [        UR
                  5      n[        US5       nUR                  UR                  5       I S h  vN 5        S S S 5        [        U UU[        R                  S9nUR                  U5        UR                  5         UR                  U5        SUR                  UR                   UR"                  UR$                  UR&                  UR(                  S.S.$  N! , (       d  f       N= f7f)NTr8   r:   )rs   r=   r5   rA   u   Cours créé avec succèsrD   rs   r=   r5   rA   
created_atrF   r1   )rG   rH   COURSE_IMAGE_PATHrJ   rK   rL   rM   rN   rO   r   r   rP   rS   rT   rU   rD   rs   r=   r5   rA   ry   )	rs   r=   r5   r6   rV   rW   rX   rY   r1   s	            rZ   create_courser|      s      HBJ
%5WW\\"3U^^D
*d#qGG%**,&' $ !!	F FF6NIIKJJv /))\\!--\\\\ ++

 
 ' $#s1   A!D:#D)D'
D)BD:'D))
D73D:z/courses/{course_id}	course_idc                 *  #    Uu  pVUR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eUb  Xl        Ub  X'l        U(       a  [        R                  " [        SS9  [        R                  R                  [        UR                  5      n[        US5       n	U	R                  UR!                  5       I S h  vN 5        S S S 5        Xl        [$        R&                  " 5       Ul        UR+                  5         UR-                  U5        SUR                  UR                  UR                  UR"                  UR.                  UR0                  S.S	.$  N! , (       d  f       N= f7f)
Nr^   Cours introuvabler`   Tr8   r:   u   Cours mis à jour avec succèsrx   rz   )rd   r   re   rD   rf   r   rs   r=   rG   rH   r{   rJ   rK   rL   rM   rN   rO   r5   rQ   rR   rC   rT   rU   rA   ry   )
r}   rs   r=   r5   r6   rV   rW   r1   rX   rY   s
             rZ   update_courser      s/     HB XXf$$VYY)%;<BBDF4GHH ( 
%5WW\\"3U^^D
*d#qGG%**,&' $! FIIKJJv 4))\\!--\\\\ ++

 
 ' $#s1   CFF&F 
'F/BF F
FFc                   #    Uu  p#UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eSUl        UR                  5         UR                  U5        UR                  [        5      R                  [        R                  U :H  5      R                  SS9  UR                  5         SUR                  UR                  UR                  S.S	.$ 7f)
Nr^   r   r`   ro   Frp   uG   Cours supprimé et toutes ses relations dans course_program suppriméesrr   rz   )rd   r   re   rD   rf   r   rA   rT   rU   r   r}   rt   rs   )r}   r6   rV   rW   r1   s        rZ   delete_courser      s     HB XXf$$VYY)%;<BBDF4GHH FLIIKJJv HH]""=#:#:i#GHOOdiOjIIK ]))\\\\
 rv   z"/programs/{program_id}/add-coursesc                 Z   Uu  p4UR                  [        5      R                  [        R                  U :H  [        R                  [
        R                  :H  5      R                  5       nU(       d
  [        SSS9eUR                  [        5      R                  [        R                  UR                  :H  5      R                  5         UR                  [        5      R                  [        R                  R                  UR                  5      5      R                  5       n[!        U5      [!        UR                  5      :w  a
  [        SSS9eU H2  n[        UR                  UR                  S9nUR#                  U5        M4     UR%                  5         SUR                  UR                  S.$ )Nr^   u    Programme non trouvé ou inactifr`   u"   Un ou plusieurs cours non trouvés)r\   r}   u4   Relations cours-programme mises à jour avec succès)rF   r\   
course_ids)rd   r   re   rD   rA   r   rP   rf   r   r   r\   rt   r   in_r   alllenrS   rT   )	r\   r4   r6   rV   rW   r0   coursesr1   cps	            rZ   add_courses_to_programr   	  s@    HB hhw&&

j ,,, eg  4VWW HH]""=#;#;wzz#IJQQS hhv%%fiimmDOO&DEIIKG
7|s4??++4XYY gjjFIIF
r
 
 IIK Jjjoo     z/courses/{course_id}/modules.	quizCountc           	      8  #    Uu  pVUR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eS nU(       a  [        R                  " [        SS9  [        R                  R                  [        UR                  5      n[        US5       n	U	R                  UR                  5       I S h  vN 5        S S S 5        [        UUU[         R"                  U S9n
UR%                  U
5        UR'                  5         UR)                  U
5        SU
R                  U
R*                  U
R,                  U
R.                  U
R0                  U
R2                  U
R4                  S	.S
.$  N! , (       d  f       N= f7f)Nr^   r   r`   Tr8   r:   )rs   r   r5   rA   r}   u   Module créé avec succèsrD   rs   r   r5   rA   r}   ry   rF   r2   )rd   r   re   rD   rf   r   rG   rH   MODULE_IMAGE_PATHrJ   rK   rL   rM   rN   rO   r   r   rP   rS   rT   rU   rs   r   r5   rA   r}   ry   )r}   rs   r   r5   r6   rV   rW   r1   rX   rY   r2   s              rZ   create_moduler   0  s?     HB XXf$$VYY)%;<BBDF4GHH J
%5WW\\"3U^^D
*d#qGG%**,&' $ !!F FF6NIIKJJv 0))\\))\\\\)) ++
  ' $#s1   B5F7F	F
F	B(FF		
FFz/modules/{module_id}	module_idc           	        #    Uu  pgUR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eU(       aZ  UR                  [        5      R                  [        R                  U:H  5      R	                  5       n	U	(       d
  [        SSS9eX8l        Ub  Xl        Ub  X(l	        U(       a  [        R                  " [        SS9  [        R                  R                  [        UR                  5      n
[!        U
S5       nUR#                  UR%                  5       I S h  vN 5        S S S 5        Xl        [(        R*                  " 5       Ul        UR/                  5         UR1                  U5        SUR                  UR                  UR                  UR&                  UR2                  UR                  UR4                  S	.S
.$  N! , (       d  f       N= f7f)Nr^   Module introuvabler`   r   Tr8   r:   u   Module mis à jour avec succèsr   r   )rd   r   re   rD   rf   r   r   r}   rs   r   rG   rH   r   rJ   rK   rL   rM   rN   rO   r5   rQ   rR   rC   rT   rU   rA   ry   )r   rs   r   r}   r5   r6   rV   rW   r2   r1   rX   rY   s               rZ   update_moduler   a  s     HB XXf$$VYY)%;<BBDF4HII &!((i)?@FFHC8KLL$ $ 
%5WW\\"3U^^D
*d#qGG%**,&' $! FIIKJJv 5))\\))\\\\)) ++
  ' $#s1   D&G?(G.G,
G.BG?,G..
G<8G?c                 X  #    Uu  p#UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eSUl        UR                  5         UR                  U5        SUR                  UR                  UR                  S.S.$ 7f)Nr^   r   r`   ro   u   Module supprimérr   r   )
rd   r   re   rD   rf   r   rA   rT   rU   rs   )r   r6   rV   rW   r2   s        rZ   delete_moduler     s     HB XXf$$VYY)%;<BBDF4HII FLIIKJJv &))\\\\
    B(B*z/modules/{module_id}/lessonsc                   #    Uu  p4UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eS nUR                  (       a  [        R                  " [        SS9  [        R                  R                  [        UR                  R                  5      n[        US5       nUR                  UR                  R                  5       I S h  vN 5        S S S 5        [!        UR"                  UR$                  UR&                  UR(                  UR*                  [,        R.                  U S9nUR1                  U5        UR3                  5         UR5                  U5        SUR                  UR"                  UR$                  UR                  UR(                  UR*                  UR6                  UR8                  UR:                  S	.	S
.$  N! , (       d  f       N= f7f)Nr^   r   r`   Tr8   r:   )rs   contentresourceorderxp_countrA   r   u   Leçon créée avec succès)	rD   rs   r   r   r   r   rA   r   ry   rF   r3   )rd   r   re   rD   rf   r   r   rG   rH   LESSON_RESOURCE_PATHrJ   rK   rL   rM   rN   rO   r   rs   r   resource_pathr   r   r   rP   rS   rT   rU   rA   r   ry   )	r   r4   r6   rV   rW   r2   r   rY   r3   s	            rZ   create_lessonr     sv     HB XXf$$VYY)%;<BBDF4HIIM}}
(48%94==;Q;QR-&!GG$--,,../ ' jj##jj!!F FF6NIIKJJv 1))\\~~\\\\)) ++

 ! / '&s1   C	H)G14G/
5G1=C2H/G11
G?;Hz/lessons/{lesson_id}	lesson_idc           
        #    Uu  pEUR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eU(       aZ  UR                  [        5      R                  [        R                  U:H  5      R	                  5       nU(       d
  [        SSS9eX&l        UR                  b  UR                  Ul        UR                  b  UR                  Ul	        UR                  b  UR                  Ul
        UR                  b  UR                  Ul        UR                  b  UR                  Ul        UR                  5         UR                  U5        SUR                  UR                  UR                  UR                  UR                  UR                  UR                  UR                  S.S.$ 7f)Nr^      Leçon introuvabler`   r   u    Leçon mise à jour avec succès)rD   rs   r   r   r   r   rA   r   r   )rd   r   re   rD   rf   r   r   r   rs   r   r   r   r   rT   rU   rA   )r   r4   r   r6   rV   rW   r3   r2   s           rZ   update_lessonr     sc     HB XXf$$VYY)%;<BBDF4HII &!((i)?@FFHC8LMM$ zzzz||}} --zzzz}} -- IIKJJv 6))\\~~\\\\))

 s   GGc                 X  #    Uu  p#UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d
  [        SSS9eSUl        UR                  5         UR                  U5        SUR                  UR                  UR                  S.S.$ 7f)Nr^   r   r`   ro   u   Leçon suppriméerr   r   )
rd   r   re   rD   rf   r   rA   rT   rU   rs   )r   r6   rV   rW   r3   s        rZ   delete_lessonr     s     HB XXf$$VYY)%;<BBDF4HII FLIIKJJv '))\\\\
 r   z+/modules/{module_id}/questions-with-answersc                 r  #    Uu  p4UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d  [        SSU  S3S9e/ nU H  n[        UR                  [        R                  U S9nUR                  U5        UR                  5         UR                   HL  n	[        U	R                  U	R                  [        R                  UR                  S9n
UR                  U
5        MN     UR                  5         UR!                  U5        UR#                  U5        M     [%        U5       SU  3U VVs/ s HO  nUR                  UR                  UR                   Vs/ s H  nUR                  UR                  S.PM     snS	.PMQ     snnS
.$ s  snf s  snnf 7f)Nr^   zModule  introuvabler`   )r   rA   r   )r   
is_correctrA   question_idu?    question(s) et réponses créées avec succès pour le module )r   r   )rD   r   answers)rF   	questions)rd   r   re   rD   rf   r   r   r   r   rP   rS   flushr   r   r   rT   rU   appendr   )r   r4   r6   rV   rW   r2   created_questionsqquestionaansweranss               rZ   create_questions_with_answersr   .  s     HB XXf$$VYY)%;<BBDFgi[4UVVII%%

 	x

A		<<"))$KK	F FF6N  			


8  *) . +,--lmvlwx '

 ' dd99  !yy( !$3>>J( '

 	

s*   EF7*F1:#F,	F1&F7,F11F7z9/modules/{module_id}/questions-with-answers/{question_id}r   c           
         UnUR                  [        5      R                  [        R                  U:H  [        R                  U :H  5      R                  5       nU(       d
  [        SSS9eUR                  Ul        [        R                  " 5       Ul
        UR                  [        5      R                  [        R                  U:H  5      R                  5         UR                   Ht  n[        UR                  UR                  [         R"                  [        R                  " 5       [        R                  " 5       UR                  S9nUR%                  U5        Mv     UR'                  5         UR)                  U5        U$ )Nr^   zQuestion not foundr`   )r   r   rA   ry   rC   r   )rd   r   re   rD   r   rf   r   r   rQ   utcnowrC   r   r   rt   r   r   r   rP   rS   rT   rU   )r   r   r4   r6   rV   r   r   
new_answers           rZ   update_question_with_answersr   b  s   	Bxx!(({"i' eg 
 4HII ||H"//+H HHVF..+=>EEG ||KK~~%%(( 

 	z  IIKJJxOr   c                    UnUR                  [        5      R                  [        R                  U:H  [        R                  U :H  [        R
                  [        R                  :g  5      R                  5       nU(       d
  [        SSS9e[        R                  Ul        [        R                  " 5       Ul        UR                   H2  n[        R                  Ul        [        R                  " 5       Ul        M4     UR                  5         SS0$ )Nr^   z%Question not found or already deletedr`   rF   z2Question and its answers soft-deleted successfully)rd   r   re   rD   r   rA   r   ro   rf   r   rQ   r   rC   r   rT   )r   r   r6   rV   r   r   s         rZ   !soft_delete_question_with_answersr     s     
Bxx!(({"i',... eg	  4[\\ "))HN"//+H ""#++$OO- # IIKKLLr   z#/registrations/program/{program_id}c                 *   Uu  p#UR                  [        5      R                  [        R                  U :H  5      R	                  5       nU(       d  [        SSU  S3S9eUR                  [        5      R                  [        [        R                  5      5      R                  [        R                  U :H  5      R                  5       nU(       d  SU  3/ S.$ U Vs/ s H  nUR                  UR                  UR                  UR                  (       a  UR                  R                  OS UR                   UR                  R                  UR                  R"                  UR                  R$                  S.S.PM     nn['        U5       S	U  3US.$ s  snf )
Nr^   z
Programme r   r`   u%   Aucun étudiant inscrit au programme )rF   students)rD   r;   email)registration_idtracking_xp_counttracking_staterA   ry   rW   u&    étudiant(s) inscrit(s) au programme )rd   r   re   rD   rf   r   r   optionsr   rW   r\   r   r   r   rA   rl   ry   r;   r   r   )r\   r6   rV   trainerr0   registrationsrr   s           rZ   get_students_for_programr     sW   KB hhw&&wzzZ'?@FFHGjL4YZZ 		L--.	/	'':5	6		  >zlK
 	
&  A  !tt!"!4!4..&'ggQWW]]4,,ffii	
   " (m_$J:,W !s   B"F)[rQ   rG   fastapir   r   r   r   r   r   r	   r
   fastapi_paginationr   r   fastapi_pagination.utilsr   
sqlalchemyr   r   sqlalchemy.ormr   app.utils.authentificationr   app.enums.general_stater   typingr   app.models.baser   r   r   r   r   r   r   r   r   app.schemas.userr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   app.services.emailr)   r*   r+   app.utils.helpersr,   r-   routergetenvr.   rJ   rK   rI   r{   r   r   posttupler[   patchintrm   rt   ru   strr|   r   r   r   r   r   r   r   r   r   r   putr   r   getr    r   rZ   <module>r      s    	 [ [ [ - G ! % < 0  p p p ]  ]  ]  ] - H :	 " $II17; WW\\"3Y? GGLL!2H= GGLL!2H= ww||$5x@  [ T
!"78-
-- - -^ &' T
!"78	((
( ( 	( ((V '(@GH]@^ S   )8 Z T
!"78	$$$ $ 	$ $L $% dDzT
!"78*** * 	*
 * &*Z %&>EF[>\ 3 e  '8 12 ""78##
# # 3#L +, c#YT
!"78... . 	.
 . -.` $% d$Z$ZT
!"78333 3 	3
 3 3 &3l %&>EF[>\ 3 e  '. +, ""78..
. . -.` $% $Z!"78	11
1 1 	1 &1h %&>EF[>\ 3 e  '. :; "&c!"7811
~
1 1 <1f GH {B  CX  {Y  C  c  Ib  rw   I F JK ""78MMM M LM< 12DKLaDb * *E * 3*r   