From d4a8b74c0a99b6d79961ea5646219c1d59341471 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 21 Jun 2022 18:33:43 +0200 Subject: [PATCH] WIP: jury BUT: formulaire avec style (merci @sebL) --- app/but/jury_but.py | 2 + app/static/css/jury_but.css | 68 ++++++++++++++++++++++++++++++++++ app/static/js/jury_but.js | 6 +++ app/views/notes.py | 74 +++++++++++++++++++++++++------------ 4 files changed, 126 insertions(+), 24 deletions(-) create mode 100644 app/static/css/jury_but.css create mode 100644 app/static/js/jury_but.js diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 74fd9687c..561ba5433 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -266,6 +266,8 @@ class DecisionsProposeesAnnee(DecisionsProposees): explanation: {self.explanation} """ + def annee_scolaire_sr(self) + def comp_formsemestres( self, formsemestre: FormSemestre ) -> tuple[FormSemestre, FormSemestre]: diff --git a/app/static/css/jury_but.css b/app/static/css/jury_but.css new file mode 100644 index 000000000..beffba975 --- /dev/null +++ b/app/static/css/jury_but.css @@ -0,0 +1,68 @@ +/* Saisie décision de jury BUT */ + +.jury_but { + font-family: Verdana, Geneva, Tahoma, sans-serif; +} + +.but_annee { + display: inline-grid; + grid-template-columns: repeat(4, auto); + gap: 4px; +} + +.but_annee_caption { + grid-column: 4 / 5; +} + +.but_annee_caption, +.but_niveau_titre { + background: #09c !important; + color: #FFF; + padding: 8px !important; +} + +.but_annee>* { + display: flex; + align-items: center; + padding: 0px 16px; + background: #FFF; + border: 1px solid #aaa; + border-radius: 8px; +} + +.but_annee>div.titre { + background: rgb(242, 242, 238); + border: none; + border-radius: 0px; + border-bottom: 1px solid gray; +} + +.but_niveau_ue>div:nth-child(1), +.but_note { + border-right: 1px solid #aaa; + padding: 8px; +} + +.but_annee select { + padding: 8px 8px; + border: none; +} + +.but_niveau_rcue, +.but_niveau_rcue>* { + border-color: #09c; + font-weight: bold; +} + +div.but_section_annee { + margin-bottom: 10px; +} + +div.but_settings { + margin-top: 16px; +} + +span.but_explanation { + color: blueviolet; + font-style: italic; +} \ No newline at end of file diff --git a/app/static/js/jury_but.js b/app/static/js/jury_but.js new file mode 100644 index 000000000..a2f13dd18 --- /dev/null +++ b/app/static/js/jury_but.js @@ -0,0 +1,6 @@ + + +// active les menus des codes "manuels" (année, RCUEs) +function enable_manual_codes(elt) { + $(".jury_but select.manual").prop("disabled", !elt.checked); +} diff --git a/app/views/notes.py b/app/views/notes.py index 99cd224e6..020d1cca4 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -2234,10 +2234,13 @@ def formsemestre_validation_but(formsemestre_id: int, etudid: int): # XXX TODO Page expérimentale pour les devs H = [ html_sco_header.sco_header( - page_title="Validation BUT", formsemestre_id=formsemestre_id, etudid=etudid + page_title="Validation BUT", + formsemestre_id=formsemestre_id, + etudid=etudid, + cssstyles=("css/jury_but.css",), + javascripts=("js/jury_but.js",), ), f""" -

Jury BUT

""", ] @@ -2248,21 +2251,30 @@ def formsemestre_validation_but(formsemestre_id: int, etudid: int): H.append( f""" -
Parcours: {deca.parcour.libelle or "non spécifié"} - en BUT{deca.annee_but} +
+

Jury BUT{deca.annee_but} - Parcours {deca.parcour.libelle or "non spécifié"} + - {deca.formsemestre_impair.annee_scolaire_str()}

-

Année: {deca.explanation}
{ - _gen_but_select("code_annee", deca.codes, deca.code_valide) - }

-

Niveaux de compétences

+
+
+ Décision de jury pour l'année : { + _gen_but_select("code_annee", deca.codes, deca.code_valide, disabled=True, klass="manual") + }
+ {deca.explanation} +
+ 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} +
{niveau.competence.titre}
""" ) dec_rcue = deca.decisions_rcue_by_niveau[niveau.id] @@ -2270,44 +2282,52 @@ def formsemestre_validation_but(formsemestre_id: int, etudid: int): ue = dec_rcue.rcue.ue_1 H.append( f"""
- {ue.acronyme} - {scu.fmt_note(dec_rcue.rcue.moy_ue_1)} - { +
{ue.acronyme}
+
{scu.fmt_note(dec_rcue.rcue.moy_ue_1)}
+
{ _gen_but_select("code_ue_"+str(ue.id), deca.decisions_ues[ue.id].codes, deca.decisions_ues[ue.id].code_valide ) - } + }
""" ) # Semestre pair ue = dec_rcue.rcue.ue_2 H.append( f"""
- {ue.acronyme} - {scu.fmt_note(dec_rcue.rcue.moy_ue_2)} - { +
{ue.acronyme}
+
{scu.fmt_note(dec_rcue.rcue.moy_ue_2)}
+
{ _gen_but_select("code_ue_"+str(ue.id), deca.decisions_ues[ue.id].codes, deca.decisions_ues[ue.id].code_valide ) - } + }
""" ) # RCUE H.append( f"""
- {scu.fmt_note(dec_rcue.rcue.moy_rcue)} - { - _gen_but_select("code_rcue_"+str(niveau.id), +
{scu.fmt_note(dec_rcue.rcue.moy_rcue)}
+
{ + _gen_but_select("code_rcue_"+str(niveau.id), dec_rcue.codes, - dec_rcue.code_valide + dec_rcue.code_valide, + disabled=True, klass="manual" ) - } + }
""" ) H.append("
") # but_annee + H.append( + """
+ permettre la saisie manuelles des codes d'année et de niveaux +
""" + ) + H.append("
") # but_annee + # ---- Toutes les UEs, pour infos H.append(f"
    ") for ue in formsemestre.query_ues(): # volontairement toutes les UE @@ -2318,7 +2338,13 @@ def formsemestre_validation_but(formsemestre_id: int, etudid: int): return "\n".join(H) + html_sco_header.sco_footer() -def _gen_but_select(name: str, codes: list[str], code_valide: str) -> str: +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( [ @@ -2326,7 +2352,7 @@ def _gen_but_select(name: str, codes: list[str], code_valide: str) -> str: for code in codes ] ) - return f"""""" + return f"""""" @bp.route("/formsemestre_validate_previous_ue", methods=["GET", "POST"])