diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index 67b554049..61769d2e0 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -1254,20 +1254,25 @@ def annee_scolaire_debut(year, month) -> int: return int(year) - 1 -def date_debut_anne_scolaire(annee_sco: int) -> datetime: +def date_debut_anne_scolaire(annee_sco: int | None = None) -> datetime.datetime: """La date de début de l'année scolaire - (par défaut, le 1er aout) + Si annee_sco n'est pas spécifié, année courante + (par défaut, l'année scolaire en métropole commence le 1er aout) """ + if annee_sco is None: + annee_sco = annee_scolaire() return datetime.datetime(year=annee_sco, month=MONTH_DEBUT_ANNEE_SCOLAIRE, day=1) -def date_fin_anne_scolaire(annee_sco: int) -> datetime: +def date_fin_anne_scolaire(annee_sco: int | None = None) -> datetime.datetime: """La date de fin de l'année scolaire (par défaut, le 31 juillet de l'année suivante) """ # on prend la date de début de l'année scolaire suivante, - # et on lui retre 1 jour. + # et on lui retire 1 jour. # On s'affranchit ainsi des problèmes de durées de mois. + if annee_sco is None: + annee_sco = annee_scolaire() return datetime.datetime( year=annee_sco + 1, month=MONTH_DEBUT_ANNEE_SCOLAIRE, day=1 ) - datetime.timedelta(days=1) diff --git a/app/static/css/assiduites.css b/app/static/css/assiduites.css index 613797f9a..82f51606a 100644 --- a/app/static/css/assiduites.css +++ b/app/static/css/assiduites.css @@ -660,3 +660,16 @@ table.liste_assi td.date { table.liste_assi td.actions { white-space: nowrap; /* boutons horizontalement */ } + +tr.row-assiduite td { + border-bottom: 1px solid grey; +} +tr.row-assiduite.absent td.assi-type { + background-color: var(--color-absent-clair); +} +tr.row-assiduite.retard td.assi-type { + background-color: var(--color-retard); +} +tr.row-assiduite.present td.assi-type { + background-color: var(--color-present); +} diff --git a/app/static/js/assiduites.js b/app/static/js/assiduites.js index 4ec47b72a..8f95d7f54 100644 --- a/app/static/js/assiduites.js +++ b/app/static/js/assiduites.js @@ -1429,7 +1429,7 @@ function generateEtudRow( - +

${etud.nom}

${etud.prenom}
diff --git a/app/tables/liste_assiduites.py b/app/tables/liste_assiduites.py index db3348d80..fc49464f4 100644 --- a/app/tables/liste_assiduites.py +++ b/app/tables/liste_assiduites.py @@ -54,9 +54,10 @@ class ListeAssiJusti(tb.Table): with_foot_titles=False, ) - self.ajouter_lignes() + self.add_assiduites() - def ajouter_lignes(self): + def add_assiduites(self): + "Ajoute le contenu de la table, avec assiduités et justificatif réunis" # Générer les query assiduités et justificatifs assiduites_query_etudiants: Query = None justificatifs_query_etudiants: Query = None @@ -215,6 +216,8 @@ class ListeAssiJusti(tb.Table): class RowAssiJusti(tb.Row): + "Ligne de table pour une assiduité" + def __init__(self, table: ListeAssiJusti, ligne: dict): self.ligne: dict = ligne self.etud: Identite = Identite.get_etud(ligne["etudid"]) @@ -259,7 +262,7 @@ class RowAssiJusti(tb.Row): # Ajout des colonnes optionnelles self._optionnelles() - # Ajout de l'utilisateur ayant saisie l'objet + # Ajout de l'utilisateur ayant saisi l'objet self._utilisateur() # Date de saisie @@ -277,25 +280,27 @@ class RowAssiJusti(tb.Row): obj_type: str = "" is_assiduite: bool = self.ligne["type"] == "assiduite" if is_assiduite: + self.classes.append("row-assiduite") + self.classes.append(EtatAssiduite(self.ligne["etat"]).name.lower()) etat: str = { EtatAssiduite.PRESENT: "Présence", EtatAssiduite.ABSENT: "Absence", EtatAssiduite.RETARD: "Retard", }.get(self.ligne["etat"]) - justifiee: str = "Justifiée" if self.ligne["est_just"] else "" obj_type = f"{etat} {justifiee}" else: + self.classes.append("row-justificatif") + self.classes.append(EtatJustificatif(self.ligne["etat"]).name.lower()) etat: str = { EtatJustificatif.VALIDE: "valide", EtatJustificatif.ATTENTE: "soumis", EtatJustificatif.MODIFIE: "modifié", EtatJustificatif.NON_VALIDE: "invalide", }.get(self.ligne["etat"]) - obj_type = f"Justificatif {etat}" - self.add_cell("obj_type", "Type", obj_type) + self.add_cell("obj_type", "Type", obj_type, classes=["assi-type"]) def _etud(self, lien_redirection) -> None: etud = self.etud diff --git a/app/templates/assiduites/pages/bilan_etud.j2 b/app/templates/assiduites/pages/bilan_etud.j2 index eeb190ab8..0ed1e57fa 100644 --- a/app/templates/assiduites/pages/bilan_etud.j2 +++ b/app/templates/assiduites/pages/bilan_etud.j2 @@ -2,7 +2,7 @@ {% include "assiduites/widgets/tableau_base.j2" %}
-

