diff --git a/app/models/assiduites.py b/app/models/assiduites.py index 7471c11e23..566359d577 100644 --- a/app/models/assiduites.py +++ b/app/models/assiduites.py @@ -316,10 +316,10 @@ def compute_assiduites_justified( for justi in justificatifs: assiduites: Assiduite = ( Assiduite.query.join(Justificatif, Justificatif.etudid == Assiduite.etudid) - .filter(Assiduite.etat != EtatAssiduite.PRESENT) + .filter(justi.etat == EtatJustificatif.VALIDE) .filter( - Assiduite.date_debut <= justi.date_fin, - Assiduite.date_fin >= justi.date_debut, + Assiduite.date_debut < justi.date_fin, + Assiduite.date_fin > justi.date_debut, ) ) @@ -329,11 +329,9 @@ def compute_assiduites_justified( db.session.add(assi) if reset: - un_justified: Assiduite = ( - Assiduite.query.filter(Assiduite.id.not_in(list_assiduites_id)) - .filter(Assiduite.etat != EtatAssiduite.PRESENT) - .join(Justificatif, Justificatif.etudid == Assiduite.etudid) - ) + un_justified: Assiduite = Assiduite.query.filter( + Assiduite.id.not_in(list_assiduites_id) + ).join(Justificatif, Justificatif.etudid == Assiduite.etudid) for assi in un_justified: assi.est_just = False diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py index 3ba865a224..4af613a599 100644 --- a/app/scodoc/sco_assiduites.py +++ b/app/scodoc/sco_assiduites.py @@ -20,7 +20,6 @@ class CountCalculator: evening: time = time(18, 0), skip_saturday: bool = True, ) -> None: - self.morning: time = morning self.noon: time = noon self.after_noon: time = after_noon @@ -318,13 +317,11 @@ def justifies(justi: Justificatif, obj: bool = False) -> list[int]: if justi.etat != scu.EtatJustificatif.VALIDE: return [] - assiduites_query: Assiduite = ( - Assiduite.query.join(Justificatif, Assiduite.etudid == Justificatif.etudid) - .filter(Assiduite.etat != scu.EtatAssiduite.PRESENT) - .filter( - Assiduite.date_debut <= justi.date_fin, - Assiduite.date_fin >= justi.date_debut, - ) + assiduites_query: Assiduite = Assiduite.query.join( + Justificatif, Assiduite.etudid == Justificatif.etudid + ).filter( + Assiduite.date_debut <= justi.date_fin, + Assiduite.date_fin >= justi.date_debut, ) if not obj: diff --git a/app/static/css/assiduites.css b/app/static/css/assiduites.css index eb6e243ee4..be487a7e35 100644 --- a/app/static/css/assiduites.css +++ b/app/static/css/assiduites.css @@ -192,6 +192,14 @@ background-color: #F1D99C !important; } +.etud_row .assiduites_bar .justified { + background-image: repeating-linear-gradient(135deg, transparent, transparent 4px, #7059FF 4px, #7059FF 8px); +} + +.etud_row .assiduites_bar .invalid_justified { + background-image: repeating-linear-gradient(135deg, transparent, transparent 4px, #d61616 4px, #d61616 8px); +} + /* --- Boutons assiduités --- */ .etud_row .btns_field { diff --git a/app/static/js/assiduites.js b/app/static/js/assiduites.js index 79d7308fc2..bd004f4274 100644 --- a/app/static/js/assiduites.js +++ b/app/static/js/assiduites.js @@ -16,6 +16,7 @@ let currentValues = [8.0, 10.0]; //Objet stockant les étudiants et les assiduités let etuds = {}; let assiduites = {}; +let justificatifs = {}; // Variable qui définit si le processus d'action de masse est lancé let currentMassAction = false; @@ -1094,12 +1095,40 @@ function createMiniTimeline(assiduitesArray) { setPeriodValues(deb, fin); updateSelectedSelect(getCurrentAssiduiteModuleImplId()); + updateJustifyBtn(); }); } //ajouter affichage assiduites on over setupAssiduiteBuble(block, assiduité); + + if (assiduité.est_just) { + block.classList.add("justified"); + } } + const action = (justificatifs) => { + if (justificatifs.length > 0) { + let j = "invalid_justified"; + + justificatifs.forEach((ju) => { + if (ju.etat == "VALIDE") { + j = "justified"; + } + }); + + block.classList.add(j); + } + }; + + getJustificatifFromPeriod( + { + deb: new moment.tz(assiduité.date_debut, TIMEZONE), + fin: new moment.tz(assiduité.date_fin, TIMEZONE), + }, + assiduité.etudid, + action + ); + switch (assiduité.etat) { case "PRESENT": block.classList.add("present"); @@ -1773,31 +1802,33 @@ function getCurrentAssiduite(etudid) { // <<== Gestion de la justification ==>> -function getJustificatifFromPeriod(date) { - let justifs = []; - sync_get( - getUrl() + - `/api/justificatifs/${etudid}/query?date_debut=${date.deb.format()}&date_fin=${date.fin.format()}`, - (data) => { - justifs = data; - } - ); - - return justifs; +function getJustificatifFromPeriod(date, etudid, update) { + $.ajax({ + async: true, + type: "GET", + url: + getUrl() + + `/api/justificatifs/${etudid}/query?date_debut=${date.deb + .add(1, "s") + .format()}&date_fin=${date.fin.subtract(1, "s").format()}`, + success: (data) => { + update(data); + }, + error: () => {}, + }); } -function updateJustifieButton(isJustified, isDisabled = true) { - const btn = document.getElementById("justif-rapide"); - if (isJustified) { - btn.classList.add("justifie"); - } else { - btn.classList.remove("justifie"); - } +function updateJustifyBtn() { + if (isSingleEtud()) { + const assi = getCurrentAssiduite(etudid); - if (isDisabled) { - btn.setAttribute("disabled", "true"); - } else { - btn.removeAttribute("disabled"); + const just = assi ? !assi.est_just : false; + const btn = document.getElementById("justif-rapide"); + if (!just) { + btn.setAttribute("disabled", "true"); + } else { + btn.removeAttribute("disabled"); + } } } @@ -1806,12 +1837,100 @@ function fastJustify(assiduite) { deb: new moment.tz(assiduite.date_debut, TIMEZONE), fin: new moment.tz(assiduite.date_fin, TIMEZONE), }; - const justifs = getJustificatifFromPeriod(period); + const action = (justifs) => { + if (justifs.length > 0) { + justifyAssiduite(assiduite.assiduite_id, !assiduite.est_just); + } else { + console.debug("WIP"); + //créer un nouveau justificatif + // Afficher prompt -> demander raison et état - if (justifs.length > 0) { - //modifier l'assiduité - } else { - //créer un nouveau justificatif - // Afficher prompt -> demander raison et état - } + const success = () => { + const raison = document.getElementById("promptText").value; + const etat = document.getElementById("promptSelect").value; + + //créer justificatif + + const justif = { + date_debut: new moment.tz(assiduite.date_debut, TIMEZONE) + .add(1, "s") + .format(), + date_fin: new moment.tz(assiduite.date_fin, TIMEZONE) + .subtract(1, "s") + .format(), + raison: raison, + etat: etat, + }; + + createJustificatif(justif); + + // justifyAssiduite(assiduite.assiduite_id, true); + generateAllEtudRow(); + }; + + const content = document.createElement("fieldset"); + + const htmlPrompt = ` + + + + `; + + content.innerHTML = htmlPrompt; + + openPromptModal( + "Nouveau justificatif (Rapide)", + content, + success, + () => {}, + "#7059FF" + ); + } + }; + getJustificatifFromPeriod(period, assiduite.etudid, action); +} + +function justifyAssiduite(assiduite_id, justified) { + const assiduite = { + est_just: justified, + }; + const path = getUrl() + `/api/assiduite/${assiduite_id}/edit`; + let bool = false; + sync_post( + path, + assiduite, + (data, status) => { + bool = true; + }, + (data, status) => { + //error + console.error(data, status); + } + ); + + return bool; +} + +function createJustificatif(justif) { + const path = getUrl() + `/api/justificatif/${etudid}/create`; + sync_post( + path, + [justif], + (data, status) => { + //success + if (data.success.length > 0) { + console.table(data[0]); + } + console.warn(data); + }, + (data, status) => { + //error + console.error(data, status); + } + ); } diff --git a/app/templates/assiduites/signal_assiduites_etud.j2 b/app/templates/assiduites/signal_assiduites_etud.j2 index 00b4bd217e..bd5de04e79 100644 --- a/app/templates/assiduites/signal_assiduites_etud.j2 +++ b/app/templates/assiduites/signal_assiduites_etud.j2 @@ -29,6 +29,8 @@ {% include "assiduites/toast.j2" %} +{% include "assiduites/alert.j2" %} +{% include "assiduites/prompt.j2" %}