Jury BUT: Messages d'erreur si pas de ref. comp.

This commit is contained in:
Emmanuel Viennet 2023-01-03 09:06:11 -03:00
parent c9bdac4853
commit b306584356
6 changed files with 36 additions and 26 deletions

View File

@ -93,7 +93,7 @@ from app.scodoc import sco_cache
from app.scodoc import sco_codes_parcours as sco_codes 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 CODES_UE_VALIDES, RED, UE_STANDARD
from app.scodoc import sco_utils as scu 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): class NoRCUEError(ScoValueError):
@ -205,6 +205,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
formsemestre: FormSemestre, formsemestre: FormSemestre,
): ):
assert formsemestre.formation.is_apc() assert formsemestre.formation.is_apc()
if formsemestre.formation.referentiel_competence is None:
raise ScoNoReferentielCompetences(formation=formsemestre.formation)
super().__init__(etud=etud) super().__init__(etud=etud)
self.formsemestre = formsemestre self.formsemestre = formsemestre
"le formsemestre utilisé pour construire ce deca" "le formsemestre utilisé pour construire ce deca"
@ -1148,7 +1150,7 @@ class BUTCursusEtud: # WIP TODO
def __init__(self, formsemestre: FormSemestre, etud: Identite): def __init__(self, formsemestre: FormSemestre, etud: Identite):
if formsemestre.formation.referentiel_competence is None: if formsemestre.formation.referentiel_competence is None:
raise ScoException("BUTCursusEtud: pas de référentiel de compétences") raise ScoNoReferentielCompetences(formation=formsemestre.formation)
assert len(etud.formsemestre_inscriptions) > 0 assert len(etud.formsemestre_inscriptions) > 0
self.formsemestre = formsemestre self.formsemestre = formsemestre
self.etud = etud self.etud = etud

View File

