From ebd71a32994ee3b9dd3ab3ff975df75785c8cdee Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 24 Aug 2024 14:39:19 +0200 Subject: [PATCH] Templatification des vues (WIP) --- app/scodoc/sco_placement.py | 18 ++-- app/scodoc/sco_report.py | 64 ++++++------ app/scodoc/sco_report_but.py | 11 +-- app/scodoc/sco_semset.py | 33 +++---- app/scodoc/sco_trombino.py | 99 ++++++++++--------- app/static/css/scodoc.css | 4 +- app/static/js/trombino.js | 10 -- app/templates/auth/toogle_active_user.j2 | 2 +- app/templates/scodoc/forms/placement.j2 | 9 ++ app/templates/scolar/photos_import_files.j2 | 2 +- app/views/absences.py | 78 +++++++-------- app/views/assiduites.py | 26 +++-- app/views/jury_validations.py | 45 +++++---- app/views/notes.py | 41 ++++---- app/views/users.py | 102 ++++---------------- 15 files changed, 237 insertions(+), 307 deletions(-) delete mode 100644 app/static/js/trombino.js diff --git a/app/scodoc/sco_placement.py b/app/scodoc/sco_placement.py index c019bf1d..1b51ced2 100644 --- a/app/scodoc/sco_placement.py +++ b/app/scodoc/sco_placement.py @@ -51,7 +51,7 @@ from wtforms import ( from app.models import Evaluation, ModuleImpl import app.scodoc.sco_utils as scu import app.scodoc.notesdb as ndb -from app.scodoc import html_sco_header, sco_preferences +from app.scodoc import sco_preferences from app.scodoc import sco_edit_module from app.scodoc import sco_evaluations from app.scodoc import sco_excel @@ -204,14 +204,14 @@ def placement_eval_selectetuds(evaluation_id): % runner.__dict__ ) return runner.exec_placement() # calcul et generation du fichier - htmls = [ - html_sco_header.sco_header(), - sco_evaluations.evaluation_describe(evaluation_id=evaluation_id), - "

Placement et émargement des étudiants

", - render_template("scodoc/forms/placement.j2", form=form), - ] - footer = html_sco_header.sco_footer() - return "\n".join(htmls) + "

" + footer + + return render_template( + "scodoc/forms/placement.j2", + evaluations_description=sco_evaluations.evaluation_describe( + evaluation_id=evaluation_id + ), + form=form, + ) class PlacementRunner: diff --git a/app/scodoc/sco_report.py b/app/scodoc/sco_report.py index 2f316bd6..0984c8c3 100644 --- a/app/scodoc/sco_report.py +++ b/app/scodoc/sco_report.py @@ -37,7 +37,7 @@ import time import datetime from operator import itemgetter -from flask import url_for, g, request +from flask import url_for, g, render_template, request import pydot from app import log @@ -50,7 +50,6 @@ from app.models.etudiants import Identite from app.scodoc import ( codes_cursus, - html_sco_header, sco_etud, sco_formsemestre, sco_formsemestre_inscriptions, @@ -411,11 +410,6 @@ def formsemestre_report_counts( if fmt != "html": return tableau H = [ - html_sco_header.sco_header( - cssstyles=sco_groups_view.CSSSTYLES, - javascripts=sco_groups_view.JAVASCRIPTS, - page_title=title, - ), tableau, "\n".join(F), """

Le tableau affiche le nombre d'étudiants de ce semestre dans chacun @@ -423,9 +417,14 @@ def formsemestre_report_counts( pour les lignes et les colonnes. Le codedecision est le code de la décision du jury.

