From 5d10ee467eb8ea6eddfa7381050fa5a71ad83732 Mon Sep 17 00:00:00 2001 From: Iziram Date: Tue, 19 Mar 2024 15:32:39 +0100 Subject: [PATCH] =?UTF-8?q?Assiduit=C3=A9=20:=20t=C3=A9l=C3=A9chargement?= =?UTF-8?q?=20des=20assiduit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/templates/assiduites/pages/bilan_dept.j2 | 33 ++++++++ app/views/assiduites.py | 87 ++++++++++++++++++++ 2 files changed, 120 insertions(+) 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)