diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index f4f0c77c..de514dbe 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -245,6 +245,15 @@ class FormSemestre(db.Model): d["etapes_apo_str"] = self.etapes_apo_str() return d + def get_parcours_apc(self) -> list[ApcParcours]: + """Liste des parcours proposés par ce semestre. + Si aucun n'est coché et qu'il y a un référentiel, tous ceux du référentiel. + """ + return self.parcours or ( + self.formation.referentiel_competence + and self.formation.referentiel_competence.parcours + ) + def query_ues(self, with_sport=False) -> flask_sqlalchemy.BaseQuery: """UE des modules de ce semestre, triées par numéro. - Formations classiques: les UEs auxquelles appartiennent @@ -670,8 +679,12 @@ class FormSemestre(db.Model): db.session.add(partition) db.session.flush() # pour avoir un id flash("Partition Parcours créée.") + elif partition.groups_editable: + # Il ne faut jamais laisser éditer cette partition de parcours + partition.groups_editable = False + db.session.add(partition) - for parcour in self.parcours: + for parcour in self.get_parcours_apc(): if parcour.code: group = GroupDescr.query.filter_by( partition_id=partition.id, group_name=parcour.code @@ -680,21 +693,28 @@ class FormSemestre(db.Model): partition.groups.append(GroupDescr(group_name=parcour.code)) db.session.flush() # S'il reste des groupes de parcours qui ne sont plus dans le semestre - # et qui n'ont pas d'inscrits, supprime-les. + # - s'ils n'ont pas d'inscrits, supprime-les. + # - s'ils ont des inscrits: avertissement for group in GroupDescr.query.filter_by(partition_id=partition.id): - if (group.group_name not in (p.code for p in self.parcours)) and ( - len( - [ - inscr - for inscr in self.inscriptions - if (inscr.parcour is not None) - and inscr.parcour.code == group.group_name - ] - ) - == 0 - ): - flash(f"suppression du groupe de parcours {group.group_name}") - db.session.delete(group) + if group.group_name not in (p.code for p in self.parcours): + if ( + len( + [ + inscr + for inscr in self.inscriptions + if (inscr.parcour is not None) + and inscr.parcour.code == group.group_name + ] + ) + == 0 + ): + flash(f"Suppression du groupe de parcours vide {group.group_name}") + db.session.delete(group) + else: + flash( + f"""Attention: groupe de parcours {group.group_name} non vide: + réaffectez ses étudiants dans des parcours du semestre""" + ) db.session.commit() diff --git a/app/scodoc/sco_formsemestre_status.py b/app/scodoc/sco_formsemestre_status.py index 65383467..c961dadf 100644 --- a/app/scodoc/sco_formsemestre_status.py +++ b/app/scodoc/sco_formsemestre_status.py @@ -998,10 +998,7 @@ def formsemestre_status_head(formsemestre_id: int = None, page_title: str = None H.append("") 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 - ) + sem_parcours = sem.get_parcours_apc() H.append( f""" Parcours: @@ -1051,6 +1048,8 @@ def formsemestre_status(formsemestre_id=None): "formsemestre_bulletinetud: formsemestre_id must be an integer !" ) formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) + # S'assure que les groupes de parcours sont à jour: + formsemestre.setup_parcours_groups() modimpls = sco_moduleimpl.moduleimpl_withmodule_list( formsemestre_id=formsemestre_id ) diff --git a/app/views/scolar.py b/app/views/scolar.py index 6bb24e9f..b82b082a 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -902,6 +902,7 @@ sco_publish( @scodoc7func def partition_editor(formsemestre_id: int): formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) + formsemestre.setup_parcours_groups() H = [ html_sco_header.sco_header( cssstyles=["css/partition_editor.css"],