
    GgEiU                        d Z ddlmZmZmZmZmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7 e       Z8e8js                  de:       ee0       ee      fde;dede
fd       Z<e8js                  de:       ee0       ee      fde;dede
fd       Z=e8js                  de:       ee0       ee      fde;dede
fd       Z>e8js                  de4e           ee0       ee      fdede
fd       Z?e8js                  de        ee0       ee      fde;dede
fd        Z@e8j                  de        ed!       ed!       ed       ed       ed       ee0       ee      fd"eBd#eBd$e5eB   d%e;d&e5e   dede
fd'       ZCe8j                  de        ed       ed       ed       ed       ed       ed       ee0       ee      fde;d"e5eB   d#e5eB   d$e5eB   d%e5e;   d(e5eE   d&e5e   dede
fd)       ZFe8j                  d       ee0       ee      fde;dede
fd*       ZHe8js                  d+e4e#         d ee0       ee      fde;dede
fd,       ZIe8j                  d+e#       ed!       ed!       ed!       ed       ed       ed       ed       ed       ed       ee0       ee      fde;d"eBd#eBd-e5eB   d.e5eB   d/e5eB   d0e5e;   d%e;d1e5e   dede
fd2       ZJe8j                  d3e#       ed       ed       ed       ed       ed       ed       ed       ed       ed       ed       ee0       ee      fd4e;de5e;   d"e5eB   d#e5eB   d-e5eB   d.e5eB   d/e5eB   d0e5e;   d%e5e;   d(e5eE   d1e5e   dede
fd5       ZKe8j                  d3       ee0       ee      fd4e;dede
fd6       ZLe8js                  d3e#       ee0       ee      fd4e;dede
fd7       ZMe8js                  d8e4e&         d ee0       ee      fd4e;dede
fd9       ZNe8j                  d8e&       ee0       ee      fd:e$dede
fd;       ZOe8j                  d<e&       ee0       ee      fde;d:e%dede
fd=       ZPe8j                  d<       ee0       ee      fde;dede
fd>       ZQe8js                  d<e&       ee0       ee      fde;dede
fd?       ZRe8js                  d@e4e)         d ee0       ee      fde;dede
fdA       ZSe8j                  d@e)       ee0       ee      fdBe'dede
fdC       ZTe8j                  dDe)       ee0       ee      fde;dBe(dede
fdE       ZUe8j                  dD       ee0       ee      fde;dede
fdF       ZVe8js                  dDe)       ee0       ee      fde;dede
fdG       ZWe8j                  dH       ed!       ed!dIJ       ee0       ee      fde;dKedLeBdede
f
dM       ZXe8j                  dNe+       ee0       ee      fdOe*dede
fdP       ZYe8js                  dQe       ee0       ee      fdRe;dede
fdS       ZZe8j                  dTe-       ee0       ee      fdUe,dede
fdV       Z[e8j                  dWe-       ee0       ee      fdXe;dUe.dede
fdY       Z\e8j                  dQ       ee0       ee      fdRe;dede
fdZ       Z]e8j                  dW       ee0       ee      fdXe;dede
fd[       Z^y)\z8
Endpoints admin pour la gestion du module de formation
    )	APIRouterDependsHTTPExceptionstatus
UploadFileFileForm)Session
joinedload)get_db)User)Theme)Disease)Chapter)Capsule)Quiz)QuizQuestion)QuizDetailAdminResponseThemeCreateThemeUpdateThemeResponseDiseaseCreateDiseaseUpdateDiseaseResponseChapterCreateChapterUpdateChapterResponseCapsuleCreateCapsuleUpdateCapsuleResponse
QuizCreateQuizResponseQuizQuestionCreateQuizQuestionResponseQuizQuestionUpdate)get_current_admin)TrainingStatsService)ListOptionalNz/capsules/{capsule_id}/stats)response_model
capsule_idcurrent_admindbc                 d   K   t        |      }|j                  |       }|st        dd      |S w)uo   
    Récupère les statistiques pour une capsule spécifique (nombre de vues, complétions, temps moyen).
         Capsule non trouvéestatus_codedetail)r'   get_capsule_statsr   )r+   r,   r-   stats_servicestatss        K/home/www/lebenam.kofcorporation.com/app/api/v1/endpoints/admin/training.pyr4   r4      8      ),M++J7E4JKKL   .0z/chapters/{chapter_id}/stats
