Modifie le calcul de l'ensemble des UE si aucun parcours BUT n'est coché: prend toutes.

This commit is contained in:
Emmanuel Viennet 2022-12-17 09:18:10 -03:00 committed by iziram
parent 0d9338dc0a
commit e59fce5f6b
5 changed files with 38 additions and 17 deletions

View File

@ -257,10 +257,14 @@ class FormSemestre(db.Model):
if self.formation.get_parcours().APC_SAE: if self.formation.get_parcours().APC_SAE:
sem_ues = UniteEns.query.filter_by( sem_ues = UniteEns.query.filter_by(
formation=self.formation, semestre_idx=self.semestre_id formation=self.formation, semestre_idx=self.semestre_id
).filter( )
if self.parcours:
# Prend toutes les UE de l'un des parcours du sem., ou déclarées sans parcours
sem_ues = sem_ues.filter(
(UniteEns.parcour == None) (UniteEns.parcour == None)
| (UniteEns.parcour_id.in_([p.id for p in self.parcours])) | (UniteEns.parcour_id.in_([p.id for p in self.parcours]))
) )
# si le sem. ne coche aucun parcours, prend toutes les UE
else: else:
sem_ues = db.session.query(UniteEns).filter( sem_ues = db.session.query(UniteEns).filter(
ModuleImpl.formsemestre_id == self.id, ModuleImpl.formsemestre_id == self.id,

View File

@ -553,7 +553,10 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N
str(parcour.id) for parcour in ref_comp.parcours str(parcour.id) for parcour in ref_comp.parcours
], ],
"explanation": """Parcours proposés dans ce semestre. "explanation": """Parcours proposés dans ce semestre.
S'il s'agit d'un semestre de "tronc commun", ne pas indiquer de parcours.""", S'il s'agit d'un semestre de "tronc commun", ne pas indiquer de parcours.
Attention, si aucun parcours n'est coché, toutes les UEs du
programme seront considérées, quel que soit leur parcours.
""",
}, },
) )
] ]

View File

@ -40,7 +40,7 @@ from app import log
from app.comp import res_sem from app.comp import res_sem
from app.comp.res_common import ResultatsSemestre from app.comp.res_common import ResultatsSemestre
from app.comp.res_compat import NotesTableCompat from app.comp.res_compat import NotesTableCompat
from app.models import Evaluation, Module, ModuleImpl, NotesNotes from app.models import Evaluation, Formation, Module, ModuleImpl, NotesNotes
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
@ -963,12 +963,12 @@ def html_expr_diagnostic(diagnostics):
return "".join(H) return "".join(H)
def formsemestre_status_head(formsemestre_id=None, page_title=None): def formsemestre_status_head(formsemestre_id: int = None, page_title: str = None):
"""En-tête HTML des pages "semestre" """ """En-tête HTML des pages "semestre" """
sem = FormSemestre.query.get(formsemestre_id) sem: FormSemestre = FormSemestre.query.get(formsemestre_id)
if not sem: if not sem:
raise ScoValueError("Semestre inexistant (il a peut être été supprimé ?)") raise ScoValueError("Semestre inexistant (il a peut être été supprimé ?)")
formation = sem.formation formation: Formation = sem.formation
parcours = formation.get_parcours() parcours = formation.get_parcours()
page_title = page_title or "Modules de " page_title = page_title or "Modules de "
@ -996,11 +996,16 @@ def formsemestre_status_head(formsemestre_id=None, page_title=None):
}</tt></b>)""" }</tt></b>)"""
) )
H.append("</td></tr>") H.append("</td></tr>")
if sem.parcours: if formation.is_apc():
# Affiche les parcours BUT cochés. Si aucun, tous ceux du référentiel.
sem_parcours = sem.parcours or (
formation.referentiel_competence
and formation.referentiel_competence.parcours
)
H.append( H.append(
f""" f"""
<tr><td class="fichetitre2">Parcours: </td> <tr><td class="fichetitre2">Parcours: </td>
<td style="color: blue;">{', '.join(parcours.code for parcours in sem.parcours)}</td> <td style="color: blue;">{', '.join(parcours.code for parcours in sem_parcours)}</td>
</tr> </tr>
""" """
) )

View File

@ -130,22 +130,29 @@ FormSemestres:
Etudiants: Etudiants:
Aaaaa: Aaaaa:
prenom: Étudiant prenom: Étudiant_SEE
civilite: M civilite: M
formsemestres: formsemestres:
S1_SEE: S1_SEE:
parcours: SEE parcours: SEE
notes_modules: notes_modules: # on joue avec les SAE seulement car elles sont "diagonales"
R1.01: 12 "SAÉ 1.01": 8 # UE11 ratée
R1.SEE.11: 15 "SAÉ 1.02": 9 # UE12 ratée
"SAÉ 1.SEE.03": 18 # UE13 => sera capitalisée
"SAÉ 1.SEE.04": 7 # UE14 ratée
deca: deca:
codes_min: [ ] codes_min: [ ]
S2_SEE: S2_SEE:
parcours: SEE parcours: SEE
notes_modules: # on joue avec les SAE seulement
"SAE 21": 9 # UE21 ratée, pas le niveau de comp.
"SAE22": 12 # UE22 ok, emporte le niveau par compensation
"SAE23.SEE": 19 # UE23 ok
"SAE24.SEE": 12 # UE24 ok, mais ne compense pas
S3: S3:
parcours: SEE parcours: SEE
Bbbbb: Bbbbb:
prenom: Étudiante prenom: Étudiante_BMB
civilite: F civilite: F
formsemestres: formsemestres:
S1_BMB: S1_BMB:

View File

@ -33,7 +33,7 @@ def test_but_jury_S1(test_client):
assert deca.formsemestre_pair is None # jury de S1, pas de S2 assert deca.formsemestre_pair is None # jury de S1, pas de S2
assert deca.rcues_annee == [] # S1, pas de RCUEs assert deca.rcues_annee == [] # S1, pas de RCUEs
assert deca.inscription_etat == scu.INSCRIT assert deca.inscription_etat == scu.INSCRIT
assert deca.inscription_etat_impair is None assert deca.inscription_etat_impair == scu.INSCRIT
assert deca.parcour == formsemestre.parcours[0] # un seul parcours dans ce sem. assert deca.parcour == formsemestre.parcours[0] # un seul parcours dans ce sem.
assert formsemestre.query_ues().all() == deca.ues_impair assert formsemestre.query_ues().all() == deca.ues_impair
nb_ues = formsemestre.query_ues().count() nb_ues = formsemestre.query_ues().count()
@ -48,7 +48,9 @@ def test_but_jury_S3(test_client):
app.set_sco_dept(DEPT) app.set_sco_dept(DEPT)
doc = sty.setup_from_yaml("tests/unit/cursus_but_gb.yaml") doc = sty.setup_from_yaml("tests/unit/cursus_but_gb.yaml")
formsemestre: FormSemestre = FormSemestre.query.filter_by(titre="S3").first() formsemestre: FormSemestre = FormSemestre.query.filter_by(titre="S3").first()
etud: Identite = formsemestre.etuds.filter_by(nom="See1").first() # du parcours SEE etud: Identite = formsemestre.etuds.filter_by(
prenom="Étudiant_SEE"
).first() # du parcours SEE
assert etud assert etud
deca = DecisionsProposeesAnnee(etud, formsemestre) deca = DecisionsProposeesAnnee(etud, formsemestre)
assert len(deca.niveaux_competences) == 5 # 5 compétences dans ce parcours assert len(deca.niveaux_competences) == 5 # 5 compétences dans ce parcours