Jury BUT: Messages d'erreur si pas de ref. comp.
This commit is contained in:
parent
c9bdac4853
commit
b306584356
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user