diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index 1523c8e820..f93bf05269 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -1476,3 +1476,14 @@ def is_assiduites_module_forced( except (TypeError, ValueError): retour = sco_preferences.get_preference("forcer_module", dept_id=dept_id) return retour + + +def get_assiduites_time_config(config_type: str) -> str: + from app.models import ScoDocSiteConfig + match config_type: + case "matin": + return ScoDocSiteConfig.get("assi_morning_time", "08:00:00") + case "aprem": + return ScoDocSiteConfig.get("assi_afternoon_time", "18:00:00") + case "pivot": + return ScoDocSiteConfig.get("assi_lunch_time", "13:00:00") diff --git a/app/static/css/assiduites.css b/app/static/css/assiduites.css index fe429ecfcb..ed5daa259f 100644 --- a/app/static/css/assiduites.css +++ b/app/static/css/assiduites.css @@ -1,15 +1,17 @@ :root { --color-present: #6bdb83; --color-absent: #e62a11; + --color-absent-clair: #F25D4A; --color-retard: #f0c865; --color-justi: #7059FF; + --color-justi-clair: #6885E3; --color-justi-invalide: #a84476; --color-nonwork: #badfff; --color-absent-justi: #e65ab7; --color-retard-justi: #ffef7a; - --color-error: #FF0000; + --color-error: #e62a11; --color-warning: #eec660; --color-information: #658ef0; @@ -21,7 +23,7 @@ --color-defaut: #FFF; --color-defaut-dark: #444; - + --color-default-text: #1F1F1F; --motif-justi: repeating-linear-gradient(135deg, transparent, transparent 4px, var(--color-justi) 4px, var(--color-justi) 8px); diff --git a/app/static/js/assiduites.js b/app/static/js/assiduites.js index aadd04cae9..8b4df342c9 100644 --- a/app/static/js/assiduites.js +++ b/app/static/js/assiduites.js @@ -953,6 +953,89 @@ function createAssiduite(etat, etudid) { ); return !with_errors; } +/** + * Création d'une assiduité pour un étudiant + * @param {String} etat l'état de l'étudiant + * @param {Number | String} etudid l'identifiant de l'étudiant + * + * TODO : Rendre asynchrone + */ +function createAssiduiteComplete(assiduite, etudid) { + if (!hasModuleImpl(assiduite) && window.forceModule) { + const html = ` +

Aucun module n'a été spécifié

+ `; + const div = document.createElement("div"); + div.innerHTML = html; + openAlertModal("Erreur Module", div); + return false; + } + + const path = getUrl() + `/api/assiduite/${etudid}/create`; + + let with_errors = false; + + sync_post( + path, + [assiduite], + (data, status) => { + //success + if (data.success.length > 0) { + let obj = data.success["0"].message.assiduite_id; + } + if (data.errors.length > 0) { + console.error(data.errors["0"].message); + if (data.errors["0"].message == "Module non renseigné") { + const HTML = ` +

Attention, le module doit obligatoirement être renseigné.

+

Cela vient de la configuration du semestre ou plus largement du département.

+

Si c'est une erreur, veuillez voir avec le ou les responsables de votre scodoc.

+ `; + + const content = document.createElement("div"); + content.innerHTML = HTML; + + openAlertModal("Sélection du module", content); + } + if ( + data.errors["0"].message == "L'étudiant n'est pas inscrit au module" + ) { + const HTML = ` +

Attention, l'étudiant n'est pas inscrit à ce module.

+

Si c'est une erreur, veuillez voir avec le ou les responsables de votre scodoc.

+ `; + + const content = document.createElement("div"); + content.innerHTML = HTML; + + openAlertModal("Sélection du module", content); + } + if ( + data.errors["0"].message == + "Duplication: la période rentre en conflit avec une plage enregistrée" + ) { + const HTML = ` +

L'assiduité n'a pas pu être enregistrée car une autre assiduité existe sur la période sélectionnée

+

Si c'est une erreur, veuillez voir avec le ou les responsables de votre scodoc.

+ `; + + const content = document.createElement("div"); + content.innerHTML = HTML; + + openAlertModal("Période conflictuelle", content); + } + with_errors = true; + } + }, + (data, status) => { + //error + console.error(data, status); + errorAlert(); + with_errors = true; + } + ); + return !with_errors; +} /** * Suppression d'une assiduité diff --git a/app/templates/assiduites/pages/ajout_assiduites.j2 b/app/templates/assiduites/pages/ajout_assiduites.j2 new file mode 100644 index 0000000000..311b24a55c --- /dev/null +++ b/app/templates/assiduites/pages/ajout_assiduites.j2 @@ -0,0 +1,234 @@ +{% include "assiduites/widgets/toast.j2" %} +{% block pageContent %} +
+

Ajouter une assiduité

+ {% include "assiduites/widgets/tableau_base.j2" %} + {% if saisie_eval %} +
+
+

+ La saisie de l'assiduité a été préconfigurée en fonction de l'évaluation.
+ Une fois la saisie finie, cliquez sur le lien si dessous pour revenir sur la gestion de l'évaluation +

+ retourner sur la page de l'évaluation +
+ {% endif %} +
+
+
+
+ Date de début + + Journée entière +
+
+ Date de fin + +
+
+ +
+
+ Etat de l'assiduité + +
+
+
+
+ Module + {% with moduleid="ajout_assiduite_module_impl",label=false %} + {% include "assiduites/widgets/moduleimpl_dynamic_selector.j2" %} + {% endwith %} +
+
+ +
+
+ Raison + +
+
+ +
+ + +
+ + +
+ +
+
+ + {% include "assiduites/widgets/tableau_assi.j2" %} +
+ +
+ + + +{% endblock pageContent %} \ No newline at end of file diff --git a/app/templates/assiduites/pages/ajout_justificatif.j2 b/app/templates/assiduites/pages/ajout_justificatif.j2 index fac1b11ed5..d74737146a 100644 --- a/app/templates/assiduites/pages/ajout_justificatif.j2 +++ b/app/templates/assiduites/pages/ajout_justificatif.j2 @@ -3,10 +3,7 @@

Justifier des absences ou retards

{% include "assiduites/widgets/tableau_base.j2" %} -
- - {% include "assiduites/widgets/tableau_justi.j2" %} -
+
@@ -60,6 +57,10 @@
+
+ + {% include "assiduites/widgets/tableau_justi.j2" %} +
@@ -224,12 +225,12 @@ if (document.getElementById('justi_journee').checked) { date_deb.setAttribute("show", "date") date_fin.setAttribute("show", "date") - document.getElementById("date_fin").classList.add("hidden"); + document.querySelector(`legend[for="justi_date_fin"]`).removeAttribute("required") + } else { date_deb.removeAttribute("show") date_fin.removeAttribute("show") - document.getElementById("date_fin").classList.remove("hidden"); - + document.querySelector(`legend[for="justi_date_fin"]`).setAttribute("required", "") } } @@ -238,8 +239,12 @@ const date_fin = document.querySelector(".page #justi_date_fin") const journee = document.querySelector('.page #justi_journee').checked const deb = date_deb.valueAsObject.date + "T" + (journee ? assi_morning : date_deb.valueAsObject.time) - const fin = (journee ? date_deb.valueAsObject.date : date_fin.valueAsObject.date) + "T" + (journee ? assi_evening : date_fin.valueAsObject.time) - + let fin = "T" + (journee ? assi_evening : date_fin.valueAsObject.time) + if (journee) { + fin = (date_fin.valueAsObject.date || date_deb.valueAsObject.date) + fin + } else { + fin = date_fin.valueAsObject.date + fin + } return { "deb": deb, "fin": fin, diff --git a/app/templates/assiduites/pages/calendrier.j2 b/app/templates/assiduites/pages/calendrier.j2 index 0f9ef84bda..1b3b59a497 100644 --- a/app/templates/assiduites/pages/calendrier.j2 +++ b/app/templates/assiduites/pages/calendrier.j2 @@ -343,6 +343,9 @@