chapter_idc                 d   K   t        |      }|j                  |       }|st        dd      |S w)uu   
    Récupère les statistiques pour un chapitre spécifique (nombre de lectures, complétions, stats de quiz).
    r/      Chapitre non trouvér1   )r'   get_chapter_statsr   )r:   r,   r-   r5   r6   s        r7   r=   r=   .   r8   r9   z!/themes/{theme_id}/progress-statstheme_idc                 d   K   t        |      }|j                  |       }|st        dd      |S w)ue   
    Récupère les statistiques de progression des apprenants pour une thématique spécifique.
    r/      Thématique non trouvéer1   )r'   get_theme_progress_statsr   )r>   r,   r-   r5   r6   s        r7   rA   rA   =   s8      ),M228<E4NOOLr9   z/themesc                    K   |j                  t              j                  t        j                        j	                         }|S w)u    Liste de toutes les thématiques)queryr   order_byorderall)r,   r-   themess      r7   get_all_themesrH   N   s2      XXe_%%ekk2668FMs   AAz/themes/{theme_id}c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |S w)zRechercher une therapie par IDr/   r@   r1   )rC   r   filteridfirstr   r>   r,   r-   themes       r7   	get_themerO   W   sH      HHUO""588x#78>>@E4NOOL   AA.namedescriptioncolorrE   iconc                 D  K   d}|r|j                   rd}t        j                  |d       t        j                  j	                  |j                         d   }	t        j                          |	 }
t        j                  j                  ||
      }t        |d      5 }|j                          d{   }|j                  |       ddd       t        | ||||      }|j                  |       |j                          |j                  |       |S 7 a# 1 sw Y   OxY ww)u7   Créer une nouvelle thématique avec icône optionnelleNuploads/themesTexist_ok   wb)rQ   rR   rS   rE   rT   )filenameosmakedirspathsplitextuuiduuid4joinopenreadwriter   addcommitrefresh)rQ   rR   rS   rE   rT   r,   r-   	icon_path
upload_dirfile_extensionr[   fcontentrN   s                 r7   create_themern   d   s      I%

J.))$--8;jjl^N#34GGLLX6	)T" 	a IIK'GGGG	 E FF5MIIKJJuL (	 	s1   BD D0D1DAD DDD 	is_activec	                   K   |j                  t              j                  t        j                  | k(        j	                         }	|	st        dd      |r#|j                  rd}
t        j                  |
d       |	j                  rHt        j                  j                  |	j                        rt        j                  |	j                         t        j                  j                  |j                        d   }t        j                          | }t        j                  j!                  |
|      }t#        |d      5 }|j%                          d	{   }|j'                  |       d	d	d	       ||	_	        |||||d
}|j)                         D ]  \  }}|	t+        |	||        |j-                          |j/                  |	       |	S 7 w# 1 sw Y   exY ww)u6   Mettre à jour une thématique avec icône optionneller/   r@   r1   rV   TrW   rY   rZ   N)rQ   rR   rS   rE   ro   )rC   r   rJ   rK   rL   r   r[   r\   r]   rT   r^   existsremover_   r`   ra   rb   rc   rd   re   itemssetattrrg   rh   )r>   rQ   rR   rS   rE   ro   rT   r,   r-   rN   rj   rk   r[   ri   rl   rm   update_datafieldvalues                      r7   update_themerx      s     HHUO""588x#78>>@E4NOO %

J. ::"''..4IIejj! ))$--8;jjl^N#34GGLLX6	)T" 	a IIK'GGGG	 
 [5YK
 $))+ )uE5%() IIKJJuL# (	 	s6   E GGGG,/G2GGGGc                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  rHt        j                  j                  |j                        rt        j                  |j                         |j                  |       |j                          dddS w)u   Supprimer une thématiquer/   r@   r1   Tu   Thématique suppriméer   message)rC   r   rJ   rK   rL   r   rT   r\   r^   rq   rr   deleterg   rM   s       r7   delete_themer}      s      HHUO""588x#78>>@E4NOO zzbggnnUZZ0
		%**IIeIIK'?@@   CCz	/diseasesc                    K   |j                  t              }| r"|j                  t        j                  | k(        }|j	                  t        j
                        j                         }|S w)zListe de toutes les maladies)rC   r   rJ   r>   rD   rE   rF   )r>   r,   r-   rC   diseasess        r7   get_all_diseasesr      sR      HHWEW--9:~~gmm,002HO   A)A+symptoms
