diff --git a/app/scodoc/sco_formsemestre_edit.py b/app/scodoc/sco_formsemestre_edit.py index 49599ce5f7..2677a6e2f4 100644 --- a/app/scodoc/sco_formsemestre_edit.py +++ b/app/scodoc/sco_formsemestre_edit.py @@ -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", }, ) @@ -1259,34 +1258,54 @@ def formsemestre_associate_new_version( else: disabled = "" H.append( - f"""
{s['titremois']}
""" ) return scu.confirm_dialog( - """

Associer à une nouvelle version de formation non verrouillée ?

-

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.

-

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"""

Associer à une nouvelle version de formation non verrouillée ?

+

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.

-

Si vous voulez associer aussi d'autres semestres à la nouvelle version, cochez-les:

""" +

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...). +

+

Si vous souhaitez créer un programme pour de futurs semestres, + utilisez plutôt Créer une nouvelle version. +

+
+

Si vous voulez associer aussi d'autres semestres à la nouvelle + version, cochez-les: +

""" + "".join(H) + "
", 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"), """
Attention !

A n'utiliser qu'en cas d'erreur lors de la saisie d'une formation. Normalement, -un semestre ne doit jamais être supprimé (on perd la mémoire des notes et de tous les événements liés à ce semestre !).

+un semestre ne doit jamais être supprimé +(on perd la mémoire des notes et de tous les événements liés à ce semestre !). +

-

Tous les modules de ce semestre seront supprimés. Ceci n'est possible que - si :

-
    -
  1. aucune décision de jury n'a été entrée dans ce semestre;
  2. -
  3. et aucun étudiant de ce semestre ne le compense avec un autre semestre.
  4. -
""", +

Tous les modules de ce semestre seront supprimés. +Ceci n'est possible que si : +

+
    +
  1. aucune décision de jury n'a été entrée dans ce semestre;
  2. +
  3. et aucun étudiant de ce semestre ne le compense avec un autre semestre.
  4. +
+
""", ] evals = sco_evaluation_db.do_evaluation_list_in_formsemestre(formsemestre_id) if evals: H.append( - """

Attention: il y a %d évaluations dans ce semestre (sa suppression entrainera l'effacement définif des notes) !

""" - % len(evals) + f"""

Attention: il y a {len(evals)} évaluations + dans ce semestre + (sa suppression entrainera l'effacement définif des notes) !

""" ) 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( diff --git a/app/scodoc/sco_formsemestre_status.py b/app/scodoc/sco_formsemestre_status.py index 246a3c9afe..f7e0613443 100644 --- a/app/scodoc/sco_formsemestre_status.py +++ b/app/scodoc/sco_formsemestre_status.py @@ -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( - '

Listes de %(titre)s (%(mois_debut)s - %(mois_fin)s)

' - % sem + f"""

Listes de {formsemestre.titre} + ({formsemestre.mois_debut()} - {formsemestre.mois_fin()})

""" ) - 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""" absences @@ -803,7 +804,8 @@ def _make_listes_sem(sem, with_absences=True):
- + @@ -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"""""" + form_abs_tmpl += f"""""" date = date.next_day() form_abs_tmpl += f""" @@ -828,7 +832,7 @@ def _make_listes_sem(sem, with_absences=True): # H.append('
') # 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("

Tous les étudiants

") 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("") else: H.append('

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""" (créer)""" ) H.append("

") - 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"""

Ajouter une partition

""" @@ -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" ), - """

Tableau de bord: cliquez sur un module pour saisir des notes

""", + """

Tableau de bord: + cliquez sur un module pour saisir des notes +

""", ] 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"""
- """, - _TABLEAU_MODULES_HEAD, - f""" - - Ressources - """, - formsemestre_tableau_modules( + {_TABLEAU_MODULES_HEAD} + + + Ressources + + + {formsemestre_tableau_modules( ressources, nt, formsemestre_id, can_edit=can_edit, show_ues=False - ), - f""" - - SAÉs - """, + )} + + + SAÉs + + """, formsemestre_tableau_modules( saes, nt, formsemestre_id, can_edit=can_edit, show_ues=False ), ] if autres: H += [ - f""" + """ Autres modules """, @@ -1106,7 +1109,7 @@ def formsemestre_status(formsemestre_id=None): # --- LISTE DES ETUDIANTS H += [ '
', - _make_listes_sem(sem), + _make_listes_sem(formsemestre), "
", ] # --- Lien mail enseignants: diff --git a/app/scodoc/sco_undo_notes.py b/app/scodoc/sco_undo_notes.py index 4743ca6cf1..53fda830d7 100644 --- a/app/scodoc/sco_undo_notes.py +++ b/app/scodoc/sco_undo_notes.py @@ -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="

Saisies de notes dans %s

" % sem["titreannee"], + html_title=f"

Saisies de notes dans {formsemestre.titreannee()}

", 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)