Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
4 changed files with 38 additions and 17 deletions
Showing only changes of commit c8ac796347 - Show all commits

View File

@ -401,9 +401,11 @@ class RowAssiJusti(tb.Row):
self.add_cell( self.add_cell(
"entry_date", "entry_date",
"Saisie le", "Saisie le",
self.ligne["entry_date"].strftime("%d/%m/%y à %H:%M") (
if self.ligne["entry_date"] self.ligne["entry_date"].strftime("%d/%m/%y à %H:%M")
else "?", if self.ligne["entry_date"]
else "?"
),
data={"order": self.ligne["entry_date"] or ""}, data={"order": self.ligne["entry_date"] or ""},
raw_content=self.ligne["entry_date"], raw_content=self.ligne["entry_date"],
classes=["small-font"], classes=["small-font"],

View File

@ -19,6 +19,8 @@ from app.scodoc import sco_utils as scu
class TableAssi(tb.Table): class TableAssi(tb.Table):
"""Table listant les statistiques d'assiduité des étudiants """Table listant les statistiques d'assiduité des étudiants
L'id de la ligne est etuid, et le row stocke etud. L'id de la ligne est etuid, et le row stocke etud.
Si convert_values, transforme les nombre en chaines ("12.34"), pour le html.
""" """
def __init__( def __init__(
@ -26,12 +28,17 @@ class TableAssi(tb.Table):
etuds: list[Identite] = None, etuds: list[Identite] = None,
dates: tuple[str, str] = None, dates: tuple[str, str] = None,
formsemestre: FormSemestre = None, formsemestre: FormSemestre = None,
convert_values=False,
**kwargs, **kwargs,
): ):
self.rows: list["RowEtud"] = [] # juste pour que VSCode nous aide sur .rows self.rows: list["RowEtud"] = [] # juste pour que VSCode nous aide sur .rows
classes = ["gt_table"] classes = ["gt_table"]
self.dates = [str(dates[0]) + "T00:00", str(dates[1]) + "T23:59"] self.dates = [str(dates[0]) + "T00:00", str(dates[1]) + "T23:59"]
self.formsemestre = formsemestre self.formsemestre = formsemestre
if convert_values:
self.fmt_num = lambda x: f"{x:2.3g}"
else:
self.fmt_num = lambda x: x
super().__init__( super().__init__(
row_class=RowAssi, row_class=RowAssi,
classes=classes, classes=classes,
@ -71,6 +78,7 @@ class RowAssi(tb.Row):
def add_etud_cols(self): def add_etud_cols(self):
"""Ajoute les colonnes""" """Ajoute les colonnes"""
etud = self.etud etud = self.etud
fmt_num = self.table.fmt_num
self.table.group_titles.update( self.table.group_titles.update(
{ {
"etud_codes": "Codes", "etud_codes": "Codes",
@ -104,12 +112,12 @@ class RowAssi(tb.Row):
) )
stats = self._get_etud_stats(etud) stats = self._get_etud_stats(etud)
for key, value in stats.items(): for key, value in stats.items():
self.add_cell(key, value[0], f"{value[1] - value[2]}", "assi_stats") self.add_cell(key, value[0], fmt_num(value[1] - value[2]), "assi_stats")
if key != "present": if key != "present":
self.add_cell( self.add_cell(
key + "_justi", key + "_justi",
value[0] + " Justifiées", value[0] + " Justifiées",
f"{value[2]}", fmt_num(value[2]),
"assi_stats", "assi_stats",
) )
@ -122,15 +130,16 @@ class RowAssi(tb.Row):
self.add_cell( self.add_cell(
"justificatifs_att", "justificatifs_att",
"Justificatifs en Attente", "Justificatifs en Attente",
f"{compte_justificatifs_att.count()}", fmt_num(compte_justificatifs_att.count()),
) )
self.add_cell( self.add_cell(
"justificatifs", "Justificatifs", f"{compte_justificatifs.count()}" "justificatifs", "Justificatifs", fmt_num(compte_justificatifs.count())
) )
def _get_etud_stats(self, etud: Identite) -> dict[str, list[str, float, float]]: def _get_etud_stats(self, etud: Identite) -> dict[str, list[str, float, float]]:
""" """
Renvoie le comptage (dans la métrique du département) des différents états d'assiduité d'un étudiant Renvoie le comptage (dans la métrique du département) des différents états
d'assiduité d'un étudiant.
Returns : Returns :
{ {

View File

@ -874,9 +874,11 @@ def choix_date() -> str:
if ok: if ok:
return redirect( return redirect(
url_for( url_for(
"assiduites.signal_assiduites_group" (
if request.args.get("readonly") is None "assiduites.signal_assiduites_group"
else "assiduites.visu_assiduites_group", if request.args.get("readonly") is None
else "assiduites.visu_assiduites_group"
),
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id, formsemestre_id=formsemestre_id,
group_ids=group_ids, group_ids=group_ids,
@ -1294,7 +1296,12 @@ def etat_abs_date():
@scodoc @scodoc
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def visu_assi_group(): def visu_assi_group():
"""Visualisation de l'assiduité d'un groupe entre deux dates""" """Visualisation de l'assiduité d'un groupe entre deux dates.
Paramètres:
- date_debut, date_fin (format ISO)
- fmt : format d'export, html (défaut) ou xls
- group_ids : liste des groupes
"""
# Récupération des paramètres de la requête # Récupération des paramètres de la requête
dates = { dates = {
@ -1317,7 +1324,10 @@ def visu_assi_group():
# Génération du tableau des assiduités # Génération du tableau des assiduités
table: TableAssi = TableAssi( table: TableAssi = TableAssi(
etuds=etuds, dates=list(dates.values()), formsemestre=formsemestre etuds=etuds,
dates=list(dates.values()),
formsemestre=formsemestre,
convert_values=fmt == "html",
) )
# Export en XLS # Export en XLS
@ -2150,9 +2160,9 @@ def _module_selector_multiple(
return render_template( return render_template(
"assiduites/widgets/moduleimpl_selector_multiple.j2", "assiduites/widgets/moduleimpl_selector_multiple.j2",
choices=choices, choices=choices,
formsemestre_id=only_form.id formsemestre_id=(
if only_form only_form.id if only_form else list(modimpls_by_formsemestre.keys())[0]
else list(modimpls_by_formsemestre.keys())[0], ),
moduleimpl_id=moduleimpl_id, moduleimpl_id=moduleimpl_id,
) )

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.6.936" SCOVERSION = "9.6.937"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"