prevention	treatmentduration_minutes	thumbnailc                 L  K   d}|r|j                   rd}t        j                  |d       t        j                  j	                  |j                         d   }t        j                          | }t        j                  j                  ||      }t        |d      5 }|j                          d{   }|j                  |       ddd       t        | ||||||||	      }|
j                  |       |
j                          |
j                  |       |S 7 e# 1 sw Y   SxY ww)u6   Créer une nouvelle maladie avec miniature optionnelleNuploads/diseasesTrW   rY   rZ   )	r>   rQ   rR   r   r   r   r   rE   r   )r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   r   rf   rg   rh   )r>   rQ   rR   r   r   r   r   rE   r   r,   r-   thumbnail_pathrj   rk   r[   rl   rm   diseases                     r7   create_diseaser      s     NY'''

J.)))*<*<=a@jjl^N#34j(;.$' 	1%NN,,GGGG	 ) 
G FF7OIIKJJwN# -	 	s1   BD$D0D1DAD$DD!D$z/diseases/{disease_id}
disease_idc           
        K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |
r#|
j                  rd}t        j                  |d       |j                  rHt        j                  j                  |j                        rt        j                  |j                         t        j                  j                  |
j                        d   }t        j                          | }t        j                  j!                  ||      }t#        |d      5 }|
j%                          d	{   }|j'                  |       d	d	d	       ||_	        |||||||||	d
	}|j)                         D ]  \  }}|	t+        |||        |j-                          |j/                  |       |S 7 {# 1 sw Y   ixY ww)u5   Mettre à jour une maladie avec miniature optionneller/      Maladie non trouvéer1   r   TrW   rY   rZ   N)	r>   rQ   rR   r   r   r   r   rE   ro   )rC   r   rJ   rK   rL   r   r[   r\   r]   r   r^   rq   rr   r_   r`   ra   rb   rc   rd   re   rs   rt   rg   rh   )r   r>   rQ   rR   r   r   r   r   rE   ro   r   r,   r-   r   rj   rk   r[   r   rl   rm   ru   rv   rw   s                          r7   update_diseaser     s    " hhw&&wzzZ'?@FFHG4JKK Y'''

J. 0A0A!BIIg''( )))*<*<=a@jjl^N#34j(;.$' 	1%NN,,GGGG	 + d;JY,u9K $))+ +uGUE*+ IIKJJwN% -	 	s6   E G GGG,3G  2G GGG c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  rHt        j                  j                  |j                        rt        j                  |j                         |j                  |       |j                          dddS w)zSupprimer une maladier/   r   r1   Tu   Maladie suppriméerz   )rC   r   rJ   rK   rL   r   r   r\   r^   rq   rr   r|   rg   r   r,   r-   r   s       r7   delete_diseaser   C  s      hhw&&wzzZ'?@FFHG4JKK RWW^^G,=,=>
		'##$IIgIIK';<<r~   c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |S w)u   Détails d'une maladier/   r   r1   )rC   r   rJ   rK   rL   r   r   s       r7   get_diseaser   V  I      hhw&&wzzZ'?@FFHG4JKKNrP   z	/chaptersc                    K   |j                  t              }| r"|j                  t        j                  | k(        }|j	                  t        j
                        j                         }|S w)zListe de tous les chapitres)rC   r   rJ   r   rD   rE   rF   )r   r,   r-   rC   chapterss        r7   get_all_chaptersr   d  R      HHWEW//:=>~~gmm,002HOr   chapter_datac                    K   t        di | j                         }|j                  |       |j                          |j	                  |       |S w)u   Créer un nouveau chapitre )r   dictrf   rg   rh   )r   r,   r-   chapters       r7   create_chapterr   q  C      ,))+,GFF7OIIKJJwN   AAz/chapters/{chapter_id}c                 b  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  d      }|j                         D ]  \  }}t        |||        |j                          |j                  |       |S w)u   Mettre à jour un chapitrer/   r<   r1   Texclude_unset)rC   r   rJ   rK   rL   r   r   rs   rt   rg   rh   )r:   r   r,   r-   r   ru   rv   rw   s           r7   update_chapterr   ~        hhw&&wzzZ'?@FFHG4JKK##$#7K#))+ 'u&' IIKJJwN   B-B/c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          dddS w)zSupprimer un chapitrer/   r<   r1   Tu   Chapitre supprimérz   )rC   r   rJ   rK   rL   r   r|   rg   r:   r,   r-   r   s       r7   delete_chapterr     e      hhw&&wzzZ'?@FFHG4JKKIIgIIK';<<   A9A;c                 .  K   |j                  t              j                  t        t        j                        t        t        j
                              j                  t        j                  | k(        j                         }|st        dd      |S w)u   Détails d'un chapitrer/   r<   r1   )
