Export décisions jury BUT dans bulletins JSON

This commit is contained in:
Emmanuel Viennet 2022-06-29 19:25:08 +02:00
parent 16b3221daa
commit fd21172398
5 changed files with 71 additions and 2 deletions

View File

@ -14,6 +14,7 @@ from flask import url_for, g
from app.comp.res_but import ResultatsSemestreBUT from app.comp.res_but import ResultatsSemestreBUT
from app.models import FormSemestre, Identite from app.models import FormSemestre, Identite
from app.models import but_validations
from app.models.groups import GroupDescr from app.models.groups import GroupDescr
from app.models.ues import UniteEns from app.models.ues import UniteEns
from app.scodoc import sco_bulletins, sco_utils as scu from app.scodoc import sco_bulletins, sco_utils as scu
@ -326,6 +327,7 @@ class BulletinBUT:
semestre_infos.update( semestre_infos.update(
sco_bulletins_json.dict_decision_jury(etud.id, formsemestre.id) sco_bulletins_json.dict_decision_jury(etud.id, formsemestre.id)
) )
semestre_infos.update(but_validations.dict_decision_jury(etud, formsemestre))
if etat_inscription == scu.INSCRIT: if etat_inscription == scu.INSCRIT:
# moyenne des moyennes générales du semestre # moyenne des moyennes générales du semestre
semestre_infos["notes"] = { semestre_infos["notes"] = {

View File

@ -933,7 +933,7 @@ class BUTCursusEtud: # WIP TODO
"""La liste des UE à valider si on valide ce niveau. """La liste des UE à valider si on valide ce niveau.
Ne liste que les UE qui ne sont pas déjà acquises. Ne liste que les UE qui ne sont pas déjà acquises.
Selon la règle donéne par l'arrêté BUT: Selon la règle donnée par l'arrêté BUT:
* La validation des deux UE du niveau dune compétence emporte la validation de * La validation des deux UE du niveau dune compétence emporte la validation de
l'ensemble des UE du niveau inférieur de cette même compétence. l'ensemble des UE du niveau inférieur de cette même compétence.
""" """

View File

@ -195,6 +195,7 @@ class ApcCompetence(db.Model, XMLModel):
return f"<ApcCompetence {self.id} {self.titre!r}>" return f"<ApcCompetence {self.id} {self.titre!r}>"
def to_dict(self): def to_dict(self):
"repr dict recursive sur situations, composantes, niveaux"
return { return {
"id_orebut": self.id_orebut, "id_orebut": self.id_orebut,
"titre": self.titre, "titre": self.titre,
@ -208,6 +209,16 @@ class ApcCompetence(db.Model, XMLModel):
"niveaux": {x.annee: x.to_dict() for x in self.niveaux}, "niveaux": {x.annee: x.to_dict() for x in self.niveaux},
} }
def to_dict_bul(self) -> dict:
"dict court pour bulletins"
return {
"id_orebut": self.id_orebut,
"titre": self.titre,
"titre_long": self.titre_long,
"couleur": self.couleur,
"numero": self.numero,
}
class ApcSituationPro(db.Model, XMLModel): class ApcSituationPro(db.Model, XMLModel):
"Situation professionnelle" "Situation professionnelle"
@ -262,6 +273,7 @@ class ApcNiveau(db.Model, XMLModel):
self.annee!r} {self.competence!r}>""" self.annee!r} {self.competence!r}>"""
def to_dict(self): def to_dict(self):
"as a dict, recursif sur les AC"
return { return {
"libelle": self.libelle, "libelle": self.libelle,
"annee": self.annee, "annee": self.annee,
@ -269,6 +281,15 @@ class ApcNiveau(db.Model, XMLModel):
"app_critiques": {x.code: x.to_dict() for x in self.app_critiques}, "app_critiques": {x.code: x.to_dict() for x in self.app_critiques},
} }
def to_dict_bul(self):
"dict pour bulletins: indique la compétence, pas les ACs (pour l'instant ?)"
return {
"libelle": self.libelle,
"annee": self.annee,
"ordre": self.ordre,
"competence": self.competence.to_dict_bul(),
}
@classmethod @classmethod
def niveaux_annee_de_parcours( def niveaux_annee_de_parcours(
cls, cls,

View File

@ -13,6 +13,7 @@ from app.models import CODE_STR_LEN
from app.models.but_refcomp import ApcNiveau from app.models.but_refcomp import ApcNiveau
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.models.ues import UniteEns from app.models.ues import UniteEns
from app.models.formations import Formation
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
from app.scodoc import sco_codes_parcours as sco_codes from app.scodoc import sco_codes_parcours as sco_codes
@ -63,6 +64,10 @@ class ApcValidationRCUE(db.Model):
# Par convention, il est donné par la seconde UE # Par convention, il est donné par la seconde UE
return self.ue2.niveau_competence return self.ue2.niveau_competence
def to_dict_bul(self) -> dict:
"Export dict pour bulletins"
return {"code": self.code, "niveau": self.niveau().to_dict_bul()}
# Attention: ce n'est pas un modèle mais une classe ordinaire: # Attention: ce n'est pas un modèle mais une classe ordinaire:
class RegroupementCoherentUE: class RegroupementCoherentUE:
@ -280,3 +285,45 @@ class ApcValidationAnnee(db.Model):
def __repr__(self): def __repr__(self):
return f"<{self.__class__.__name__} {self.id} {self.etud} BUT{self.ordre}/{self.annee_scolaire}:{self.code!r}>" return f"<{self.__class__.__name__} {self.id} {self.etud} BUT{self.ordre}/{self.annee_scolaire}:{self.code!r}>"
def to_dict_bul(self) -> dict:
"dict pour bulletins"
return {
"annee_scolaire": self.annee_scolaire,
"date": self.date.isoformat(),
"code": self.code,
"ordre": self.ordre,
}
def dict_decision_jury(etud: Identite, formsemestre: FormSemestre) -> dict:
"""
Un dict avec les décisions de jury BUT enregistrées.
Ne reprend pas les décisions d'UE, non spécifiques au BUT.
"""
decisions = {}
# --- RCUEs: seulement sur semestres pairs XXX à améliorer
if formsemestre.semestre_id % 2 == 0:
# validations émises depuis ce formsemestre:
validations_rcues = ApcValidationRCUE.query.filter_by(
etudid=etud.id, formsemestre_id=formsemestre.id
)
decisions["decision_rcue"] = [v.to_dict_bul() for v in validations_rcues]
else:
decisions["decision_rcue"] = []
# --- Année: prend la validation pour l'année scolaire de ce semestre
validation = (
ApcValidationAnnee.query.filter_by(
etudid=etud.id,
annee_scolaire=formsemestre.annee_scolaire(),
)
.join(ApcValidationAnnee.formsemestre)
.join(FormSemestre.formation)
.filter(Formation.formation_code == formsemestre.formation.formation_code)
.first()
)
if validation:
decisions["decision_annee"] = validation.to_dict_bul()
else:
decisions["decision_annee"] = None
return decisions

View File

@ -2265,7 +2265,6 @@ def formsemestre_validation_but(
+ html_sco_header.sco_footer() + html_sco_header.sco_footer()
) )
res: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre)
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
if len(deca.rcues_annee) == 0: if len(deca.rcues_annee) == 0:
raise ScoValueError("année incomplète: pas de jury BUT annuel possible") raise ScoValueError("année incomplète: pas de jury BUT annuel possible")