forked from ScoDoc/ScoDoc
Un peu de modernisation de code
This commit is contained in:
parent
9b54980b31
commit
d3f79c1592
@ -1236,12 +1236,11 @@ def formsemestre_associate_new_version(
|
||||
other_formsemestre_ids = [int(x) for x in other_formsemestre_ids]
|
||||
if not dialog_confirmed:
|
||||
# dresse le liste des semestres de la meme formation et version
|
||||
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
|
||||
F = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0]
|
||||
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||
othersems = sco_formsemestre.do_formsemestre_list(
|
||||
args={
|
||||
"formation_id": F["formation_id"],
|
||||
"version": F["version"],
|
||||
"formation_id": formsemestre.formation.id,
|
||||
"version": formsemestre.formation.version,
|
||||
"etat": "1",
|
||||
},
|
||||
)
|
||||
@ -1265,28 +1264,48 @@ def formsemestre_associate_new_version(
|
||||
)
|
||||
|
||||
return scu.confirm_dialog(
|
||||
"""<h2>Associer à une nouvelle version de formation non verrouillée ?</h2>
|
||||
<p>Le programme pédagogique ("formation") va être dupliqué pour que vous puissiez le modifier sans affecter les autres semestres. Les autres paramètres (étudiants, notes...) du semestre seront inchangés.</p>
|
||||
<p>Veillez à ne pas abuser de cette possibilité, car créer trop de versions de formations va vous compliquer la gestion (à vous de garder trace des différences et à ne pas vous tromper par la suite...).
|
||||
f"""<h2>Associer à une nouvelle version de formation non verrouillée ?</h2>
|
||||
<p class="help">Le programme pédagogique ("formation") va être dupliqué
|
||||
pour que vous puissiez le modifier sans affecter les autres
|
||||
semestres. Les autres paramètres (étudiants, notes...) du
|
||||
semestre seront inchangés.
|
||||
</p>
|
||||
<div class="othersemlist"><p>Si vous voulez associer aussi d'autres semestres à la nouvelle version, cochez-les:</p>"""
|
||||
<p class="help">Veillez à ne pas abuser de cette possibilité, car créer
|
||||
trop de versions de formations va vous compliquer la gestion
|
||||
(à vous de garder trace des différences et à ne pas vous
|
||||
tromper par la suite...).
|
||||
</p>
|
||||
<p class="help">Si vous souhaitez créer un programme pour de futurs semestres,
|
||||
utilisez plutôt <a class="stdlink" href="{
|
||||
url_for('notes.formation_create_new_version',
|
||||
scodoc_dept=g.scodoc_dept, formation_id=formsemestre.formation.id
|
||||
)}">Créer une nouvelle version</a>.
|
||||
</p>
|
||||
<div class="othersemlist">
|
||||
<p>Si vous voulez associer aussi d'autres semestres à la nouvelle
|
||||
version, cochez-les:
|
||||
</p>"""
|
||||
+ "".join(H)
|
||||
+ "</div>",
|
||||
OK="Associer ces semestres à une nouvelle version",
|
||||
dest_url="",
|
||||
cancel_url="formsemestre_status?formsemestre_id=%s" % formsemestre_id,
|
||||
cancel_url=url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formsemestre_id=formsemestre_id,
|
||||
),
|
||||
parameters={"formsemestre_id": formsemestre_id},
|
||||
)
|
||||
else:
|
||||
do_formsemestres_associate_new_version(
|
||||
[formsemestre_id] + other_formsemestre_ids
|
||||
)
|
||||
flash("Semestre associé à une nouvelle version de la formation")
|
||||
return flask.redirect(
|
||||
url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formsemestre_id=formsemestre_id,
|
||||
head_message="Formation dupliquée",
|
||||
)
|
||||
)
|
||||
|
||||
@ -1365,31 +1384,34 @@ def _reassociate_moduleimpls(cnx, formsemestre_id, ues_old2new, modules_old2new)
|
||||
|
||||
def formsemestre_delete(formsemestre_id):
|
||||
"""Delete a formsemestre (affiche avertissements)"""
|
||||
sem = sco_formsemestre.get_formsemestre(formsemestre_id, raise_soft_exc=True)
|
||||
F = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0]
|
||||
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||
H = [
|
||||
html_sco_header.html_sem_header("Suppression du semestre"),
|
||||
"""<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,
|
||||
<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 !).</p>
|
||||
<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 !).
|
||||
</p>
|
||||
|
||||
<p class="help">Tous les modules de ce semestre seront supprimés. Ceci n'est possible que
|
||||
si :</p>
|
||||
<ol>
|
||||
<p class="help">Tous les modules de ce semestre seront supprimés.
|
||||
Ceci n'est possible que si :
|
||||
</p>
|
||||
<ol>
|
||||
<li>aucune décision de jury n'a été entrée dans ce semestre;</li>
|
||||
<li>et aucun étudiant de ce semestre ne le compense avec un autre semestre.</li>
|
||||
</ol></div>""",
|
||||
</ol>
|
||||
</div>""",
|
||||
]
|
||||
|
||||
evals = sco_evaluation_db.do_evaluation_list_in_formsemestre(formsemestre_id)
|
||||
if evals:
|
||||
H.append(
|
||||
"""<p class="warning">Attention: il y a %d évaluations dans ce semestre (sa suppression entrainera l'effacement définif des notes) !</p>"""
|
||||
% len(evals)
|
||||
f"""<p class="warning">Attention: il y a {len(evals)} évaluations
|
||||
dans ce semestre
|
||||
(sa suppression entrainera l'effacement définif des notes) !</p>"""
|
||||
)
|
||||
submit_label = (
|
||||
"Confirmer la suppression (du semestre et des %d évaluations !)"
|
||||
% len(evals)
|
||||
f"Confirmer la suppression (du semestre et des {len(evals)} évaluations !)"
|
||||
)
|
||||
else:
|
||||
submit_label = "Confirmer la suppression du semestre"
|
||||
@ -1397,7 +1419,7 @@ def formsemestre_delete(formsemestre_id):
|
||||
request.base_url,
|
||||
scu.get_request_args(),
|
||||
(("formsemestre_id", {"input_type": "hidden"}),),
|
||||
initvalues=F,
|
||||
initvalues=formsemestre.to_dict(),
|
||||
submitlabel=submit_label,
|
||||
cancelbutton="Annuler",
|
||||
)
|
||||
@ -1411,9 +1433,11 @@ def formsemestre_delete(formsemestre_id):
|
||||
return "\n".join(H) + html_sco_header.sco_footer()
|
||||
elif tf[0] == -1: # cancel
|
||||
return flask.redirect(
|
||||
scu.NotesURL()
|
||||
+ "/formsemestre_status?formsemestre_id="
|
||||
+ str(formsemestre_id)
|
||||
url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formsemestre_id=formsemestre_id,
|
||||
)
|
||||
)
|
||||
else:
|
||||
return flask.redirect(
|
||||
|
@ -770,13 +770,13 @@ def formsemestre_description(
|
||||
|
||||
|
||||
# genere liste html pour accès aux groupes de ce semestre
|
||||
def _make_listes_sem(sem, with_absences=True):
|
||||
def _make_listes_sem(formsemestre: FormSemestre, with_absences=True):
|
||||
# construit l'URL "destination"
|
||||
# (a laquelle on revient apres saisie absences)
|
||||
destination = url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formsemestre_id=sem["formsemestre_id"],
|
||||
formsemestre_id=formsemestre.id,
|
||||
)
|
||||
#
|
||||
H = []
|
||||
@ -786,15 +786,16 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
|
||||
#
|
||||
H.append(
|
||||
'<h3>Listes de %(titre)s <span class="infostitresem">(%(mois_debut)s - %(mois_fin)s)</span></h3>'
|
||||
% sem
|
||||
f"""<h3>Listes de {formsemestre.titre}
|
||||
<span class="infostitresem">({formsemestre.mois_debut()} - {formsemestre.mois_fin()})</span></h3>"""
|
||||
)
|
||||
|
||||
formsemestre_id = sem["formsemestre_id"]
|
||||
weekday = datetime.datetime.today().weekday()
|
||||
try:
|
||||
if with_absences:
|
||||
first_monday = sco_abs.ddmmyyyy(sem["date_debut"]).prev_monday()
|
||||
first_monday = sco_abs.ddmmyyyy(
|
||||
formsemestre.date_debut.strftime("%d/%m/%Y")
|
||||
).prev_monday()
|
||||
form_abs_tmpl = f"""
|
||||
<td>
|
||||
<a href="%(url_etat)s">absences</a>
|
||||
@ -803,7 +804,8 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
<form action="{url_for(
|
||||
"absences.SignaleAbsenceGrSemestre", scodoc_dept=g.scodoc_dept
|
||||
)}" method="get">
|
||||
<input type="hidden" name="datefin" value="{sem['date_fin']}"/>
|
||||
<input type="hidden" name="datefin" value="{
|
||||
formsemestre.date_fin.strftime("%d/%m/%Y")}"/>
|
||||
<input type="hidden" name="group_ids" value="%(group_id)s"/>
|
||||
<input type="hidden" name="destination" value="{destination}"/>
|
||||
<input type="submit" value="Saisir abs des" />
|
||||
@ -811,7 +813,9 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
"""
|
||||
date = first_monday
|
||||
for idx, jour in enumerate(sco_abs.day_names()):
|
||||
form_abs_tmpl += f"""<option value="{date}" {'selected' if idx == weekday else ''}>{jour}s</option>"""
|
||||
form_abs_tmpl += f"""<option value="{date}" {
|
||||
'selected' if idx == weekday else ''
|
||||
}>{jour}s</option>"""
|
||||
date = date.next_day()
|
||||
form_abs_tmpl += f"""
|
||||
</select>
|
||||
@ -828,7 +832,7 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
#
|
||||
H.append('<div id="grouplists">')
|
||||
# Genere liste pour chaque partition (categorie de groupes)
|
||||
for partition in sco_groups.get_partitions_list(sem["formsemestre_id"]):
|
||||
for partition in sco_groups.get_partitions_list(formsemestre.id):
|
||||
if not partition["partition_name"]:
|
||||
H.append("<h4>Tous les étudiants</h4>")
|
||||
else:
|
||||
@ -841,8 +845,8 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
group["url_etat"] = url_for(
|
||||
"absences.EtatAbsencesGr",
|
||||
group_ids=group["group_id"],
|
||||
debut=sem["date_debut"],
|
||||
fin=sem["date_fin"],
|
||||
debut=formsemestre.date_debut.strftime("%d/%m/%Y"),
|
||||
fin=formsemestre.date_fin.strftime("%d/%m/%Y"),
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
)
|
||||
if group["group_name"]:
|
||||
@ -872,7 +876,7 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
H.append("</table>")
|
||||
else:
|
||||
H.append('<p class="help indent">Aucun groupe dans cette partition')
|
||||
if sco_groups.sco_permissions_check.can_change_groups(formsemestre_id):
|
||||
if sco_groups.sco_permissions_check.can_change_groups(formsemestre.id):
|
||||
H.append(
|
||||
f""" (<a href="{url_for("scolar.affect_groups",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
@ -880,12 +884,12 @@ def _make_listes_sem(sem, with_absences=True):
|
||||
}" class="stdlink">créer</a>)"""
|
||||
)
|
||||
H.append("</p>")
|
||||
if sco_groups.sco_permissions_check.can_change_groups(formsemestre_id):
|
||||
if sco_groups.sco_permissions_check.can_change_groups(formsemestre.id):
|
||||
H.append(
|
||||
f"""<h4><a
|
||||
href="{
|
||||
url_for("scolar.edit_partition_form",
|
||||
formsemestre_id=formsemestre_id,
|
||||
formsemestre_id=formsemestre.id,
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
)
|
||||
}">Ajouter une partition</a></h4>"""
|
||||
@ -1004,25 +1008,21 @@ Il y a des notes en attente ! Le classement des étudiants n'a qu'une valeur ind
|
||||
def formsemestre_status(formsemestre_id=None):
|
||||
"""Tableau de bord semestre HTML"""
|
||||
# porté du DTML
|
||||
|
||||
sem = sco_formsemestre.get_formsemestre(formsemestre_id, raise_soft_exc=True)
|
||||
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||
modimpls = sco_moduleimpl.moduleimpl_withmodule_list(
|
||||
formsemestre_id=formsemestre_id
|
||||
)
|
||||
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||
nt = res_sem.load_formsemestre_results(formsemestre)
|
||||
|
||||
# Construit la liste de tous les enseignants de ce semestre:
|
||||
mails_enseignants = set(
|
||||
[sco_users.user_info(ens_id)["email"] for ens_id in sem["responsables"]]
|
||||
)
|
||||
mails_enseignants = set(u.email for u in formsemestre.responsables)
|
||||
for modimpl in modimpls:
|
||||
mails_enseignants.add(sco_users.user_info(modimpl["responsable_id"])["email"])
|
||||
mails_enseignants |= set(
|
||||
[sco_users.user_info(m["ens_id"])["email"] for m in modimpl["ens"]]
|
||||
)
|
||||
|
||||
can_edit = sco_formsemestre_edit.can_edit_sem(formsemestre_id, sem=sem)
|
||||
can_edit = formsemestre.can_be_edited_by(current_user)
|
||||
use_ue_coefs = sco_preferences.get_preference("use_ue_coefs", formsemestre_id)
|
||||
|
||||
H = [
|
||||
@ -1033,7 +1033,9 @@ def formsemestre_status(formsemestre_id=None):
|
||||
formsemestre_status_head(
|
||||
formsemestre_id=formsemestre_id, page_title="Tableau de bord"
|
||||
),
|
||||
"""<p><b style="font-size: 130%">Tableau de bord: </b><span class="help">cliquez sur un module pour saisir des notes</span></p>""",
|
||||
"""<p><b style="font-size: 130%">Tableau de bord: </b>
|
||||
<span class="help">cliquez sur un module pour saisir des notes</span>
|
||||
</p>""",
|
||||
]
|
||||
|
||||
if nt.expr_diagnostics:
|
||||
@ -1051,28 +1053,29 @@ def formsemestre_status(formsemestre_id=None):
|
||||
if m["module"]["module_type"] not in (ModuleType.RESSOURCE, ModuleType.SAE)
|
||||
]
|
||||
H += [
|
||||
"""
|
||||
f"""
|
||||
<div class="tableau_modules">
|
||||
""",
|
||||
_TABLEAU_MODULES_HEAD,
|
||||
f"""<tr class="formsemestre_status_cat">
|
||||
{_TABLEAU_MODULES_HEAD}
|
||||
<tr class="formsemestre_status_cat">
|
||||
<td colspan="5">
|
||||
<span class="status_module_cat">Ressources</span>
|
||||
</td></tr>""",
|
||||
formsemestre_tableau_modules(
|
||||
</td>
|
||||
</tr>
|
||||
{formsemestre_tableau_modules(
|
||||
ressources, nt, formsemestre_id, can_edit=can_edit, show_ues=False
|
||||
),
|
||||
f"""<tr class="formsemestre_status_cat">
|
||||
)}
|
||||
<tr class="formsemestre_status_cat">
|
||||
<td colspan="5">
|
||||
<span class="status_module_cat">SAÉs</span>
|
||||
</td></tr>""",
|
||||
</td>
|
||||
</tr>""",
|
||||
formsemestre_tableau_modules(
|
||||
saes, nt, formsemestre_id, can_edit=can_edit, show_ues=False
|
||||
),
|
||||
]
|
||||
if autres:
|
||||
H += [
|
||||
f"""<tr class="formsemestre_status_cat">
|
||||
"""<tr class="formsemestre_status_cat">
|
||||
<td colspan="5">
|
||||
<span class="status_module_cat">Autres modules</span>
|
||||
</td></tr>""",
|
||||
@ -1106,7 +1109,7 @@ def formsemestre_status(formsemestre_id=None):
|
||||
# --- LISTE DES ETUDIANTS
|
||||
H += [
|
||||
'<div id="groupes">',
|
||||
_make_listes_sem(sem),
|
||||
_make_listes_sem(formsemestre),
|
||||
"</div>",
|
||||
]
|
||||
# --- Lien mail enseignants:
|
||||
|
@ -48,13 +48,11 @@ Opérations:
|
||||
import datetime
|
||||
from flask import request
|
||||
|
||||
from app.models import FormSemestre
|
||||
from app.scodoc.intervals import intervalmap
|
||||
|
||||
import app.scodoc.sco_utils as scu
|
||||
import app.scodoc.notesdb as ndb
|
||||
from app.scodoc import sco_evaluations
|
||||
from app.scodoc import sco_evaluation_db
|
||||
from app.scodoc import sco_formsemestre
|
||||
from app.scodoc import sco_moduleimpl
|
||||
from app.scodoc import sco_preferences
|
||||
from app.scodoc import sco_users
|
||||
@ -179,9 +177,10 @@ def formsemestre_list_saisies_notes(formsemestre_id, format="html"):
|
||||
"""Table listant toutes les opérations de saisies de notes, dans toutes
|
||||
les évaluations du semestre.
|
||||
"""
|
||||
sem = sco_formsemestre.get_formsemestre(formsemestre_id, raise_soft_exc=True)
|
||||
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||
rows = ndb.SimpleDictFetch(
|
||||
"""SELECT i.nom, i.prenom, code_nip, n.*, mod.titre, e.description, e.jour, u.user_name, e.id as evaluation_id
|
||||
"""SELECT i.nom, i.prenom, code_nip, n.*, mod.titre, e.description, e.jour,
|
||||
u.user_name, e.id as evaluation_id
|
||||
FROM notes_notes n, notes_evaluation e, notes_moduleimpl mi,
|
||||
notes_modules mod, identite i, "user" u
|
||||
WHERE mi.id = e.moduleimpl_id
|
||||
@ -194,7 +193,7 @@ def formsemestre_list_saisies_notes(formsemestre_id, format="html"):
|
||||
""",
|
||||
{"formsemestre_id": formsemestre_id},
|
||||
)
|
||||
# Formatte les notes
|
||||
# Formate les notes
|
||||
keep_numeric = format in scu.FORMATS_NUMERIQUES
|
||||
for row in rows:
|
||||
row["value"] = scu.fmt_note(row["value"], keep_numeric=keep_numeric)
|
||||
@ -228,16 +227,14 @@ def formsemestre_list_saisies_notes(formsemestre_id, format="html"):
|
||||
titles=titles,
|
||||
columns_ids=columns_ids,
|
||||
rows=rows,
|
||||
html_title="<h2>Saisies de notes dans %s</h2>" % sem["titreannee"],
|
||||
html_title=f"<h2>Saisies de notes dans {formsemestre.titreannee()}</h2>",
|
||||
html_class="table_leftalign table_coldate gt_table_searchable",
|
||||
html_class_ignore_default=True,
|
||||
html_sortable=True,
|
||||
caption="Saisies de notes dans %s" % sem["titreannee"],
|
||||
caption=f"Saisies de notes dans {formsemestre.titreannee()}",
|
||||
preferences=sco_preferences.SemPreferences(formsemestre_id),
|
||||
base_url="%s?formsemestre_id=%s" % (request.base_url, formsemestre_id),
|
||||
origin="Généré par %s le " % sco_version.SCONAME
|
||||
+ scu.timedate_human_repr()
|
||||
+ "",
|
||||
origin=f"Généré par {sco_version.SCONAME} le " + scu.timedate_human_repr() + "",
|
||||
)
|
||||
return tab.make_page(format=format)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user