rC   r   optionsr   capsulesquizrJ   rK   rL   r   r   s       r7   get_chapterr     sq      hhw''7##$7<<  fWZZ:%&uuw  4JKKNs   BBz	/capsulesc                    K   |j                  t              }| r"|j                  t        j                  | k(        }|j	                  t        j
                        j                         }|S w)zListe de toutes les capsules)rC   r   rJ   r:   rD   rE   rF   )r:   r,   r-   rC   r   s        r7   get_all_capsulesr     r   r   capsule_datac                    K   t        di | j                         }|j                  |       |j                          |j	                  |       |S w)u   Créer une nouvelle capsuler   )r   r   rf   rg   rh   )r   r,   r-   capsules       r7   create_capsuler     r   r   z/capsules/{capsule_id}c                 b  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  d      }|j                         D ]  \  }}t        |||        |j                          |j                  |       |S w)u   Mettre à jour une capsuler/   r0   r1   Tr   )rC   r   rJ   rK   rL   r   r   rs   rt   rg   rh   )r+   r   r,   r-   r   ru   rv   rw   s           r7   update_capsuler     r   r   c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          dddS w)zSupprimer une capsuler/   r0   r1   Tu   Capsule suppriméerz   )rC   r   rJ   rK   rL   r   r|   rg   r+   r,   r-   r   s       r7   delete_capsuler     r   r   c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |S w)u   Détails d'une capsuler/   r0   r1   )rC   r   rJ   rK   rL   r   r   s       r7   get_capsuler     r   rP   z/capsules/{capsule_id}/mediazJSpecify 'content' for content_url or 'transcription' for transcription_url)rR   mediamedia_targetc                 |  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      d}t        j                  |d       t        j                  j                  |j                        d   }t        j                          | }t        j                  j                  ||      }	t        |	d      5 }
