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