From 9dcaf70e185a2149c3c2fa6ac3b86e13b3ad3582 Mon Sep 17 00:00:00 2001 From: Iziram Date: Tue, 27 Feb 2024 08:58:09 +0100 Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9=20:=20fix=20bugs=20calendrier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assiduites/pages/calendrier_assi_etud.j2 | 675 +++++++++--------- app/views/assiduites.py | 34 +- 2 files changed, 366 insertions(+), 343 deletions(-) diff --git a/app/templates/assiduites/pages/calendrier_assi_etud.j2 b/app/templates/assiduites/pages/calendrier_assi_etud.j2 index f0478610..8ef817de 100644 --- a/app/templates/assiduites/pages/calendrier_assi_etud.j2 +++ b/app/templates/assiduites/pages/calendrier_assi_etud.j2 @@ -3,9 +3,9 @@ Calendrier de l'assiduité {% endblock title %} {% block styles %} - {{ super() }} - - +{{ super() }} + + {% endblock styles %} {% block app_content %} @@ -15,379 +15,388 @@ Calendrier de l'assiduité

Assiduité de {{sco.etud.html_link_fiche()|safe}}

- - - + + +
-
- {% for mois,jours in calendrier.items() %} -
-

{{mois}}

-
- {% for jour in jours %} - {% if jour.is_non_work() %} -
- {{jour.get_nom()}} - {% else %} -
+
+ {% for mois,jours in calendrier.items() %} +
+

{{mois}}

+
+ {% for jour in jours %} + {% if jour.is_non_work() %} +
+ {{jour.get_nom()}} + {% else %} +
{% endif %} {% if mode_demi %} - {% if not jour.is_non_work() %} - {{jour.get_nom()}} - - - {% endif %} + {% if not jour.is_non_work() %} + {{jour.get_nom()}} + + + {% endif %} {% else %} - {% if not jour.is_non_work() %} - {{jour.get_nom(False)}} - {% endif %} + {% if not jour.is_non_work() %} + {{jour.get_nom(False)}} + {% endif %} {% endif %} {% if not jour.is_non_work() and jour.has_assiduites()%} - +
- Assiduité du -
- {{jour.get_date()}} - {{jour.generate_minitimeline() | safe}} + Assiduité du +
+ {{jour.get_date()}} + {{jour.generate_minitimeline() | safe}}
{% endif %} -
+
{% endfor %}
- {% endfor %} -
-
- Année scolaire 2022-2023Changer - année: - + {% endfor %} +
+
+ Année scolaireChanger + année: + - Assiduité de {{sco.etud.nomprenom}} -
+ Assiduité de {{sco.etud.nomprenom}} +
-
-

Calendrier

-

Code couleur

-
    -
  • → présence de l'étudiant lors de la période -
  • -
  • → la période n'est pas travaillée -
  • -
  • → absence de l'étudiant lors de la période -
  • -
  • → absence justifiée -
  • -
  • → retard de l'étudiant lors de la période -
  • -
  • → retard justifié -
  • +
    +

    Calendrier

    +

    Code couleur

    +
      +
    • → présence de l'étudiant lors de la + période +
    • +
    • → la période n'est pas travaillée +
    • +
    • → absence de l'étudiant lors de la + période +
    • +
    • → absence justifiée +
    • +
    • → retard de l'étudiant lors de la + période +
    • +
    • → retard justifié +
    • -
    • → la période est couverte par un +
    • → la période est couverte par un + justificatif valide
    • +
    • → la période est + couverte par un justificatif non valide +
    • +
    • → la période + a un justificatif en attente de validation +
    • +
    + + +

    Vous pouvez passer le curseur sur les jours colorés afin de voir les informations supplémentaires

    +
    +
      +
    • présence +
    • +
    • non travaillé +
    • +
    • absence +
    • +
    • absence justifiée +
    • +
    • retard +
    • +
    • retard justifié +
    • +
    • justificatif valide
    • -
    • → la période est - couverte par un justificatif non valide -
    • -
    • → la période - a un justificatif en attente de validation +
    • justificatif non valide
    - - -

    Vous pouvez passer le curseur sur les jours colorés afin de voir les informations supplémentaires

