diff --git a/Rapport.md b/Rapport.md index a62d08c9b6232cb01dfa2284b7361779d0f00b22..304db5fb5f68dadc4f20c6c185e4d4a747958686 100644 --- a/Rapport.md +++ b/Rapport.md @@ -1,7 +1,8 @@ # Compte rendu analyse du ticket 1023 - +Manel Boumansour +Xavier Moyon ## 1. Le ticket - +Lien de notre git : Ticket décrit dans la page https://git.scodoc.org/Scodoc/Scodoc/issues/1023 @@ -26,116 +27,112 @@ Nous classiferions comme évolutive, car la fonctionnalité fonctionnait mais ne ## 2.1 Reproduire le problème Etudiant : Valentin FEBLAR +Essayer de trouver quand sont envoyés les mails d'absences. +Recherche dans les pages scodoc, les pages permettant d'ajouter une absence pour un ou plusieurs étudiants. -Classe email avec méthode _send-message_ -> /app/email.py +1. Sur la page Scodoc/CAS/Scolarite/Assiduites, on peut noter les assiduites  -Utilisation de la classe email pour les absences -> app/scodoc/sco_abs_notification.py +2. Nous allons ensuite choisir un étudiant sur lequel on va noter des absences : Valentin Feblar +3. Nous devons ensuite changer le profil de Valentin pour que son mail de contact soit un des nôtre. Cela se fait sur la page Scodoc/CAS/Scolarite/fiche_etud?etudid=14516  +4. Ensuite, nous devons mettre des absences à Valentin, pour cela on retourne sur la page du point 1. +5. Nous nous sommes rendu compte que les mails ne s'envoyaient pas et avons constater que le mode DEBUG bloquait l'envoi de mail. . +On a donc retiré le controle sur le mode. -Classe assiduites.py -> app/models/assiduites.py - appelle la méthode _create-assiduite_ - qui lui va appeler sco_abs_notifaction.abs_notify - qui lui va appeler do_abs_notify - qui lui va appeler abs_notify_send - qui lui va appeler email.send_message +6. Ensuite, après cette modification, l'envoi de mail se faisait de manière théorique, on voyait dans les logs que Scodoc les envoyait, mais sans que nous recevions de mails. +. +Nous pensions alors que l'envoi de mails n'était pas possible sur la machine virtuelle. -test avec les log et tout -> problème à partir de l'appel du abs_notify_send dans le abs_notify => invalid_formsemestre +7. Nous avons trouvé la page de configuration de Scodoc et avons décidé de modifier les paramètres des mails pour y mettre nos adresses mails, ainsi que pour modifier les conditions d'envoi de mail. . -for destinations -> vide car à la création le abs_notify_get_destinations possède un formsemestre invalide +8. Nous avons finalement eu la confirmation que Scodoc avait essayé d'envoyer des mails mais sans succès. +Nous avions donc bien la confirmation que les mails s'envoyait lorsqu'une absence d'une étudiant est noté. +. -Problème trouvé -> voir screen fait -## 2.2 Analyse de la solution -- Dans la classe app/api/billets_absences.py se trouve une méthode billets_absence_etudiant qui renvoie la liste des absences d'un étudiant donné +**--> Problème confirmé** -- Gestion des absences dans la bases de données se déroule dans la classe app/models/absences.py -> dedans il crée une classe BilletAbsence -- classe app/api/assiduites.py contient une méthode assiduites qui retourne la liste des absences d'un étudiant +## 2.2 Analyse de la solution -- classe app/models/assiduites.py contient une méthode get_assiduite qui retourne la liste des assiduités pour un dept +1. Recherche dans le code des méthodes permettant d'envoyer les mails d'absences pour comprendre comment cela fonctionnait. +--> Dans le fichier app/models/assiduites.py -- classe CountCalculator dans le fichier app/scodoc/sco_assiduites.py TRES INTERESSANTE +2. Recherche d'une solution pour corriger la problématique : + 1. ***Envoyer tout 1er du mois des mails pour toutes les absences injustifiées des étudiants ayant au moins x absences injustifiées sur le semestre.*** + 2. ***Envoyer tout 1er du mois des mails pour toutes les absences injustifiées d'au moins trois jours (Donc ayant eu lieu au moins trois jours avant la fin du mois précédent) des étudiants ayant au moins x absences injustifiées sur le semestre.*** + Pour l'instant nous sommes resté l'idée d'envoyer les mail de manière mensuel et non de manière hebdomadaire. + **-->Solution 1** étant donné le court pour impléménter la fonctionnalité, nous avons décidé d'aller au plus simple. +3. Reflexion sur la façon dont nous allons pouvoir implementer la fonctionnalité et sur les différents traitements nécéssaires : Mise en place d'une logique : + 1. Récupération d'une liste de semestres + 2. Filtrage sur la liste de semestres pour récuperer que ceux qui correspondent à la bonne plage de date (Terminant après le début du mois précedent). + 3. Recupération pour chaque semestres de la liste de ses étudiants. + 4. Filtrage sur la liste des étudiants pour ne conserver que les étudiants ayant au moins x absences injustifiées sur le semestre. + 5. Filtrage sur la liste des étudiants pour ne conserver que les étudiants ayant au moins une absence injustifiée sur le mois précédent. + 6. Pour chaque absences injustifiées de chaque étudiant du mois précédent on envoi un mail +4. Analyse du code pour trouver les classes et les méthodes permettant de mettre en place notre procédure. + 1. Dans la classe app/api/billets_absences.py se trouve une méthode billets_absence_etudiant qui renvoie la liste des absences d'un étudiant donné. Cette méthodes est appellé directement par le front. C'est un pôint d'entrée qui se chargera d'appeler les bonnes méthodes (Cependant passer par l'API ne semblait pas très). -- Voir photo avec tableau par groupe et période de toutes les absences d'un groupe, création du fichier dans la classe app/views/assiduites.py -> méthode visu_asssi_group() + 2. La classe BilletAbsence dans app/models/absences.py permet de contenir une absence -- ON AIMES LA CLASSE TableAsssi dans le fichier app/tables/visu_assiduites.py (utilise la clase CountCalculator) + 3. classe app/api/assiduites.py contient une méthode assiduites qui retourne la liste des absences d'un étudiant -- méthode est_courant dans app/models/formesemestre.py qui permet de savoir si la période d'un semestre est compris dans la date actuelle + 4. classe app/models/assiduites.py contient une méthode get_assiduite qui retourne la liste des assiduités pour un dept -- méthode groups_table dans app/scodoc/sco_groups_view.py qui retourne la liste des étudiants dans un semestre + 5. classe CountCalculator dans le fichier app/scodoc/sco_assiduites.py permet de calculer pour chaque étudiant de calculer son nombres absences et d'absences justifiées dans une période donnée. Ensuite il ne nous resterait plus qu'a faire une soustraction pour trouver le nombre d'absences injustifiées. -- méthode get_default_group dans app/scodoc/sco_groups.py qui retourne les groupes d'un formsemester + 6. L'objet TableAsssi dans le fichier app/tables/visu_assiduites.py utilise la méthode CountCalculator et contient un recap pour chaque étudiant sur ses assiduites (absences justifiées et injustifiées) + + 7. La classe app/views/assiduites.py contient une méthode visu_asssi_group() permettant pour un groupe d'avoir son tableau recapitulatif sous la forme d'un objet TableAssi -- méthode _get_etud_stats dans app/tables/visu_assiduites.py qui retoune le nombre absences et nbr absences justifiées + 8. La méthode est_courant dans app/models/formesemestre.py permet de savoir si la période d'un semestre est compris dans la date actuelle -- méthode get_assiduites_stats dans app/scodoc/sco_assiduites.py qui permet de récuperer les assiduites d'un etudiant pour une periode donnée + 9. La méthode groups_table dans app/scodoc/sco_groups_view.py retourne la liste des étudiants dans un semestre -- méthode _list_formsemestres_query dans app/api/formesemestre.py qui permet de récupérer les formesemestre + 10. méthode get_default_group dans app/scodoc/sco_groups.py qui retourne les groupes d'un semestres -Première étape : récuperer la liste de tout les semestres - - méthode -Deuxième étape : faire une boucle sur la liste des semestres et leur appliqué la méthode est_courant (ne garder que ceux qui retourne true) - - méthode est_courant dans app/models/formesemestre.py qui permet de savoir si la période d'un semestre est compris dans la date actuelle -Troisième étape : récupérer la liste d'étudiants (à partir du formsemestre) - - méthode groups_table dans app/scodoc/sco_groups_view.py qui retourne la liste des étudiants dans un semestre -Quatrième étape : Récuperer les absences par étudiant - - méthode get_default_group dans app/scodoc/sco_groups.py qui retourne les groupes d'un formsemester - - création d'un objet TableAsssi dans le fichier app/tables/visu_assiduites.py ( qui utilise la clase CountCalculator) - - méthode _get_etud_stats dans app/tables/visu_assiduites.py qui retoune le nombre absences et nbr absences justifiées -Cinquième étape : Pour les étudiants pré sélectionné, on récuoère leurs absences du mois dernier - - méthode get_assiduites_stats dans app/scodoc/sco_assiduites.py qui permet de récuperer les assiduites d'un etudiant pour une periode donnée + 4. La méthode get_assiduites_stats dans app/scodoc/sco_assiduites.py qui permet de récuperer les assiduites d'un etudiant pour une periode donnée + 5. méthode _list_formsemestres_query dans app/api/formesemestre.py qui permet de récupérer la liste des semestres ## 2.3 Proposition de la solution +Pour implémenter la fonctionnalité, nous avons de : -Création d'un scheduler/workflow qui va lancer chaque mois, une méthode qui va générer et envoyer un mail à chaque étudiants qui ont plus de x absences injustifiées dans le semestre, résumant leurs absences injustifiées du mois précedent. - -Création du scheduler : - -- Utilisation du module python apsscheduler : - - from apsscheduler.schedulers.background import BackGroundScheduler - -- Création d'une méthode pour instancier notre scheduler et le lancer : - - ``` - def start_scheduler(): - scheduler = BackgroundScheduler(timezone='Europe/Paris') - scheduler.add_job(job, 'interval', id='my_task1', seconds=10) - scheduler.start() - return scheduler - ``` - Ce scheduler s'execute toutes les 10 secondes - -- On va appeler le scheduler pour lancer l'execution en arrière plan, avec le lancement de l'app en premier lan - +1. Créer un scheduler/workflow qui va lancer chaque mois, une méthode qui va générer et envoyer un mail à chaque étudiants qui ont plus de x absences injustifiées dans le semestre, résumant leurs absences injustifiées du mois précedent. Pour créer le Scheduler nous avons d'abord ajouter l'instancié un Objet de type Scheduler, cependant nous avons rencontré un problème lorsque nous avons découvert qu'il tournait en premier plan et qu'il bloquait donc l'accès aux fonctionnalités de Scodoc. +C'est pour cela que nous avons créé un scheduler dans le fichier api/\_\_init\_\_.py, en plus du Scheduler, on va créer un "Job" une méthode appelée par ce dernier et qui va éxécuter toute la procédure que nous avons précédemment décrit. +Avant d'implementer le Scheduler, nous avons du importer le module nécéssaire à l'aide de cette commande : ``` - def create_app(config_class=DevConfig): - #Contenu initial de la méthode - #.... - start_scheduler() - return app + from apsscheduler.schedulers.background import BackGroundScheduler ``` - - -- Implémenter le job que le scheduler va lancer (envoie mail) - - code - -- Paramétrer le scheduler (fréquence execution) - - code - - -Suppression ancien mail : - -- Trouver sa place dans le code - - code - -- Retirer l'envoie immédiat - - -AJOUTER LE LIEN DU REPO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Ensuite une fois la méthode pour créer le scheduler créée, il nous faut l'appeler dans la méthode create_app du fichier api/\_\_init\_\_.py. +Cela lancera le scheduler + +1. Suppression de l'envoi de mail lors de la saisie d'une absence. Pour ne pas faire doublons avec notre futur méthode, il nous faut retirer l'envoi de mail lors de la saisie des absences dans la méthode create_assiduite du fichier app/models/assiduites. + + +2. Implementation du "Job" appelé par le scheduler. Malheuresement par manque de temps nous n'avons pas eu le temps de faire toute les étapes de développement pour cette partie, mais voici comment cette méthode aurait dû fonctionner : + 1. Première étape : récuperer la liste de tout les semestres + 2. Deuxième étape : faire une boucle sur la liste des semestres et leur appliquer la méthode est_courant (ne garder que ceux qui retourne true) + - méthode est_courant dans app/models/formesemestre.py qui permet de savoir si la période d'un semestre est compris dans la date actuelle + 3. Troisième étape : récupérer la liste d'étudiants (à partir du formsemestre) + - méthode groups_table dans app/scodoc/sco_groups_view.py qui retourne la liste des étudiants dans un semestre + 4. Quatrième étape : Récuperer les absences par étudiant + - méthode get_default_group dans app/scodoc/sco_groups.py qui retourne les groupes d'un formsemester + - création d'un objet TableAsssi dans le fichier app/tables/visu_assiduites.py ( qui utilise la clase CountCalculator) + - méthode _get_etud_stats dans app/tables/visu_assiduites.py qui retoune le nombre absences et nbr absences justifiées + 5. Cinquième étape : Pour les étudiants pré sélectionné, on récuoère leurs absences du mois dernier + - méthode get_assiduites_stats dans app/scodoc/sco_assiduites.py qui permet de récuperer les assiduites d'un etudiant pour une periode donnée + 6. Envoi d'un mail par absences. +3. Configuration du Scheduler pour qu'il se lance tous les premier du mois. Malheuresement par manque de temps nous n'avons pas eu le temps de le parametrer pour notre besoin. + +## Conclusions + +- La première difficultés rencontré a été de s'approprier le code, sa logique et son architecture. +- Pour cela 4h sont nécéssaires, pour bien tout appréhender, cette étape est très importante car elle sert de base ensuite pour établir un protocole pour implémenter quelque chose. +- 2h Sont nécéssaires pour réussir a reproduire la problématique, pour tout configurer. +- 6h pour émettre les hypothèse et émettre et commencer la solutions. +- Lors du dévellopement, nous avons eu beaucoup de difficultés a trouver les méthodes et classes a utiliser étant donné l'importance du projet et le fait que le langage de programmation ne soit pas celui que nous avons l'habitude d'utilisé pour le développement d'APIs. +- Nous avons bien vu que la maintenance est plus compliquée que le dévéloppement d'une application de zéro du fait qu'elle nécéssite une compréhension de l'existant et que cela nécéssite beaucoup de temps. diff --git a/image-1.png b/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5c549d80dca947027dfe803b67fbb2826b0014b4 Binary files /dev/null and b/image-1.png differ diff --git a/image-2.png b/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..59744b3201b0d3fe4eaa74baa7a79f3ba8d001b1 Binary files /dev/null and b/image-2.png differ diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5c549d80dca947027dfe803b67fbb2826b0014b4 Binary files /dev/null and b/image.png differ diff --git a/images/appelSched.png b/images/appelSched.png new file mode 100644 index 0000000000000000000000000000000000000000..5c549d80dca947027dfe803b67fbb2826b0014b4 Binary files /dev/null and b/images/appelSched.png differ diff --git a/images/commentairNotif.png b/images/commentairNotif.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f2ce2389c1615b6ca61dfac250f6f89bae681c Binary files /dev/null and b/images/commentairNotif.png differ diff --git a/images/creationDuScheduler.png b/images/creationDuScheduler.png new file mode 100644 index 0000000000000000000000000000000000000000..59744b3201b0d3fe4eaa74baa7a79f3ba8d001b1 Binary files /dev/null and b/images/creationDuScheduler.png differ diff --git a/images/modeDebug.png b/images/modeDebug.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa0c6dfaa1ea16f50bf9fd7f7b3367adfd10a6b Binary files /dev/null and b/images/modeDebug.png differ