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