From 0406bba322cbbba50b7b4f9c9d48cdaddcc8e81e Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Fri, 13 Dec 2024 16:54:02 +0100
Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9:=20am=C3=A9lioration=20fonction?=
 =?UTF-8?q?=20import=20excel:=20feuille=5Fabs=5Fformsemestre?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/tables/visu_assiduites.py                 |  8 +++++--
 .../pages/feuille_abs_formsemestre.j2         | 23 ++++++++++---------
 app/views/assiduites.py                       | 20 ++++++++++------
 3 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/app/tables/visu_assiduites.py b/app/tables/visu_assiduites.py
index 0903cd87..f160d035 100644
--- a/app/tables/visu_assiduites.py
+++ b/app/tables/visu_assiduites.py
@@ -188,7 +188,8 @@ class RowAssi(tb.Row):
             self.add_cell(
                 "lien_ajout",
                 "",
-                f"""<a href='{ajout_url}' class="stdlink">signaler</a>""",
+                "signaler",
+                target=ajout_url,
                 no_excel=True,
                 column_classes={"col_lien_ajout"},
             )
@@ -201,9 +202,12 @@ class RowAssi(tb.Row):
 
         Returns :
             {
-                "<etat>" : [<Etat version lisible>, <nb total etat>, <nb just etat>]
+                "<etat>" : [<Etat version lisible>, <nb_total_etat>, <nb_just_etat>]
             }
 
+        nb_total_etat = nb d'assiduité de la catégorie (dans la métrique)
+        nb_just_etat = nb d'assiduité justifiées de la catégorie (dans la métrique)
+
         """
 
         # Préparation du retour
diff --git a/app/templates/assiduites/pages/feuille_abs_formsemestre.j2 b/app/templates/assiduites/pages/feuille_abs_formsemestre.j2
index c3424d54..85b68575 100644
--- a/app/templates/assiduites/pages/feuille_abs_formsemestre.j2
+++ b/app/templates/assiduites/pages/feuille_abs_formsemestre.j2
@@ -5,10 +5,6 @@
 <style>
     #excel-content {
         margin: 4px 0;
-        display: flex;
-        flex-direction: column;
-        gap: 4px;
-        justify-content: space-evenly;
     }
 
     .hint {
@@ -48,12 +44,11 @@
         <p class="hint">Le fichier importé doit respecter le format suivant</p>
 
         <ul>
-            <li>
-                colonne A : Identifiant de l'étudiant
-            </li>
-            <li class="star">colonne B : Date de début</li>
-            <li class="star">colonne C : Date de fin</li>
-            <li class="opt">colonne D : État (ABS, RET, PRE), considéré ABSent si vide</li>
+            <li>colonne A : identifiant de l'étudiant (voir type ci-dessous)</li>
+            <li class="star">colonne B : date de début</li>
+            <li class="star">colonne C : date de fin</li>
+            <li class="opt">colonne D : état: ABS (absent), ABSJUST (absent justifié),
+                RET (retard), PRE (présent), considéré ABSent si vide</li>
             <li class="opt">colonne E : code du module</li>
         </ul>
 
@@ -88,9 +83,15 @@
                         accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />
             </div>
             <div class="space-before-18">
-                <button type="submit">Importer</button>
+                <button type="submit"><b>Importer</b></button>
             </div>
         </form>
+        <div class="vspaced">
+        <a class="stdlink" href="{{
+            url_for('notes.formsemestre_status',
+                scodoc_dept=g.scodoc_dept, formsemestre_id=sco.formsemestre.id)
+        }}">retour au tableau de bord</a>
+        </div>
     </div>
 </div>
 
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index 6ce9b5c6..e197ae1b 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -2562,13 +2562,15 @@ def _import_excel_assiduites_list(
     erreurs: list[tuple[str, list]] = []
     for num, ligne in enumerate(data):
         if not ligne or len(ligne) < 5:
-            raise ScoValueError("Format de fichier tableau non reconnu")
+            raise ScoValueError(
+                "Format de fichier tableau non reconnu (nb de colonnes)"
+            )
         identifiant_etud = ligne[0]  # etudid/nip/ine
         date_debut_str = ligne[1]  # iso / fra / excel
         date_fin_str = ligne[2]  # iso / fra / excel
         etat = ligne[3].strip().upper()  # etat abs par défaut, sinon RET ou PRE
         etat = etat or "ABS"
-        module = ligne[4] or None  # code du module
+        module = ligne[4].strip() or None  # code du module
         moduleimpl: ModuleImpl | None = None
         try:
             # On récupère l'étudiant
@@ -2578,7 +2580,9 @@ def _import_excel_assiduites_list(
                     f"Étudiant ({safehtml.html_to_safe_html(identifiant_etud)}) non trouvé"
                 )
             # On vérifie que l'étudiant appartient au semestre
-            if formsemestre not in etud.get_formsemestres():
+            if formsemestre.id not in {
+                ins.formsemestre_id for ins in etud.formsemestre_inscriptions
+            }:
                 raise ScoValueError("Étudiant non inscrit dans le semestre")
 
             # On transforme les dates
@@ -2590,14 +2594,14 @@ def _import_excel_assiduites_list(
             date_fin = scu.TIME_ZONE.localize(date_fin)
 
             # Vérification de l'état
-            if etat not in ["ABS", "RET", "PRE"]:
+            if etat not in ["ABS", "RET", "PRE", "ABSJUST"]:
                 raise ScoValueError(f"État invalide => {etat}")
 
-            etat: scu.EtatAssiduite = {
+            etat_assiduite: scu.EtatAssiduite = {
                 "ABS": scu.EtatAssiduite.ABSENT,
                 "RET": scu.EtatAssiduite.RETARD,
                 "PRE": scu.EtatAssiduite.PRESENT,
-            }.get(etat, scu.EtatAssiduite.ABSENT)
+            }.get(etat[:3], scu.EtatAssiduite.ABSENT)
 
             # On récupère le moduleimpl à partir du code du module et du formsemestre
             if module:
@@ -2607,8 +2611,10 @@ def _import_excel_assiduites_list(
                 etud=etud,
                 date_debut=date_debut,
                 date_fin=date_fin,
-                etat=etat,
+                etat=etat_assiduite,
                 moduleimpl=moduleimpl,
+                est_just="JUST" in etat,
+                user_id=current_user.id,
             )
             db.session.add(assiduite)
             scass.simple_invalidate_cache(assiduite.to_dict())
-- 
GitLab