Bilan de l'assiduité de {{sco.etud.nomprenom}}

+

Bilan de l'assiduité de {{sco.etud.html_link_fiche()|safe}}

{% else %} - Non + Non {% endif %} {% endif %} @@ -103,4 +103,4 @@
Saisie par {{objet.saisie_par}} le {{objet.entry_date}} -
\ No newline at end of file + diff --git a/app/templates/assiduites/widgets/tableau_assi.j2 b/app/templates/assiduites/widgets/tableau_assi.j2 index 92e6aef81..c273c6c6e 100644 --- a/app/templates/assiduites/widgets/tableau_assi.j2 +++ b/app/templates/assiduites/widgets/tableau_assi.j2 @@ -92,7 +92,7 @@ } else if (k.indexOf('etudid') != -1) { const e = getEtudiant(assiduite.etudid); - td.innerHTML = `${e.prenom.capitalize()} ${e.nom.toUpperCase()}`; + td.innerHTML = `${e.prenom.capitalize()} ${e.nom.toUpperCase()}`; } else { td.textContent = assiduite[k].capitalize() } @@ -217,7 +217,7 @@ - + ` const el = document.createElement('div') @@ -462,4 +462,4 @@ try { getAllAssiduitesFromEtud(etudid, action, true, true, assi_limit_annee) } catch (_) { } } - \ No newline at end of file + diff --git a/app/templates/assiduites/widgets/tableau_justi.j2 b/app/templates/assiduites/widgets/tableau_justi.j2 index 33ac3317f..06e5c6e51 100644 --- a/app/templates/assiduites/widgets/tableau_justi.j2 +++ b/app/templates/assiduites/widgets/tableau_justi.j2 @@ -88,7 +88,7 @@ } else if (k.indexOf('etudid') != -1) { const e = getEtudiant(justificatif.etudid); - td.innerHTML = `${e.prenom.capitalize()} ${e.nom.toUpperCase()}`; + td.innerHTML = `${e.prenom.capitalize()} ${e.nom.toUpperCase()}`; } else if (k == "formsemestre") { if (justificatif.hasOwnProperty("formsemestre")) { td.textContent = justificatif.formsemestre.title.replaceAll('-', ' '); @@ -213,8 +213,8 @@ method: "POST" }) - // This returns a promise inside of which we are checking for errors from the server. - // The catch promise at the end of the call does not getting called when the server returns an error. + // This returns a promise inside of which we are checking for errors from the server. + // The catch promise at the end of the call does not getting called when the server returns an error. // More information about the error catching can be found here: https://www.tjvantoll.com/2015/09/13/fetch-and-errors/. .then((result) => { if (!result.ok) { @@ -228,8 +228,8 @@ return result.blob(); }) - // We use the download property for triggering the download of the file from our browser. - // More information about the following code can be found here: https://stackoverflow.com/questions/32545632/how-can-i-download-a-file-using-window-fetch. + // We use the download property for triggering the download of the file from our browser. + // More information about the following code can be found here: https://stackoverflow.com/questions/32545632/how-can-i-download-a-file-using-window-fetch. // The filename from the first promise is used as name of the file. .then((blob) => { if (blob != null) { @@ -676,4 +676,4 @@ align-items: center; gap: 5px; } - \ No newline at end of file + diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 2ecc196d6..963588f29 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -524,7 +524,7 @@ def liste_assiduites_etud(): ).build() -@bp.route("/BilanEtud") +@bp.route("/bilan_etud") @scodoc @permission_required(Permission.ScoView) def bilan_etud(): @@ -557,8 +557,8 @@ def bilan_etud(): ) # Gestion des dates du bilan (par défaut l'année scolaire) - date_debut: str = f"01/09/{scu.annee_scolaire()}" - date_fin: str = f"30/06/{scu.annee_scolaire()+1}" + date_debut = scu.date_debut_anne_scolaire().strftime("%d/%m/%Y") + date_fin: str = scu.date_fin_anne_scolaire().strftime("%d/%m/%Y") # Récupération de la métrique d'assiduité assi_metric = scu.translate_assiduites_metric( @@ -1251,7 +1251,7 @@ def _prepare_tableau( ) -@bp.route("/TableauAssiduiteActions", methods=["GET", "POST"]) +@bp.route("/tableau_assiduite_actions", methods=["GET", "POST"]) @scodoc @permission_required(Permission.AbsChange) def tableau_assiduite_actions(): @@ -1295,7 +1295,7 @@ def tableau_assiduite_actions(): module = _module_selector(formsemestre, module) return render_template( - "assiduites/pages/tableau_actions.j2", + "assiduites/pages/tableau_assiduite_actions.j2", sco=ScoData(etud=objet.etudiant), # XXX type semble être utilisé qq part, ne pas changer type="Justificatif" if obj_type == "justificatif" else "Assiduité",