From 2de4f6e0b35345fcaedf0a5710c987015719a087 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Mon, 2 Sep 2024 10:35:24 +0200
Subject: [PATCH] =?UTF-8?q?TYraitement=20erreur=20saisie=20assiduit=C3=A9?=
 =?UTF-8?q?=20+=20cosmetic?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/scodoc/html_sidebar.py                    | 180 +-----------------
 app/scodoc/sco_page_etud.py                   |   1 -
 app/scodoc/sco_utils.py                       |   8 +
 app/static/css/assiduites.css                 |   2 +-
 app/static/css/scodoc.css                     |   1 +
 .../assiduites/explication_etats_justifs.j2   |   2 +-
 .../pages/ajout_justificatif_etud.j2          |   8 +-
 app/templates/assiduites/pages/bilan_etud.j2  |  21 +-
 .../assiduites/pages/calendrier_assi_etud.j2  |   3 +-
 .../pages/signal_assiduites_group.j2          |   2 +-
 app/templates/sidebar.j2                      |   2 +-
 app/views/assiduites.py                       |  20 +-
 12 files changed, 44 insertions(+), 206 deletions(-)

diff --git a/app/scodoc/html_sidebar.py b/app/scodoc/html_sidebar.py
index 85df8548c..7036f4e4a 100755
--- a/app/scodoc/html_sidebar.py
+++ b/app/scodoc/html_sidebar.py
@@ -29,16 +29,10 @@
 Génération de la "sidebar" (marge gauche des pages HTML)
 """
 
-from flask import render_template, url_for
-from flask import g, request
-from flask_login import current_user
+from flask import request
 
 from app import db
-from app.models import Evaluation, GroupDescr, Identite, ModuleImpl, Partition
-import app.scodoc.sco_utils as scu
-from app.scodoc import sco_preferences
-from app.scodoc.sco_permissions import Permission
-from sco_version import SCOVERSION
+from app.models import Evaluation, GroupDescr, ModuleImpl, Partition
 
 
 def retreive_formsemestre_from_request() -> int:
@@ -93,173 +87,3 @@ def retreive_formsemestre_from_request() -> int:
         return int(formsemestre_id)
     except ValueError:
         return None  # no current formsemestre
-
-
-def sidebar_common():
-    "partie commune à toutes les sidebar"
-    home_link = url_for("scodoc.index", scodoc_dept=g.scodoc_dept)
-    H = [
-        f"""<a class="scodoc_title" href="{home_link}">ScoDoc {SCOVERSION}</a><br>
-        <a href="{home_link}" class="sidebar">Accueil</a> <br>
-        <div id="authuser"><a id="authuserlink" href="{
-            url_for("users.user_info_page",
-                scodoc_dept=g.scodoc_dept, user_name=current_user.user_name)
-            }">{current_user.user_name}</a>
-        <br><a id="deconnectlink" href="{url_for("auth.logout")}">déconnexion</a>
-        </div>
-        {sidebar_dept()}
-        <h2 class="insidebar">Scolarité</h2>
-        <a href="{
-            url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)
-        }" class="sidebar">Semestres</a> <br>
-        <a href="{
-            url_for("notes.index_html", scodoc_dept=g.scodoc_dept)
-        }" class="sidebar">Formations</a> <br>
-        """
-    ]
-    if current_user.has_permission(Permission.AbsChange):
-        H.append(
-            f""" <a href="{
-                url_for("assiduites.bilan_dept", scodoc_dept=g.scodoc_dept)
-            }" class="sidebar">Assiduité</a> <br> """
-        )
-    if current_user.has_permission(
-        Permission.UsersAdmin
-    ) or current_user.has_permission(Permission.UsersView):
-        H.append(
-            f"""<a href="{
-                url_for("users.index_html", scodoc_dept=g.scodoc_dept)
-            }" class="sidebar">Utilisateurs</a> <br>"""
-        )
-
-    if current_user.has_permission(Permission.EditPreferences):
-        H.append(
-            f"""<a href="{url_for("scolar.edit_preferences", scodoc_dept=g.scodoc_dept)}"
-            class="sidebar">Paramétrage</a> <br>"""
-        )
-
-    return "".join(H)
-
-
-def sidebar(etudid: int = None):
-    "Main HTML page sidebar"
-    # rewritten from legacy DTML code
-    from app.scodoc import sco_assiduites
-    from app.scodoc import sco_etud
-
-    params = {}
-
-    H = [
-        f"""
-        <!-- sidebar py -->
-        <div class="sidebar" id="sidebar">
-        { sidebar_common() }
-        <div class="box-chercheetud">Chercher étudiant:<br>
-        <form method="get" id="form-chercheetud"
-            action="{url_for('scolar.search_etud_in_dept', scodoc_dept=g.scodoc_dept) }">
-        <div><input type="text" size="12" class="in-expnom" name="expnom" spellcheck="false"></input></div>
-        </form></div>
-        <div class="etud-insidebar">
-        """
-    ]
-    # ---- Il y-a-t-il un etudiant selectionné ?
-    etudid = etudid if etudid is not None else g.get("etudid", None)
-    if etudid is None:
-        if request.method == "GET":
-            etudid = request.args.get("etudid", None)
-        elif request.method == "POST":
-            etudid = request.form.get("etudid", None)
-
-    if etudid is not None:
-        etud = Identite.get_etud(etudid)
-        # compte les absences du semestre en cours
-        H.append(
-            f"""<h2 id="insidebar-etud"><a href="{
-                url_for(
-                    "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid
-                )
-                }" class="sidebar">
-            <font color="#FF0000">{etud.civilite_str} {etud.nom_disp()}</font></a>
-            </h2>
-            <b>Absences</b>"""
-        )
-        inscription = etud.inscription_courante()
-        if inscription:
-            formsemestre = inscription.formsemestre
-            nbabsnj, nbabsjust, _ = sco_assiduites.formsemestre_get_assiduites_count(
-                etudid, formsemestre
-            )
-            H.append(
-                f"""<span title="absences du {
-                    formsemestre.date_debut.strftime(scu.DATE_FMT)
-                } au {
-                    formsemestre.date_fin.strftime(scu.DATE_FMT)
-                }" data-tooltip>({
-                    sco_preferences.get_preference("assi_metrique", None)})
-                <br>{nbabsjust:1g} J., {nbabsnj:1g} N.J.</span>"""
-            )
-        H.append("<ul>")
-        if current_user.has_permission(Permission.AbsChange):
-            # essaie de conserver le semestre actuellement en vue
-            cur_formsemestre_id = retreive_formsemestre_from_request()
-            H.append(
-                f"""
-                <li><a href="{
-                    url_for('assiduites.ajout_assiduite_etud',
-                            scodoc_dept=g.scodoc_dept, etudid=etudid)
-                    }">Ajouter</a></li>
-                <li><a href="{
-                    url_for('assiduites.ajout_justificatif_etud',
-                            scodoc_dept=g.scodoc_dept, etudid=etudid,
-                            formsemestre_id=cur_formsemestre_id,
-                            )
-                    }">Justifier</a></li>
-                """
-            )
-            if sco_preferences.get_preference("handle_billets_abs"):
-                H.append(
-                    f"""<li><a href="{
-                    url_for('absences.billets_etud',
-                            scodoc_dept=g.scodoc_dept, etudid=etudid)
-                    }">Billets</a></li>"""
-                )
-        H.append(
-            f"""
-            <li><a href="{ url_for('assiduites.calendrier_assi_etud',
-                                   scodoc_dept=g.scodoc_dept, etudid=etudid)
-                                }">Calendrier</a></li>
-            <li><a href="{ url_for('assiduites.bilan_etud',
-                                   scodoc_dept=g.scodoc_dept, etudid=etudid)
-                                }" title="Les pages bilan et liste ont été fusionnées">Liste/Bilan</a></li>
-            </ul>
-            """
-        )
-    else:
-        pass  # H.append("(pas d'étudiant en cours)")
-    # ---------
-    H.append("</div>")  # /etud-insidebar
-    # Logo
-    H.append(
-        f"""<div class="logo-insidebar">
-        <div class="sidebar-bottom"><a href="{
-            url_for( 'scodoc.about', scodoc_dept=g.scodoc_dept )
-            }" class="sidebar">À propos</a><br>
-        <a href="{ scu.SCO_USER_MANUAL }" target="_blank" rel="noopener" class="sidebar">Aide</a>
-        </div></div>
-        <div class="logo-logo">
-           <a href="{ url_for( 'scodoc.about', scodoc_dept=g.scodoc_dept ) }">
-                    { scu.icontag("scologo_img", no_size=True) }</a>
-        </div>
-        </div>
-        <!-- end of sidebar -->
-        """
-    )
-    return "".join(H)
-
-
-def sidebar_dept():
-    """Partie supérieure de la marge de gauche"""
-    return render_template(
-        "sidebar_dept.j2",
-        prefs=sco_preferences.SemPreferences(),
-    )
diff --git a/app/scodoc/sco_page_etud.py b/app/scodoc/sco_page_etud.py
index 307b56b64..8d6cbc3fb 100644
--- a/app/scodoc/sco_page_etud.py
+++ b/app/scodoc/sco_page_etud.py
@@ -171,7 +171,6 @@ def fiche_etud(etudid=None):
         log(f"fiche_etud: etudid={etudid!r} request.args={request.args!r}")
         raise ScoValueError("Étudiant inexistant !") from exc
     # la sidebar est differente s'il y a ou pas un etudid