|j                          d	{   }|
j!                  |       d	d	d	       d	}|d
k(  r|j"                  }|	|_        n&|dk(  r|j$                  }|	|_        nt        dd      |r4t        j                  j'                  |      rt        j(                  |       |j+                          |j-                  |       d|	|dS 7 # 1 sw Y   xY ww)uF   Upload d'un fichier média pour une capsule (contenu ou transcription)r/   r0   r1   zuploads/capsulesTrW   rY   rZ   Nrm   transcription  u4   media_target doit être 'content' ou 'transcription')r   	media_urlr   )rC   r   rJ   rK   rL   r   r\   r]   r^   r_   r[   r`   ra   rb   rc   rd   re   content_urltranscription_urlrq   rr   rg   rh   )r+   r   r   r,   r-   r   rj   rk   r[   filepathrl   rm   old_file_paths                r7   upload_capsule_mediar     sh     hhw&&wzzZ'?@FFHG4JKK#JKK
T*WW%%enn5a8N**,/0Hww||J1H	h	 

$	 My ++&		(11$,!4jkk6
		- IIKJJw<PP' % s1   CF<F02F.3F0B&F<.F00F95F<z/quizzes	quiz_datac                 \  K   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        dd      t        di | j                         }|j                  |       |j                          |j                  |       |S w)u   Créer un nouveau quizr   u   Ce chapitre a déjà un quizr1   r   )
rC   r   rJ   r:   rL   r   r   rf   rg   rh   )r   r,   r-   existingr   s        r7   create_quizr   '  s      xx~$$T__	8L8L%LMSSUH4RSS#).."#DFF4LIIKJJtKs   B*B,z/quizzes/{quiz_id}quiz_idc                    K   |j                  t              j                  t        t        j                              j                  t        j                  | k(        j                         }|st        dd      |S w)ug   Détails d'un quiz spécifique, incluant toutes les questions et les réponses correctes (pour l'admin)r/      Quiz non trouvér1   )	rC   r   r   r   	questionsrJ   rK   rL   r   r   r,   r-   r   s       r7   get_quiz_detailsr   9  s`      88D>!!4>>"fTWW  	 4FGGKs   A;A=z/quiz-questionsquestion_datac           	      N  K   t        | j                  | j                  | j                  D cg c]  }|j	                          c}| j
                  | j                  | j                        }|j                  |       |j                          |j                  |       |S c c}w w)u$   Créer une nouvelle question de quiz)r   questionr   correct_answerexplanationrE   )r   r   r   r   r   r   r   rE   rf   rg   rh   )r   r,   r-   optr   s        r7   create_quiz_questionr   I  s      %%'''4'<'<==$33!--!!H FF8IIKJJxO >s   *B%B A"B%z/quiz-questions/{question_id}question_idc                 b  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  d      }|j                         D ]  \  }}t        |||        |j                          |j                  |       |S w)u/   Mettre à jour une question de quiz spécifiquer/      Question non trouvéer1   Tr   )rC   r   rJ   rK   rL   r   r   rs   rt   rg   rh   )r   r   r,   r-   r   ru   rv   rw   s           r7   update_quiz_questionr   ]  s      xx%,,\__-KLRRTH4KLL$$4$8K#))+ (u%'( IIKJJxOr   c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          dddS w)zSupprimer un quizr/   r   r1   Tu   Quiz supprimérz   )rC   r   rJ   rK   rL   r   r|   rg   r   s       r7   delete_quizr   r  sc      88D>  G!34::<D4FGGIIdOIIK'788r   c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          dddS w)zSupprimer une question de quizr/   r   r1   Tu   Question suppriméerz   )rC   r   rJ   rK   rL   r   r|   rg   )r   r,   r-   r   s       r7   delete_quiz_questionr     se      xx%,,\__-KLRRTH4KLLIIhIIK'<==r   )___doc__fastapir   r   r   r   r   r   r	   sqlalchemy.ormr
   r   app.db.sessionr   app.models.userr   app.models.themer   app.models.diseaser   app.models.chapterr   app.models.capsuler   app.models.quizr   app.models.quiz_questionr   app.schemas.trainingr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   app.core.securityr&   #app.services.training_stats_servicer'   typingr(   r)   r\   r`   routergetr   intr4   r=   rA   rH   rO   poststrrn   putboolrx   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r       r7   <module>r      s   V U U . !   " & & &   1     0 D ! 	 	 *4@ ""34&/ 	 A *4@ ""34&/ 	 A /E ""34&/ 	 F  Id=&9:!"34&/ ;  ? ""34&/			 		 @	 Y}5S	Cy:a!%d!"34&/"
"" C=" 	"
 :
" " 	" 6"H  ? t*!%d:: $T
!%d!"34&/00
3-0 #0 C=	0
 C=0 ~0 :
0 0 	0 @0d #$ ""34&/AAA 	A %A( K_(=>!"34&/


 	
 ?
 [9IS	Cy"4j $T
#Dz&*4ja&*4j!"34&/**
* * sm	*
 * }* sm* * 
#* * 	* :*X $_E #4jt*!%d"4j $T
#Dz&*4j: $T
&*4j!"34&/55sm5 3-5 #	5
 sm5 5 }5 sm5 C=5 ~5 
#5 5 	5 F5n '( ""34&/=== 	= )=$ $_E ""34&/			 		 F	 K_(=>!"34&/


 	
 ?
 [9 ""34&/


 	
 :
 $_E ""34&/	  		 F& '( ""34&/=== 	= )= $_E ""34&/ 	 F  K_(=>!"34&/


 	
 ?
 [9 ""34&/


 	
 :
 $_E ""34&/	  		 F& '( ""34&/=== 	= )= $_E ""34&/			 		 F	 +, S	S.z{!"34&/'Q'Q'Q 'Q 	'Q
 	'Q -'QV Z5 ""34&/ 	 6"  1HI ""34&/ 	 J /CD ""34&/% 	 E& +<PQ ""34&/	%  		 R( #$ ""34&/999 	9 %9 ./ ""34&/>>> 	> 0>r   