-
    -
  • présence -
  • -
  • non travaillé -
  • -
  • absence -
  • -
  • absence justifiée -
  • -
  • retard -
  • -
  • retard justifié -
  • -
  • - justificatif valide
  • -
  • justificatif non valide -
  • -
-
- - -{% endblock app_content %} + document.querySelectorAll('input[type="checkbox"].memo, #annee').forEach(el => { + el.addEventListener('change', function () { + updatePage(); + }) + }); + + document.querySelectorAll('[assi_id]').forEach((el, i) => { + el.addEventListener('click', () => { + const assi_id = el.getAttribute('assi_id'); + window.open(`${SCO_URL}/Assiduites/tableau_assiduite_actions?type=assiduite&action=details&obj_id=${assi_id}`); + }) + }); + + + + {% endblock app_content %} \ No newline at end of file diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 0333aa0b..5aecdb3b 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -25,6 +25,7 @@ ############################################################################## import datetime +import json import re from typing import Any @@ -825,17 +826,19 @@ def calendrier_assi_etud(): # Récupération des années d'étude de l'étudiant annees: list[int] = [] for ins in etud.formsemestre_inscriptions: + date_deb = ins.formsemestre.date_debut + date_fin = ins.formsemestre.date_fin annees.extend( - (ins.formsemestre.date_debut.year, ins.formsemestre.date_fin.year) + [ + scu.annee_scolaire_repr(date_deb.year, date_deb.month), + scu.annee_scolaire_repr(date_fin.year, date_fin.month), + ] ) annees = sorted(annees, reverse=True) # Transformation en une liste "json" # (sera utilisé pour générer le selecteur d'année) - annees_str: str = "[" - for ann in annees: - annees_str += f"{ann}," - annees_str += "]" + annees_str: str = json.dumps(annees) calendrier: dict[str, list["Jour"]] = generate_calendar(etud, annee) @@ -2355,12 +2358,16 @@ class Jour: assiduites_matin = [ assi for assi in self.assiduites - if scu.is_period_overlapping((assi.date_debut, assi.date_fin), matin) + if scu.is_period_overlapping( + (assi.date_debut, assi.date_fin), matin, bornes=False + ) ] justificatifs_matin = [ justi for justi in self.justificatifs - if scu.is_period_overlapping((justi.date_debut, justi.date_fin), matin) + if scu.is_period_overlapping( + (justi.date_debut, justi.date_fin), matin, bornes=False + ) ] etat = self._get_color_assiduites_cascade( @@ -2388,13 +2395,17 @@ class Jour: assiduites_aprem = [ assi for assi in self.assiduites - if scu.is_period_overlapping((assi.date_debut, assi.date_fin), aprem) + if scu.is_period_overlapping( + (assi.date_debut, assi.date_fin), aprem, bornes=False + ) ] justificatifs_aprem = [ justi for justi in self.justificatifs - if scu.is_period_overlapping((justi.date_debut, justi.date_fin), aprem) + if scu.is_period_overlapping( + (justi.date_debut, justi.date_fin), aprem, bornes=False + ) ] etat = self._get_color_assiduites_cascade( @@ -2433,6 +2444,7 @@ class Jour: # chaque block d'assiduité est défini par: # longueur = ( (fin-deb) / longueur_timeline ) * 100 # emplacement = ( (deb - heure_matin) / longueur_timeline ) * 100 + # longueur + emplacement = 100% sinon on réduit longueur assiduite_blocks: list[dict[str, float | str]] = [] @@ -2448,8 +2460,10 @@ class Jour: else heure_soir ) - longueur: float = ((fin - deb) / longueur_timeline) * 100 emplacement: float = ((deb - heure_matin) / longueur_timeline) * 100 + longueur: float = ((fin - deb) / longueur_timeline) * 100 + if longueur + emplacement > 100: + longueur = 100 - emplacement etat: str = scu.EtatAssiduite(assi.etat).name.lower() est_just: str = "est_just" if assi.est_just else ""