diff --git a/app/__init__.py b/app/__init__.py index 6946415f5..6fb6cf052 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -502,12 +502,10 @@ def clear_scodoc_cache(): # --------- Logging -def log(msg: str, silent_test=True): +def log(msg: str): """log a message. If Flask app, use configured logger, else stderr. """ - if silent_test and current_app and current_app.config["TESTING"]: - return try: dept = getattr(g, "scodoc_dept", "") msg = f" ({dept}) {msg}" diff --git a/app/api/absences.py b/app/api/absences.py index e098c196a..b049bfb7c 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ScoDoc 9 API : Absences diff --git a/app/api/billets_absences.py b/app/api/billets_absences.py index f15a9b495..69d6186ff 100644 --- a/app/api/billets_absences.py +++ b/app/api/billets_absences.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/departements.py b/app/api/departements.py index 0782453c1..bc6c38d67 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/etudiants.py b/app/api/etudiants.py index c1ebd07f2..cb150fe71 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/evaluations.py b/app/api/evaluations.py index a8fb2c26c..69e18e7b2 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/formations.py b/app/api/formations.py index 002ce7392..c784f1100 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 1c1db110a..acc749caa 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/jury.py b/app/api/jury.py index b58147c7f..f31d1a788 100644 --- a/app/api/jury.py +++ b/app/api/jury.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/logos.py b/app/api/logos.py index 5c31ed758..677c2b7be 100644 --- a/app/api/logos.py +++ b/app/api/logos.py @@ -5,7 +5,7 @@ # # Gestion scolarite IUT # -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/api/partitions.py b/app/api/partitions.py index a6283f481..699f18e71 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/api/tools.py b/app/api/tools.py index 90750e121..ec0b8561a 100644 --- a/app/api/tools.py +++ b/app/api/tools.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ScoDoc 9 API : outils diff --git a/app/api/users.py b/app/api/users.py index ee2cce248..962aa9e79 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/apc_edit_ue.py b/app/but/apc_edit_ue.py index 2222dc65e..01b1aacd9 100644 --- a/app/but/apc_edit_ue.py +++ b/app/but/apc_edit_ue.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/bulletin_but.py b/app/but/bulletin_but.py index f21e8ff62..d8dbd61c7 100644 --- a/app/but/bulletin_but.py +++ b/app/but/bulletin_but.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## @@ -361,7 +361,7 @@ class BulletinBUT: "formsemestre_id": formsemestre.id, "etat_inscription": etat_inscription, "options": sco_preferences.bulletin_option_affichage( - formsemestre.id, self.prefs + formsemestre, self.prefs ), } if not published: @@ -465,6 +465,7 @@ class BulletinBUT: "ressources": {}, "saes": {}, "ues": {}, + "ues_capitalisees": {}, } ) diff --git a/app/but/bulletin_but_pdf.py b/app/but/bulletin_but_pdf.py index 526465f57..1ba7a760c 100644 --- a/app/but/bulletin_but_pdf.py +++ b/app/but/bulletin_but_pdf.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/bulletin_but_xml_compat.py b/app/but/bulletin_but_xml_compat.py index 01e5c7cc0..00564f14b 100644 --- a/app/but/bulletin_but_xml_compat.py +++ b/app/but/bulletin_but_xml_compat.py @@ -5,7 +5,7 @@ # # Gestion scolarite IUT # -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/app/but/cursus_but.py b/app/but/cursus_but.py index e3ae8bb61..15ac1fa37 100644 --- a/app/but/cursus_but.py +++ b/app/but/cursus_but.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/forms/jury_but_forms.py b/app/but/forms/jury_but_forms.py index 0f3719600..67bd955af 100644 --- a/app/but/forms/jury_but_forms.py +++ b/app/but/forms/jury_but_forms.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/forms/refcomp_forms.py b/app/but/forms/refcomp_forms.py index 41ffff4a6..2b817473c 100644 --- a/app/but/forms/refcomp_forms.py +++ b/app/but/forms/refcomp_forms.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## diff --git a/app/but/import_refcomp.py b/app/but/import_refcomp.py index e1e62d486..666deb547 100644 --- a/app/but/import_refcomp.py +++ b/app/but/import_refcomp.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## from xml.etree import ElementTree diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 6cc201b68..bf0e75eb1 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## @@ -91,9 +91,15 @@ from app.models.ues import UniteEns from app.models.validations import ScolarFormSemestreValidation from app.scodoc import sco_cache from app.scodoc import sco_codes_parcours as sco_codes -from app.scodoc.sco_codes_parcours import CODES_UE_VALIDES, RED, UE_STANDARD +from app.scodoc.sco_codes_parcours import ( + BUT_CODES_ORDERED, + CODES_RCUE_VALIDES, + CODES_UE_VALIDES, + RED, + UE_STANDARD, +) from app.scodoc import sco_utils as scu -from app.scodoc.sco_exceptions import ScoException, ScoValueError +from app.scodoc.sco_exceptions import ScoNoReferentielCompetences, ScoValueError class NoRCUEError(ScoValueError): @@ -170,7 +176,7 @@ class DecisionsProposees: def __repr__(self) -> str: return f"""<{self.__class__.__name__} valid={self.code_valide - } codes={self.codes} explanation={self.explanation}""" + } codes={self.codes} explanation={self.explanation}>""" class DecisionsProposeesAnnee(DecisionsProposees): @@ -205,6 +211,8 @@ class DecisionsProposeesAnnee(DecisionsProposees): formsemestre: FormSemestre, ): assert formsemestre.formation.is_apc() + if formsemestre.formation.referentiel_competence is None: + raise ScoNoReferentielCompetences(formation=formsemestre.formation) super().__init__(etud=etud) self.formsemestre = formsemestre "le formsemestre utilisé pour construire ce deca" @@ -348,8 +356,9 @@ class DecisionsProposeesAnnee(DecisionsProposees): ) "vrai si l'année est réussie, tous niveaux validables ou validés par le jury" self.valide_moitie_rcue = self.nb_validables > (self.nb_competences // 2) - "Peut passer si plus de la moitié validables et tous > 8" + "Vrai si plus de la moitié des RCUE validables" self.passage_de_droit = self.valide_moitie_rcue and (self.nb_rcues_under_8 == 0) + "Vrai si peut passer dans l'année BUT suivante: plus de la moitié validables et tous > 8" # XXX TODO ajouter condition pour passage en S5 # Enfin calcule les codes des UE: @@ -362,7 +371,6 @@ class DecisionsProposeesAnnee(DecisionsProposees): "s" if plural else ""} sur {self.nb_competences}""" if self.admis: self.codes = [sco_codes.ADM] + self.codes - self.explanation = expl_rcues # elif not self.jury_annuel: # self.codes = [] # pas de décision annuelle sur semestres impairs elif self.inscription_etat != scu.INSCRIT: @@ -378,9 +386,9 @@ class DecisionsProposeesAnnee(DecisionsProposees): sco_codes.ABL, sco_codes.EXCLU, ] + expl_rcues = "" elif self.passage_de_droit: self.codes = [sco_codes.PASD, sco_codes.ADJ] + self.codes - self.explanation = expl_rcues elif self.valide_moitie_rcue: # mais au moins 1 rcue insuffisante self.codes = [ sco_codes.RED, @@ -388,7 +396,7 @@ class DecisionsProposeesAnnee(DecisionsProposees): sco_codes.PAS1NCI, sco_codes.ADJ, ] + self.codes - self.explanation = expl_rcues + f" et {self.nb_rcues_under_8} < 8" + expl_rcues += f" et {self.nb_rcues_under_8} < 8" else: self.codes = [ sco_codes.RED, @@ -397,17 +405,21 @@ class DecisionsProposeesAnnee(DecisionsProposees): sco_codes.ADJ, sco_codes.PASD, # voir #488 (discutable, conventions locales) ] + self.codes - self.explanation = ( - expl_rcues - + f""" et {self.nb_rcues_under_8} - niveau{'x' if self.nb_rcues_under_8 > 1 else ''} < 8""" - ) + expl_rcues += f""" et {self.nb_rcues_under_8} niveau{'x' if self.nb_rcues_under_8 > 1 else ''} < 8""" + # Si l'un des semestres est extérieur, propose ADM if ( self.formsemestre_impair and self.formsemestre_impair.modalite == "EXT" ) or (self.formsemestre_pair and self.formsemestre_pair.modalite == "EXT"): self.codes.insert(0, sco_codes.ADM) - + self.explanation = f"
Pas de référentiel de compétences associé à la formation !
-Pour associer un référentiel, passer par le menu Semestre / - Voir la formation... et suivre le lien "associer à un référentiel - de compétences" - """ - ) + raise ScoNoReferentielCompetences(formation=formsemestre2.formation) rows, titles, column_ids, jury_stats = get_jury_but_table( formsemestre2, read_only=read_only, mode=mode diff --git a/app/but/jury_but_validation_auto.py b/app/but/jury_but_validation_auto.py index 918bd571e..d5e308ab9 100644 --- a/app/but/jury_but_validation_auto.py +++ b/app/but/jury_but_validation_auto.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## @@ -15,12 +15,19 @@ from app.scodoc import sco_cache from app.scodoc.sco_exceptions import ScoValueError -def formsemestre_validation_auto_but(formsemestre: FormSemestre, only_adm=True) -> int: +def formsemestre_validation_auto_but( + formsemestre: FormSemestre, only_adm: bool = True, no_overwrite: bool = True +) -> int: """Calcul automatique des décisions de jury sur une année BUT. + Ne modifie jamais de décisions de l'année scolaire précédente, même + si on a des RCUE "à cheval". Normalement, only_adm est True et on n'enregistre que les décisions ADM (de droit). Si only_adm est faux, on enregistre la première décision proposée par ScoDoc (mode à n'utiliser que pour les tests) + Si no_overwrite est vrai (défaut), ne ré-écrit jamais les codes déjà enregistrés + (utiliser faux pour certains tests) + Returns: nombre d'étudiants "admis" """ if not formsemestre.formation.is_apc(): @@ -33,7 +40,7 @@ def formsemestre_validation_auto_but(formsemestre: FormSemestre, only_adm=True) if deca.admis: # année réussie nb_admis += 1 if deca.admis or not only_adm: - deca.record_all() + deca.record_all(no_overwrite=no_overwrite) db.session.commit() return nb_admis diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py index 1a19a5b78..3140bd02e 100644 --- a/app/but/jury_but_view.py +++ b/app/but/jury_but_view.py @@ -1,6 +1,6 @@ ############################################################################## # ScoDoc -# Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. +# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## @@ -30,6 +30,7 @@ from app.models import ( Identite, UniteEns, ScolarAutorisationInscription, + ScolarFormSemestreValidation, ) from app.scodoc import html_sco_header from app.scodoc.sco_exceptions import ScoValueError @@ -41,32 +42,21 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str: Si pas read_only, menus sélection codes jury. """ H = [] - if deca.code_valide and not read_only: - erase_span = f"""effacer décisions""" - else: - erase_span = "" H.append("""