- {% 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 ""