forked from ScoDoc/ScoDoc
BUT/parcours: inscriptions, visualisation des parcours
This commit is contained in:
parent
8411292255
commit
d78fb13821
@ -125,6 +125,7 @@ class FormSemestre(db.Model):
|
|||||||
"Partition",
|
"Partition",
|
||||||
backref=db.backref("formsemestre", lazy=True),
|
backref=db.backref("formsemestre", lazy=True),
|
||||||
lazy="dynamic",
|
lazy="dynamic",
|
||||||
|
order_by="Partition.numero",
|
||||||
)
|
)
|
||||||
# Ancien id ScoDoc7 pour les migrations de bases anciennes
|
# Ancien id ScoDoc7 pour les migrations de bases anciennes
|
||||||
# ne pas utiliser après migrate_scodoc7_dept_archives
|
# ne pas utiliser après migrate_scodoc7_dept_archives
|
||||||
|
@ -47,6 +47,7 @@ class Partition(db.Model):
|
|||||||
backref=db.backref("partition", lazy=True),
|
backref=db.backref("partition", lazy=True),
|
||||||
lazy="dynamic",
|
lazy="dynamic",
|
||||||
cascade="all, delete-orphan",
|
cascade="all, delete-orphan",
|
||||||
|
order_by="GroupDescr.numero",
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@ -109,7 +110,7 @@ class GroupDescr(db.Model):
|
|||||||
partition_id = db.Column(db.Integer, db.ForeignKey("partition.id"))
|
partition_id = db.Column(db.Integer, db.ForeignKey("partition.id"))
|
||||||
# "A", "C2", ... (NULL for 'all'):
|
# "A", "C2", ... (NULL for 'all'):
|
||||||
group_name = db.Column(db.String(GROUPNAME_STR_LEN))
|
group_name = db.Column(db.String(GROUPNAME_STR_LEN))
|
||||||
# Numero = ordre de presentation)
|
# Numero = ordre de presentation
|
||||||
numero = db.Column(db.Integer)
|
numero = db.Column(db.Integer)
|
||||||
|
|
||||||
etuds = db.relationship(
|
etuds = db.relationship(
|
||||||
|
@ -51,6 +51,7 @@ class Module(db.Model):
|
|||||||
secondary=parcours_modules,
|
secondary=parcours_modules,
|
||||||
lazy="subquery",
|
lazy="subquery",
|
||||||
backref=db.backref("modules", lazy=True),
|
backref=db.backref("modules", lazy=True),
|
||||||
|
order_by="ApcParcours.numero",
|
||||||
)
|
)
|
||||||
|
|
||||||
app_critiques = db.relationship(
|
app_critiques = db.relationship(
|
||||||
@ -115,6 +116,19 @@ class Module(db.Model):
|
|||||||
"""
|
"""
|
||||||
return scu.ModuleType.get_abbrev(self.module_type)
|
return scu.ModuleType.get_abbrev(self.module_type)
|
||||||
|
|
||||||
|
def sort_key_apc(self) -> tuple:
|
||||||
|
"""Clé de tri pour avoir
|
||||||
|
présentation par type (res, sae), parcours, type, numéro
|
||||||
|
"""
|
||||||
|
if (
|
||||||
|
len(self.parcours) == self.formation.referentiel_competence.parcours.count()
|
||||||
|
or len(self.parcours) == 0
|
||||||
|
):
|
||||||
|
key_parcours = ""
|
||||||
|
else:
|
||||||
|
key_parcours = "/".join([p.code for p in self.parcours])
|
||||||
|
return self.module_type, key_parcours, self.numero
|
||||||
|
|
||||||
def set_ue_coef(self, ue, coef: float) -> None:
|
def set_ue_coef(self, ue, coef: float) -> None:
|
||||||
"""Set coef module vers cette UE"""
|
"""Set coef module vers cette UE"""
|
||||||
self.update_ue_coef_dict({ue.id: coef})
|
self.update_ue_coef_dict({ue.id: coef})
|
||||||
|
@ -290,7 +290,7 @@ def formation_import_xml(doc: str, import_tags=True):
|
|||||||
module.parcours.append(parcours)
|
module.parcours.append(parcours)
|
||||||
db.session.add(module)
|
db.session.add(module)
|
||||||
else:
|
else:
|
||||||
log("Warning: parcours {code_parcours} inexistant !")
|
log(f"Warning: parcours {code_parcours} inexistant !")
|
||||||
if import_tags and tag_names:
|
if import_tags and tag_names:
|
||||||
sco_tag_module.module_tag_set(mod_id, tag_names)
|
sco_tag_module.module_tag_set(mod_id, tag_names)
|
||||||
if module.is_apc() and ue_coef_dict:
|
if module.is_apc() and ue_coef_dict:
|
||||||
|
@ -254,6 +254,7 @@ def do_formsemestre_create(args, silent=False):
|
|||||||
formsemestre_id,
|
formsemestre_id,
|
||||||
default=True,
|
default=True,
|
||||||
redirect=0,
|
redirect=0,
|
||||||
|
numero=1000000, # à la fin
|
||||||
)
|
)
|
||||||
_group_id = sco_groups.create_group(partition_id, default=True)
|
_group_id = sco_groups.create_group(partition_id, default=True)
|
||||||
|
|
||||||
|
@ -105,8 +105,9 @@ def formsemestre_editwithmodules(formsemestre_id):
|
|||||||
]
|
]
|
||||||
if not sem["etat"]:
|
if not sem["etat"]:
|
||||||
H.append(
|
H.append(
|
||||||
"""<p>%s<b>Ce semestre est verrouillé.</b></p>"""
|
f"""<p>{scu.icontag(
|
||||||
% scu.icontag("lock_img", border="0", title="Semestre verrouillé")
|
"lock_img", border="0", title="Semestre verrouillé")
|
||||||
|
}<b>Ce semestre est verrouillé.</b></p>"""
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
r = do_formsemestre_createwithmodules(edit=1)
|
r = do_formsemestre_createwithmodules(edit=1)
|
||||||
@ -159,7 +160,7 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
"vous n'avez pas le droit d'effectuer cette opération"
|
"vous n'avez pas le droit d'effectuer cette opération"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Liste des enseignants avec forme pour affichage / saisie avec suggestion
|
# Liste des enseignants avec form pour affichage / saisie avec suggestion
|
||||||
# attention: il faut prendre ici tous les utilisateurs, même inactifs, car
|
# attention: il faut prendre ici tous les utilisateurs, même inactifs, car
|
||||||
# les responsables de modules d'anciens semestres peuvent ne plus être actifs.
|
# les responsables de modules d'anciens semestres peuvent ne plus être actifs.
|
||||||
# Mais la suggestion utilise get_user_list_xml() qui ne suggérera que les actifs.
|
# Mais la suggestion utilise get_user_list_xml() qui ne suggérera que les actifs.
|
||||||
@ -226,7 +227,11 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
semestre_id_labels.append(f"S{sid}")
|
semestre_id_labels.append(f"S{sid}")
|
||||||
# Liste des modules dans cette formation
|
# Liste des modules dans cette formation
|
||||||
if is_apc:
|
if is_apc:
|
||||||
modules = formation.modules.order_by(Module.module_type, Module.numero)
|
# BUT: trie par type (res, sae), parcours, numéro
|
||||||
|
modules = sorted(
|
||||||
|
formation.modules,
|
||||||
|
key=lambda m: m.sort_key_apc(),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
modules = (
|
modules = (
|
||||||
Module.query.filter(
|
Module.query.filter(
|
||||||
@ -235,11 +240,10 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
.order_by(Module.module_type, UniteEns.numero, Module.numero)
|
.order_by(Module.module_type, UniteEns.numero, Module.numero)
|
||||||
.all()
|
.all()
|
||||||
)
|
)
|
||||||
mods = [mod.to_dict() for mod in modules]
|
|
||||||
# Pour regroupement des modules par semestres:
|
# Pour regroupement des modules par semestres:
|
||||||
semestre_ids = {}
|
semestre_ids = {}
|
||||||
for mod in mods:
|
for mod in modules:
|
||||||
semestre_ids[mod["semestre_id"]] = 1
|
semestre_ids[mod.semestre_id] = 1
|
||||||
semestre_ids = list(semestre_ids.keys())
|
semestre_ids = list(semestre_ids.keys())
|
||||||
semestre_ids.sort()
|
semestre_ids.sort()
|
||||||
|
|
||||||
@ -607,16 +611,16 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
for mod in mods:
|
for mod in modules:
|
||||||
if mod["semestre_id"] == semestre_id and (
|
if mod.semestre_id == semestre_id and (
|
||||||
(not edit) # creation => tous modules
|
(not edit) # creation => tous modules
|
||||||
or (not is_apc) # pas BUT, on peut mixer les semestres
|
or (not is_apc) # pas BUT, on peut mixer les semestres
|
||||||
or (semestre_id == formsemestre.semestre_id) # module du semestre
|
or (semestre_id == formsemestre.semestre_id) # module du semestre
|
||||||
or (mod["module_id"] in module_ids_set) # module déjà présent
|
or (mod.id in module_ids_set) # module déjà présent
|
||||||
):
|
):
|
||||||
nbmod += 1
|
nbmod += 1
|
||||||
if edit:
|
if edit:
|
||||||
select_name = f"{mod['module_id']}!group_id"
|
select_name = f"{mod.id}!group_id"
|
||||||
|
|
||||||
def opt_selected(gid):
|
def opt_selected(gid):
|
||||||
if gid == vals.get(select_name):
|
if gid == vals.get(select_name):
|
||||||
@ -624,26 +628,34 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
if mod["module_id"] in module_ids_set:
|
if mod.id in module_ids_set:
|
||||||
|
# pas de menu inscription si le module est déjà présent
|
||||||
disabled = "disabled"
|
disabled = "disabled"
|
||||||
else:
|
else:
|
||||||
disabled = ""
|
disabled = ""
|
||||||
fcg = '<select name="%s" %s>' % (select_name, disabled)
|
fcg = f'<select name="{select_name}" {disabled}>'
|
||||||
default_group_id = sco_groups.get_default_group(formsemestre_id)
|
default_group_id = sco_groups.get_default_group(formsemestre_id)
|
||||||
fcg += '<option value="%s" %s>Tous</option>' % (
|
fcg += f"""<option value="{default_group_id}" {
|
||||||
default_group_id,
|
opt_selected(default_group_id)}>Tous</option>"""
|
||||||
opt_selected(default_group_id),
|
|
||||||
)
|
fcg += f'<option value="" {opt_selected("")}>Aucun</option>'
|
||||||
fcg += '<option value="" %s>Aucun</option>' % opt_selected("")
|
for partition in formsemestre.partitions:
|
||||||
for p in sco_groups.get_partitions_list(formsemestre_id):
|
if partition.partition_name is not None:
|
||||||
if p["partition_name"] != None:
|
for group in partition.groups:
|
||||||
for group in sco_groups.get_partition_groups(p):
|
# Si le module n'est associé qu'à un parcours, propose d'y inscrire les étudiants directement
|
||||||
fcg += '<option value="%s" %s>%s %s</option>' % (
|
if (
|
||||||
group["group_id"],
|
partition.partition_name == scu.PARTITION_PARCOURS
|
||||||
opt_selected(group["group_id"]),
|
and len(mod.parcours) == 1
|
||||||
p["partition_name"],
|
and group.group_name == mod.parcours[0].code
|
||||||
group["group_name"],
|
):
|
||||||
)
|
selected = "selected"
|
||||||
|
else:
|
||||||
|
selected = opt_selected(group.id)
|
||||||
|
# print(
|
||||||
|
# f"{partition.partition_name} {group.group_name} {selected}"
|
||||||
|
# )
|
||||||
|
fcg += f"""<option value="{group.id}" {selected
|
||||||
|
}>{partition.partition_name} {group.group_name}</option>"""
|
||||||
fcg += "</select>"
|
fcg += "</select>"
|
||||||
itemtemplate = f"""<tr {tr_class}>
|
itemtemplate = f"""<tr {tr_class}>
|
||||||
<td class="tf-fieldlabel">%(label)s</td>
|
<td class="tf-fieldlabel">%(label)s</td>
|
||||||
@ -657,12 +669,12 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
</tr>"""
|
</tr>"""
|
||||||
modform.append(
|
modform.append(
|
||||||
(
|
(
|
||||||
"MI" + str(mod["module_id"]),
|
"MI" + str(mod.id),
|
||||||
{
|
{
|
||||||
"input_type": "text_suggest",
|
"input_type": "text_suggest",
|
||||||
"size": 50,
|
"size": 50,
|
||||||
"withcheckbox": True,
|
"withcheckbox": True,
|
||||||
"title": "%s %s" % (mod["code"] or "", mod["titre"] or ""),
|
"title": "%s %s" % (mod.code or "", mod.titre or ""),
|
||||||
"allowed_values": allowed_user_names,
|
"allowed_values": allowed_user_names,
|
||||||
"template": itemtemplate,
|
"template": itemtemplate,
|
||||||
"text_suggest_options": {
|
"text_suggest_options": {
|
||||||
@ -689,11 +701,6 @@ def do_formsemestre_createwithmodules(edit=False):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
if edit:
|
if edit:
|
||||||
# modform.append( ('inscrire_etudslist',
|
|
||||||
# { 'input_type' : 'checkbox',
|
|
||||||
# 'allowed_values' : ['X'], 'labels' : [ '' ],
|
|
||||||
# 'title' : '' ,
|
|
||||||
# 'explanation' : 'inscrire tous les étudiants du semestre aux modules ajoutés'}) )
|
|
||||||
submitlabel = "Modifier ce semestre"
|
submitlabel = "Modifier ce semestre"
|
||||||
else:
|
else:
|
||||||
submitlabel = "Créer ce semestre de formation"
|
submitlabel = "Créer ce semestre de formation"
|
||||||
|
@ -137,7 +137,9 @@ def get_partition(partition_id):
|
|||||||
|
|
||||||
|
|
||||||
def get_partitions_list(formsemestre_id, with_default=True) -> list[dict]:
|
def get_partitions_list(formsemestre_id, with_default=True) -> list[dict]:
|
||||||
"""Liste des partitions pour ce semestre (list of dicts)"""
|
"""Liste des partitions pour ce semestre (list of dicts),
|
||||||
|
triées par numéro, avec la partition par défaut en fin de liste.
|
||||||
|
"""
|
||||||
partitions = ndb.SimpleDictFetch(
|
partitions = ndb.SimpleDictFetch(
|
||||||
"""SELECT p.id AS partition_id, p.*
|
"""SELECT p.id AS partition_id, p.*
|
||||||
FROM partition p
|
FROM partition p
|
||||||
@ -205,7 +207,7 @@ def get_partition_groups(partition):
|
|||||||
FROM group_descr gd, partition p
|
FROM group_descr gd, partition p
|
||||||
WHERE gd.partition_id=%(partition_id)s
|
WHERE gd.partition_id=%(partition_id)s
|
||||||
AND gd.partition_id=p.id
|
AND gd.partition_id=p.id
|
||||||
ORDER BY group_name
|
ORDER BY gd.numero
|
||||||
""",
|
""",
|
||||||
partition,
|
partition,
|
||||||
)
|
)
|
||||||
@ -575,7 +577,6 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||||
etuds_set = {ins.etudid for ins in formsemestre.inscriptions}
|
etuds_set = {ins.etudid for ins in formsemestre.inscriptions}
|
||||||
|
|
||||||
sem = formsemestre.get_infos_dict() # transition TODO
|
|
||||||
groups = get_partition_groups(partition)
|
groups = get_partition_groups(partition)
|
||||||
# Build XML:
|
# Build XML:
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
@ -593,7 +594,6 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
x_response.append(x_group)
|
x_response.append(x_group)
|
||||||
for e in get_group_members(group["group_id"]):
|
for e in get_group_members(group["group_id"]):
|
||||||
etud = sco_etud.get_etud_info(etudid=e["etudid"], filled=True)[0]
|
etud = sco_etud.get_etud_info(etudid=e["etudid"], filled=True)[0]
|
||||||
# etud = sco_etud.get_etud_info_filled_by_etudid(e["etudid"], cnx)
|
|
||||||
x_group.append(
|
x_group.append(
|
||||||
Element(
|
Element(
|
||||||
"etud",
|
"etud",
|
||||||
@ -602,7 +602,7 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
sexe=etud["civilite_str"], # compat
|
sexe=etud["civilite_str"], # compat
|
||||||
nom=sco_etud.format_nom(etud["nom"]),
|
nom=sco_etud.format_nom(etud["nom"]),
|
||||||
prenom=sco_etud.format_prenom(etud["prenom"]),
|
prenom=sco_etud.format_prenom(etud["prenom"]),
|
||||||
origin=comp_origin(etud, sem),
|
origin=_comp_etud_origin(etud, formsemestre),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if e["etudid"] in etuds_set:
|
if e["etudid"] in etuds_set:
|
||||||
@ -620,7 +620,6 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
doc.append(x_group)
|
doc.append(x_group)
|
||||||
for etudid in etuds_set:
|
for etudid in etuds_set:
|
||||||
etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0]
|
etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0]
|
||||||
# etud = sco_etud.get_etud_info_filled_by_etudid(etudid, cnx)
|
|
||||||
x_group.append(
|
x_group.append(
|
||||||
Element(
|
Element(
|
||||||
"etud",
|
"etud",
|
||||||
@ -628,7 +627,7 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
sexe=etud["civilite_str"],
|
sexe=etud["civilite_str"],
|
||||||
nom=sco_etud.format_nom(etud["nom"]),
|
nom=sco_etud.format_nom(etud["nom"]),
|
||||||
prenom=sco_etud.format_prenom(etud["prenom"]),
|
prenom=sco_etud.format_prenom(etud["prenom"]),
|
||||||
origin=comp_origin(etud, sem),
|
origin=_comp_etud_origin(etud, formsemestre),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
t2 = time.time()
|
t2 = time.time()
|
||||||
@ -640,14 +639,14 @@ def XMLgetGroupsInPartition(partition_id): # was XMLgetGroupesTD
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def comp_origin(etud, cur_sem):
|
def _comp_etud_origin(etud: dict, cur_formsemestre: FormSemestre):
|
||||||
"""breve description de l'origine de l'étudiant (sem. precedent)
|
"""breve description de l'origine de l'étudiant (sem. precedent)
|
||||||
(n'indique l'origine que si ce n'est pas le semestre precedent normal)
|
(n'indique l'origine que si ce n'est pas le semestre precedent normal)
|
||||||
"""
|
"""
|
||||||
# cherche le semestre suivant le sem. courant dans la liste
|
# cherche le semestre suivant le sem. courant dans la liste
|
||||||
cur_sem_idx = None
|
cur_sem_idx = None
|
||||||
for i in range(len(etud["sems"])):
|
for i in range(len(etud["sems"])):
|
||||||
if etud["sems"][i]["formsemestre_id"] == cur_sem["formsemestre_id"]:
|
if etud["sems"][i]["formsemestre_id"] == cur_formsemestre.id:
|
||||||
cur_sem_idx = i
|
cur_sem_idx = i
|
||||||
break
|
break
|
||||||
|
|
||||||
@ -655,8 +654,8 @@ def comp_origin(etud, cur_sem):
|
|||||||
return "" # on pourrait indiquer le bac mais en general on ne l'a pas en debut d'annee
|
return "" # on pourrait indiquer le bac mais en general on ne l'a pas en debut d'annee
|
||||||
|
|
||||||
prev_sem = etud["sems"][cur_sem_idx + 1]
|
prev_sem = etud["sems"][cur_sem_idx + 1]
|
||||||
if prev_sem["semestre_id"] != (cur_sem["semestre_id"] - 1):
|
if prev_sem["semestre_id"] != (cur_formsemestre.semestre_id - 1):
|
||||||
return " (S%s)" % prev_sem["semestre_id"]
|
return f" (S{prev_sem['semestre_id']})"
|
||||||
else:
|
else:
|
||||||
return "" # parcours normal, ne le signale pas
|
return "" # parcours normal, ne le signale pas
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ def moduleimpl_withmodule_list(
|
|||||||
- pour les formations classiques: semestre/UE/numero_matiere/numero_module;
|
- pour les formations classiques: semestre/UE/numero_matiere/numero_module;
|
||||||
- pour le BUT: ignore UEs sauf si sort_by_ue et matières dans le tri.
|
- pour le BUT: ignore UEs sauf si sort_by_ue et matières dans le tri.
|
||||||
|
|
||||||
Attention: Cette fonction fait partie de l'API ScoDoc 7 et est publiée.
|
NB: Cette fonction faisait partie de l'API ScoDoc 7.
|
||||||
"""
|
"""
|
||||||
from app.scodoc import sco_edit_ue
|
from app.scodoc import sco_edit_ue
|
||||||
from app.scodoc import sco_edit_matiere
|
from app.scodoc import sco_edit_matiere
|
||||||
|
@ -214,7 +214,7 @@ def moduleimpl_inscriptions_edit(moduleimpl_id, etuds=[], submitted=False):
|
|||||||
return "\n".join(H)
|
return "\n".join(H)
|
||||||
|
|
||||||
|
|
||||||
def _make_menu(partitions, title="", check="true"):
|
def _make_menu(partitions: list[dict], title="", check="true") -> str:
|
||||||
"""Menu with list of all groups"""
|
"""Menu with list of all groups"""
|
||||||
items = [{"title": "Tous", "attr": "onclick=\"group_select('', -1, %s)\"" % check}]
|
items = [{"title": "Tous", "attr": "onclick=\"group_select('', -1, %s)\"" % check}]
|
||||||
p_idx = 0
|
p_idx = 0
|
||||||
@ -258,8 +258,8 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
authuser = current_user
|
authuser = current_user
|
||||||
|
formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
|
||||||
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
|
is_apc = formsemestre.formation.is_apc()
|
||||||
inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
|
inscrits = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
|
||||||
args={"formsemestre_id": formsemestre_id}
|
args={"formsemestre_id": formsemestre_id}
|
||||||
)
|
)
|
||||||
@ -268,85 +268,93 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
|
|||||||
formsemestre_id
|
formsemestre_id
|
||||||
)
|
)
|
||||||
|
|
||||||
can_change = authuser.has_permission(Permission.ScoEtudInscrit) and sem["etat"]
|
can_change = (
|
||||||
|
authuser.has_permission(Permission.ScoEtudInscrit) and formsemestre.etat
|
||||||
# Liste des modules
|
|
||||||
Mlist = sco_moduleimpl.moduleimpl_withmodule_list(
|
|
||||||
formsemestre_id=formsemestre_id, sort_by_ue=True
|
|
||||||
)
|
)
|
||||||
# Decrit les inscriptions aux modules:
|
|
||||||
|
# Décrit les inscriptions aux modules:
|
||||||
commons = [] # modules communs a tous les etuds du semestre
|
commons = [] # modules communs a tous les etuds du semestre
|
||||||
options = [] # modules ou seuls quelques etudiants sont inscrits
|
options = [] # modules ou seuls quelques etudiants sont inscrits
|
||||||
for mod in Mlist:
|
mod_description = {} # modimplid : str
|
||||||
|
mod_nb_inscrits = {} # modimplid : int
|
||||||
|
for modimpl in formsemestre.modimpls_sorted:
|
||||||
tous_inscrits, nb_inscrits, descr = descr_inscrs_module(
|
tous_inscrits, nb_inscrits, descr = descr_inscrs_module(
|
||||||
sem,
|
modimpl.id,
|
||||||
mod["moduleimpl_id"],
|
|
||||||
set_all,
|
set_all,
|
||||||
partitions,
|
partitions,
|
||||||
partitions_etud_groups,
|
|
||||||
)
|
)
|
||||||
if tous_inscrits:
|
if tous_inscrits:
|
||||||
commons.append(mod)
|
commons.append(modimpl)
|
||||||
else:
|
else:
|
||||||
mod["descri"] = descr
|
mod_description[modimpl.id] = descr
|
||||||
mod["nb_inscrits"] = nb_inscrits
|
mod_nb_inscrits[modimpl.id] = nb_inscrits
|
||||||
options.append(mod)
|
options.append(modimpl)
|
||||||
|
|
||||||
# Page HTML:
|
# Page HTML:
|
||||||
H = [html_sco_header.html_sem_header("Inscriptions aux modules du semestre")]
|
H = [html_sco_header.html_sem_header("Inscriptions aux modules du semestre")]
|
||||||
|
|
||||||
H.append("<h3>Inscrits au semestre: %d étudiants</h3>" % len(inscrits))
|
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(
|
||||||
'<table class="formsemestre_status formsemestre_inscr"><tr><th>UE</th><th>Code</th><th>Inscrits</th><th></th></tr>'
|
'<table class="formsemestre_status formsemestre_inscr"><tr><th>UE</th><th>Code</th><th>Inscrits</th><th></th></tr>'
|
||||||
)
|
)
|
||||||
for mod in options:
|
for modimpl in options:
|
||||||
if can_change:
|
if can_change:
|
||||||
c_link = '<a class="discretelink" href="moduleimpl_inscriptions_edit?moduleimpl_id=%s">%s</a>' % (
|
c_link = f"""<a class="discretelink" href="{url_for(
|
||||||
mod["moduleimpl_id"],
|
'notes.moduleimpl_inscriptions_edit',
|
||||||
mod["descri"] or "<i>(inscrire des étudiants)</i>",
|
scodoc_dept=g.scodoc_dept,
|
||||||
)
|
moduleimpl_id=modimpl.id)
|
||||||
|
}">{mod_description[modimpl.id] or "<i>(inscrire des étudiants)</i>"}</a>
|
||||||
|
"""
|
||||||
else:
|
else:
|
||||||
c_link = mod["descri"]
|
c_link = mod_description[modimpl.id]
|
||||||
H.append(
|
H.append(
|
||||||
'<tr class="formsemestre_status"><td>%s</td><td class="formsemestre_status_code">%s</td><td class="formsemestre_status_inscrits">%s</td><td>%s</td></tr>'
|
f"""<tr class="formsemestre_status"><td>{
|
||||||
% (
|
modimpl.module.ue.acronyme or ""
|
||||||
mod["ue"]["acronyme"] or "",
|
}</td><td class="formsemestre_status_code">{
|
||||||
mod["module"]["code"] or "(module sans code)",
|
modimpl.module.code or "(module sans code)"
|
||||||
mod["nb_inscrits"],
|
}</td><td class="formsemestre_status_inscrits">{
|
||||||
c_link,
|
mod_nb_inscrits[modimpl.id]}</td><td>{c_link}</td></tr>"""
|
||||||
)
|
|
||||||
)
|
)
|
||||||
H.append("</table>")
|
H.append("</table>")
|
||||||
else:
|
else:
|
||||||
H.append(
|
H.append(
|
||||||
'<span style="font-size:110%; font-style:italic; color: red;"">Tous les étudiants sont inscrits à tous les modules.</span>'
|
"""<span style="font-size:110%; font-style:italic; color: red;"
|
||||||
|
>Tous les étudiants sont inscrits à tous les modules.</span>"""
|
||||||
)
|
)
|
||||||
|
|
||||||
if commons:
|
if commons:
|
||||||
H.append(
|
H.append(
|
||||||
"<h3>Modules communs (auxquels tous les étudiants sont inscrits):</h3>"
|
"""<h3>Modules communs (auxquels tous les étudiants sont inscrits):</h3>
|
||||||
|
|
||||||
|
<table class="formsemestre_status formsemestre_inscr">
|
||||||
|
<tr><th>UE</th><th>Code</th><th>Module</th>"""
|
||||||
)
|
)
|
||||||
H.append(
|
if is_apc:
|
||||||
'<table class="formsemestre_status formsemestre_inscr"><tr><th>UE</th><th>Code</th><th>Module</th></tr>'
|
H.append("<th>Parcours</th>")
|
||||||
)
|
H.append("""</tr>""")
|
||||||
for mod in commons:
|
for modimpl in commons:
|
||||||
if can_change:
|
if can_change:
|
||||||
c_link = (
|
c_link = f"""<a class="discretelink" href="{
|
||||||
'<a class="discretelink" href="moduleimpl_inscriptions_edit?moduleimpl_id=%s">%s</a>'
|
url_for("notes.moduleimpl_inscriptions_edit",
|
||||||
% (mod["moduleimpl_id"], mod["module"]["titre"])
|
scodoc_dept=g.scodoc_dept, moduleimpl_id=modimpl.id)
|
||||||
)
|
}">{modimpl.module.titre}</a>"""
|
||||||
else:
|
else:
|
||||||
c_link = mod["module"]["titre"]
|
c_link = modimpl.module.titre
|
||||||
H.append(
|
H.append(
|
||||||
'<tr class="formsemestre_status_green"><td>%s</td><td class="formsemestre_status_code">%s</td><td>%s</td></tr>'
|
f"""<tr class="formsemestre_status_green"><td>{
|
||||||
% (
|
modimpl.module.ue.acronyme or ""
|
||||||
mod["ue"]["acronyme"],
|
}</td><td class="formsemestre_status_code">{
|
||||||
mod["module"]["code"] or "(module sans code)",
|
modimpl.module.code or "(module sans code)"
|
||||||
c_link,
|
}</td><td>{c_link}</td>"""
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
if is_apc:
|
||||||
|
H.append(
|
||||||
|
f"""<td><em>{', '.join(p.code for p in modimpl.module.parcours)}</em></td>"""
|
||||||
|
)
|
||||||
|
H.append("</tr>")
|
||||||
H.append("</table>")
|
H.append("</table>")
|
||||||
|
|
||||||
# Etudiants "dispensés" d'une UE (capitalisée)
|
# Etudiants "dispensés" d'une UE (capitalisée)
|
||||||
@ -427,9 +435,7 @@ def moduleimpl_inscriptions_stats(formsemestre_id):
|
|||||||
return "\n".join(H)
|
return "\n".join(H)
|
||||||
|
|
||||||
|
|
||||||
def descr_inscrs_module(
|
def descr_inscrs_module(moduleimpl_id, set_all, partitions):
|
||||||
sem, moduleimpl_id, set_all, partitions, partitions_etud_groups
|
|
||||||
):
|
|
||||||
"""returns tous_inscrits, nb_inscrits, descr"""
|
"""returns tous_inscrits, nb_inscrits, descr"""
|
||||||
ins = sco_moduleimpl.do_moduleimpl_inscription_list(moduleimpl_id=moduleimpl_id)
|
ins = sco_moduleimpl.do_moduleimpl_inscription_list(moduleimpl_id=moduleimpl_id)
|
||||||
set_m = set([x["etudid"] for x in ins]) # ens. des inscrits au module
|
set_m = set([x["etudid"] for x in ins]) # ens. des inscrits au module
|
||||||
|
@ -3173,6 +3173,7 @@ def check_integrity_all():
|
|||||||
def moduleimpl_list(
|
def moduleimpl_list(
|
||||||
moduleimpl_id=None, formsemestre_id=None, module_id=None, format="json"
|
moduleimpl_id=None, formsemestre_id=None, module_id=None, format="json"
|
||||||
):
|
):
|
||||||
|
# TODO DEPRECATED A RETIRER
|
||||||
try:
|
try:
|
||||||
data = sco_moduleimpl.moduleimpl_list(
|
data = sco_moduleimpl.moduleimpl_list(
|
||||||
moduleimpl_id=moduleimpl_id,
|
moduleimpl_id=moduleimpl_id,
|
||||||
@ -3193,6 +3194,7 @@ def moduleimpl_withmodule_list(
|
|||||||
moduleimpl_id=None, formsemestre_id=None, module_id=None, format="json"
|
moduleimpl_id=None, formsemestre_id=None, module_id=None, format="json"
|
||||||
):
|
):
|
||||||
"""API ScoDoc 7"""
|
"""API ScoDoc 7"""
|
||||||
|
# TODO DEPRECATED A RETIRER
|
||||||
data = sco_moduleimpl.moduleimpl_withmodule_list(
|
data = sco_moduleimpl.moduleimpl_withmodule_list(
|
||||||
moduleimpl_id=moduleimpl_id,
|
moduleimpl_id=moduleimpl_id,
|
||||||
formsemestre_id=formsemestre_id,
|
formsemestre_id=formsemestre_id,
|
||||||
|
Loading…
Reference in New Issue
Block a user