diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index 5ed34cf36..f4f0c77c1 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -257,10 +257,14 @@ class FormSemestre(db.Model): if self.formation.get_parcours().APC_SAE: sem_ues = UniteEns.query.filter_by( formation=self.formation, semestre_idx=self.semestre_id - ).filter( - (UniteEns.parcour == None) - | (UniteEns.parcour_id.in_([p.id for p in self.parcours])) ) + 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_id.in_([p.id for p in self.parcours])) + ) + # si le sem. ne coche aucun parcours, prend toutes les UE else: sem_ues = db.session.query(UniteEns).filter( ModuleImpl.formsemestre_id == self.id, diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py index bd396ad16..3eee1a67b 100644 --- a/app/scodoc/sco_formsemestre_edit.py +++ b/app/scodoc/sco_formsemestre_edit.py @@ -553,7 +553,10 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N str(parcour.id) for parcour in ref_comp.parcours ], "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. + """, }, ) ] diff --git a/app/scodoc/sco_formsemestre_status.py b/app/scodoc/sco_formsemestre_status.py index 85eac7241..653834676 100644 --- a/app/scodoc/sco_formsemestre_status.py +++ b/app/scodoc/sco_formsemestre_status.py @@ -40,7 +40,7 @@ from app import log from app.comp import res_sem from app.comp.res_common import ResultatsSemestre 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.formsemestre import FormSemestre import app.scodoc.sco_utils as scu @@ -963,12 +963,12 @@ def html_expr_diagnostic(diagnostics): 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" """ - sem = FormSemestre.query.get(formsemestre_id) + sem: FormSemestre = FormSemestre.query.get(formsemestre_id) if not sem: raise ScoValueError("Semestre inexistant (il a peut être été supprimé ?)") - formation = sem.formation + formation: Formation = sem.formation parcours = formation.get_parcours() page_title = page_title or "Modules de " @@ -996,11 +996,16 @@ def formsemestre_status_head(formsemestre_id=None, page_title=None): })""" ) H.append("") - 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( f""" Parcours: - {', '.join(parcours.code for parcours in sem.parcours)} + {', '.join(parcours.code for parcours in sem_parcours)} """ ) diff --git a/tests/unit/cursus_but_gb.yaml b/tests/unit/cursus_but_gb.yaml index 2dba62e95..24090c5bd 100644 --- a/tests/unit/cursus_but_gb.yaml +++ b/tests/unit/cursus_but_gb.yaml @@ -130,22 +130,29 @@ FormSemestres: Etudiants: Aaaaa: - prenom: Étudiant + prenom: Étudiant_SEE civilite: M formsemestres: S1_SEE: parcours: SEE - notes_modules: - R1.01: 12 - R1.SEE.11: 15 + notes_modules: # on joue avec les SAE seulement car elles sont "diagonales" + "SAÉ 1.01": 8 # UE11 ratée + "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: codes_min: [ ] S2_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: parcours: SEE Bbbbb: - prenom: Étudiante + prenom: Étudiante_BMB civilite: F formsemestres: S1_BMB: diff --git a/tests/unit/test_but_jury.py b/tests/unit/test_but_jury.py index 8b46050e0..e8dc86714 100644 --- a/tests/unit/test_but_jury.py +++ b/tests/unit/test_but_jury.py @@ -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.rcues_annee == [] # S1, pas de RCUEs 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 formsemestre.query_ues().all() == deca.ues_impair nb_ues = formsemestre.query_ues().count() @@ -48,7 +48,9 @@ def test_but_jury_S3(test_client): app.set_sco_dept(DEPT) doc = sty.setup_from_yaml("tests/unit/cursus_but_gb.yaml") 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 deca = DecisionsProposeesAnnee(etud, formsemestre) assert len(deca.niveaux_competences) == 5 # 5 compétences dans ce parcours