@ -32,7 +32,7 @@ from app.scodoc.sco_codes_parcours import (
from app.scodoc import sco_formsemestre_status from app.scodoc import sco_formsemestre_status
from app.scodoc import sco_pvjury from app.scodoc import sco_pvjury
from app.scodoc import sco_utils as scu from app.scodoc import sco_utils as scu
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoNoReferentielCompetences
def formsemestre_saisie_jury_but( def formsemestre_saisie_jury_but(
@ -63,14 +63,7 @@ def formsemestre_saisie_jury_but(
# raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs") # raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs")
if formsemestre2.formation.referentiel_competence is None: if formsemestre2.formation.referentiel_competence is None:
raise ScoValueError( raise ScoNoReferentielCompetences(formation=formsemestre2.formation)
"""
<p>Pas de référentiel de compétences associé à la formation !</p>
<p>Pour associer un référentiel, passer par le menu <b>Semestre /
Voir la formation... </b> et suivre le lien <em>"associer à un référentiel
de compétences"</em>
"""
)
rows, titles, column_ids, jury_stats = get_jury_but_table( rows, titles, column_ids, jury_stats = get_jury_but_table(
formsemestre2, read_only=read_only, mode=mode formsemestre2, read_only=read_only, mode=mode

View File

@ -14,7 +14,7 @@ import sqlalchemy
from app import db from app import db
from app.scodoc.sco_utils import ModuleType from app.scodoc.sco_utils import ModuleType
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoNoReferentielCompetences
# from https://stackoverflow.com/questions/2537471/method-of-iterating-over-sqlalchemy-models-defined-columns # from https://stackoverflow.com/questions/2537471/method-of-iterating-over-sqlalchemy-models-defined-columns
@ -322,9 +322,8 @@ class ApcNiveau(db.Model, XMLModel):
if annee not in {1, 2, 3}: if annee not in {1, 2, 3}:
raise ValueError("annee invalide pour un parcours BUT") raise ValueError("annee invalide pour un parcours BUT")
if referentiel_competence is None: if referentiel_competence is None:
raise ScoValueError( raise ScoNoReferentielCompetences()
"Pas de référentiel de compétences associé à la formation !"
)
annee_formation = f"BUT{annee}" annee_formation = f"BUT{annee}"
if parcour is None: if parcour is None:
return ApcNiveau.query.filter( return ApcNiveau.query.filter(

View File

@ -40,8 +40,9 @@ class InvalidNoteValue(ScoException):
pass pass
# Exception qui stoque dest_url
class ScoValueError(ScoException): class ScoValueError(ScoException):
"Exception avec page d'erreur utilisateur, et qui stoque dest_url"
def __init__(self, msg, dest_url=None): def __init__(self, msg, dest_url=None):
super().__init__(msg) super().__init__(msg)
self.dest_url = dest_url self.dest_url = dest_url
@ -74,7 +75,7 @@ class ScoFormatError(ScoValueError):
class ScoInvalidParamError(ScoValueError): class ScoInvalidParamError(ScoValueError):
"""Paramètres requete invalides. """Paramètres requete invalides.
A utilisée lorsqu'une route est appelée avec des paramètres invalides Utilisée lorsqu'une route est appelée avec des paramètres invalides
(id strings, ...) (id strings, ...)
""" """
@ -157,6 +158,23 @@ class ScoInvalidIdType(ScoValueError):
super().__init__(msg) super().__init__(msg)
class ScoNoReferentielCompetences(ScoValueError):
"""Formation APC (BUT) non associée à référentiel de compétences"""
def __init__(self, msg: str = "", formation: "Formation" = None):
formation_title = (
f"{formation.title} version {formation.version}" if formation else ""
)
msg = f"""
<p>Pas de référentiel de compétences associé à la formation {formation_title}!
</p>
<p>Pour associer un référentiel, passer par le menu <b>Semestre /
Voir la formation... </b> et suivre le lien <em>"associer à un référentiel
de compétences"</em>
"""
super().__init__(msg)
class ScoGenError(ScoException): class ScoGenError(ScoException):
"exception avec affichage d'une page explicative ad-hoc" "exception avec affichage d'une page explicative ad-hoc"

View File

@ -76,7 +76,7 @@ def do_evaluation_listenotes(
else: else:
raise ValueError("missing argument: evaluation or module") raise ValueError("missing argument: evaluation or module")
if not evals: if not evals:
return "<p>Aucune évaluation !</p>", f"ScoDoc" return "<p>Aucune évaluation !</p>", "ScoDoc"
E = evals[0] # il y a au moins une evaluation E = evals[0] # il y a au moins une evaluation
modimpl = ModuleImpl.query.get(E["moduleimpl_id"]) modimpl = ModuleImpl.query.get(E["moduleimpl_id"])
@ -244,7 +244,6 @@ def _make_table_notes(
E = evals[0] E = evals[0]
moduleimpl_id = E["moduleimpl_id"] moduleimpl_id = E["moduleimpl_id"]
modimpl = ModuleImpl.query.get_or_404(moduleimpl_id) modimpl = ModuleImpl.query.get_or_404(moduleimpl_id)
modimpl_o = modimpl.to_dict() # TODO temporaire - à refactorer
module: Module = modimpl.module module: Module = modimpl.module
formsemestre: FormSemestre = modimpl.formsemestre formsemestre: FormSemestre = modimpl.formsemestre
is_apc = module.formation.get_parcours().APC_SAE is_apc = module.formation.get_parcours().APC_SAE

View File

@ -426,16 +426,16 @@ def do_evaluation_set_missing(
def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False): def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False):
"suppress all notes in this eval" "suppress all notes in this eval"
E = sco_evaluation_db.do_evaluation_list({"evaluation_id": evaluation_id})[0] evaluation = Evaluation.query.get_or_404(evaluation_id)
if sco_permissions_check.can_edit_notes( if sco_permissions_check.can_edit_notes(
current_user, E["moduleimpl_id"], allow_ens=False current_user, evaluation.moduleimpl_id, allow_ens=False
): ):
# On a le droit de modifier toutes les notes # On a le droit de modifier toutes les notes
# recupere les etuds ayant une note # recupere les etuds ayant une note
notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id) notes_db = sco_evaluation_db.do_evaluation_get_all_notes(evaluation_id)
elif sco_permissions_check.can_edit_notes( elif sco_permissions_check.can_edit_notes(
current_user, E["moduleimpl_id"], allow_ens=True current_user, evaluation.moduleimpl_id, allow_ens=True
): ):
# Enseignant associé au module: ne peut supprimer que les notes qu'il a saisi # Enseignant associé au module: ne peut supprimer que les notes qu'il a saisi
notes_db = sco_evaluation_db.do_evaluation_get_all_notes( notes_db = sco_evaluation_db.do_evaluation_get_all_notes(
@ -449,7 +449,7 @@ def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False):
status_url = url_for( status_url = url_for(
"notes.moduleimpl_status", "notes.moduleimpl_status",
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
moduleimpl_id=E["moduleimpl_id"], moduleimpl_id=evaluation.moduleimpl_id,
) )
if not dialog_confirmed: if not dialog_confirmed:
@ -495,13 +495,12 @@ def evaluation_suppress_alln(evaluation_id, dialog_confirmed=False):
""" """
] ]
# news # news
modimpl = ModuleImpl.query.get(E["moduleimpl_id"])
ScolarNews.add( ScolarNews.add(
typ=ScolarNews.NEWS_NOTE, typ=ScolarNews.NEWS_NOTE,
obj=modimpl.id, obj=evaluation.moduleimpl.id,
text=f"""Suppression des notes d'une évaluation dans text=f"""Suppression des notes d'une évaluation dans
<a class="stdlink" href="{status_url}" <a class="stdlink" href="{status_url}"
>{modimpl.module.titre or 'module sans titre'}</a> >{evaluation.moduleimpl.module.titre or 'module sans titre'}</a>
""", """,
url=status_url, url=status_url,
) )