############################################################################## # ScoDoc # Copyright (c) 1999 - 2022 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ Edition associations UE <-> Ref. Compétence """ from flask import g, url_for from app import db, log from app.models import Formation, UniteEns from app.models.but_refcomp import ApcNiveau from app.scodoc import sco_codes_parcours def form_ue_choix_niveau(formation: Formation, ue: UniteEns) -> str: """Form. HTML pour associer une UE à un niveau de compétence""" if ue.type != sco_codes_parcours.UE_STANDARD: return "" ref_comp = ue.formation.referentiel_competence if ref_comp is None: return f"""<div class="ue_choix_niveau"> <div class="warning">Pas de référentiel de compétence associé à cette formation !</div> <div><a class="stdlink" href="{ url_for('notes.refcomp_assoc_formation', scodoc_dept=g.scodoc_dept, formation_id=ue.formation.id) }">associer un référentiel de compétence</a> </div> </div>""" annee = (ue.semestre_idx + 1) // 2 # 1, 2, 3 niveaux_by_parcours = ref_comp.get_niveaux_by_parcours(annee) # Les niveaux déjà associés à d'autres UE du même semestre autres_ues = formation.ues.filter_by(semestre_idx=ue.semestre_idx) niveaux_autres_ues = { oue.niveau_competence_id for oue in autres_ues if oue.id != ue.id } options = [] if niveaux_by_parcours["TC"]: # TC pour Tronc Commun options.append("""<optgroup label="Tronc commun">""") for n in niveaux_by_parcours["TC"]: if n.id in niveaux_autres_ues: disabled = "disabled" else: disabled = "" options.append( f"""<option value="{n.id}" {'selected' if ue.niveau_competence == n else ''} {disabled}>{n.annee} {n.competence.titre_long} niveau {n.ordre}</option>""" ) options.append("""</optgroup>""") for parcour in ref_comp.parcours: if len(niveaux_by_parcours[parcour.id]): options.append(f"""<optgroup label="Parcours {parcour.libelle}">""") for n in niveaux_by_parcours[parcour.id]: if n.id in niveaux_autres_ues: disabled = "disabled" else: disabled = "" options.append( f"""<option value="{n.id}" {'selected' if ue.niveau_competence == n else ''} {disabled}>{n.annee} {n.competence.titre_long} niveau {n.ordre}</option>""" ) options.append("""</optgroup>""") options_str = "\n".join(options) return f""" <div class="ue_choix_niveau"> <form class="form_ue_choix_niveau"> <b>Niveau de compétence associé:</b> <select onchange="set_ue_niveau_competence(this);" data-ue_id="{ue.id}" data-setter="{ url_for( "notes.set_ue_niveau_competence", scodoc_dept=g.scodoc_dept) }"> <option value="" {'selected' if ue.niveau_competence is None else ''}>aucun</option> {options_str} </select> </form> </div> """ def set_ue_niveau_competence(ue_id: int, niveau_id: int): """Associe le niveau et l'UE""" ue = UniteEns.query.get_or_404(ue_id) autres_ues = ue.formation.ues.filter_by(semestre_idx=ue.semestre_idx) niveaux_autres_ues = { oue.niveau_competence_id for oue in autres_ues if oue.id != ue.id } if niveau_id in niveaux_autres_ues: log( f"set_ue_niveau_competence: denying association of {ue} to already associated {niveau_id}" ) return "", 409 # conflict if niveau_id == "": niveau = "" # suppression de l'association ue.niveau_competence = None else: niveau = ApcNiveau.query.get_or_404(niveau_id) ue.niveau_competence = niveau db.session.add(ue) db.session.commit() log(f"set_ue_niveau_competence( {ue}, {niveau} )") return "", 204