-    # voir html_sidebar.sidebar()
     g.etudid = etudid
     info = etud.to_dict_scodoc7(restrict=restrict_etud_data)
     if etud.prenom_etat_civil:
diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py
index 245b7d5b6..c88e2e04b 100644
--- a/app/scodoc/sco_utils.py
+++ b/app/scodoc/sco_utils.py
@@ -267,6 +267,14 @@ class EtatAssiduite(int, BiDirectionalEnum):
             EtatAssiduite.RETARD: "Retard",
         }.get(self, "")
 
+    def e(self) -> str:
+        """e si la version libile est féminine"""
+        return {
+            EtatAssiduite.PRESENT: "e",
+            EtatAssiduite.ABSENT: "e",
+            EtatAssiduite.RETARD: "",
+        }.get(self, "")
+
 
 class EtatJustificatif(int, BiDirectionalEnum):
     """Code des états des justificatifs"""
diff --git a/app/static/css/assiduites.css b/app/static/css/assiduites.css
index ff04a8019..2db39a87e 100644
--- a/app/static/css/assiduites.css
+++ b/app/static/css/assiduites.css
@@ -519,7 +519,7 @@
 
 .legende {
   border: 1px dashed #333;
-  width: 75%;
+  max-width: var(--sco-content-max-width);
   padding: 20px;
 }
 
diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css
index 8c72b700d..f1cd90800 100644
--- a/app/static/css/scodoc.css
+++ b/app/static/css/scodoc.css
@@ -91,6 +91,7 @@ div.scobox {
 
 div.scobox.explanation {
   background-color: var(--sco-color-background);
+  border: 1px dashed #333;
 }
 
 div.scobox.success div.scobox-title {
diff --git a/app/templates/assiduites/explication_etats_justifs.j2 b/app/templates/assiduites/explication_etats_justifs.j2
index c8b0dc1bf..30fed42f7 100644
--- a/app/templates/assiduites/explication_etats_justifs.j2
+++ b/app/templates/assiduites/explication_etats_justifs.j2
@@ -1,6 +1,6 @@
 {# Explication des états des justificatifs #}
 
-<div class="explication-etats-justifs">
+<div class="explication-etats-justifs scobox explanation">
     <div class="explication-titre">États des justificatifs</div>
     <div class="explication-etats">
         <div class="valide">Justificatif valide</div>
diff --git a/app/templates/assiduites/pages/ajout_justificatif_etud.j2 b/app/templates/assiduites/pages/ajout_justificatif_etud.j2
index 3aeba96a3..6eaef6f48 100644
--- a/app/templates/assiduites/pages/ajout_justificatif_etud.j2
+++ b/app/templates/assiduites/pages/ajout_justificatif_etud.j2
@@ -1,6 +1,6 @@
 {# Formulaire ajout ou modification de justificatif
 Si justif, edit #}
-{% extends "sco_page.j2" %}
+{% extends "sco_page_dept.j2" %}
 {% import 'wtf.j2' as wtf %}
 
 {% block styles %}
@@ -49,7 +49,7 @@ div.submit > input {
     {% endif %}
     {% if justif %}
         <div class="informations">
-        
+
         <div class="info-saisie">
             <span>Saisie par {{justif.saisie_par}} le {{justif.entry_date}}</span>
         </div>
@@ -70,7 +70,7 @@ div.submit > input {
             <span class="text">Aucune</span>
             {% endif %}
         </div>
-        
+
         </div>
     {% endif %}
 
@@ -172,7 +172,7 @@ div.submit > input {
         {% endif %}
         {% endif %}
 
-        
+
 
     </fieldset>
     </form>
diff --git a/app/templates/assiduites/pages/bilan_etud.j2 b/app/templates/assiduites/pages/bilan_etud.j2
index a2dafcd76..2436d95ea 100644
--- a/app/templates/assiduites/pages/bilan_etud.j2
+++ b/app/templates/assiduites/pages/bilan_etud.j2
@@ -1,4 +1,4 @@
-{% extends "sco_page.j2" %}
+{% extends "sco_page_dept.j2" %}
 
 {% block title %}
 Bilan assiduité de {{sco.etud.nomprenom}}
@@ -60,6 +60,8 @@ Bilan assiduité de {{sco.etud.nomprenom}}
 {% endblock styles %}
 
 {% block app_content %}
+{% include "assiduites/widgets/alert.j2" %}
+
 <div class="pageContent">
 
     <h2>Bilan de l'assiduité de {{sco.etud.html_link_fiche()|safe}}</span></h2>
@@ -70,7 +72,7 @@ Bilan assiduité de {{sco.etud.nomprenom}}
 
     <div class="scobox">
         <!-- Statistiques d'assiduité (nb pres, nb retard, nb absence) + nb justifié -->
-        <h4>Statistiques d'assiduité</h4>
+        <div class="scobox-title">Statistiques d'assiduité</div>
         <div class="stats-inputs">
             <label class="stats-label"> Date de début <input type="text" class="datepicker" name="stats_date_debut"
                     id="stats_date_debut" value="{{date_debut}}"></label>
@@ -91,12 +93,13 @@ Bilan assiduité de {{sco.etud.nomprenom}}
     </section>
     </div>
 
-    <div class="legende">
-        <h3>Statistiques</h3>
-        <p>Un message d'alerte apparait si le nombre d'absence dépasse le seuil (indiqué dans les préférences du
-            département)</p>
+    <div class="help scobox explanation">
+        <p>Un message d'alerte apparait si le nombre d'absence dépasse le seuil indiqué dans les préférences du
+            département (actuellement {{assi_seuil}}).
+        </p>
         <p>Les statistiques sont calculées entre les deux dates sélectionnées. Après modification des dates,
-            appuyer sur le bouton "Actualiser"</p>
+            appuyer sur le bouton "Actualiser".
+        </p>
 
         {% include "assiduites/explication_etats_justifs.j2" %}
 
@@ -117,7 +120,7 @@ Bilan assiduité de {{sco.etud.nomprenom}}
     // Fonction appelée lors du clic sur le bouton "Actualiser"
     // Et au chargement de la page
     function stats() {
-        // On prend les dates de début et de fin 
+        // On prend les dates de début et de fin
         // (format DD/MM/YYYY) et on les convertit en Date()
         const dd_val = document.getElementById('stats_date_debut').value;
         const df_val = document.getElementById('stats_date_fin').value;
@@ -199,7 +202,7 @@ Bilan assiduité de {{sco.etud.nomprenom}}
             // JOURNEE
             const jour = document.createElement('span');
             jour.textContent = `${counter[key].total.journee} journée(s)${withJusti(key, "journee")}`;
-            
+
             // On met à jour le DOM avec les valeurs calculées
             // On met l'état en Titre pour chaque partie
             div.append(jour, demi, heure);
diff --git a/app/templates/assiduites/pages/calendrier_assi_etud.j2 b/app/templates/assiduites/pages/calendrier_assi_etud.j2
index f5610ad76..ecb86a5a8 100644
--- a/app/templates/assiduites/pages/calendrier_assi_etud.j2
+++ b/app/templates/assiduites/pages/calendrier_assi_etud.j2
@@ -37,8 +37,7 @@ Calendrier de l'assiduité
             <span id="label-nom">Assiduité de {{sco.etud.nomprenom}}</span>
         </div>
 
-        <div class="help">
-            <h3>Calendrier</h3>
+        <div class="scobox explanation help">
             {% include "assiduites/widgets/legende_couleur.j2" %}
         </div>
         <ul class="couleurs print">
diff --git a/app/templates/assiduites/pages/signal_assiduites_group.j2 b/app/templates/assiduites/pages/signal_assiduites_group.j2
index 6fc0aaa19..98591ce5a 100644
--- a/app/templates/assiduites/pages/signal_assiduites_group.j2
+++ b/app/templates/assiduites/pages/signal_assiduites_group.j2
@@ -220,7 +220,7 @@
         </p>
     </div>
 
-    <div class="help">
+    <div class="scobox explanation help">
         {% include "assiduites/widgets/legende_couleur.j2" %}
     </div>
 
diff --git a/app/templates/sidebar.j2 b/app/templates/sidebar.j2
index eecc69241..62e817378 100755
--- a/app/templates/sidebar.j2
+++ b/app/templates/sidebar.j2
@@ -91,7 +91,7 @@
             <li><a href="{{ url_for('assiduites.calendrier_assi_etud', scodoc_dept=g.scodoc_dept,
                     etudid=sco.etud.id) }}">Calendrier</a></li>
             <li><a href="{{ url_for('assiduites.bilan_etud', scodoc_dept=g.scodoc_dept,
-                    etudid=sco.etud.id) }}" title="Les pages bilan et liste ont été fusionnées">Liste/Bilan</a></li>
+                    etudid=sco.etud.id) }}">Bilan</a></li>
         </ul>
         {% endif %}
     </div> {# /etud-insidebar #}
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index 33ccb8709..eda9b41b4 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -1387,16 +1387,18 @@ def visu_assi_group():
 
 
 def _get_anne_sco_from_request() -> int | None:
-    """La valeur du paramètreannee_sco de la requête GET,
+    """La valeur du paramètre annee_sco de la requête GET,
     ou None si absent"""
     annee_sco: str | None = request.args.get("annee_sco", None)
+    if annee_sco is None:
+        return None
     # Vérification de l'année scolaire
-    if annee_sco is not None:
-        try:
-            return int(annee_sco)
-        except (ValueError, TypeError):
-            pass
-    return None
+    try:
+        annee_sco_int = int(annee_sco)
+    except (ValueError, TypeError) as exc:
+        raise ScoValueError("Année scolaire invalide")
+
+    return annee_sco_int
 
 
 def _prepare_tableau(
@@ -1600,9 +1602,11 @@ def tableau_assiduite_actions():
 
     objet: Assiduite | Justificatif
     objet_name = ""
+    e = ""
     if obj_type == "assiduite":
         objet: Assiduite = Assiduite.query.get_or_404(obj_id)
         objet_name = scu.EtatAssiduite(objet.etat).version_lisible()
+        e = scu.EtatAssiduite(objet.etat).e()
     else:
         objet: Justificatif = Justificatif.query.get_or_404(obj_id)
         objet_name = "Justificatif"
@@ -1610,7 +1614,7 @@ def tableau_assiduite_actions():
     # Suppression : attention, POST ou GET !
     if action == "supprimer":
         objet.supprime()
-        flash(f"{objet_name} supprimé")
+        flash(f"{objet_name} supprimé{e}")
 
         return redirect(request.referrer)
 
-- 
GitLab