Templatification: remplacement html_sem_header

This commit is contained in:
Emmanuel Viennet 2024-08-16 01:11:06 +02:00
parent 19a8e9650b
commit 47e40a9634
33 changed files with 367 additions and 346 deletions

View File

@ -105,7 +105,7 @@ def pvjury_page_but(formsemestre_id: int, fmt="html"):
}, },
xls_style_base=xls_style_base, xls_style_base=xls_style_base,
) )
return tab.make_page(fmt=fmt, javascripts=["js/etud_info.js"]) return tab.make_page(fmt=fmt)
def pvjury_table_but( def pvjury_table_but(

View File

@ -271,10 +271,10 @@ class ScolarNews(db.Model):
return "" return ""
dept_news_url = url_for("scolar.dept_news", scodoc_dept=g.scodoc_dept) dept_news_url = url_for("scolar.dept_news", scodoc_dept=g.scodoc_dept)
H = [ H = [
f"""<div class="scobox news"><div class="scobox-title"><a href="{ f"""<div class="scobox news"><div class="scobox-title" desktop="true"><a href="{
dept_news_url dept_news_url
}">Dernières opérations</a> }">Dernières opérations</a>
</div><ul class="newslist">""" </div><ul class="newslist" desktop="true">"""
] ]
for news in news_list: for news in news_list:
@ -289,11 +289,18 @@ class ScolarNews(db.Model):
</li>""" </li>"""
) )
H.append("</ul></div>") H.append(
"""</ul>
<ul class="newslist" mobile="true" style="margin-bottom: 0px;">
<li><a href="{dept_news_url}" class="stdlink">Dernières opérations</a></li>
</ul>
</div>
"""
)
# Informations générales # Informations générales
H.append( H.append(
f"""<div> f"""<div desktop="true">
Pour en savoir plus sur ScoDoc voir Pour en savoir plus sur ScoDoc voir
<a class="stdlink" href="{scu.SCO_ANNONCES_WEBSITE}">scodoc.org</a> <a class="stdlink" href="{scu.SCO_ANNONCES_WEBSITE}">scodoc.org</a>
</div> </div>

View File

@ -242,18 +242,3 @@ def sco_footer():
+ scu.CUSTOM_HTML_FOOTER + scu.CUSTOM_HTML_FOOTER
+ """</body></html>""" + """</body></html>"""
) )
def html_sem_header(
title, with_page_header=True, with_h2=True, page_title=None, **args
):
"Titre d'une page semestre avec lien vers tableau de bord"
# sem now unused and thus optional...
if with_page_header:
h = sco_header(page_title="%s" % (page_title or title), **args)
else:
h = ""
if with_h2:
return h + f"""<h2 class="formsemestre">{title}</h2>"""
else:
return h

View File

@ -27,7 +27,7 @@
import json import json
import flask import flask
from flask import flash, g, request, url_for from flask import flash, g, render_template, request, url_for
from app import ScoDocJSONEncoder from app import ScoDocJSONEncoder
from app.but import jury_but_pv from app.but import jury_but_pv
@ -238,11 +238,6 @@ def formsemestre_archive(formsemestre_id, group_ids: list[int] = None):
) )
H = [ H = [
html_sco_header.html_sem_header(
"Archiver les PV et résultats du semestre",
javascripts=sco_groups_view.JAVASCRIPTS,
cssstyles=sco_groups_view.CSSSTYLES,
),
"""<p class="help">Cette page permet de générer et d'archiver tous """<p class="help">Cette page permet de générer et d'archiver tous
les documents résultant de ce semestre: PV de jury, lettres individuelles, les documents résultant de ce semestre: PV de jury, lettres individuelles,
tableaux récapitulatifs.</p><p class="help">Les documents archivés sont tableaux récapitulatifs.</p><p class="help">Les documents archivés sont
@ -311,7 +306,17 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
html_foot_markup=menu_choix_groupe, html_foot_markup=menu_choix_groupe,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + "\n".join(F) return render_template(
"sco_page.j2",
title="Archiver les PV et résultats",
javascripts=sco_groups_view.JAVASCRIPTS,
cssstyles=sco_groups_view.CSSSTYLES,
content="<h2>Archiver les PV et résultats du semestre</h2>"
+ "\n".join(H)
+ "\n"
+ tf[1]
+ "\n".join(F),
)
elif tf[0] == -1: elif tf[0] == -1:
msg = "Opération annulée" msg = "Opération annulée"
else: else:
@ -371,7 +376,7 @@ def formsemestre_list_archives(formsemestre_id):
} }
archives_descr.append(a) archives_descr.append(a)
H = [html_sco_header.html_sem_header("Archive des PV et résultats ")] H = []
if not archives_descr: if not archives_descr:
H.append("<p>aucune archive enregistrée</p>") H.append("<p>aucune archive enregistrée</p>")
else: else:
@ -399,7 +404,9 @@ def formsemestre_list_archives(formsemestre_id):
H.append("</ul></li>") H.append("</ul></li>")
H.append("</ul>") H.append("</ul>")
return "\n".join(H) + html_sco_header.sco_footer() return render_template(
"sco_page.j2", title="Archive des PV et résultats", content="\n".join(H)
)
def formsemestre_get_archived_file(formsemestre_id, archive_name, filename): def formsemestre_get_archived_file(formsemestre_id, archive_name, filename):

View File

@ -76,7 +76,6 @@ def report_debouche_date(start_year=None, fmt="html"):
tab.base_url = f"{request.base_url}?start_year={start_year}" tab.base_url = f"{request.base_url}?start_year={start_year}"
return tab.make_page( return tab.make_page(
title="""<h2 class="formsemestre">Débouchés étudiants </h2>""", title="""<h2 class="formsemestre">Débouchés étudiants </h2>""",
javascripts=["js/etud_info.js"],
fmt=fmt, fmt=fmt,
with_html_headers=True, with_html_headers=True,
) )

View File

@ -597,7 +597,6 @@ def _view_etuds_page(
return f""" return f"""
{html_sco_header.sco_header( {html_sco_header.sco_header(
page_title=title, page_title=title,
javascripts=["js/etud_info.js"],
)} )}
<h2>{title}</h2> <h2>{title}</h2>
@ -750,7 +749,6 @@ def view_apo_csv(etape_apo="", semset_id="", fmt="html"):
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
page_title=f"""Maquette Apogée enregistrée pour {etape_apo}""", page_title=f"""Maquette Apogée enregistrée pour {etape_apo}""",
javascripts=["js/etud_info.js"],
), ),
f"""<h2>Étudiants dans la maquette Apogée {etape_apo}</h2> f"""<h2>Étudiants dans la maquette Apogée {etape_apo}</h2>
<p>Pour l'ensemble <a class="stdlink" href="{ <p>Pour l'ensemble <a class="stdlink" href="{

View File

