############################################################################## # ScoDoc # Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """Jury BUT: affichage/formulaire """ import re import flask from flask import flash, url_for from flask import g, request from app import db from app.but import jury_but from app.but.jury_but import DecisionsProposeesAnnee, DecisionsProposeesUE from app.comp import res_sem from app.comp.res_but import ResultatsSemestreBUT from app.models import ( FormSemestre, FormSemestreInscription, Identite, UniteEns, ScolarAutorisationInscription, ) from app.scodoc import html_sco_header from app.scodoc.sco_exceptions import ScoValueError from app.scodoc import sco_utils as scu def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str: """Affichage des décisions annuelles BUT 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("""
""") if deca.jury_annuel: H.append( f"""
Décision de jury pour l'année : { _gen_but_select("code_annee", deca.codes, deca.code_valide, disabled=True, klass="manual") } ({'non ' if deca.code_valide is None else ''}enregistrée) {erase_span}
{deca.explanation}
""" ) else: H.append("""
Pas de décision annuelle (sem. impair)
""") H.append("""
""") H.append( f"""
Niveaux de compétences et unités d'enseignement :
S{1}
S{2}
RCUE
""" ) for niveau in deca.niveaux_competences: H.append( f"""
{niveau.competence.titre}
""" ) dec_rcue = deca.decisions_rcue_by_niveau.get(niveau.id) if dec_rcue is None: break # Semestre impair H.append( _gen_but_niveau_ue( dec_rcue.rcue.ue_1, deca.decisions_ues[dec_rcue.rcue.ue_1.id], disabled=read_only, ) ) # Semestre pair H.append( _gen_but_niveau_ue( dec_rcue.rcue.ue_2, deca.decisions_ues[dec_rcue.rcue.ue_2.id], disabled=read_only, ) ) # RCUE H.append( f"""
{scu.fmt_note(dec_rcue.rcue.moy_rcue)}
{ _gen_but_select("code_rcue_"+str(niveau.id), dec_rcue.codes, dec_rcue.code_valide, disabled=True, klass="manual" ) }
""" ) H.append("
") # but_annee return "\n".join(H) def _gen_but_select( name: str, codes: list[str], code_valide: str, disabled: bool = False, klass: str = "", ) -> str: "Le menu html select avec les codes" h = "\n".join( [ f"""""" for code in codes ] ) return f""" """ def _gen_but_niveau_ue(ue: UniteEns, dec_ue: DecisionsProposeesUE, disabled=False): if dec_ue.ue_status and dec_ue.ue_status["is_capitalized"]: moy_ue_str = f"""{ scu.fmt_note(dec_ue.moy_ue_with_cap)}""" scoplement = f"""
UE {ue.acronyme} capitalisée le {dec_ue.ue_status["event_date"].strftime("%d/%m/%Y")}
UE en cours avec moyenne {scu.fmt_note(dec_ue.moy_ue)}
""" else: moy_ue_str = f"""{scu.fmt_note(dec_ue.moy_ue)}""" scoplement = "" return f"""
{ue.acronyme}
{moy_ue_str}
{scoplement}
{ _gen_but_select("code_ue_"+str(ue.id), dec_ue.codes, dec_ue.code_valide, disabled=disabled ) }
""" def jury_but_semestriel( formsemestre: FormSemestre, etud: Identite, read_only: bool, navigation_div: str = "", ) -> str: """Formulaire saisie décision d'UE d'un semestre BUT isolé (pas jury annuel)""" res: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre) parcour, ues = jury_but.list_ue_parcour_etud(formsemestre, etud, res) inscription_etat = etud.inscription_etat(formsemestre.id) semestre_terminal = ( formsemestre.semestre_id >= formsemestre.formation.get_parcours().NB_SEM ) est_autorise_a_passer = (formsemestre.semestre_id + 1) in ( a.semestre_id for a in ScolarAutorisationInscription.query.filter_by( etudid=etud.id, origin_formsemestre_id=formsemestre.id, ) ) decisions_ues = { ue.id: DecisionsProposeesUE(etud, formsemestre, ue, inscription_etat) for ue in ues } for dec_ue in decisions_ues.values(): dec_ue.compute_codes() if request.method == "POST": if not read_only: for key in request.form: code = request.form[key] # Codes d'UE m = re.match(r"^code_ue_(\d+)$", key) if m: ue_id = int(m.group(1)) dec_ue = decisions_ues.get(ue_id) if not dec_ue: raise ScoValueError(f"UE invalide ue_id={ue_id}") dec_ue.record(code) db.session.commit() flash("codes enregistrés") if not semestre_terminal: if request.form.get("autorisation_passage"): if not est_autorise_a_passer: ScolarAutorisationInscription.autorise_etud( etud.id, formsemestre.formation.formation_code, formsemestre.id, formsemestre.semestre_id + 1, ) db.session.commit() flash( f"autorisation de passage en S{formsemestre.semestre_id + 1} enregistrée" ) else: if est_autorise_a_passer: ScolarAutorisationInscription.delete_autorisation_etud( etud.id, formsemestre.id ) db.session.commit() flash( f"autorisation de passage en S{formsemestre.semestre_id + 1} annulée" ) return flask.redirect( url_for( "notes.formsemestre_validation_but", scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id, etudid=etud.id, ) ) # GET if formsemestre.semestre_id % 2 == 0: warning = f"""
Cet étudiant de S{formsemestre.semestre_id} ne peut pas passer en jury BUT annuel car il lui manque le semestre précédent.
""" else: warning = "" H = [ html_sco_header.sco_header( page_title="Validation BUT", formsemestre_id=formsemestre.id, etudid=etud.id, cssstyles=("css/jury_but.css",), javascripts=("js/jury_but.js",), ), f"""
Jury BUT S{formsemestre.id} - Parcours {(parcour.libelle if parcour else False) or "non spécifié"}
{etud.nomprenom}

