Merge pull request 'Ajout du filtre de module dans la page de bilan étudiant + résolution bug d'affichage des tableaux' (#949) from iziram/ScoDoc:master into master

Reviewed-on: ScoDoc/ScoDoc#949
This commit is contained in:
Emmanuel Viennet 2024-06-27 20:44:34 +02:00
commit 408c340525
4 changed files with 115 additions and 47 deletions

View File

@ -168,9 +168,11 @@ class ListeAssiJusti(tb.Table):
self.options.show_desc, self.options.show_desc,
self.options.order[0], self.options.order[0],
self.options.order[1], self.options.order[1],
self.options.moduleimpl_id,
], ],
) )
) )
r = RequeteTableauAssiduiteCache().get(cle_cache) r = RequeteTableauAssiduiteCache().get(cle_cache)
if r is None: if r is None:
@ -194,6 +196,15 @@ class ListeAssiJusti(tb.Table):
Assiduite.etat != EtatAssiduite.RETARD Assiduite.etat != EtatAssiduite.RETARD
) )
# Filtrage par moduleimpl_id
if (
self.options.moduleimpl_id is not None
and assiduites_query_etudiants is not None
):
assiduites_query_etudiants = assiduites_query_etudiants.filter(
Assiduite.moduleimpl_id == self.options.moduleimpl_id
)
if type_obj in [0, 2]: if type_obj in [0, 2]:
justificatifs_query_etudiants = self.table_data.justificatifs_query justificatifs_query_etudiants = self.table_data.justificatifs_query
@ -497,8 +508,7 @@ class RowAssiJusti(tb.Row):
} }
) )
# Ajout de l'étudid dans la version excel # Ajout de l'étudid dans la version excel
if self.table.no_pagination: self.add_cell("etudid", "Etudid", etud.id, only_excel=True)
self.add_cell("etudid", "Etudid", etud.id)
# Ajout des informations de l'étudiant # Ajout des informations de l'étudiant
@ -544,45 +554,56 @@ class RowAssiJusti(tb.Row):
if self.table.options.show_module: if self.table.options.show_module:
if self.ligne["type"] == "assiduite": if self.ligne["type"] == "assiduite":
assi: Assiduite = Assiduite.query.get(self.ligne["obj_id"]) assi: Assiduite = Assiduite.query.get(self.ligne["obj_id"])
if self.table.no_pagination: # Gestion des colonnes concernant le module
mod: Module = assi.get_module(False) mod: Module = assi.get_module(False)
code = mod.code if isinstance(mod, Module) else "" code = mod.code if isinstance(mod, Module) else ""
titre = "" titre = ""
if isinstance(mod, Module): if isinstance(mod, Module):
titre = mod.titre titre = mod.titre
elif isinstance(mod, str): elif isinstance(mod, str):
titre = mod titre = mod
else: else:
titre = "Non Spécifié" titre = "Non Spécifié"
self.add_cell( self.add_cell(
"code_module", "Code Module", code, data={"order": code} "code_module",
) "Code Module",
self.add_cell( code,
"titre_module", data={"order": code},
"Titre Module", only_excel=True,
titre, )
data={"order": titre}, self.add_cell(
) "titre_module",
else: "Titre Module",
mod: Module = assi.get_module(True) titre,
self.add_cell( data={"order": titre},
"module", only_excel=True,
"Module", )
mod,
data={"order": mod}, mod: Module = assi.get_module(True)
) self.add_cell(
"module",
"Module",
mod,
data={"order": mod},
no_excel=True,
)
else: else:
if self.table.no_pagination: self.add_cell("module", "Module", "", data={"order": ""}, no_excel=True)
self.add_cell("module", "Module", "", data={"order": ""}) self.add_cell(
else: "code_module",
self.add_cell("code_module", "Code Module", "", data={"order": ""}) "Code Module",
self.add_cell( "",
"titre_module", data={"order": ""},
"Titre Module", only_excel=True,
"", )
data={"order": ""}, self.add_cell(
) "titre_module",
"Titre Module",
"",
data={"order": ""},
only_excel=True,
)
def _utilisateur(self) -> None: def _utilisateur(self) -> None:
utilisateur: User = ( utilisateur: User = (
@ -764,6 +785,7 @@ class AssiDisplayOptions:
show_module: str | bool = False, show_module: str | bool = False,
order: tuple[str, str | bool] = None, order: tuple[str, str | bool] = None,
annee_sco: int = None, annee_sco: int = None,
moduleimpl_id: int = None,
): ):
self.page: int = page self.page: int = page
self.nb_ligne_page: int = nb_ligne_page self.nb_ligne_page: int = nb_ligne_page
@ -778,6 +800,7 @@ class AssiDisplayOptions:
self.show_module = to_bool(show_module) self.show_module = to_bool(show_module)
self.annee_sco: int | None = annee_sco self.annee_sco: int | None = annee_sco
self.moduleimpl_id: int | None = moduleimpl_id
self.order = ( self.order = (
("date_debut", False) if order is None else (order[0], to_bool(order[1])) ("date_debut", False) if order is None else (order[0], to_bool(order[1]))

View File

@ -1,8 +1,12 @@
<select name="moduleimpl_select" id="moduleimpl_select"> <select name="moduleimpl_select" id="moduleimpl_select">
{% with moduleimpl_id=moduleimpl_id %} {% if not no_default %}
{% include "assiduites/widgets/simplemoduleimpl_select.j2" %} {% with moduleimpl_id=moduleimpl_id %}
{% endwith %} {% include "assiduites/widgets/simplemoduleimpl_select.j2" %}
{% endwith %}
{% else %}
<option value="">Pas de filtre</option>
{% endif %}
{% for cat, mods in choices.items() %} {% for cat, mods in choices.items() %}
<optgroup label="{{cat}}"> <optgroup label="{{cat}}">

View File

@ -43,6 +43,13 @@
{% endfor %} {% endfor %}
</select> </select>
<br> <br>
{% if moduleimpl_select %}
<label for="moduleimpl_select">
Filtrage du module
{{moduleimpl_select | safe}}
</label>
{% endif %}
<br>
</div> </div>
<div class="div-tableau"> <div class="div-tableau">
@ -205,6 +212,15 @@
location.href = url.href location.href = url.href
})); }));
const selecteur = document.querySelector("#moduleimpl_select");
console.log(selecteur);
selecteur.addEventListener('change', ()=>{
console.log("selecteur", selecteur.value)
const url = new URL(location.href);
url.searchParams.set("moduleimpl_id", selecteur.value);
location.href = url.href
});
}); });
</script> </script>