""", - html_sco_header.sco_footer(), ] - return "\n".join(H) + return render_template( + "sco_page.j2", + cssstyles=sco_groups_view.CSSSTYLES, + javascripts=sco_groups_view.JAVASCRIPTS, + title=title, + content="\n".join(H), + ) # -------------------------------------------------------------------------- @@ -813,11 +812,6 @@ def formsemestre_suivi_cohorte( href="{burl}&percent=1">Afficher les résultats en pourcentages

""" H = [ - html_sco_header.sco_header( - cssstyles=sco_groups_view.CSSSTYLES, - javascripts=sco_groups_view.JAVASCRIPTS, - page_title=tab.page_title, - ), """

Suivi cohorte: devenir des étudiants de ce semestre

""", _gen_form_selectetuds( formsemestre.id, @@ -853,9 +847,14 @@ def formsemestre_suivi_cohorte(

""", expl, - html_sco_header.sco_footer(), ] - return "\n".join(H) + return render_template( + "sco_page.j2", + cssstyles=sco_groups_view.CSSSTYLES, + javascripts=sco_groups_view.JAVASCRIPTS, + title=tab.page_title, + content="\n".join(H), + ) def _gen_form_selectetuds( @@ -1365,15 +1364,11 @@ def formsemestre_suivi_cursus( ] H = [ - html_sco_header.sco_header( - page_title=tab.page_title, - ), """

Cursus suivis par les étudiants de ce semestre

""", "\n".join(F), t, - html_sco_header.sco_footer(), ] - return "\n".join(H) + return render_template("sco_page.j2", title=tab.page_title, content="\n".join(H)) # ------------- @@ -1742,12 +1737,6 @@ def formsemestre_graph_cursus( ) H = [ - html_sco_header.sco_header( - cssstyles=sco_groups_view.CSSSTYLES, - javascripts=sco_groups_view.JAVASCRIPTS, - page_title="Graphe cursus de %(titreannee)s" % sem, - no_sidebar=True, - ), """

Cursus des étudiants de ce semestre

""", doc, f"

{len(etuds)} étudiants sélectionnés

", @@ -1771,11 +1760,12 @@ def formsemestre_graph_cursus( ), """

Origine et devenir des étudiants inscrits dans %(titreannee)s""" % sem, - """(version pdf""" - % url_for("notes.formsemestre_graph_cursus", fmt="pdf", **url_kw), - """, image PNG)""" - % url_for("notes.formsemestre_graph_cursus", fmt="png", **url_kw), - f""" + f"""(version pdf, + image PNG) +

Le graphe permet de suivre les étudiants inscrits dans le semestre sélectionné (dessiné en vert). Chaque rectangle représente un semestre (cliquez dedans @@ -1788,8 +1778,14 @@ def formsemestre_graph_cursus( étudiants appartenant aux groupes indiqués dans le semestre d'origine.

""", - html_sco_header.sco_footer(), ] - return "\n".join(H) + return render_template( + "sco_page.j2", + cssstyles=sco_groups_view.CSSSTYLES, + javascripts=sco_groups_view.JAVASCRIPTS, + page_title=f"Graphe cursus de {sem['titreannee']}", + no_sidebar=True, + content="\n".join(H), + ) else: raise ValueError(f"invalid format: {fmt}") diff --git a/app/scodoc/sco_report_but.py b/app/scodoc/sco_report_but.py index 56ffe6d3..8a685a11 100644 --- a/app/scodoc/sco_report_but.py +++ b/app/scodoc/sco_report_but.py @@ -31,21 +31,18 @@ from collections import defaultdict -from flask import request +from flask import render_template, request from app import db from app.but import jury_but from app.models import FormSemestre from app.models.formsemestre import FormSemestreInscription - import app.scodoc.sco_utils as scu -from app.scodoc import html_sco_header from app.scodoc import codes_cursus from app.scodoc.sco_exceptions import ScoValueError - from app.scodoc import sco_preferences -import sco_version from app.scodoc.gen_tables import GenTable +import sco_version # Titres, ordonnés @@ -107,13 +104,11 @@ def formsemestre_but_indicateurs(formsemestre_id: int, fmt="html"): if fmt != "html": return t H = [ - html_sco_header.sco_header(page_title=title), t, """

""", - html_sco_header.sco_footer(), ] - return "\n".join(H) + return render_template("sco_page.j2", title=title, content="\n".join(H)) def but_indicateurs_by_bac(formsemestre: FormSemestre) -> dict[str:dict]: diff --git a/app/scodoc/sco_semset.py b/app/scodoc/sco_semset.py index 2eb4c4b3..a1d6cb26 100644 --- a/app/scodoc/sco_semset.py +++ b/app/scodoc/sco_semset.py @@ -40,17 +40,15 @@ sem_set_list() """ import flask -from flask import g, url_for +from flask import g, render_template, url_for from app import db, log from app.comp import res_sem from app.comp.res_compat import NotesTableCompat from app.models import FormSemestre -from app.scodoc import html_sco_header from app.scodoc import sco_etape_apogee from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre_status -from app.scodoc import sco_portal_apogee from app.scodoc import sco_preferences from app.scodoc.gen_tables import GenTable from app.scodoc.sco_etape_bilan import EtapeBilan @@ -412,7 +410,7 @@ def do_semset_delete(semset_id, dialog_confirmed=False): s = SemSet(semset_id=semset_id) if not dialog_confirmed: return scu.confirm_dialog( - "

Suppression de l'ensemble %(title)s ?

" % s, + f"

Suppression de l'ensemble {s['title']} ?

", dest_url="", parameters={"semset_id": semset_id}, cancel_url="semset_page", @@ -421,14 +419,14 @@ def do_semset_delete(semset_id, dialog_confirmed=False): return flask.redirect("semset_page") -def edit_semset_set_title(id=None, value=None): +def edit_semset_set_title(oid=None, value=None): """Change title of semset""" title = value.strip() - if not id: + if not oid: raise ScoValueError("empty semset_id") - SemSet(semset_id=id) + SemSet(semset_id=oid) cnx = ndb.GetDBConnexion() - semset_edit(cnx, {"semset_id": id, "title": title}) + semset_edit(cnx, {"semset_id": oid, "title": title}) return title @@ -517,22 +515,18 @@ def semset_page(fmt="html"): page_title = "Ensembles de semestres" H = [ - html_sco_header.sco_header( - page_title=page_title, - javascripts=["libjs/jinplace-1.2.1.min.js"], - ), """""", - "

%s

" % page_title, + f"

{page_title}

", ] H.append(tab.html()) annee_courante = int(scu.annee_scolaire()) menu_annee = "\n".join( [ - '' % (i, i) + f"""""" for i in range(2014, annee_courante + 1) ] ) @@ -561,8 +555,8 @@ def semset_page(fmt="html"): H.append( """ -
-

Autres opérations:

+
+
Autres opérations :
-
+
{{ wtf.quick_form(form, button_map={'submit':'secondary'}) }}
diff --git a/app/templates/scodoc/forms/placement.j2 b/app/templates/scodoc/forms/placement.j2 index 7cb5b482..ecfe3664 100644 --- a/app/templates/scodoc/forms/placement.j2 +++ b/app/templates/scodoc/forms/placement.j2 @@ -1,3 +1,5 @@ +{% extends 'sco_page.j2' %} + {% import 'wtf.j2' as wtf %} {% macro render_field(field) %} @@ -15,6 +17,12 @@ {% endmacro %} +{% block app_content %} + +{{ evaluations_description|safe}} + +

Placement et émargement des étudiants

+
{{ form.evaluation_id }} @@ -78,3 +86,4 @@
+{% endblock %} \ No newline at end of file diff --git a/app/templates/scolar/photos_import_files.j2 b/app/templates/scolar/photos_import_files.j2 index 2961d7d7..b139782f 100644 --- a/app/templates/scolar/photos_import_files.j2 +++ b/app/templates/scolar/photos_import_files.j2 @@ -1,5 +1,5 @@ {# -*- mode: jinja-html -*- #} -{% extends 'base.j2' %} +{% extends 'sco_page.j2' %} {% block app_content %} diff --git a/app/views/absences.py b/app/views/absences.py index d3f26ebb..e539a073 100644 --- a/app/views/absences.py +++ b/app/views/absences.py @@ -24,7 +24,8 @@ ############################################################################## """ -Module absences: remplacé par assiduité en août 2023, reste ici seulement la gestion des "billets" +Module absences: remplacé par assiduité en août 2023, +reste ici seulement la gestion des "billets" """ @@ -32,8 +33,7 @@ import dateutil import dateutil.parser import flask -from flask import g, request -from flask import abort, flash, url_for +from flask import abort, flash, g, render_template, request, url_for from flask_login import current_user from app import db, log @@ -54,11 +54,8 @@ from app.scodoc import sco_utils as scu from app.scodoc.sco_permissions import Permission from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.TrivialFormulator import TrivialFormulator -from app.scodoc import html_sco_header -from app.scodoc import sco_cal from app.scodoc import sco_assiduites as scass from app.scodoc import sco_abs_billets -from app.scodoc import sco_etud from app.scodoc import sco_preferences @@ -77,11 +74,7 @@ from app.scodoc import sco_preferences def index_html(): """Gestionnaire absences, page principale""" - H = [ - html_sco_header.sco_header( - page_title="Billets d'absences", - ), - ] + H = [] if current_user.has_permission( Permission.AbsChange ) and sco_preferences.get_preference("handle_billets_abs"): @@ -93,8 +86,9 @@ def index_html(): """ ) - H.append(html_sco_header.sco_footer()) - return "\n".join(H) + return render_template( + "sco_page_dept.j2", title="Billets d'absences", content="\n".join(H) + ) # ----- Gestion des "billets d'absence": signalement par les etudiants eux mêmes (à travers le portail) @@ -158,12 +152,8 @@ def add_billets_absence_form(etudid): """Formulaire ajout billet (pour tests seulement, le vrai formulaire accessible aux etudiants étant sur le portail étudiant). """ - etud = sco_etud.get_etud_info(filled=True, etudid=etudid)[0] - H = [ - html_sco_header.sco_header( - page_title="Billet d'absence de %s" % etud["nomprenom"] - ) - ] + _ = Identite.get_etud(etudid) # check + H = ["""

Formulaire ajout billet (pour tests)

"""] tf = TrivialFormulator( request.base_url, scu.get_request_args(), @@ -179,7 +169,11 @@ def add_billets_absence_form(etudid): ), ) if tf[0] == 0: - return "\n".join(H) + tf[1] + html_sco_header.sco_footer() + return render_template( + "sco_page_dept.j2", + title="""Billet d'absence de {etud["nomprenom"]}""", + content="\n".join(H) + tf[1], + ) elif tf[0] == -1: return flask.redirect(url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)) else: @@ -242,11 +236,8 @@ def list_billets(): et formulaire recherche d'un billet. """ table = sco_abs_billets.table_billets_etud(etat=False) - T = table.html() + table_html = table.html() H = [ - html_sco_header.sco_header( - page_title="Billet d'absence non traités", - ), f"

Billets d'absence en attente de traitement ({table.get_nb_rows()})

", ] @@ -257,15 +248,18 @@ def list_billets(): submitbutton=False, ) if tf[0] == 0: - return "\n".join(H) + tf[1] + T + html_sco_header.sco_footer() - else: - return flask.redirect( - url_for( - "absences.process_billet_absence_form", - billet_id=tf[2]["billet_id"], - scodoc_dept=g.scodoc_dept, - ) + return render_template( + "sco_page.j2", + title="Billet d'absence non traités", + content="\n".join(H) + tf[1] + table_html, ) + return flask.redirect( + url_for( + "absences.process_billet_absence_form", + billet_id=tf[2]["billet_id"], + scodoc_dept=g.scodoc_dept, + ) + ) @bp.route("/delete_billets_absence", methods=["POST", "GET"]) @@ -337,7 +331,8 @@ def _ProcessBilletAbsence( def process_billet_absence_form(billet_id: int): """Formulaire traitement d'un billet""" if not isinstance(billet_id, int): - raise abort(404, "billet_id invalide") + abort(404, "billet_id invalide") + return # safety guard billet: BilletAbsence = ( BilletAbsence.query.filter_by(id=billet_id) .join(Identite) @@ -352,9 +347,6 @@ def process_billet_absence_form(billet_id: int): etud = billet.etudiant H = [ - html_sco_header.sco_header( - page_title=f"Traitement billet d'absence de {etud.nomprenom}", - ), f"""

Traitement du billet {billet.id} : {etud.nomprenom}

@@ -403,7 +395,11 @@ def process_billet_absence_form(billet_id: int):

""" - return "\n".join(H) + "
" + tf[1] + F + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title=f"Traitement billet d'absence de {etud.nomprenom}", + content="\n".join(H) + "
" + tf[1] + F, + ) elif tf[0] == -1: return flask.redirect(url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)) else: @@ -414,7 +410,7 @@ def process_billet_absence_form(billet_id: int): j = "non justifiées" H.append('
') if n > 0: - H.append("%d absences (1/2 journées) %s ajoutées" % (n, j)) + H.append(f"{n} absences (1/2 journées) {j} ajoutées") elif n == 0: H.append("Aucun jour d'absence dans les dates indiquées !") elif n < 0: @@ -434,4 +430,8 @@ def process_billet_absence_form(billet_id: int): ) tab = sco_abs_billets.table_billets(billets, etud=etud) H.append(tab.html()) - return "\n".join(H) + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title=f"Traitement billet d'absence de {etud.nomprenom}", + content="\n".join(H), + ) diff --git a/app/views/assiduites.py b/app/views/assiduites.py index 49b861a8..43c4ddf8 100644 --- a/app/views/assiduites.py +++ b/app/views/assiduites.py @@ -1073,10 +1073,10 @@ def signal_assiduites_group(): select_all_when_unspecified=True, ) if not groups_infos.members: - return ( - html_sco_header.sco_header(page_title="Saisie de l'assiduité") - + "

Aucun étudiant !

" - + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title="Saisie de l'assiduité", + content="

Aucun étudiant !

", ) # --- Filtrage par formsemestre --- @@ -1952,10 +1952,10 @@ def signal_assiduites_hebdo(): group_ids, formsemestre_id=formsemestre.id, select_all_when_unspecified=True ) if not groups_infos.members: - return ( - html_sco_header.sco_header(page_title="Assiduité: saisie hebdomadaire") - + "

Aucun étudiant !

" - + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title="Assiduité: feuille saisie hebdomadaire", + content="

Aucun étudiant !

", ) # Récupération des étudiants @@ -2305,12 +2305,10 @@ def feuille_abs_hebdo(): group_ids, formsemestre_id=formsemestre.id, select_all_when_unspecified=True ) if not groups_infos.members: - return ( - html_sco_header.sco_header( - page_title="Assiduité: feuille saisie hebdomadaire" - ) - + "

Aucun étudiant !

" - + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title="Assiduité: feuille saisie hebdomadaire", + content="

Aucun étudiant !

", ) # Gestion des jours diff --git a/app/views/jury_validations.py b/app/views/jury_validations.py index d266040a..656c4e8b 100644 --- a/app/views/jury_validations.py +++ b/app/views/jury_validations.py @@ -60,7 +60,6 @@ from app.models import ( ScoDocSiteConfig, ) from app.scodoc import ( - html_sco_header, sco_bulletins_json, sco_cache, sco_formsemestre_exterieurs, @@ -251,27 +250,23 @@ def formsemestre_validation_but(
""" - H = [ - html_sco_header.sco_header( - page_title=f"Validation BUT S{formsemestre.semestre_id}", - formsemestre_id=formsemestre_id, - etudid=etudid, + H = ["""
"""] + inscription = formsemestre.etuds_inscriptions.get(etudid) + if not inscription: + raise ScoValueError("étudiant non inscrit au semestre") + if inscription.etat != scu.INSCRIT: + return render_template( + "sco_page.j2", + title=f"Validation BUT S{formsemestre.semestre_id}", + sco=ScoData(etud=etud, formsemestre=formsemestre), cssstyles=[ "css/jury_but.css", "css/cursus_but.css", ], javascripts=("js/jury_but.js",), - ), - """
- """, - ] - inscription = formsemestre.etuds_inscriptions.get(etudid) - if not inscription: - raise ScoValueError("étudiant non inscrit au semestre") - if inscription.etat != scu.INSCRIT: - return ( - "\n".join(H) - + f""" + content=( + "\n".join(H) + + f"""
@@ -291,7 +286,7 @@ def formsemestre_validation_but( {navigation_div}
""" - + html_sco_header.sco_footer() + ), ) deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) @@ -341,7 +336,7 @@ def formsemestre_validation_but( êtes-vous certain de vouloir enregistrer une décision de jury ?
""" if read_only: - warning += f"""
Affichage en lecture seule
""" + warning += """
Affichage en lecture seule
""" if deca.formsemestre_impair: inscription = deca.formsemestre_impair.etuds_inscriptions.get(etud.id) @@ -507,7 +502,17 @@ def formsemestre_validation_but(
""" ) - return "\n".join(H) + html_sco_header.sco_footer() + return render_template( + "sco_page.j2", + title=f"Validation BUT S{formsemestre.semestre_id}", + sco=ScoData(etud=etud, formsemestre=formsemestre), + cssstyles=[ + "css/jury_but.css", + "css/cursus_but.css", + ], + javascripts=("js/jury_but.js",), + content="\n".join(H), + ) @bp.route( diff --git a/app/views/notes.py b/app/views/notes.py index e3fbdf4f..3ed64a43 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -88,7 +88,6 @@ from app.scodoc.sco_exceptions import ( ScoInvalidIdType, ) from app.scodoc import ( - html_sco_header, sco_apogee_compare, sco_archives_formsemestre, sco_assiduites, @@ -770,8 +769,10 @@ def formation_import_xml_form(): cancelbutton="Annuler", ) if tf[0] == 0: - return f""" - { html_sco_header.sco_header(page_title="Import d'une formation") } + return render_template( + "sco_page_dept.j2", + title="Import d'une formation", + content=f"""

Import d'une formation

Création d'une formation (avec UE, matières, modules) à partir un fichier XML (réservé aux utilisateurs avertis). @@ -783,8 +784,8 @@ def formation_import_xml_form(): }">page des référentiels).

{ tf[1] } - { html_sco_header.sco_footer() } - """ + """, + ) elif tf[0] == -1: return flask.redirect(url_for("notes.index_html", scodoc_dept=g.scodoc_dept)) else: @@ -792,8 +793,10 @@ def formation_import_xml_form(): tf[2]["xmlfile"].read() ) - return f""" - { html_sco_header.sco_header(page_title="Import d'une formation") } + return render_template( + "sco_page_dept.j2", + title="Import d'une formation", + content=f"""

Import effectué !

  • {nb_sent} bulletins sur {len(inscriptions)} envoyés par mail !

    continuer

    - {html_sco_header.sco_footer()} - """ + """, + ) sco_publish( @@ -2258,10 +2263,8 @@ def appreciation_add_form( else: action = "Ajout" H = [ - html_sco_header.sco_header(), f"""

    {action} d'une appréciation sur {etud.nomprenom}

    """, ] - F = html_sco_header.sco_footer() descr = [ ("edit", {"input_type": "hidden", "default": edit}), ("etudid", {"input_type": "hidden"}), @@ -2286,7 +2289,7 @@ def appreciation_add_form( submitlabel="Ajouter appréciation", ) if tf[0] == 0: - return "\n".join(H) + "\n" + tf[1] + F + return render_template("sco_page.j2", content="\n".join(H) + "\n" + tf[1]) elif tf[0] == -1: return flask.redirect(bul_url) else: @@ -2643,7 +2646,7 @@ def check_form_integrity(formation_id, fix=False): else: txth = "OK" log("ok") - return html_sco_header.sco_header() + txth + html_sco_header.sco_footer() + return render_template("sco_page.j2", content=txth) @bp.route("/check_formsemestre_integrity") @@ -2681,6 +2684,4 @@ def check_formsemestre_integrity(formsemestre_id): else: diag = ["OK"] log("ok") - return ( - html_sco_header.sco_header() + "
    ".join(diag) + html_sco_header.sco_footer() - ) + return render_template("sco_page.j2", content="
    ".join(diag)) diff --git a/app/views/users.py b/app/views/users.py index 0ed67057..a2825265 100644 --- a/app/views/users.py +++ b/app/views/users.py @@ -64,7 +64,7 @@ from app.decorators import ( permission_required, ) -from app.scodoc import html_sco_header, sco_import_users, sco_roles_default +from app.scodoc import sco_import_users, sco_roles_default from app.scodoc import sco_users from app.scodoc import sco_utils as scu from app.scodoc import sco_xml @@ -74,7 +74,6 @@ from app.scodoc.sco_import_users import generate_password from app.scodoc.sco_permissions_check import can_handle_passwd from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message from app.views import users_bp as bp -from app.views import scodoc_bp _ = lambda x: x # sans babel @@ -92,7 +91,7 @@ class ChangePasswordForm(FlaskForm): validators=[ EqualTo( "new_password", - message="Les deux saisies sont " "différentes, recommencez", + message="Les deux saisies sont différentes, recommencez", ), ], ) @@ -106,9 +105,9 @@ class ChangePasswordForm(FlaskForm): submit = SubmitField() cancel = SubmitField("Annuler") - def validate_email(self, email): - "vérifie que le mail est unique" - user = User.query.filter_by(email=email.data.strip()).first() + def validate_email(self, e_mail): + "vérifie que le mail est unique (inline wtf validator)" + user = User.query.filter_by(email=e_mail.data.strip()).first() if user is not None and self.user_name.data != user.user_name: raise ValidationError( _("Cette adresse e-mail est déjà attribuée à un autre compte") @@ -120,6 +119,7 @@ class ChangePasswordForm(FlaskForm): raise ValidationError("Mot de passe trop simple, recommencez") def validate_old_password(self, old_password): + "vérifie password actuel" if not current_user.check_password(old_password.data): raise ValidationError("Mot de passe actuel incorrect, ré-essayez") @@ -855,9 +855,7 @@ def import_users_generate_excel_sample(): @scodoc7func def import_users_form(): """Import utilisateurs depuis feuille Excel""" - head = html_sco_header.sco_header(page_title="Import utilisateurs") H = [ - head, """

    Téléchargement d'une liste d'utilisateurs

    A utiliser pour importer de nouveaux utilisateurs (enseignants ou secrétaires) @@ -886,12 +884,10 @@ def import_users_form():

  • Étape 1: Obtenir la feuille excel vide à remplir - ou bien la liste complète des utilisateurs.
  • Étape 2: """ ) - F = html_sco_header.sco_footer() tf = TrivialFormulator( request.base_url, scu.get_request_args(), @@ -915,7 +911,11 @@ def import_users_form(): submitlabel="Télécharger", ) if tf[0] == 0: - return "\n".join(H) + tf[1] + "
" + help_msg + F + return render_template( + "sco_page_dept.j2", + title="Import utilisateurs", + content="\n".join(H) + tf[1] + "" + help_msg, + ) elif tf[0] == -1: return flask.redirect(url_for("scolar.index_html", docodc_dept=g.scodoc_dept)) @@ -923,8 +923,10 @@ def import_users_form(): ok, diags, nb_created = sco_import_users.import_excel_file( tf[2]["xlsfile"], tf[2]["force"] ) - H = [html_sco_header.sco_header(page_title="Import utilisateurs")] - H.append("
    ") + H = [ + """

    Téléchargement d'une liste d'utilisateurs

    +
      """ + ] for diag in diags: H.append(f"
    • {diag}
    • ") H.append("
    ") @@ -942,7 +944,9 @@ def import_users_form():

    Continuer

    """ ) - return "\n".join(H) + html_sco_header.sco_footer() + return render_template( + "sco_page_dept.j2", title="Import utilisateurs", content="\n".join(H) + ) @bp.route("/user_info_page") @@ -1061,76 +1065,6 @@ def form_change_password(user_name=None): ) -@bp.route("/change_password", methods=["POST"]) -@scodoc -@permission_required(Permission.ScoView) -@scodoc7func -def change_password(user_name, password, password2): - "Change the password for user given by user_name" - if user_name is not None: # scodoc7func converti en int ! - user_name = str(user_name) - u = User.query.filter_by(user_name=user_name).first() - # Check access permission - if not can_handle_passwd(u): - # access denied - log( - f"change_password: access denied (authuser={current_user}, user_name={user_name})" - ) - raise AccessDenied("vous n'avez pas la permission de changer ce mot de passe") - H = [] - F = html_sco_header.sco_footer() - # check password - dest_url = url_for( - "users.form_change_password", scodoc_dept=g.scodoc_dept, user_name=user_name - ) - if password != password2: - H.append( - f"""

    Les deux mots de passes saisis sont différents !

    -

    Recommencer

    - """ - ) - else: - if not is_valid_password(password): - H.append( - f"""

    ce mot de passe n'est pas assez compliqué ! -
    (oui, il faut un mot de passe vraiment compliqué !) -

    -

    Recommencer

    - """ - ) - else: - # ok, strong password - db.session.add(u) - u.set_password(password) - db.session.commit() - # - # ici page simplifiee car on peut ne plus avoir - # le droit d'acceder aux feuilles de style - return f""" - - - -Mot de passe changé - - -

    Mot de passe changé !

    -

    Changement effectué

    -

    Ne notez pas ce mot de passe, mais mémorisez le !

    -

    Rappel: il est interdit de communiquer son mot de passe à - un tiers, même si c'est un collègue de confiance !

    -

    Si vous n'êtes pas administrateur, le système va vous redemander - votre login et nouveau mot de passe au prochain accès. -

    - Continuer - - -""" - - return html_sco_header.sco_header() + "\n".join(H) + F - - @bp.route("/toggle_active_user/", methods=["GET", "POST"]) @scodoc @permission_required(Permission.UsersAdmin)