Jury sur un semestre BUT isolé

{warning}
""", ] if (not read_only) and any([dec.code_valide for dec in decisions_ues.values()]): erase_span = f"""effacer décisions""" else: erase_span = "aucune décision enregistrée pour ce semestre" H.append( f"""
{erase_span}
Unités d'enseignement de S{formsemestre.semestre_id}:
""" ) for ue in ues: dec_ue = decisions_ues[ue.id] H.append("""
""") H.append( _gen_but_niveau_ue( ue, dec_ue, disabled=read_only, ) ) H.append( """
""" ) H.append("
") # but_annee if read_only: H.append( """
Vous n'avez pas la permission de modifier ces décisions. Les champs entourés en vert sont enregistrés.
""" ) else: if formsemestre.semestre_id < formsemestre.formation.get_parcours().NB_SEM: H.append( f"""
autoriser à passer dans le semestre S{formsemestre.semestre_id+1}
""" ) else: H.append("""
dernier semestre de la formation.
""") H.append( """
""" ) H.append(navigation_div) return "\n".join(H) # ------------- def infos_fiche_etud_html(etudid: int) -> str: """Section html pour fiche etudiant provisoire pour BUT 2022 """ etud: Identite = Identite.query.get_or_404(etudid) inscriptions = ( FormSemestreInscription.query.join(FormSemestreInscription.formsemestre) .filter( FormSemestreInscription.etudid == etud.id, ) .order_by(FormSemestre.date_debut) ) formsemestres_but = [ i.formsemestre for i in inscriptions if i.formsemestre.formation.is_apc() ] if len(formsemestres_but) == 0: return "" # temporaire quick & dirty: affiche le dernier try: deca = DecisionsProposeesAnnee(etud, formsemestres_but[-1]) if len(deca.rcues_annee) > 0: return f"""
{show_etud(deca, read_only=True)}
""" except ScoValueError: pass return ""