diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index 4506eed01..322958165 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -187,7 +187,7 @@ class FormSemestre(db.Model): def get_formsemestre( cls, formsemestre_id: int | str, dept_id: int = None ) -> "FormSemestre": - """ "FormSemestre ou 404, cherche uniquement dans le département spécifié ou le courant""" + """FormSemestre ou 404, cherche uniquement dans le département spécifié ou le courant""" if not isinstance(formsemestre_id, int): try: formsemestre_id = int(formsemestre_id) diff --git a/app/models/moduleimpls.py b/app/models/moduleimpls.py index b674ed996..9cb168eb9 100644 --- a/app/models/moduleimpls.py +++ b/app/models/moduleimpls.py @@ -2,6 +2,7 @@ """ScoDoc models: moduleimpls """ import pandas as pd +from flask import abort, g from flask_sqlalchemy.query import Query from app import db @@ -82,6 +83,23 @@ class ModuleImpl(db.Model): df_cache.EvaluationsPoidsCache.set(self.id, evaluations_poids) return evaluations_poids + @classmethod + def get_modimpl(cls, moduleimpl_id: int | str, dept_id: int = None) -> "ModuleImpl": + """FormSemestre ou 404, cherche uniquement dans le département spécifié ou le courant.""" + from app.models.formsemestre import FormSemestre + + if not isinstance(moduleimpl_id, int): + try: + moduleimpl_id = int(moduleimpl_id) + except (TypeError, ValueError): + abort(404, "moduleimpl_id invalide") + if g.scodoc_dept: + dept_id = dept_id if dept_id is not None else g.scodoc_dept_id + query = cls.query.filter_by(id=moduleimpl_id) + if dept_id is not None: + query = query.join(FormSemestre).filter_by(dept_id=dept_id) + return query.first_or_404() + def invalidate_evaluations_poids(self): """Invalide poids cachés""" df_cache.EvaluationsPoidsCache.delete(self.id) diff --git a/app/scodoc/sco_moduleimpl_inscriptions.py b/app/scodoc/sco_moduleimpl_inscriptions.py index 34b3d3bd6..487368f0c 100644 --- a/app/scodoc/sco_moduleimpl_inscriptions.py +++ b/app/scodoc/sco_moduleimpl_inscriptions.py @@ -40,6 +40,7 @@ from app.comp.res_compat import NotesTableCompat from app.models import ( FormSemestre, Identite, + ModuleImpl, Partition, ScolarFormSemestreValidation, UniteEns, @@ -52,7 +53,6 @@ from app.scodoc import codes_cursus from app.scodoc import sco_edit_module from app.scodoc import sco_edit_ue from app.scodoc import sco_etud -from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_groups from app.scodoc import sco_moduleimpl @@ -63,7 +63,9 @@ import app.scodoc.sco_utils as scu from app.tables import list_etuds -def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): +def moduleimpl_inscriptions_edit( + moduleimpl_id, etudids: list[int] | None = None, submitted=False +): """Formulaire inscription des etudiants a ce module * Gestion des inscriptions Nom TD TA TP (triable) @@ -75,12 +77,12 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): * Si pas les droits: idem en readonly """ - M = sco_moduleimpl.moduleimpl_list(moduleimpl_id=moduleimpl_id)[0] - formsemestre_id = M["formsemestre_id"] - mod = sco_edit_module.module_list(args={"module_id": M["module_id"]})[0] - sem = sco_formsemestre.get_formsemestre(formsemestre_id) + etudids = etudids or [] + modimpl = ModuleImpl.get_modimpl(moduleimpl_id) + module = modimpl.module + formsemestre = modimpl.formsemestre # -- check lock - if not sem["etat"]: + if not formsemestre.etat: raise ScoValueError("opération impossible: semestre verrouille") header = html_sco_header.sco_header( page_title="Inscription au module", @@ -90,25 +92,23 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): footer = html_sco_header.sco_footer() H = [ header, - """

Inscriptions au module %s (%s)