View File

@ -589,12 +589,26 @@ def bilan_etud():
Returns: Returns:
str: l'html généré str: l'html généré
""" """
# Initialisation des options du tableau
options: liste_assi.AssiDisplayOptions = liste_assi.AssiDisplayOptions(
show_module=True
)
# Récupération de l'étudiant # Récupération de l'étudiant
etudid = request.args.get("etudid", -1) etudid = request.args.get("etudid", -1)
etud: Identite = Identite.query.get_or_404(etudid) etud: Identite = Identite.query.get_or_404(etudid)
if etud.dept_id != g.scodoc_dept_id: if etud.dept_id != g.scodoc_dept_id:
abort(404, "étudiant inexistant dans ce département") abort(404, "étudiant inexistant dans ce département")
# Gestion du filtre de module
moduleimpl_id = request.args.get("moduleimpl_id", None)
if moduleimpl_id is not None:
try:
moduleimpl_id = int(moduleimpl_id)
except ValueError:
moduleimpl_id = None
options.moduleimpl_id = moduleimpl_id
# Gestion des dates du bilan (par défaut l'année scolaire) # Gestion des dates du bilan (par défaut l'année scolaire)
date_debut = scu.date_debut_annee_scolaire().strftime(scu.DATE_FMT) date_debut = scu.date_debut_annee_scolaire().strftime(scu.DATE_FMT)
date_fin: str = scu.date_fin_annee_scolaire().strftime(scu.DATE_FMT) date_fin: str = scu.date_fin_annee_scolaire().strftime(scu.DATE_FMT)
@ -604,16 +618,21 @@ def bilan_etud():
sco_preferences.get_preference("assi_metrique", dept_id=g.scodoc_dept_id), sco_preferences.get_preference("assi_metrique", dept_id=g.scodoc_dept_id),
) )
# préparation du selecteur de moduleimpl
moduleimpl_select: str = _module_selector_multiple(
etud, moduleimpl_id, no_default=True
)
# Préparation de la page # Préparation de la page
tableau = _prepare_tableau( tableau = _prepare_tableau(
liste_assi.AssiJustifData.from_etudiants( liste_assi.AssiJustifData.from_etudiants(etud),
etud,
),
filename=f"assiduites-justificatifs-{etud.id}", filename=f"assiduites-justificatifs-{etud.id}",
afficher_etu=False, afficher_etu=False,
filtre=liste_assi.AssiFiltre(type_obj=0), filtre=liste_assi.AssiFiltre(type_obj=0),
options=liste_assi.AssiDisplayOptions(show_module=True), options=options,
cache_key=f"tableau-etud-{etud.id}", cache_key=f"tableau-etud-{etud.id}",
moduleimpl_select=moduleimpl_select,
) )
if not tableau[0]: if not tableau[0]:
return tableau[1] return tableau[1]
@ -1359,6 +1378,7 @@ def _prepare_tableau(
filtre: liste_assi.AssiFiltre = None, filtre: liste_assi.AssiFiltre = None,
options: liste_assi.AssiDisplayOptions = None, options: liste_assi.AssiDisplayOptions = None,
afficher_options: bool = True, afficher_options: bool = True,
moduleimpl_select: str = None,
titre="Évènements enregistrés pour cet étudiant", titre="Évènements enregistrés pour cet étudiant",
cache_key: str = "", cache_key: str = "",
force_options: dict[str, object] = None, force_options: dict[str, object] = None,
@ -1454,6 +1474,7 @@ def _prepare_tableau(
options=options, options=options,
afficher_options=afficher_options, afficher_options=afficher_options,
titre=titre, titre=titre,
moduleimpl_select=moduleimpl_select,
) )
@ -2270,7 +2291,10 @@ def _module_selector(formsemestre: FormSemestre, moduleimpl_id: int = None) -> s
def _module_selector_multiple( def _module_selector_multiple(
etud: Identite, moduleimpl_id: int = None, only_form: FormSemestre = None etud: Identite,
moduleimpl_id: int = None,
only_form: FormSemestre = None,
no_default: bool = False,
) -> str: ) -> str:
"""menu HTML <select> pour choix moduleimpl """menu HTML <select> pour choix moduleimpl
Prend les semestres de l'année, sauf si only_form est indiqué. Prend les semestres de l'année, sauf si only_form est indiqué.
@ -2298,6 +2322,7 @@ def _module_selector_multiple(
"assiduites/widgets/moduleimpl_selector_multiple.j2", "assiduites/widgets/moduleimpl_selector_multiple.j2",
choices=choices, choices=choices,
moduleimpl_id=moduleimpl_id, moduleimpl_id=moduleimpl_id,
no_default=no_default,
) )