@ -27,7 +27,7 @@
"""Vérification des absences à une évaluation """Vérification des absences à une évaluation
""" """
from flask import url_for, g from flask import g, render_template, url_for
from flask_sqlalchemy.query import Query from flask_sqlalchemy.query import Query
from app import db from app import db
@ -37,6 +37,7 @@ from app.scodoc import html_sco_header
from app.scodoc import sco_evaluations from app.scodoc import sco_evaluations
from app.scodoc import sco_evaluation_db from app.scodoc import sco_evaluation_db
from app.scodoc import sco_groups from app.scodoc import sco_groups
from app.views import ScoData
def evaluation_check_absences(evaluation: Evaluation): def evaluation_check_absences(evaluation: Evaluation):
@ -109,8 +110,10 @@ def evaluation_check_absences(evaluation: Evaluation):
def evaluation_check_absences_html( def evaluation_check_absences_html(
evaluation: Evaluation, with_header=True, show_ok=True evaluation: Evaluation, with_header=True, show_ok=True
): ) -> str:
"""Affiche état vérification absences d'une évaluation""" """Affiche état vérification absences d'une évaluation.
Si with_header, génère page complète, sinon fragment html.
"""
( (
note_but_abs, # une note alors qu'il était signalé abs note_but_abs, # une note alors qu'il était signalé abs
abs_non_signalee, # note ABS alors que pas signalé abs abs_non_signalee, # note ABS alors que pas signalé abs
@ -121,10 +124,6 @@ def evaluation_check_absences_html(
if with_header: if with_header:
H = [ H = [
html_sco_header.html_sem_header(
"Vérification absences à l'évaluation",
formsemestre_id=evaluation.moduleimpl.formsemestre_id,
),
sco_evaluations.evaluation_describe(evaluation_id=evaluation.id), sco_evaluations.evaluation_describe(evaluation_id=evaluation.id),
"""<p class="help">Vérification de la cohérence entre les notes saisies """<p class="help">Vérification de la cohérence entre les notes saisies
et les absences signalées.</p>""", et les absences signalées.</p>""",
@ -208,19 +207,19 @@ def evaluation_check_absences_html(
etudlist(abs_but_exc) etudlist(abs_but_exc)
if with_header: if with_header:
H.append(html_sco_header.sco_footer()) return render_template(
"sco_page.j2",
title="Vérification absences à l'évaluation",
content="<h2>Vérification absences à l'évaluation</h2>" + "\n".join(H),
sco=ScoData(formsemestre=evaluation.moduleimpl.formsemestre),
)
return "\n".join(H) return "\n".join(H)
def formsemestre_check_absences_html(formsemestre_id): def formsemestre_check_absences_html(formsemestre_id: int):
"""Affiche etat verification absences pour toutes les evaluations du semestre !""" """Affiche état vérification absences pour toutes les évaluations du semestre."""
formsemestre: FormSemestre = FormSemestre.query.filter_by( formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
dept_id=g.scodoc_dept_id, id=formsemestre_id
).first_or_404()
H = [ H = [
html_sco_header.html_sem_header(
"Vérification absences aux évaluations de ce semestre",
),
"""<p class="help">Vérification de la cohérence entre les notes saisies """<p class="help">Vérification de la cohérence entre les notes saisies
et les absences signalées. et les absences signalées.
Sont listés tous les modules avec des évaluations.<br>Aucune action n'est effectuée: Sont listés tous les modules avec des évaluations.<br>Aucune action n'est effectuée:
@ -248,5 +247,9 @@ def formsemestre_check_absences_html(formsemestre_id):
) )
H.append("</div>") H.append("</div>")
H.append(html_sco_header.sco_footer()) return render_template(
return "\n".join(H) "sco_page.j2",
content="<h2>Vérification absences aux évaluations de ce semestre</h2>"
+ "\n".join(H),
title="Vérification absences aux évaluations de ce semestre",
)

View File

@ -10,7 +10,7 @@ avec leur état.
Sur une idée de Pascal Bouron, de Lyon. Sur une idée de Pascal Bouron, de Lyon.
""" """
import time import time
from flask import g, url_for from flask import g, render_template, url_for
from app import db from app import db
from app.models import Evaluation, FormSemestre from app.models import Evaluation, FormSemestre
@ -23,7 +23,7 @@ import app.scodoc.sco_utils as scu
def evaluations_recap(formsemestre_id: int) -> str: def evaluations_recap(formsemestre_id: int) -> str:
"""Page récap. de toutes les évaluations d'un semestre""" """Page récap. de toutes les évaluations d'un semestre"""
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
rows, titles = evaluations_recap_table(formsemestre) rows, titles = evaluations_recap_table(formsemestre)
column_ids = titles.keys() column_ids = titles.keys()
filename = scu.sanitize_filename( filename = scu.sanitize_filename(
@ -32,11 +32,14 @@ def evaluations_recap(formsemestre_id: int) -> str:
if not rows: if not rows:
return '<div class="evaluations_recap"><div class="message">aucune évaluation</div></div>' return '<div class="evaluations_recap"><div class="message">aucune évaluation</div></div>'
H = [ H = [
html_sco_header.sco_header( f"""<h2>Évaluations du semestre</h2>
page_title="Évaluations du semestre", <div>
javascripts=["js/evaluations_recap.js"], <a class="stdlink" href="{url_for(
), 'notes.formsemestre_check_absences_html',
f"""<div class="evaluations_recap"><table class="evaluations_recap compact { scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre.id,
)}">Vérifier les absences aux évaluations</a>
</div>
<div class="evaluations_recap"><table class="evaluations_recap compact {
'apc' if formsemestre.formation.is_apc() else 'classic' 'apc' if formsemestre.formation.is_apc() else 'classic'
}" }"
data-filename="{filename}">""", data-filename="{filename}">""",
@ -56,13 +59,19 @@ def evaluations_recap(formsemestre_id: int) -> str:
H.append( H.append(
"""</tbody></table></div> """</tbody></table></div>
<div class="help">Les étudiants démissionnaires ou défaillants ne sont pas pris en compte dans cette table.</div> <div class="help">Les étudiants démissionnaires ou défaillants ne sont
pas pris en compte dans cette table.</div>
""" """
) )
H.append( H.append(
html_sco_header.sco_footer(), html_sco_header.sco_footer(),
) )
return "".join(H) return render_template(
"sco_page.j2",
title="Évaluations du semestre",
javascripts=["js/evaluations_recap.js"],
content="".join(H),
)
def evaluations_recap_table(formsemestre: FormSemestre) -> list[dict]: def evaluations_recap_table(formsemestre: FormSemestre) -> list[dict]:

View File

@ -31,9 +31,7 @@ import collections
import datetime import datetime
import operator import operator
from flask import url_for from flask import g, render_template, request, url_for
from flask import g
from flask import request
from flask_login import current_user from flask_login import current_user
from app import db from app import db
@ -45,8 +43,6 @@ from app.models import Evaluation, FormSemestre, ModuleImpl, Module
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app.scodoc.sco_utils import ModuleType from app.scodoc.sco_utils import ModuleType
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app.scodoc import html_sco_header
from app.scodoc import sco_cal
from app.scodoc import sco_evaluation_db from app.scodoc import sco_evaluation_db
from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_formsemestre_inscriptions
from app.scodoc import sco_groups from app.scodoc import sco_groups
@ -470,7 +466,7 @@ class CalendrierEval(sco_gen_cal.Calendrier):
# View # View
def formsemestre_evaluations_cal(formsemestre_id): def formsemestre_evaluations_cal(formsemestre_id):
"""Page avec calendrier de toutes les evaluations de ce semestre""" """Page avec calendrier de toutes les évaluations de ce semestre"""
formsemestre = FormSemestre.get_formsemestre(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
@ -481,13 +477,12 @@ def formsemestre_evaluations_cal(formsemestre_id):
cal = CalendrierEval(year, evaluations, nt) cal = CalendrierEval(year, evaluations, nt)
cal_html = cal.get_html() cal_html = cal.get_html()
return f""" return render_template(
{ "sco_page.j2",
html_sco_header.html_sem_header( cssstyles=["css/calabs.css"],
"Evaluations du semestre", title="Évaluations du semestre",
cssstyles=["css/calabs.css"], content=f"""
) <h2>Évaluations du semestre</h2>
}
<div class="cal_evaluations"> <div class="cal_evaluations">
{ cal_html } { cal_html }
</div> </div>
@ -513,8 +508,8 @@ def formsemestre_evaluations_cal(formsemestre_id):
) )
}" class="stdlink">voir les délais de correction</a> }" class="stdlink">voir les délais de correction</a>
</p> </p>
{ html_sco_header.sco_footer() } """,
""" )
def evaluation_date_first_completion(evaluation_id) -> datetime.datetime: def evaluation_date_first_completion(evaluation_id) -> datetime.datetime:
@ -651,7 +646,7 @@ def evaluation_describe(evaluation_id="", edit_in_place=True, link_saisie=True)
"""HTML description of evaluation, for page headers """HTML description of evaluation, for page headers
edit_in_place: allow in-place editing when permitted (not implemented) edit_in_place: allow in-place editing when permitted (not implemented)
""" """
evaluation: Evaluation = Evaluation.query.get_or_404(evaluation_id) evaluation = Evaluation.get_evaluation(evaluation_id)
modimpl = evaluation.moduleimpl modimpl = evaluation.moduleimpl
responsable: User = db.session.get(User, modimpl.responsable_id) responsable: User = db.session.get(User, modimpl.responsable_id)
resp_nomprenom = responsable.get_prenomnom() resp_nomprenom = responsable.get_prenomnom()

View File

@ -73,7 +73,9 @@ def _build_results_table(start_date=None, end_date=None, types_parcours=[]):
formsemestre_ids_parcours = [sem["formsemestre_id"] for sem in semlist_parcours] formsemestre_ids_parcours = [sem["formsemestre_id"] for sem in semlist_parcours]
# Ensemble des étudiants # Ensemble des étudiants
etuds_infos = {} # etudid : { formsemestre_id d'inscription le plus recent dans les dates considérées, etud } etuds_infos = (
{}
) # etudid : { formsemestre_id d'inscription le plus recent dans les dates considérées, etud }
for formsemestre_id in formsemestre_ids_parcours: for formsemestre_id in formsemestre_ids_parcours:
formsemestre = FormSemestre.get_formsemestre(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
@ -285,8 +287,7 @@ def scodoc_table_results(
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
page_title="Export résultats", page_title="Export résultats",
javascripts=html_sco_header.BOOTSTRAP_JS javascripts=html_sco_header.BOOTSTRAP_JS + ["js/export_results.js"],
+ ["js/etud_info.js", "js/export_results.js"],
cssstyles=html_sco_header.BOOTSTRAP_CSS, cssstyles=html_sco_header.BOOTSTRAP_CSS,
), ),
# XXX # XXX

View File

@ -28,7 +28,7 @@
"""Recherche d'étudiants """Recherche d'étudiants
""" """
import flask import flask
from flask import url_for, g, request from flask import url_for, g, render_template, request
from flask_login import current_user from flask_login import current_user
import sqlalchemy as sa import sqlalchemy as sa
@ -177,13 +177,7 @@ def search_etud_in_dept(expnom=""):
url_args["etudid"] = etuds[0].id url_args["etudid"] = etuds[0].id
return flask.redirect(url_for(endpoint, **url_args)) return flask.redirect(url_for(endpoint, **url_args))
H = [ H = []
html_sco_header.sco_header(
page_title="Recherche d'un étudiant",
no_sidebar=False,
javascripts=["js/etud_info.js"],
)
]
if len(etuds) == 0 and len(etuds) <= 1: if len(etuds) == 0 and len(etuds) <= 1:
H.append("""<h2>chercher un étudiant:</h2>""") H.append("""<h2>chercher un étudiant:</h2>""")
else: else:
@ -266,7 +260,9 @@ def search_etud_in_dept(expnom=""):
"""<p class="help">La recherche porte sur tout ou partie du NOM ou du NIP """<p class="help">La recherche porte sur tout ou partie du NOM ou du NIP
de l'étudiant. Saisir au moins deux caractères.</p>""" de l'étudiant. Saisir au moins deux caractères.</p>"""
) )
return "\n".join(H) + html_sco_header.sco_footer() return render_template(
"sco_page_dept.j2", title="Recherche d'un étudiant", content="\n".join(H)
)
def search_etuds_infos(expnom=None, code_nip=None) -> list[dict]: def search_etuds_infos(expnom=None, code_nip=None) -> list[dict]:

View File

@ -28,7 +28,7 @@
"""Menu "custom" (défini par l'utilisateur) dans les semestres """Menu "custom" (défini par l'utilisateur) dans les semestres
""" """
import flask import flask
from flask import g, url_for, request from flask import g, url_for, render_template, request
from flask_login import current_user from flask_login import current_user
from app.models.config import ScoDocSiteConfig, PersonalizedLink from app.models.config import ScoDocSiteConfig, PersonalizedLink
@ -37,9 +37,6 @@ import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
from app.scodoc.TrivialFormulator import TrivialFormulator from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import html_sco_header from app.scodoc import html_sco_header
from app.scodoc import htmlutils
from app.scodoc import sco_formsemestre
from app.scodoc import sco_edt_cal
_custommenuEditor = ndb.EditableTable( _custommenuEditor = ndb.EditableTable(
"notes_formsemestre_custommenu", "notes_formsemestre_custommenu",
@ -106,14 +103,13 @@ def formsemestre_custommenu_html(formsemestre_id):
def formsemestre_custommenu_edit(formsemestre_id): def formsemestre_custommenu_edit(formsemestre_id):
"""Dialog to edit the custom menu""" """Dialog to edit the custom menu"""
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
dest_url = url_for( dest_url = url_for(
"notes.formsemestre_status", "notes.formsemestre_status",
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id, formsemestre_id=formsemestre_id,
) )
H = [ H = [
html_sco_header.html_sem_header("Modification du menu du semestre "),
"""<div class="help"> """<div class="help">
<p>Ce menu, spécifique à chaque semestre, peut être utilisé pour <p>Ce menu, spécifique à chaque semestre, peut être utilisé pour
placer des liens vers vos applications préférées. placer des liens vers vos applications préférées.
@ -164,7 +160,14 @@ def formsemestre_custommenu_edit(formsemestre_id):
name="tf", name="tf",
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
title="Modification du menu du semestre",
content="<h2>Modification du menu du semestre</h2>"
+ "\n".join(H)
+ "\n"
+ tf[1],
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect(dest_url) return flask.redirect(dest_url)
else: else:

View File

@ -28,8 +28,7 @@
"""Form choix modules / responsables et creation formsemestre """Form choix modules / responsables et creation formsemestre
""" """
import flask import flask
from flask import url_for, flash, redirect from flask import flash, g, request, redirect, render_template, url_for
from flask import g, request
from flask_login import current_user from flask_login import current_user
import sqlalchemy as sa import sqlalchemy as sa
@ -97,18 +96,10 @@ def formsemestre_createwithmodules():
return "\n".join(H) + html_sco_header.sco_footer() return "\n".join(H) + html_sco_header.sco_footer()
def formsemestre_editwithmodules(formsemestre_id): def formsemestre_editwithmodules(formsemestre_id: int):
"""Page modification semestre""" """Page modification semestre"""
formsemestre: FormSemestre = FormSemestre.query.filter_by( formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
id=formsemestre_id, dept_id=g.scodoc_dept_id H = []
).first_or_404()
H = [
html_sco_header.html_sem_header(
"Modification du semestre",
javascripts=["libjs/AutoSuggest.js", "js/formsemestre_edit.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
]
if not formsemestre.etat: if not formsemestre.etat:
H.append( H.append(
f"""<p>{scu.icontag( f"""<p>{scu.icontag(
@ -136,7 +127,13 @@ def formsemestre_editwithmodules(formsemestre_id):
""" """
) )
return "\n".join(H) + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
javascripts=["libjs/AutoSuggest.js", "js/formsemestre_edit.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
title="Modification du semestre",
content="<h2>Modification du semestre</h2>" + "\n".join(H),
)
def can_edit_sem(formsemestre_id: int = None, sem=None): def can_edit_sem(formsemestre_id: int = None, sem=None):
@ -1162,12 +1159,9 @@ def formsemestre_clone(formsemestre_id):
} }
H = [ H = [
html_sco_header.html_sem_header( """<p class="help">Cette opération duplique un semestre:
"Copie du semestre", on reprend les mêmes modules et responsables.
javascripts=["libjs/AutoSuggest.js"], Aucun étudiant n'est inscrit.</p>""",
cssstyles=["css/autosuggest_inquisitor.css"],
),
"""<p class="help">Cette opération duplique un semestre: on reprend les mêmes modules et responsables. Aucun étudiant n'est inscrit.</p>""",
] ]
descr = [ descr = [
@ -1244,7 +1238,13 @@ def formsemestre_clone(formsemestre_id):
if ndb.DateDMYtoISO(tf[2]["date_debut"]) > ndb.DateDMYtoISO(tf[2]["date_fin"]): if ndb.DateDMYtoISO(tf[2]["date_debut"]) > ndb.DateDMYtoISO(tf[2]["date_fin"]):
msg = '<ul class="tf-msg"><li class="tf-msg">Dates de début et fin incompatibles !</li></ul>' msg = '<ul class="tf-msg"><li class="tf-msg">Dates de début et fin incompatibles !</li></ul>'
if tf[0] == 0 or msg: if tf[0] == 0 or msg:
return "".join(H) + msg + tf[1] + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
title="Copie du semestre",
content="".join(H) + msg + tf[1],
)
elif tf[0] == -1: # cancel elif tf[0] == -1: # cancel
return flask.redirect( return flask.redirect(
url_for( url_for(
@ -1388,8 +1388,8 @@ def formsemestre_delete(formsemestre_id: int) -> str | flask.Response:
"""Delete a formsemestre (affiche avertissements)""" """Delete a formsemestre (affiche avertissements)"""
formsemestre: FormSemestre = FormSemestre.get_formsemestre(formsemestre_id) formsemestre: FormSemestre = FormSemestre.get_formsemestre(formsemestre_id)
H = [ H = [
html_sco_header.html_sem_header("Suppression du semestre"), """<h2>Suppression du semestre</h2>
"""<div class="ue_warning"><span>Attention !</span> <div class="ue_warning"><span>Attention !</span>
<p class="help">A n'utiliser qu'en cas d'erreur lors de la saisie d'une formation. Normalement, <p class="help">A n'utiliser qu'en cas d'erreur lors de la saisie d'une formation. Normalement,
<b>un semestre ne doit jamais être supprimé</b> <b>un semestre ne doit jamais être supprimé</b>
(on perd la mémoire des notes et de tous les événements liés à ce semestre !). (on perd la mémoire des notes et de tous les événements liés à ce semestre !).
@ -1442,8 +1442,9 @@ Ceci n'est possible que si :
) )
else: else:
H.append(tf[1]) H.append(tf[1])
return render_template(
return "\n".join(H) + html_sco_header.sco_footer() "sco_page.j2", title="Suppression du semestre", content="\n".join(H)
)
if tf[0] == -1: # cancel if tf[0] == -1: # cancel
return flask.redirect( return flask.redirect(
@ -1743,7 +1744,6 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
if not ok: if not ok:
return err return err
footer = html_sco_header.sco_footer()
help_msg = """<p class="help"> help_msg = """<p class="help">
Seuls les modules ont un coefficient. Cependant, il est nécessaire d'affecter un coefficient aux UE capitalisée pour pouvoir les prendre en compte dans la moyenne générale. Seuls les modules ont un coefficient. Cependant, il est nécessaire d'affecter un coefficient aux UE capitalisée pour pouvoir les prendre en compte dans la moyenne générale.
</p> </p>
@ -1766,7 +1766,6 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
</p> </p>
""" """
H = [ H = [
html_sco_header.html_sem_header("Coefficients des UE du semestre"),
help_msg, help_msg,
] ]
# #
@ -1809,7 +1808,11 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
initvalues=initvalues, initvalues=initvalues,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + footer return render_template(
"sco_page.j2",
title="Coefficients des UE du semestre",
content="<h2>Coefficients des UE du semestre</h2>" + "\n".join(H) + tf[1],
)
elif tf[0] == -1: elif tf[0] == -1:
return redirect( return redirect(
url_for( url_for(
@ -1846,11 +1849,13 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
) )
if not ok: if not ok:
return ( render_template(
"\n".join(H) "sco_page.j2",
title="Coefficients des UE du semestre",
content="<h2>Coefficients des UE du semestre</h2>"
+ "\n".join(H)
+ "<p><ul><li>%s</li></ul></p>" % "</li><li>".join(msg) + "<p><ul><li>%s</li></ul></p>" % "</li><li>".join(msg)
+ tf[1] + tf[1],
+ footer
) )
# apply modifications # apply modifications
@ -1873,20 +1878,25 @@ def formsemestre_edit_uecoefs(formsemestre_id, err_ue_id=None):
for ue in ue_deleted: for ue in ue_deleted:
message.append(f"<li>{ue.acronyme}</li>") message.append(f"<li>{ue.acronyme}</li>")
message.append("</ul>") message.append("</ul>")
sco_cache.invalidate_formsemestre(
formsemestre_id=formsemestre_id
) # > modif coef UE cap (modifs notes de _certains_ etudiants)
else: else:
message = ["""<h3>Aucune modification</h3>"""] message = ["""<h3>Aucune modification</h3>"""]
sco_cache.invalidate_formsemestre(
formsemestre_id=formsemestre_id
) # > modif coef UE cap (modifs notes de _certains_ etudiants)
return f"""{html_sco_header.html_sem_header("Coefficients des UE du semestre")} return render_template(
{" ".join(message)} "sco_page.j2",
<p><a class="stdlink" href="{url_for("notes.formsemestre_status", title="Coefficients des UE du semestre",
content=f"""
<h2>Coefficients des UE du semestre</h2>
{" ".join(message)}
<p><a class="stdlink" href="{url_for(
"notes.formsemestre_status",
scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id) scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id)
}">Revenir au tableau de bord</a> }">Revenir au tableau de bord</a>
</p> </p>
{footer} """,
""" )
def _get_sem_ues_modimpls( def _get_sem_ues_modimpls(

View File

@ -31,7 +31,7 @@ import collections
import time import time
import flask import flask
from flask import flash, url_for, g, request from flask import flash, url_for, g, render_template, request
from app import db from app import db
from app.comp import res_sem from app.comp import res_sem
@ -428,12 +428,7 @@ def formsemestre_inscription_with_modules(
etud = Identite.get_etud(etudid) etud = Identite.get_etud(etudid)
if etud.dept_id != formsemestre.dept_id: if etud.dept_id != formsemestre.dept_id:
raise ScoValueError("l'étudiant n'est pas dans ce département") raise ScoValueError("l'étudiant n'est pas dans ce département")
H = [ H = []
html_sco_header.html_sem_header(
f"Inscription de {etud.nomprenom} dans ce semestre",
)
]
footer = html_sco_header.sco_footer()
# Check 1: déjà inscrit ici ? # Check 1: déjà inscrit ici ?
inscr = FormSemestreInscription.query.filter_by( inscr = FormSemestreInscription.query.filter_by(
etudid=etud.id, formsemestre_id=formsemestre.id etudid=etud.id, formsemestre_id=formsemestre.id
@ -456,7 +451,12 @@ def formsemestre_inscription_with_modules(
</ul> </ul>
""" """
) )
return "\n".join(H) + footer return render_template(
"sco_page.j2",
title=f"Inscription de {etud.nomprenom} dans ce semestre",
content=f"<h2>Inscription de {etud.nomprenom} dans ce semestre</h2>"
+ "\n".join(H),
)
# Check 2: déjà inscrit dans un semestre recouvrant les même dates ? # Check 2: déjà inscrit dans un semestre recouvrant les même dates ?
# Informe et propose dé-inscriptions # Informe et propose dé-inscriptions
others = est_inscrit_ailleurs(etudid, formsemestre_id) others = est_inscrit_ailleurs(etudid, formsemestre_id)
@ -494,7 +494,12 @@ def formsemestre_inscription_with_modules(
</p>""" </p>"""
# was sco_groups.make_query_groups(group_ids) # was sco_groups.make_query_groups(group_ids)
) )
return "\n".join(H) + footer return render_template(
"sco_page.j2",
title=f"Inscription de {etud.nomprenom} dans ce semestre",
content=f"<h2>Inscription de {etud.nomprenom} dans ce semestre</h2>"
+ "\n".join(H),
)
# #
if group_ids is not None: if group_ids is not None:
# OK, inscription # OK, inscription
@ -527,7 +532,12 @@ def formsemestre_inscription_with_modules(
</form> </form>
""" """
) )
return "\n".join(H) + footer return render_template(
"sco_page.j2",
title=f"Inscription de {etud.nomprenom} dans ce semestre",
content=f"<h2>Inscription de {etud.nomprenom} dans ce semestre</h2>"
+ "\n".join(H),
)
def formsemestre_inscription_option(etudid, formsemestre_id): def formsemestre_inscription_option(etudid, formsemestre_id):
@ -855,12 +865,7 @@ def formsemestre_inscrits_ailleurs(formsemestre_id):
"""Page listant les étudiants inscrits dans un autre semestre """Page listant les étudiants inscrits dans un autre semestre
dont les dates recouvrent le semestre indiqué. dont les dates recouvrent le semestre indiqué.
""" """
H = [ H = []
html_sco_header.html_sem_header(
"Inscriptions multiples parmi les étudiants du semestre ",
javascripts=["js/etud_info.js"],
)
]
insd = list_inscrits_ailleurs(formsemestre_id) insd = list_inscrits_ailleurs(formsemestre_id)
# liste ordonnée par nom # liste ordonnée par nom
etudlist = [Identite.get_etud(etudid) for etudid, sems in insd.items() if sems] etudlist = [Identite.get_etud(etudid) for etudid, sems in insd.items() if sems]
@ -912,4 +917,9 @@ def formsemestre_inscrits_ailleurs(formsemestre_id):
) )
else: else:
H.append("""<p>Aucun étudiant en inscription multiple (c'est normal) !</p>""") H.append("""<p>Aucun étudiant en inscription multiple (c'est normal) !</p>""")
return "\n".join(H) + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
title="Inscriptions multiples parmi les étudiants du semestre",
content="<h2>Inscriptions multiples parmi les étudiants du semestre</h2>"
+ "\n".join(H),
)

View File

@ -741,9 +741,7 @@ def formsemestre_description_table(
columns_ids=columns_ids, columns_ids=columns_ids,
html_caption=title, html_caption=title,
html_class="table_leftalign formsemestre_description", html_class="table_leftalign formsemestre_description",
html_title=html_sco_header.html_sem_header( html_title="<h2>Description du semestre</h2>",
"Description du semestre", with_page_header=False
),
origin=f"Généré par {sco_version.SCONAME} le {scu.timedate_human_repr()}", origin=f"Généré par {sco_version.SCONAME} le {scu.timedate_human_repr()}",
page_title=title, page_title=title,
pdf_title=title, pdf_title=title,
@ -977,9 +975,6 @@ def formsemestre_status_head(formsemestre_id: int = None, page_title: str = None
page_title = page_title or "Modules de " page_title = page_title or "Modules de "
H = [ H = [
html_sco_header.html_sem_header(
page_title, with_page_header=False, with_h2=False
),
f"""<table> f"""<table>
<tr><td class="fichetitre2">Formation: </td><td> <tr><td class="fichetitre2">Formation: </td><td>
<a href="{url_for('notes.ue_table', <a href="{url_for('notes.ue_table',

View File

@ -30,8 +30,7 @@
import time import time
import flask import flask
from flask import url_for, flash, g, request from flask import flash, g, render_template, request, url_for
from flask.templating import render_template
import sqlalchemy as sa import sqlalchemy as sa
from app.models import Identite, Evaluation from app.models import Identite, Evaluation
@ -957,11 +956,13 @@ def form_decision_manuelle(Se, formsemestre_id, etudid, desturl="", sortcol=None
# ----------- # -----------
def formsemestre_validation_auto(formsemestre_id): def formsemestre_validation_auto(formsemestre_id: int):
"Formulaire saisie automatisee des decisions d'un semestre" "Formulaire saisie automatisée des décisions d'un semestre"
H = [ return render_template(
html_sco_header.html_sem_header("Saisie automatique des décisions du semestre"), "sco_page.j2",
f""" title="Saisie automatique des décisions",
content=f"""
<h2>Saisie automatique des décisions du semestre</h2>
<ul> <ul>
<li>Seuls les étudiants qui obtiennent le semestre seront affectés (code ADM, moyenne générale et <li>Seuls les étudiants qui obtiennent le semestre seront affectés (code ADM, moyenne générale et
toutes les barres, semestre précédent validé);</li> toutes les barres, semestre précédent validé);</li>
@ -978,9 +979,7 @@ def formsemestre_validation_auto(formsemestre_id):
<p><em>Le calcul prend quelques minutes, soyez patients !</em></p> <p><em>Le calcul prend quelques minutes, soyez patients !</em></p>
</form> </form>
""", """,
html_sco_header.sco_footer(), )
]
return "\n".join(H)
def do_formsemestre_validation_auto(formsemestre_id): def do_formsemestre_validation_auto(formsemestre_id):

View File

@ -57,14 +57,11 @@ from app.scodoc.sco_exceptions import ScoValueError, ScoPermissionDenied
from app.scodoc.sco_permissions import Permission from app.scodoc.sco_permissions import Permission
JAVASCRIPTS = html_sco_header.BOOTSTRAP_JS + [ JAVASCRIPTS = html_sco_header.BOOTSTRAP_JS + [
"js/etud_info.js",
"js/groups_view.js", "js/groups_view.js",
"js/multi-select.js", "js/multi-select.js",
] ]
CSSSTYLES = html_sco_header.BOOTSTRAP_CSS + [ CSSSTYLES = html_sco_header.BOOTSTRAP_CSS
"libjs/bootstrap/css/bootstrap.min.css",
]
# view: # view:
@ -615,8 +612,8 @@ def groups_table(
etud_info["_nom_disp_order"] = etud_sort_key(etud_info) etud_info["_nom_disp_order"] = etud_sort_key(etud_info)
etud_info["_prenom_target"] = fiche_url etud_info["_prenom_target"] = fiche_url
etud_info["_nom_disp_td_attrs"] = ( etud_info["_nom_disp_td_attrs"] = 'id="%s" class="etudinfo"' % (
'id="%s" class="etudinfo"' % (etud_info["etudid"]) etud_info["etudid"]
) )
etud_info["bourse_str"] = "oui" if etud_info["boursier"] else "non" etud_info["bourse_str"] = "oui" if etud_info["boursier"] else "non"
if etud_info["etat"] == "D": if etud_info["etat"] == "D":

View File

@ -36,8 +36,6 @@ from flask import url_for, g, request
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
from app import db, log from app import db, log
from app.comp import res_sem
from app.comp.res_compat import NotesTableCompat
from app.models import Formation, FormSemestre, GroupDescr, Identite from app.models import Formation, FormSemestre, GroupDescr, Identite
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app.scodoc import html_sco_header from app.scodoc import html_sco_header
@ -315,7 +313,6 @@ def formsemestre_inscr_passage(
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
page_title="Passage des étudiants", page_title="Passage des étudiants",
javascripts=["js/etud_info.js"],
) )
] ]
footer = html_sco_header.sco_footer() footer = html_sco_header.sco_footer()
@ -487,10 +484,9 @@ def _build_page(
else: else:
ignore_jury_checked = "" ignore_jury_checked = ""
H = [ H = [
html_sco_header.html_sem_header( f"""
"Passages dans le semestre", with_page_header=False <h2 class="formsemestre">Passages dans le semestre</h2>
), <form name="f" method="post" action="{request.base_url}">
f"""<form name="f" method="post" action="{request.base_url}">
<input type="hidden" name="formsemestre_id" value="{formsemestre.id}"/> <input type="hidden" name="formsemestre_id" value="{formsemestre.id}"/>
@ -589,7 +585,7 @@ def formsemestre_inscr_passage_help(formsemestre: FormSemestre):
def etuds_select_boxes( def etuds_select_boxes(
auth_etuds_by_cat, auth_etuds_by_cat,
inscrits_ailleurs={}, inscrits_ailleurs: dict = None,
sel_inscrits=True, sel_inscrits=True,
show_empty_boxes=False, show_empty_boxes=False,
export_cat_xls=None, export_cat_xls=None,
@ -602,6 +598,7 @@ def etuds_select_boxes(
sel_inscrits= sel_inscrits=
export_cat_xls = export_cat_xls =
""" """
inscrits_ailleurs = inscrits_ailleurs or {}
if export_cat_xls: if export_cat_xls:
return etuds_select_box_xls(auth_etuds_by_cat[export_cat_xls]) return etuds_select_box_xls(auth_etuds_by_cat[export_cat_xls])
@ -633,7 +630,7 @@ def etuds_select_boxes(
for src_cat in auth_etuds_by_cat.keys(): for src_cat in auth_etuds_by_cat.keys():
infos = auth_etuds_by_cat[src_cat]["infos"] infos = auth_etuds_by_cat[src_cat]["infos"]
infos["comment"] = infos.get("comment", "") # commentaire dans sous-titre boite infos["comment"] = infos.get("comment", "") # commentaire dans sous-titre boite
help = infos.get("help", "") help_txt = infos.get("help", "")
etuds = auth_etuds_by_cat[src_cat]["etuds"] etuds = auth_etuds_by_cat[src_cat]["etuds"]
etuds.sort(key=itemgetter("nom")) etuds.sort(key=itemgetter("nom"))
with_checkbox = (not read_only) and auth_etuds_by_cat[src_cat]["infos"].get( with_checkbox = (not read_only) and auth_etuds_by_cat[src_cat]["infos"].get(
@ -650,8 +647,8 @@ def etuds_select_boxes(
<div class="pas_sembox_title"><a href="%(title_target)s" """ <div class="pas_sembox_title"><a href="%(title_target)s" """
% infos % infos
) )
if help: # bubble if help_txt: # bubble
H.append('title="%s"' % help) H.append('title="%s"' % help_txt)
H.append( H.append(
""">%(title)s</a></div> """>%(title)s</a></div>
<div class="pas_sembox_subtitle">(%(nbetuds)d étudiants%(comment)s)""" <div class="pas_sembox_subtitle">(%(nbetuds)d étudiants%(comment)s)"""

View File

@ -98,7 +98,7 @@ def scodoc_table_etuds_lycees(fmt="html"):
html_sco_header.sco_header( html_sco_header.sco_header(
page_title=tab.page_title, page_title=tab.page_title,
init_google_maps=True, init_google_maps=True,
javascripts=["js/etud_info.js", "js/map_lycees.js"], javascripts=["js/map_lycees.js"],
), ),
"""<h2 class="formsemestre">Lycées d'origine des %d étudiants (%d semestres)</h2>""" """<h2 class="formsemestre">Lycées d'origine des %d étudiants (%d semestres)</h2>"""
% (len(etuds), len(semdepts)), % (len(etuds), len(semdepts)),
@ -219,8 +219,7 @@ def formsemestre_etuds_lycees(
page_title=tab.page_title, page_title=tab.page_title,
init_google_maps=True, init_google_maps=True,
cssstyles=sco_groups_view.CSSSTYLES, cssstyles=sco_groups_view.CSSSTYLES,
javascripts=sco_groups_view.JAVASCRIPTS javascripts=sco_groups_view.JAVASCRIPTS + ["js/map_lycees.js"],
+ ["js/etud_info.js", "js/map_lycees.js"],
), ),
"""<h2 class="formsemestre">Lycées d'origine des étudiants</h2>""", """<h2 class="formsemestre">Lycées d'origine des étudiants</h2>""",
"\n".join(F), "\n".join(F),

View File

@ -31,7 +31,7 @@ import collections
from operator import attrgetter from operator import attrgetter
import flask import flask
from flask import url_for, g, request from flask import url_for, g, render_template, request
from flask_login import current_user from flask_login import current_user
from app import db, log from app import db, log
@ -84,7 +84,6 @@ def moduleimpl_inscriptions_edit(
return # can_change_inscriptions raises exception return # can_change_inscriptions raises exception
header = html_sco_header.sco_header( header = html_sco_header.sco_header(
page_title="Inscription au module", page_title="Inscription au module",
javascripts=["js/etud_info.js"],
) )
footer = html_sco_header.sco_footer() footer = html_sco_header.sco_footer()
H = [ H = [
@ -301,14 +300,12 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
# Page HTML: # Page HTML:
H = [ H = [
html_sco_header.html_sem_header( f"""
"Inscriptions aux modules et UE du semestre", <h2 class="formsemestre">Inscriptions aux modules et UE du semestre</h2>
javascripts=["js/etud_info.js", "js/moduleimpl_inscriptions_stats.js"], <h3>Inscrits au semestre: {len(inscrits)} étudiants</h3>
) """
] ]
H.append(f"<h3>Inscrits au semestre: {len(inscrits)} étudiants</h3>")
if options: if options:
H.append("<h3>Modules auxquels tous les étudiants ne sont pas inscrits:</h3>") H.append("<h3>Modules auxquels tous les étudiants ne sont pas inscrits:</h3>")
H.append( H.append(
@ -495,8 +492,12 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
""" """
) )
H.append(html_sco_header.sco_footer()) return render_template(
return "\n".join(H) "sco_page.j2",
title="Inscriptions aux modules et UE du semestre",
javascripts=["js/moduleimpl_inscriptions_stats.js"],
content="\n".join(H),
)
def _list_but_ue_inscriptions(res: NotesTableCompat, read_only: bool = True) -> str: def _list_but_ue_inscriptions(res: NotesTableCompat, read_only: bool = True) -> str:

View File

@ -233,7 +233,6 @@ def formsemestre_poursuite_report(formsemestre_id, fmt="html"):
tab.base_url = "%s?formsemestre_id=%s" % (request.base_url, formsemestre_id) tab.base_url = "%s?formsemestre_id=%s" % (request.base_url, formsemestre_id)
return tab.make_page( return tab.make_page(
title="""<h2 class="formsemestre">Poursuite d'études</h2>""", title="""<h2 class="formsemestre">Poursuite d'études</h2>""",
javascripts=["js/etud_info.js"],
fmt=fmt, fmt=fmt,
with_html_headers=True, with_html_headers=True,
) )

View File

@ -112,7 +112,7 @@ get_base_preferences(formsemestre_id)
""" """
import flask import flask
from flask import current_app, flash, g, request, url_for from flask import current_app, flash, g, render_template, request, url_for
from app import db, log from app import db, log
from app.models import Departement from app.models import Departement
@ -2243,14 +2243,8 @@ class BasePreferences:
def edit(self): def edit(self):
"""HTML dialog: edit global preferences""" """HTML dialog: edit global preferences"""
from app.scodoc import html_sco_header
self.load() self.load()
H = [ H = [
html_sco_header.sco_header(
page_title=f"Préférences {g.scodoc_dept}",
javascripts=["js/detail_summary_persistence.js"],
),
f"<h2>Préférences globales pour le département {g.scodoc_dept}</h2>", f"<h2>Préférences globales pour le département {g.scodoc_dept}</h2>",
# f"""<p><a href="{url_for("scodoc.configure_logos", scodoc_dept=g.scodoc_dept) # f"""<p><a href="{url_for("scodoc.configure_logos", scodoc_dept=g.scodoc_dept)
# }">modification des logos du département (pour documents pdf)</a></p>""" # }">modification des logos du département (pour documents pdf)</a></p>"""
@ -2277,7 +2271,12 @@ class BasePreferences:
) )
dest_url = url_for("scolar.index_html", scodoc_dept=g.scodoc_dept) dest_url = url_for("scolar.index_html", scodoc_dept=g.scodoc_dept)
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + html_sco_header.sco_footer() return render_template(
"sco_page_dept.j2",
content="\n".join(H) + tf[1],
title=f"Préférences {g.scodoc_dept}",
javascripts=["js/detail_summary_persistence.js"],
)
if tf[0] == -1: if tf[0] == -1:
return flask.redirect(dest_url) # cancel return flask.redirect(dest_url) # cancel
# #
@ -2384,18 +2383,11 @@ class SemPreferences:
# The dialog # The dialog
def edit(self, categories=[]): def edit(self, categories=[]):
"""Dialog to edit semestre preferences in given categories""" """Dialog to edit semestre preferences in given categories"""
from app.scodoc import html_sco_header
from app.scodoc import sco_formsemestre
if not self.formsemestre_id: if not self.formsemestre_id:
raise ScoValueError( raise ScoValueError(
"sem_preferences.edit doit etre appele sur un semestre !" "sem_preferences.edit doit etre appele sur un semestre !"
) # a bug ! ) # a bug !
H = [ H = [
html_sco_header.html_sem_header(
"Préférences du semestre",
javascripts=["js/detail_summary_persistence.js"],
),
""" """
<p class="help">Les paramètres définis ici ne s'appliqueront qu'à ce semestre.</p> <p class="help">Les paramètres définis ici ne s'appliqueront qu'à ce semestre.</p>
<p class="msg">Attention: cliquez sur "Enregistrer les modifications" en bas de page pour appliquer vos changements !</p> <p class="msg">Attention: cliquez sur "Enregistrer les modifications" en bas de page pour appliquer vos changements !</p>
@ -2456,7 +2448,12 @@ function set_global_pref(el, pref_name) {
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
content="\n".join(H) + tf[1],
title="Préférences du semestre",
javascripts=["js/detail_summary_persistence.js"],
)
elif tf[0] == -1: elif tf[0] == -1:
flash("Annulé") flash("Annulé")
return flask.redirect(dest_url) return flask.redirect(dest_url)

View File

@ -35,8 +35,7 @@ from reportlab.platypus import Paragraph
from reportlab.lib import styles from reportlab.lib import styles
import flask import flask
from flask import flash, redirect, url_for from flask import flash, g, redirect, render_template, request, url_for
from flask import g, request
from app.models import FormSemestre, Identite from app.models import FormSemestre, Identite
@ -223,15 +222,13 @@ def formsemestre_pvjury(formsemestre_id, fmt="html", publish=True):
) )
) )
footer = html_sco_header.sco_footer()
dpv = sco_pv_dict.dict_pvjury(formsemestre_id, with_prev=True) dpv = sco_pv_dict.dict_pvjury(formsemestre_id, with_prev=True)
if not dpv: if not dpv:
if fmt == "html": if fmt == "html":
return ( return render_template(
html_sco_header.sco_header() "sco_page.j2",
+ "<h2>Aucune information disponible !</h2>" title="PV Jury",
+ footer content="<h2>Aucune information disponible !</h2>",
) )
else: else:
return None return None
@ -262,11 +259,10 @@ def formsemestre_pvjury(formsemestre_id, fmt="html", publish=True):
) )
tab.base_url = "%s?formsemestre_id=%s" % (request.base_url, formsemestre_id) tab.base_url = "%s?formsemestre_id=%s" % (request.base_url, formsemestre_id)
H = [ H = [
html_sco_header.html_sem_header( f"""
"Décisions du jury pour le semestre", <h2 class="formsemestre">Décisions du jury pour le semestre</h2>
javascripts=["js/etud_info.js"], <p>(dernière modif le {dpv["date"]})</p>
), """,
"""<p>(dernière modif le %s)</p>""" % dpv["date"],
] ]
H.append( H.append(
@ -333,7 +329,9 @@ def formsemestre_pvjury(formsemestre_id, fmt="html", publish=True):
""" """
) )
H.append("</div>") # /codes H.append("</div>") # /codes
return "\n".join(H) + footer return render_template(
"sco_page.j2", title="Décisions du jury pour le semestre", content="\n".join(H)
)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -351,9 +349,6 @@ def formsemestre_pvjury_pdf(formsemestre_id, group_ids: list[int] = None, etudid
if etudid: if etudid:
# PV pour ce seul étudiant: # PV pour ce seul étudiant:
etud = Identite.get_etud(etudid) etud = Identite.get_etud(etudid)
etuddescr = f"""<a class="discretelink" href="{
url_for("scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid)
}">{etud.nomprenom}</a>"""
etudids = [etudid] etudids = [etudid]
else: else:
etuddescr = "" etuddescr = ""
@ -367,11 +362,6 @@ def formsemestre_pvjury_pdf(formsemestre_id, group_ids: list[int] = None, etudid
etudids = [m["etudid"] for m in groups_infos.members] etudids = [m["etudid"] for m in groups_infos.members]
H = [ H = [
html_sco_header.html_sem_header(
f"Édition du PV de jury {etuddescr}",
javascripts=sco_groups_view.JAVASCRIPTS,
cssstyles=sco_groups_view.CSSSTYLES,
),
f"""<div class="help">Utiliser cette page pour éditer des versions provisoires des PV. f"""<div class="help">Utiliser cette page pour éditer des versions provisoires des PV.
<span class="fontred">Il est recommandé d'archiver les versions définitives: <span class="fontred">Il est recommandé d'archiver les versions définitives:
<a class="stdlink" href="{url_for( <a class="stdlink" href="{url_for(
@ -384,7 +374,6 @@ def formsemestre_pvjury_pdf(formsemestre_id, group_ids: list[int] = None, etudid
"""<p><em>Voir aussi si besoin les réglages sur la page "Paramétrage" """<p><em>Voir aussi si besoin les réglages sur la page "Paramétrage"
(accessible à l'administrateur du département).</em> (accessible à l'administrateur du département).</em>
</p>""", </p>""",
html_sco_header.sco_footer(),
] ]
descr = descrform_pvjury(formsemestre) descr = descrform_pvjury(formsemestre)
if etudid: if etudid:
@ -409,7 +398,20 @@ def formsemestre_pvjury_pdf(formsemestre_id, group_ids: list[int] = None, etudid
html_foot_markup=menu_choix_groupe, html_foot_markup=menu_choix_groupe,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + "\n".join(F) return render_template(
"sco_page.j2",
title=f"Édition du PV de jury de {etud.nom_prenom()}",
content=f"""<h2 class="formsemestre">Édition du PV de jury
de <a class="discretelink" href="{
url_for("scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etudid)
}">{etud.nomprenom}</a></h2>"""
+ "\n".join(H)
+ "\n"
+ tf[1]
+ "\n".join(F),
javascripts=sco_groups_view.JAVASCRIPTS,
cssstyles=sco_groups_view.CSSSTYLES,
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(
@ -541,7 +543,7 @@ def descrform_pvjury(formsemestre: FormSemestre):
] ]
def formsemestre_lettres_individuelles(formsemestre_id, group_ids=[]): def formsemestre_lettres_individuelles(formsemestre_id, group_ids=()):
"Lettres avis jury en PDF" "Lettres avis jury en PDF"
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id) formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
if not group_ids: if not group_ids:
@ -553,12 +555,9 @@ def formsemestre_lettres_individuelles(formsemestre_id, group_ids=[]):
etudids = [m["etudid"] for m in groups_infos.members] etudids = [m["etudid"] for m in groups_infos.members]
H = [ H = [
html_sco_header.html_sem_header( f"""
"Édition des lettres individuelles", <h2 class="formsemestre">Édition des lettres individuelles</h2>
javascripts=sco_groups_view.JAVASCRIPTS, <p class="help">Utiliser cette page pour éditer des versions provisoires des PV.
cssstyles=sco_groups_view.CSSSTYLES,
),
f"""<p class="help">Utiliser cette page pour éditer des versions provisoires des PV.
<span class="fontred">Il est recommandé d'archiver les versions définitives: <a <span class="fontred">Il est recommandé d'archiver les versions définitives: <a
href="{url_for( href="{url_for(
"notes.formsemestre_archive", "notes.formsemestre_archive",
@ -568,7 +567,6 @@ def formsemestre_lettres_individuelles(formsemestre_id, group_ids=[]):
>voir cette page</a></span></p> >voir cette page</a></span></p>
""", """,
] ]
F = html_sco_header.sco_footer()
descr = descrform_lettres_individuelles() descr = descrform_lettres_individuelles()
menu_choix_groupe = ( menu_choix_groupe = (
"""<div class="group_ids_sel_menu">Groupes d'étudiants à lister: """ """<div class="group_ids_sel_menu">Groupes d'étudiants à lister: """
@ -587,7 +585,13 @@ def formsemestre_lettres_individuelles(formsemestre_id, group_ids=[]):
html_foot_markup=menu_choix_groupe, html_foot_markup=menu_choix_groupe,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + F return render_template(
"sco_page.j2",
title="Édition des lettres individuelles",
content="\n".join(H) + "\n" + tf[1],
javascripts=sco_groups_view.JAVASCRIPTS,
cssstyles=sco_groups_view.CSSSTYLES,
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(

View File

@ -123,7 +123,7 @@ def formsemestre_recapcomplet(
page_title=f"{formsemestre.sem_modalite()}: " page_title=f"{formsemestre.sem_modalite()}: "
+ ("jury" if mode_jury else "moyennes"), + ("jury" if mode_jury else "moyennes"),
no_sidebar=True, no_sidebar=True,
javascripts=["js/etud_info.js", "js/table_recap.js"], javascripts=["js/table_recap.js"],
), ),
sco_formsemestre_status.formsemestre_status_head( sco_formsemestre_status.formsemestre_status_head(
formsemestre_id=formsemestre_id formsemestre_id=formsemestre_id

View File

@ -1367,7 +1367,6 @@ def formsemestre_suivi_cursus(
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
page_title=tab.page_title, page_title=tab.page_title,
javascripts=["js/etud_info.js"],
), ),
"""<h2 class="formsemestre">Cursus suivis par les étudiants de ce semestre</h2>""", """<h2 class="formsemestre">Cursus suivis par les étudiants de ce semestre</h2>""",
"\n".join(F), "\n".join(F),

View File

@ -168,12 +168,7 @@ def formsemestre_synchro_etuds(
suffix=scu.XLSX_SUFFIX, suffix=scu.XLSX_SUFFIX,
) )
H = [ H = [html_sco_header.sco_header(page_title="Synchronisation étudiants")]
html_sco_header.sco_header(
page_title="Synchronisation étudiants",
javascripts=["js/etud_info.js"],
)
]
if not submitted: if not submitted:
H += _build_page( H += _build_page(
sem, sem,

View File

@ -54,14 +54,13 @@ Solution proposée (nov 2014):
""" """
import flask import flask
from flask import flash, g, request, url_for from flask import flash, g, request, render_template, url_for
from flask_login import current_user from flask_login import current_user
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
from app import db, log from app import db, log
from app.models import Evaluation, Identite, ModuleImpl, UniteEns from app.models import Evaluation, Identite, ModuleImpl, UniteEns
from app.scodoc import html_sco_header
from app.scodoc import codes_cursus from app.scodoc import codes_cursus
from app.scodoc import sco_edit_matiere from app.scodoc import sco_edit_matiere
from app.scodoc import sco_edit_module from app.scodoc import sco_edit_module
@ -240,11 +239,9 @@ def external_ue_create_form(formsemestre_id: int, etudid: int):
existing_external_ue = get_existing_external_ue(formation_id) existing_external_ue = get_existing_external_ue(formation_id)
H = [ H = [
html_sco_header.html_sem_header( f"""
f"Ajout d'une UE externe pour {etud.nomprenom}", <h2 class="formsemestre">Ajout d'une UE externe pour {etud.nomprenom}</h2>
javascripts=["js/sco_ue_external.js"], <p class="help">Cette page permet d'indiquer que l'étudiant a suivi une UE
),
"""<p class="help">Cette page permet d'indiquer que l'étudiant a suivi une UE
dans un autre établissement et qu'elle doit être intégrée dans le semestre courant.<br> dans un autre établissement et qu'elle doit être intégrée dans le semestre courant.<br>
La note (/20) obtenue par l'étudiant doit toujours être spécifiée.</br> La note (/20) obtenue par l'étudiant doit toujours être spécifiée.</br>
On peut choisir une UE externe existante (dans le menu), ou bien en créer une, qui sera On peut choisir une UE externe existante (dans le menu), ou bien en créer une, qui sera
@ -252,7 +249,6 @@ def external_ue_create_form(formsemestre_id: int, etudid: int):
</p> </p>
""", """,
] ]
html_footer = html_sco_header.sco_footer()
parcours = formsemestre.formation.get_cursus() parcours = formsemestre.formation.get_cursus()
ue_types = [ ue_types = [
typ for typ in parcours.ALLOWED_UE_TYPES if typ != codes_cursus.UE_SPORT typ for typ in parcours.ALLOWED_UE_TYPES if typ != codes_cursus.UE_SPORT
@ -349,7 +345,12 @@ def external_ue_create_form(formsemestre_id: int, etudid: int):
etudid=etudid, etudid=etudid,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + html_footer return render_template(
"sco_page.j2",
title=f"Ajout d'une UE externe pour {etud.nomprenom}",
javascripts=["js/sco_ue_external.js"],
content="\n".join(H) + "\n" + tf[1],
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect(bull_url) return flask.redirect(bull_url)
else: else:
@ -358,12 +359,14 @@ def external_ue_create_form(formsemestre_id: int, etudid: int):
note, 20.0, etudid=etudid, absents=[], invalids=[] note, 20.0, etudid=etudid, absents=[], invalids=[]
) )
if invalid: if invalid:
return ( return render_template(
"\n".join(H) "sco_page.j2",
title=f"Ajout d'une UE externe pour {etud.nomprenom}",
javascripts=["js/sco_ue_external.js"],
content="\n".join(H)
+ "\n" + "\n"
+ tf_error_message("valeur note invalide") + tf_error_message("valeur note invalide")
+ tf[1] + tf[1],
+ html_footer
) )
if tf[2]["existing_ue"]: if tf[2]["existing_ue"]:
ue_id = int(tf[2]["existing_ue"]) ue_id = int(tf[2]["existing_ue"])
@ -371,12 +374,14 @@ def external_ue_create_form(formsemestre_id: int, etudid: int):
else: else:
acronyme = tf[2]["acronyme"].strip() acronyme = tf[2]["acronyme"].strip()
if not acronyme: if not acronyme:
return ( return render_template(
"\n".join(H) "sco_page.j2",
title=f"Ajout d'une UE externe pour {etud.nomprenom}",
javascripts=["js/sco_ue_external.js"],
content="\n".join(H)
+ "\n" + "\n"
+ tf_error_message("spécifier acronyme d'UE") + tf_error_message("spécifier acronyme d'UE")
+ tf[1] + tf[1],
+ html_footer
) )
modimpl = external_ue_create( modimpl = external_ue_create(
formsemestre_id, formsemestre_id,

View File

@ -31,7 +31,7 @@
# Anciennement ZScoUsers.py, fonctions de gestion des données réécrites avec flask/SQLAlchemy # Anciennement ZScoUsers.py, fonctions de gestion des données réécrites avec flask/SQLAlchemy
import re import re
from flask import url_for, g, request from flask import url_for, g, render_template, request
from flask_login import current_user from flask_login import current_user
@ -54,7 +54,7 @@ def index_html(
all_depts = int(all_depts) all_depts = int(all_depts)
with_inactives = int(with_inactives) with_inactives = int(with_inactives)
H = [html_sco_header.html_sem_header("Gestion des utilisateurs")] H = ["<h2>Gestion des utilisateurs</h2>"]
if current_user.has_permission(Permission.UsersAdmin, g.scodoc_dept): if current_user.has_permission(Permission.UsersAdmin, g.scodoc_dept):
H.append( H.append(
@ -112,6 +112,7 @@ def index_html(
raise ScoValueError("nom de rôle invalide") raise ScoValueError("nom de rôle invalide")
else: else:
having_role = None having_role = None
content = list_users( content = list_users(
g.scodoc_dept, g.scodoc_dept,
all_depts=all_depts, all_depts=all_depts,
@ -122,10 +123,12 @@ def index_html(
) )
if fmt != "html": if fmt != "html":
return content return content
H.append(content) H.append(content)
F = html_sco_header.sco_footer() return render_template(
return "\n".join(H) + F "sco_page.j2", content="\n".join(H), title="Gestion des utilisateurs"
)
def list_users( def list_users(

View File

@ -686,11 +686,6 @@ div.scobox.news {
background-color: rgb(255, 235, 170); background-color: rgb(255, 235, 170);
} }
div.news a,
div.news a.stdlink {
color: black;
text-decoration: none;
}
div.news a:hover { div.news a:hover {
color: rgb(153, 51, 51); color: rgb(153, 51, 51);

View File

@ -43,14 +43,18 @@
<img id="toggle-sidebar-img" src="{{scu.STATIC_DIR}}/icons/back.svg" width="12px" alt="toggle sidebar"/> <img id="toggle-sidebar-img" src="{{scu.STATIC_DIR}}/icons/back.svg" width="12px" alt="toggle sidebar"/>
</div> </div>
</div> </div>
<div class="formsemestre-page-header"> {% if sco.formsemestre %}
<div class="formsemestre-page-header">
{% include "flashed_messages.j2" %}
{% if sco.formsemestre %}
{% block formsemestre_header %}
{% include "formsemestre_header.j2" %}
{% endblock %}
{% endif %}
</div>
{% else %}
{% include "flashed_messages.j2" %} {% include "flashed_messages.j2" %}
{% if sco.formsemestre %} {% endif %}
{% block formsemestre_header %}
{% include "formsemestre_header.j2" %}
{% endblock %}
{% endif %}
</div>
<div id="sidebar"> <div id="sidebar">
{% include "sidebar.j2" %} {% include "sidebar.j2" %}
</div> </div>
@ -73,6 +77,7 @@
<script src="{{scu.STATIC_DIR}}/libjs/menu.js"></script> <script src="{{scu.STATIC_DIR}}/libjs/menu.js"></script>
<script src="{{scu.STATIC_DIR}}/libjs/bubble.js"></script> <script src="{{scu.STATIC_DIR}}/libjs/bubble.js"></script>
<script src="{{scu.STATIC_DIR}}/js/scodoc.js"></script> <script src="{{scu.STATIC_DIR}}/js/scodoc.js"></script>
<script src="{{scu.STATIC_DIR}}/js/etud_info.js"></script>
<script src="{{scu.STATIC_DIR}}/DataTables/datatables.min.js"></script> <script src="{{scu.STATIC_DIR}}/DataTables/datatables.min.js"></script>
<script> <script>
window.onload = function () { window.onload = function () {

View File

@ -246,7 +246,6 @@ def list_billets():
H = [ H = [
html_sco_header.sco_header( html_sco_header.sco_header(
page_title="Billet d'absence non traités", page_title="Billet d'absence non traités",
javascripts=["js/etud_info.js"],
), ),
f"<h2>Billets d'absence en attente de traitement ({table.get_nb_rows()})</h2>", f"<h2>Billets d'absence en attente de traitement ({table.get_nb_rows()})</h2>",
] ]

View File

@ -942,18 +942,12 @@ def edit_enseignants_form(moduleimpl_id):
"modif liste enseignants/moduleimpl" "modif liste enseignants/moduleimpl"
modimpl = ModuleImpl.get_modimpl(moduleimpl_id) modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
modimpl.can_change_ens(raise_exc=True) modimpl.can_change_ens(raise_exc=True)
# -- #
header = html_sco_header.html_sem_header( page_title = f"Enseignants du module {modimpl.module.titre or modimpl.module.code}"
f"""Enseignants du <a href="{ title = f"""Enseignants du <a href="{
url_for("notes.moduleimpl_status", url_for("notes.moduleimpl_status",
scodoc_dept=g.scodoc_dept, moduleimpl_id=modimpl.id) scodoc_dept=g.scodoc_dept, moduleimpl_id=modimpl.id)
}">module {modimpl.module.titre or modimpl.module.code}</a>""", }">module {modimpl.module.titre or modimpl.module.code}</a>"""
page_title=f"Enseignants du module {modimpl.module.titre or modimpl.module.code}",
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
footer = html_sco_header.sco_footer()
# Liste des enseignants avec forme pour affichage / saisie avec suggestion # Liste des enseignants avec forme pour affichage / saisie avec suggestion
userlist = sco_users.get_user_list() userlist = sco_users.get_user_list()
uid2display = {} # uid : forme pour affichage = "NOM Prenom (login)"(login)" uid2display = {} # uid : forme pour affichage = "NOM Prenom (login)"(login)"
@ -1021,7 +1015,13 @@ def edit_enseignants_form(moduleimpl_id):
cancelbutton="Annuler", cancelbutton="Annuler",
) )
if tf[0] == 0: if tf[0] == 0:
return header + "\n".join(H) + tf[1] + F + footer return render_template(
"sco_page.j2",
title=page_title,
content=title + "\n".join(H) + tf[1],
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(
@ -1058,7 +1058,13 @@ def edit_enseignants_form(moduleimpl_id):
moduleimpl_id=moduleimpl_id, moduleimpl_id=moduleimpl_id,
) )
) )
return header + "\n".join(H) + tf[1] + F + footer return render_template(
"sco_page.j2",
title=page_title,
content=title + "\n".join(H) + tf[1],
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
@bp.route("/edit_moduleimpl_resp", methods=["GET", "POST"]) @bp.route("/edit_moduleimpl_resp", methods=["GET", "POST"])
@ -1072,15 +1078,13 @@ def edit_moduleimpl_resp(moduleimpl_id: int):
modimpl: ModuleImpl = ModuleImpl.query.get_or_404(moduleimpl_id) modimpl: ModuleImpl = ModuleImpl.query.get_or_404(moduleimpl_id)
modimpl.can_change_responsable(current_user, raise_exc=True) # access control modimpl.can_change_responsable(current_user, raise_exc=True) # access control
H = [ H = [
html_sco_header.html_sem_header( f"""<h2 class="formsemestre">Modification du responsable du
f"""Modification du responsable du <a class="stdlink" href="{ <a class="stdlink" href="{
url_for("notes.moduleimpl_status", url_for("notes.moduleimpl_status",
scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id) scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id)
}">module {modimpl.module.titre or ""}</a>""", }">module {modimpl.module.titre or ""}</a></h2>"""
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
] ]
help_str = """<p class="help">Taper le début du nom de l'enseignant.</p>""" help_str = """<p class="help">Taper le début du nom de l'enseignant.</p>"""
# Liste des enseignants avec forme pour affichage / saisie avec suggestion # Liste des enseignants avec forme pour affichage / saisie avec suggestion
userlist = [sco_users.user_info(user=u) for u in sco_users.get_user_list()] userlist = [sco_users.user_info(user=u) for u in sco_users.get_user_list()]
@ -1125,7 +1129,13 @@ def edit_moduleimpl_resp(moduleimpl_id: int):
initvalues=initvalues, initvalues=initvalues,
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + help_str + html_sco_header.sco_footer() return render_template(
"sco_page.j2",
content="\n".join(H) + tf[1] + help_str,
title="Modification responsable module",
javascripts=["libjs/AutoSuggest.js"],
cssstyles=["css/autosuggest_inquisitor.css"],
)
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(
@ -1198,21 +1208,13 @@ def view_module_abs(moduleimpl_id, fmt="html"):
} }
) )
H = [ content = f"""
html_sco_header.html_sem_header( <h2>Absences du <a href="{
f"""Absences du <a href="{ url_for("notes.moduleimpl_status",
url_for("notes.moduleimpl_status", scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id
scodoc_dept=g.scodoc_dept, moduleimpl_id=moduleimpl_id )}">module {modimpl.module.titre_str()}</a></h2>"""
)}">module {modimpl.module.titre_str()}</a>""",
page_title=f"Absences du module {modimpl.module.titre_str()}",
)
]
if not rows and fmt == "html": if not rows and fmt == "html":
return ( content += "<p>Aucune absence signalée</p>"
"\n".join(H)
+ "<p>Aucune absence signalée</p>"
+ html_sco_header.sco_footer()
)
tab = GenTable( tab = GenTable(
titles={ titles={
@ -1236,7 +1238,14 @@ def view_module_abs(moduleimpl_id, fmt="html"):
if fmt != "html": if fmt != "html":
return tab.make_page(fmt=fmt) return tab.make_page(fmt=fmt)
return "\n".join(H) + tab.html() + html_sco_header.sco_footer() if not tab.is_empty():
content += tab.html()
return render_template(
"sco_page.j2",
content=content,
title=f"Absences du module {modimpl.module.titre_str()}",
)
@bp.route("/delete_ue_expr/<int:formsemestre_id>/<int:ue_id>", methods=["GET", "POST"]) @bp.route("/delete_ue_expr/<int:formsemestre_id>/<int:ue_id>", methods=["GET", "POST"])
@ -1337,9 +1346,7 @@ def formsemestre_enseignants_list(formsemestre_id, fmt="html"):
html_class="table_leftalign formsemestre_enseignants_list", html_class="table_leftalign formsemestre_enseignants_list",
html_with_td_classes=True, html_with_td_classes=True,
filename=scu.make_filename(f"Enseignants-{formsemestre.titre_annee()}"), filename=scu.make_filename(f"Enseignants-{formsemestre.titre_annee()}"),
html_title=html_sco_header.html_sem_header( html_title="""<h2 class="formsemestre">Enseignants du semestre</h2>""",
"Enseignants du semestre", with_page_header=False
),
base_url=f"{request.base_url}?formsemestre_id={formsemestre_id}", base_url=f"{request.base_url}?formsemestre_id={formsemestre_id}",
caption="""Tous les enseignants (responsables ou associés aux modules de caption="""Tous les enseignants (responsables ou associés aux modules de
ce semestre) apparaissent. Le nombre de saisies d'absences est indicatif.""", ce semestre) apparaissent. Le nombre de saisies d'absences est indicatif.""",
@ -1646,7 +1653,6 @@ def evaluation_delete(evaluation_id):
etat = sco_evaluations.do_evaluation_etat(evaluation.id) etat = sco_evaluations.do_evaluation_etat(evaluation.id)
H = [ H = [
f""" f"""
{html_sco_header.html_sem_header(tit, with_h2=False)}
<h2 class="formsemestre">Module <tt>{evaluation.moduleimpl.module.code}</tt> <h2 class="formsemestre">Module <tt>{evaluation.moduleimpl.module.code}</tt>
{evaluation.moduleimpl.module.titre_str()}</h2> {evaluation.moduleimpl.module.titre_str()}</h2>
<h3>{tit}</h3> <h3>{tit}</h3>
@ -1682,7 +1688,7 @@ def evaluation_delete(evaluation_id):
</p> </p>
</div>""" </div>"""
) )
return "\n".join(H) + html_sco_header.sco_footer() return render_template("sco_page.j2", title=tit, content="\n".join(H))
if warning: if warning:
H.append("""</div>""") H.append("""</div>""")
@ -1695,7 +1701,7 @@ def evaluation_delete(evaluation_id):
cancelbutton="Annuler", cancelbutton="Annuler",
) )
if tf[0] == 0: if tf[0] == 0:
return "\n".join(H) + tf[1] + html_sco_header.sco_footer() return render_template("sco_page.j2", title=tit, content="\n".join(H) + tf[1])
elif tf[0] == -1: elif tf[0] == -1:
return flask.redirect( return flask.redirect(
url_for( url_for(
@ -1706,14 +1712,15 @@ def evaluation_delete(evaluation_id):
) )
else: else:
evaluation.delete() evaluation.delete()
return ( return render_template(
"\n".join(H) "sco_page.j2",
title=tit,
content="\n".join(H)
+ f"""<p>OK, évaluation supprimée.</p> + f"""<p>OK, évaluation supprimée.</p>
<p><a class="stdlink" href="{ <p><a class="stdlink" href="{
url_for("notes.moduleimpl_status", scodoc_dept=g.scodoc_dept, url_for("notes.moduleimpl_status", scodoc_dept=g.scodoc_dept,
moduleimpl_id=evaluation.moduleimpl_id) moduleimpl_id=evaluation.moduleimpl_id)
}">Continuer</a></p>""" }">Continuer</a></p>""",
+ html_sco_header.sco_footer()
) )
@ -1771,7 +1778,6 @@ def evaluation_listenotes():
content=content, content=content,
title=page_title, title=page_title,
cssstyles=["css/verticalhisto.css"], cssstyles=["css/verticalhisto.css"],
javascripts=["js/etud_info.js"],
) )
return content return content

View File

@ -1961,14 +1961,15 @@ def check_group_apogee(group_id, etat=None, fix=False, fixmail=False):
etat = etat or None etat = etat or None
members, group, _, sem, _ = sco_groups.get_group_infos(group_id, etat=etat) members, group, _, sem, _ = sco_groups.get_group_infos(group_id, etat=etat)
formsemestre_id = group["formsemestre_id"] formsemestre_id = group["formsemestre_id"]
title = f"""Étudiants du {group["group_name"] or "semestre"}"""
cnx = ndb.GetDBConnexion() cnx = ndb.GetDBConnexion()
H = [ H = [
html_sco_header.html_sem_header( f"""<h2 class="formsemestre">{title}</h2>
"Étudiants du %s" % (group["group_name"] or "semestre") <table class="sortable" id="listegroupe">
), <tr>
'<table class="sortable" id="listegroupe">', <th>Nom</th><th>Nom usuel</th><th>Prénom</th><th>Mail</th>
"<tr><th>Nom</th><th>Nom usuel</th><th>Prénom</th><th>Mail</th><th>NIP (ScoDoc)</th><th>Apogée</th></tr>", <th>NIP (ScoDoc)</th><th>Apogée</th>
</tr>"""
] ]
nerrs = 0 # nombre d'anomalies détectées nerrs = 0 # nombre d'anomalies détectées
nfix = 0 # nb codes changes nfix = 0 # nb codes changes
@ -2090,8 +2091,7 @@ def check_group_apogee(group_id, etat=None, fix=False, fixmail=False):
formsemestre_id, formsemestre_id,
) )
) )
return render_template("sco_page.j2", title=title, content="\n".join(H))
return "\n".join(H) + html_sco_header.sco_footer()
@bp.route("/export_etudiants_courants") @bp.route("/export_etudiants_courants")
@ -2483,8 +2483,11 @@ def formsemestre_import_etud_admission(
diag += "</ul>" diag += "</ul>"
diag_by_sem[formsemestre.id] = diag diag_by_sem[formsemestre.id] = diag
return f""" return render_template(
{ html_sco_header.html_sem_header("Ré-import données admission") } "sco_page.j2",
title="Ré-import données admission",
content=f"""
<h2>-import données admission</h2>
<h3>Opération effectuée</h3> <h3>Opération effectuée</h3>
<p>Sur le(s) semestres(s):</p> <p>Sur le(s) semestres(s):</p>
<ul> <ul>
@ -2492,8 +2495,8 @@ def formsemestre_import_etud_admission(
{ '</li><li>'.join( [(s.html_link_status() + diag_by_sem[s.id]) for s in formsemestres ]) } { '</li><li>'.join( [(s.html_link_status() + diag_by_sem[s.id]) for s in formsemestres ]) }
</li> </li>
</ul> </ul>
{ html_sco_header.sco_footer() } """,
""" )
sco_publish( sco_publish(