+ f"""

Inscriptions au module {module.titre or "(module sans titre)"} ({module.code})

Cette page permet d'éditer les étudiants inscrits à ce module (ils doivent évidemment être inscrits au semestre). - Les étudiants cochés sont (ou seront) inscrits. Vous pouvez facilement inscrire ou + Les étudiants cochés sont (ou seront) inscrits. Vous pouvez inscrire ou désinscrire tous les étudiants d'un groupe à l'aide des menus "Ajouter" et "Enlever".

-

Aucune modification n'est prise en compte tant que l'on n'appuie pas sur le bouton - "Appliquer les modifications". +

Aucune modification n'est prise en compte tant que l'on n'appuie pas + sur le bouton "Appliquer les modifications".

- """ - % ( - moduleimpl_id, - mod["titre"] or "(module sans titre)", - mod["code"] or "(module sans code)", - ), + """, ] # Liste des inscrits à ce semestre inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_listinscrits( - formsemestre_id + formsemestre.id ) for ins in inscrits: etuds_info = sco_etud.get_etud_info(etudid=ins["etudid"], filled=1) @@ -121,12 +121,10 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): ) ins["etud"] = etuds_info[0] inscrits.sort(key=lambda inscr: sco_etud.etud_sort_key(inscr["etud"])) - in_m = sco_moduleimpl.do_moduleimpl_inscription_list( - moduleimpl_id=M["moduleimpl_id"] - ) - in_module = set([x["etudid"] for x in in_m]) + in_m = sco_moduleimpl.do_moduleimpl_inscription_list(moduleimpl_id=modimpl.id) + in_module = {x["etudid"] for x in in_m} # - partitions = sco_groups.get_partitions_list(formsemestre_id) + partitions = sco_groups.get_partitions_list(formsemestre.id) # if not submitted: H.append( @@ -149,27 +147,32 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): } } - """ + + + """ ) H.append( f"""
- + -

- - { _make_menu(partitions, "Ajouter", "true") } - { _make_menu(partitions, "Enlever", "false")} -
-


- +
+ { _make_menu(partitions, "Ajouter", "true") } + { _make_menu(partitions, "Enlever", "false")} +
+
+ - + """ ) for partition in partitions: if partition["partition_name"]: - H.append("" % partition["partition_name"]) - H.append("") + H.append(f"") + H.append("") for ins in inscrits: etud = ins["etud"] @@ -178,24 +181,20 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): else: checked = "" H.append( - """""") - groups = sco_groups.get_etud_groups(etud["etudid"], formsemestre_id) + groups = sco_groups.get_etud_groups(etud["etudid"], formsemestre.id) for partition in partitions: if partition["partition_name"]: gr_name = "" @@ -205,11 +204,11 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): break # gr_name == '' si etud non inscrit dans un groupe de cette partition H.append(f"") - H.append("""
NomNom%s
{partition['partition_name']}
""" - % (etud["etudid"], checked) + f"""
""" ) H.append( - """%s""" - % ( + f"""{etud['nomprenom']}""" ) H.append("""{gr_name}
""") + H.append("""""") else: # SUBMISSION # inscrit a ce module tous les etuds selectionnes sco_moduleimpl.do_moduleimpl_inscrit_etuds( - moduleimpl_id, formsemestre_id, etuds, reset=True + moduleimpl_id, formsemestre.id, etudids, reset=True ) return flask.redirect( url_for( @@ -225,10 +224,10 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False): def _make_menu(partitions: list[dict], title="", check="true") -> str: """Menu with list of all groups""" - items = [{"title": "Tous", "attr": "onclick=\"group_select('', -1, %s)\"" % check}] + items = [{"title": "Tous", "attr": f"onclick=\"group_select('', -1, {check})\""}] p_idx = 0 for partition in partitions: - if partition["partition_name"] != None: + if partition["partition_name"] is not None: p_idx += 1 for group in sco_groups.get_partition_groups(partition): items.append( @@ -240,9 +239,9 @@ def _make_menu(partitions: list[dict], title="", check="true") -> str: } ) return ( - '' + '
' + htmlutils.make_menu(title, items, alone=True) - + "" + + "
" ) diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index f42cc0f6d..ac2c691a3 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -1736,7 +1736,9 @@ formsemestre_page_title .lock img { width: 200px !important; } -span.inscr_addremove_menu { +div.inscr_addremove_menu { + display: inline-block; + margin: 8px 0px; width: 150px; } diff --git a/sco_version.py b/sco_version.py index 7b986ac6c..6535cd674 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.6.78" +SCOVERSION = "9.6.79" SCONAME = "ScoDoc"