Compare commits

...

8 Commits

7 changed files with 79 additions and 32 deletions

View File

@ -248,10 +248,9 @@ def get_annee_diplome_semestre(
def get_cosemestres_diplomants(
annee_diplome: int, formation_id: int
annee_diplome: int
) -> dict[int, FormSemestre]:
"""Ensemble des cosemestres donnant lieu à diplomation à l'``annee_diplome``
et s'intégrant à la formation donnée par son ``formation_id``.
"""Ensemble des cosemestres donnant lieu à diplomation à l'``annee_diplome``.
**Définition** : Un co-semestre est un semestre :
@ -259,26 +258,17 @@ def get_cosemestres_diplomants(
* dont la formation est la même (optionnel)
* qui a des étudiants inscrits
Si formation_id == None, ne prend pas en compte l'identifiant de formation
TODO:: A raccrocher à un programme
Args:
annee_diplome: L'année de diplomation
formation_id: L'identifiant de la formation
Returns:
Un dictionnaire {fid: FormSemestre(fid)} contenant les cosemestres
"""
tousLesSems = (
sco_formsemestre.do_formsemestre_list()
) # tous les semestres memorisés dans scodoc
if formation_id:
cosemestres_fids = {
sem["id"]
for sem in tousLesSems
if get_annee_diplome_semestre(sem) == annee_diplome
and sem["formation_id"] == formation_id
}
else:
cosemestres_fids = {
cosemestres_fids = {
sem["id"]
for sem in tousLesSems
if get_annee_diplome_semestre(sem) == annee_diplome

View File

@ -41,7 +41,8 @@ import app.pe.pe_rcs
from app.models import FormSemestre, Identite, Formation
from app.pe import pe_comp, pe_affichage
from app.scodoc import codes_cursus
from app.scodoc import sco_utils as scu
from app.comp.res_sem import load_formsemestre_results
class EtudiantsJuryPE:
"""Classe centralisant la gestion des étudiants à prendre en compte dans un jury de PE"""
@ -94,7 +95,7 @@ class EtudiantsJuryPE:
*Remarque* : ex: JuryPE.get_etudiants_in_jury()
"""
cosemestres = pe_comp.get_cosemestres_diplomants(self.annee_diplome, None)
cosemestres = pe_comp.get_cosemestres_diplomants(self.annee_diplome)
self.cosemestres = cosemestres
pe_affichage.pe_print(
@ -236,8 +237,15 @@ class EtudiantsJuryPE:
"abandon": False, # va être traité en dessous
}
# Est-il réorienté / démissionnaire ou a-t-il arrêté volontairement sa formation ?
self.cursus[etudid]["abandon"] = arret_de_formation(identite, cosemestres)
# Est-il démissionnaire : charge son dernier semestre pour connaitre son état ?
dernier_semes_etudiant = formsemestres[0]
res = load_formsemestre_results(dernier_semes_etudiant)
etud_etat = res.get_etud_etat(etudid)
if etud_etat == scu.DEMISSION:
self.cursus[etudid]["abandon"] |= True
else:
# Est-il réorienté ou a-t-il arrêté volontairement sa formation ?
self.cursus[etudid]["abandon"] |= arret_de_formation(identite, cosemestres)
def get_semestres_significatifs(self, etudid: int):
"""Ensemble des semestres d'un étudiant, qui l'auraient amené à être diplomé
@ -251,7 +259,6 @@ class EtudiantsJuryPE:
Un dictionnaire ``{fid: FormSemestre(fid)`` dans lequel les semestres
amènent à une diplomation avant l'annee de diplomation du jury
"""
semestres_etudiant = self.cursus[etudid]["formsemestres"]
semestres_significatifs = {}
for fid in semestres_etudiant:

View File

@ -109,10 +109,21 @@ class SemestreTag(TableTag):
## Vérifie l'unicité des tags
if len(set(self.tags)) != len(self.tags):
liste_tag_reserves = ["but"] + list(dict_ues_competences.values())
liste_tag_perso = list(tags_personnalises.keys())
intersection = list(set(liste_tag_perso) & set(liste_tag_reserves))
liste_intersection = "\n".join([f"<li><code>{tag}</code></li>" for tag in intersection])
message = f"""Erreur dans le module PE : Un des tags saisis dans votre programme de formation
fait parti des tags réservés. En particulier,
votre semestre <em>{self.formsemestre.titre_annee()}</em>
contient le(s) tag(s) réservé(s) suivant :
<ul>
{liste_intersection}
</ul>
Modifiez votre programme de formation pour le(s) supprimer. Il(s) sera(ont) automatiquement à vos documents de poursuites d'études.
"""
raise ScoValueError(
f"""Erreur dans le module PE : L'un des tags saisis dans le programme
fait parti des tags réservés (par ex. "comp. <titre_compétence>"). Modifiez les
tags de votre programme"""
message
)
# Calcul des moyennes & les classements de chaque étudiant à chaque tag

View File

@ -70,14 +70,19 @@ def pe_view_sem_recap(formsemestre_id: int):
# L'année du diplome
annee_diplome = pe_comp.get_annee_diplome_semestre(formsemestre)
# Cosemestres diplomants
cosemestres = pe_comp.get_cosemestres_diplomants(annee_diplome)
if request.method == "GET":
return render_template(
"pe/pe_view_sem_recap.j2",
annee_diplome=annee_diplome,
formsemestre=formsemestre,
sco=ScoData(formsemestre=formsemestre),
cosemestres=cosemestres,
)
# request.method == "POST"
jury = pe_jury.JuryPE(annee_diplome)
if not jury.diplomes_ids:
flash("aucun étudiant à considérer !")
@ -97,3 +102,11 @@ def pe_view_sem_recap(formsemestre_id: int):
download_name=scu.sanitize_filename(jury.nom_export_zip + ".zip"),
as_attachment=True,
)
return render_template(
"pe/pe_view_sem_recap.j2",
annee_diplome=annee_diplome,
formsemestre=formsemestre,
sco=ScoData(formsemestre=formsemestre),
cosemestres=cosemestres,
)

View File

@ -177,8 +177,7 @@ def etud_upload_file_form(etudid):
data = tf[2]["datafile"].read()
descr = tf[2]["description"]
filename = tf[2]["datafile"].filename
etud_archive_id = (etudid,)
_store_etud_file_to_new_archive(etud_archive_id, data, filename, description=descr)
_store_etud_file_to_new_archive(etudid, data, filename, description=descr)
return flask.redirect(etud.url_fiche())

View File

@ -30,7 +30,7 @@
<p>
Cette fonction génère un ensemble de feuilles de calcul (xlsx)
permettant d'éditer des avis de poursuites d'études pour les étudiants
de BUT diplômés en {{annee_diplome}}.
de BUT diplômés.
<br>
De nombreux aspects sont paramétrables:
<a href="https://scodoc.org/AvisPoursuiteEtudes"
@ -40,9 +40,36 @@
</p>
</div>
<form method="post">
<input type="submit" value="Générer les documents"/>
<input type="hidden" name="formsemestre_id" value="{{formsemestre.id}}">
</form>
<h3>Avis de poursuites d'études de la promo {{ annee_diplome }}</h3>
<div class="help">
Seront (a minima) pris en compte les étudiants ayant été inscrits aux semestres suivants :
<ul>
{% for fid in cosemestres %}
<li>
{{ cosemestres[fid].titre_annee() }}
</li>
{% endfor %}
</ul>
</div>
<div>
<progress id="pe_progress" style="visibility: hidden"></progress>
<br>
<button onclick="submitPEGeneration()">Générer les documents de la promo {{ annee_diplome }}</button>
</div>
<form method="post" id="pe_generation" style="visibility: hidden">
<input type="submit"
onclick="submitPEGeneration()" value=""/>
<input type="hidden" name="formsemestre_id" value="{{formsemestre.id}}">
</form>
<script>
function submitPEGeneration() {
// document.getElementById("pe_progress").style.visibility = 'visible';
document.getElementById("pe_generation").submit(); //attach an id to your form
}
</script>
{% endblock app_content %}

View File

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