diff --git a/app/scodoc/sco_abs_notification.py b/app/scodoc/sco_abs_notification.py index 54a645e3..0a63fc56 100644 --- a/app/scodoc/sco_abs_notification.py +++ b/app/scodoc/sco_abs_notification.py @@ -31,6 +31,7 @@ Il suffit d'appeler abs_notify() après chaque ajout d'absence. """ + import datetime from typing import Optional @@ -281,6 +282,9 @@ def abs_notification_message( "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid, _external=True ) + # Formsemestre concerné (ex: "BUT Informatique semestre 2") + values["semestre"] = formsemestre.titre_num() + template = prefs["abs_notification_mail_tmpl"] txt = "" if template: diff --git a/app/scodoc/sco_moduleimpl_status.py b/app/scodoc/sco_moduleimpl_status.py index 1890b87d..abe85457 100644 --- a/app/scodoc/sco_moduleimpl_status.py +++ b/app/scodoc/sco_moduleimpl_status.py @@ -371,20 +371,6 @@ def moduleimpl_status(moduleimpl_id=None, partition_id=None): >Saisie Absences (Hebdo) """ ) - H.append( - f""" - (Saisie Absences Différée) - """ - ) - H.append("") # if not modimpl.check_apc_conformity(nt): diff --git a/app/static/js/assiduites.js b/app/static/js/assiduites.js index 0d12635c..4bcb8396 100644 --- a/app/static/js/assiduites.js +++ b/app/static/js/assiduites.js @@ -168,6 +168,10 @@ function creerLigneEtudiant(etud, index) { date_fin: null, }; + /**Retourne une liste d'assiduité en conflit avec la période actuelle + * @param {Array} assiduites - Les assiduités de l'étudiant + * @returns {Array} Les assiduités en conflit + */ function recupConflitsAssiduites(assiduites) { const period = getPeriodAsDate(); @@ -182,9 +186,12 @@ function creerLigneEtudiant(etud, index) { ); }); } - + // Pas de conflit en readonly const conflits = readOnly ? [] : recupConflitsAssiduites(etud.assiduites); + // Si il y a des conflits, on prend le premier pour l'afficher + // si les dates de début et de fin sont les mêmes, c'est une édition + // sinon c'est un conflit if (conflits.length > 0) { currentAssiduite = conflits[0]; @@ -200,6 +207,49 @@ function creerLigneEtudiant(etud, index) { : "conflit"; } + // Création de la ligne étudiante en DOM + /* exemple de ligne étudiante +
+
1
+
Baudin Joseph +

Baudin

+
Joseph
+
+
+
+
13h +
+
+
+
+ + + +
+
+ */ const ligneEtud = document.createElement("div"); ligneEtud.classList.add("etud_row"); if (Object.keys(etudsDefDem).includes(etud.id)) { @@ -388,6 +438,9 @@ async function creerTousLesEtudiants(etuds) { etudsDiv.innerHTML = ""; const moduleImplId = readOnly ? null : $("#moduleimpl_select").val(); const inscriptions = await getInscriptionModule(moduleImplId); + // on trie les étudiants par ordre alphabétique + // et on garde ceux qui sont inscrits au module + // puis pour chaque étudiant on crée une ligne [...etuds.values()] .sort((a, b) => { return a.sort_key > b.sort_key ? 1 : -1; @@ -496,10 +549,9 @@ async function getInscriptionModule(moduleimpl_id) { return inscriptionsModules.get(moduleimpl_id); } - +// Mise à jour de la ligne étudiant async function MiseAJourLigneEtud(etud) { //Récupérer ses assiduités - function RecupAssiduitesEtudiant(etudid) { const date = $("#date").datepicker("getDate"); const date_debut = date.add(-1, "days").format("YYYY-MM-DDTHH:mm"); @@ -527,6 +579,8 @@ async function MiseAJourLigneEtud(etud) { } await RecupAssiduitesEtudiant(etud.id); + // Une fois les assiduités récupérées, on met à jour la ligne étudiant + // on replace l'ancienne ligne par la nouvellement générée const etudRow = document.getElementById(`etud_row_${etud.id}`); if (etudRow == null) return; @@ -540,12 +594,14 @@ async function MiseAJourLigneEtud(etud) { etudRow.replaceWith(ligneEtud); } +// Action appelée lors d'un clic sur un bouton d'assiduité +// Création, édition ou suppression d'une assiduité async function actionAssiduite(etud, etat, type, assiduite = null) { const modimpl_id = $("#moduleimpl_select").val(); if (assiduite && assiduite.etat.toLowerCase() === etat) type = "suppression"; const { deb, fin } = getPeriodAsDate(); - + // génération d'un objet assiduité basique qui sera complété let assiduiteObjet = assiduite ?? { date_debut: deb, date_fin: fin, @@ -554,7 +610,8 @@ async function actionAssiduite(etud, etat, type, assiduite = null) { assiduiteObjet.etat = etat; assiduiteObjet.moduleimpl_id = modimpl_id; - + // En fonction du type d'action on appelle la bonne route + // avec les bonnes valeurs if (type === "creation") { await async_post( `../../api/assiduite/${etud.id}/create`, @@ -606,7 +663,9 @@ async function actionAssiduite(etud, etat, type, assiduite = null) { ); } } - +// Fonction pour afficher un message d'erreur si le module n'est pas renseigné +// ou si l'étudiant n'est pas inscrit au module. +// On donne le message d'erreur d'une requête api et cela affiche le message correspondant function erreurModuleImpl(message) { if (message == "Module non renseigné") { const HTML = ` @@ -635,7 +694,9 @@ function erreurModuleImpl(message) { openAlertModal("Sélection du module", content); } } - +// Fonction pour ajouter en lot une assiduité à tous les étudiants +// Fonctionne uniquement pour créer ou supprimer des assiduités +// Pas d'édition possible function mettreToutLeMonde(etat, el = null) { const lignesEtuds = [...document.querySelectorAll("fieldset.btns_field")]; @@ -709,7 +770,7 @@ function mettreToutLeMonde(etat, el = null) { } envoiToastTous("remove", assiduites_id.length); if (Object.keys(unDeleted).length == 0) return; - + // CAS : des assiduités d'étudiants n'ont pas pu être supprimés let unDeletedEtuds = `