diff --git a/app/templates/assiduites/pages/bilan_dept.j2 b/app/templates/assiduites/pages/bilan_dept.j2
index f4a20efb0..4fa342ebf 100644
--- a/app/templates/assiduites/pages/bilan_dept.j2
+++ b/app/templates/assiduites/pages/bilan_dept.j2
@@ -20,6 +20,39 @@ le semestre concerné (saisie par jour ou saisie différée).
{{billets | safe}}
+
+
+
+
Télécharger l'assiduité
+
+
+
+
+
{{tableau | safe }}
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index 347b140cf..cb0f8f929 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -186,6 +186,12 @@ def bilan_dept():
if not table[0]:
return table[1]
+ # Récupération des formsemestres (pour le menu déroulant)
+ formsemestres: Query = FormSemestre.get_dept_formsemestres_courants(dept)
+ formsemestres_choices: dict[int, str] = {
+ fs.id: fs.titre_annee() for fs in formsemestres
+ }
+
# Peuplement du template jinja
return render_template(
"assiduites/pages/bilan_dept.j2",
@@ -193,6 +199,8 @@ def bilan_dept():
search_etud=sco_find_etud.form_search_etud(dest_url="assiduites.bilan_etud"),
billets=billets,
sco=ScoData(formsemestre=formsemestre),
+ formsemestres=formsemestres_choices,
+ formsemestre_id=None if not formsemestre else formsemestre.id,
)
@@ -1565,6 +1573,85 @@ def _prepare_tableau(
)
+@bp.route("/recup_assiduites_plage", methods=["POST"])
+@scodoc
+@permission_required(Permission.AbsChange)
+def recup_assiduites_plage():
+ """
+ Renvoie un fichier excel contenant toutes les assiduités d'une plage
+ La plage est définie par les valeurs "datedeb" et "datefin" du formulaire
+ Par défaut tous les étudiants du département sont concernés
+ Si le champs "formsemestre_id" est présent dans le formulaire et est non vide,
+ seuls les étudiants inscrits dans ce semestre sont concernés.
+ """
+
+ date_deb: datetime.datetime = request.form.get("datedeb")
+ date_fin: datetime.datetime = request.form.get("datefin")
+
+ # Vérification des dates
+ try:
+ date_deb = datetime.datetime.strptime(date_deb, "%d/%m/%Y")
+ except ValueError as exc:
+ raise ScoValueError("date_debut invalide", dest_url=request.referrer) from exc
+ try:
+ date_fin = datetime.datetime.strptime(date_fin, "%d/%m/%Y")
+ except ValueError as exc:
+ raise ScoValueError("date_fin invalide", dest_url=request.referrer) from exc
+
+ # Récupération des étudiants
+ etuds: Query = []
+ formsemestre_id: str | None = request.form.get("formsemestre_id")
+
+ name: str = ""
+
+ if formsemestre_id is not None and formsemestre_id != "":
+ formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
+ etuds = formsemestre.etuds
+ name = formsemestre.session_id()
+ else:
+ dept: Departement = Departement.query.get_or_404(g.scodoc_dept_id)
+ etuds = dept.etudiants
+ name = dept.acronym
+
+ # Récupération des assiduités
+ assiduites: Query = Assiduite.query.filter(
+ Assiduite.etudid.in_([etud.id for etud in etuds])
+ )
+
+ # Filtrage des assiduités en fonction des dates données
+ assiduites = scass.filter_by_date(assiduites, Assiduite, date_deb, date_fin)
+
+ table_data: liste_assi.AssiJustifData = liste_assi.AssiJustifData(
+ assiduites_query=assiduites,
+ )
+
+ options: liste_assi.AssiDisplayOptions = liste_assi.AssiDisplayOptions(
+ show_pres=True,
+ show_reta=True,
+ show_module=True,
+ show_etu=True,
+ )
+
+ date_deb_str: str = date_deb.strftime("%d-%m-%Y")
+ date_fin_str: str = date_fin.strftime("%d-%m-%Y")
+
+ filename: str = f"assiduites_{name}_{date_deb_str}_{date_fin_str}"
+
+ tableau: liste_assi.ListeAssiJusti = liste_assi.ListeAssiJusti(
+ table_data,
+ options=options,
+ titre="tableau-dept-" + filename,
+ no_pagination=True,
+ )
+
+ return scu.send_file(
+ tableau.excel(),
+ filename=filename,
+ mime=scu.XLSX_MIMETYPE,
+ suffix=scu.XLSX_SUFFIX,
+ )
+
+
@bp.route("/tableau_assiduite_actions", methods=["GET", "POST"])
@scodoc
@permission_required(Permission.AbsChange)