Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
6 changed files with 53 additions and 21 deletions
Showing only changes of commit 2e6ac8e60a - Show all commits

View File

@ -148,7 +148,7 @@ def evaluation_notes(evaluation_id: int):
@scodoc @scodoc
@permission_required(Permission.EnsView) @permission_required(Permission.EnsView)
@as_json @as_json
def evaluation_set_notes(evaluation_id: int): def evaluation_set_notes(evaluation_id: int): # evaluation-notes-set
"""Écriture de notes dans une évaluation. """Écriture de notes dans une évaluation.
The request content type should be "application/json", The request content type should be "application/json",
and contains: and contains:

View File

@ -400,6 +400,7 @@ class FormSemestre(db.Model):
"""Liste des modimpls du semestre (y compris bonus) """Liste des modimpls du semestre (y compris bonus)
- triée par type/numéro/code en APC - triée par type/numéro/code en APC
- triée par numéros d'UE/matières/modules pour les formations standard. - triée par numéros d'UE/matières/modules pour les formations standard.
Hors APC, élimine les modules de type ressources et SAEs.
""" """
modimpls = self.modimpls.all() modimpls = self.modimpls.all()
if self.formation.is_apc(): if self.formation.is_apc():
@ -411,6 +412,14 @@ class FormSemestre(db.Model):
) )
) )
else: else:
modimpls = [
mi
for mi in modimpls
if (
mi.module.module_type
not in (scu.ModuleType.RESSOURCE, scu.ModuleType.SAE)
)
]
modimpls.sort( modimpls.sort(
key=lambda m: ( key=lambda m: (
m.module.ue.numero or 0, m.module.ue.numero or 0,

View File

@ -117,7 +117,7 @@ def do_ue_create(args):
ues = ue_list({"formation_id": args["formation_id"], "acronyme": args["acronyme"]}) ues = ue_list({"formation_id": args["formation_id"], "acronyme": args["acronyme"]})
if ues: if ues:
raise ScoValueError( raise ScoValueError(
f"""Acronyme d'UE "{args['acronyme']}" déjà utilisé ! f"""Acronyme d'UE "{args['acronyme']}" déjà utilisé !
(chaque UE doit avoir un acronyme unique dans la formation)""" (chaque UE doit avoir un acronyme unique dans la formation)"""
) )
if ( if (
@ -420,8 +420,8 @@ def ue_edit(ue_id=None, create=False, formation_id=None, default_semestre_idx=No
"size": 12, "size": 12,
"title": "Code UE", "title": "Code UE",
"max_length": SHORT_STR_LEN, "max_length": SHORT_STR_LEN,
"explanation": """code interne (non vide). Toutes les UE partageant le même code "explanation": """code interne (non vide). Toutes les UE partageant le même code
(et le même code de formation) sont compatibles (compensation de semestres, capitalisation d'UE). (et le même code de formation) sont compatibles (compensation de semestres, capitalisation d'UE).
Voir liste ci-dessous.""", Voir liste ci-dessous.""",
"allow_null": False, "allow_null": False,
}, },
@ -764,7 +764,7 @@ def ue_table(formation_id=None, semestre_idx=1, msg=""): # was ue_list
H.append( H.append(
"""<p class="help">Cette formation est verrouillée car """<p class="help">Cette formation est verrouillée car
des semestres verrouillés s'y réferent. des semestres verrouillés s'y réferent.
Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module), Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module),
vous devez: vous devez:
</p> </p>
<ul class="help"> <ul class="help">
@ -827,7 +827,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
msg_refcomp = "associer à un référentiel de compétences" msg_refcomp = "associer à un référentiel de compétences"
else: else:
descr_refcomp = f"""Référentiel de compétences: descr_refcomp = f"""Référentiel de compétences:
<a href="{url_for('notes.refcomp_show', <a href="{url_for('notes.refcomp_show',
scodoc_dept=g.scodoc_dept, refcomp_id=formation.referentiel_competence.id)}" scodoc_dept=g.scodoc_dept, refcomp_id=formation.referentiel_competence.id)}"
class="stdlink"> class="stdlink">
{formation.referentiel_competence.type_titre} {formation.referentiel_competence.type_titre}
@ -856,7 +856,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
) )
for parc in formation.referentiel_competence.parcours: for parc in formation.referentiel_competence.parcours:
H.append( H.append(
f"""<div><a href="{url_for("notes.parcour_formation", f"""<div><a href="{url_for("notes.parcour_formation",
scodoc_dept=g.scodoc_dept, formation_id=formation.id, parcour_id=parc.id ) scodoc_dept=g.scodoc_dept, formation_id=formation.id, parcour_id=parc.id )
}">{parc.code}</a></div>""" }">{parc.code}</a></div>"""
) )
@ -865,7 +865,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
H.append( H.append(
f""" f"""
<li> <a class="stdlink" href="{ <li> <a class="stdlink" href="{
url_for('notes.edit_modules_ue_coefs', url_for('notes.edit_modules_ue_coefs',
scodoc_dept=g.scodoc_dept, formation_id=formation_id, semestre_idx=semestre_idx) scodoc_dept=g.scodoc_dept, formation_id=formation_id, semestre_idx=semestre_idx)
}">{'Visualiser' if locked else 'Éditer'} les coefficients des ressources et SAÉs</a> }">{'Visualiser' if locked else 'Éditer'} les coefficients des ressources et SAÉs</a>
</li> </li>
@ -915,7 +915,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
}">Ajouter une UE</a> }">Ajouter une UE</a>
</li> </li>
<li><a href="{ <li><a href="{
url_for('notes.formation_add_malus_modules', url_for('notes.formation_add_malus_modules',
scodoc_dept=g.scodoc_dept, formation_id=formation_id) scodoc_dept=g.scodoc_dept, formation_id=formation_id)
}" class="stdlink">Ajouter des modules de malus dans chaque UE</a> }" class="stdlink">Ajouter des modules de malus dans chaque UE</a>
</li> </li>
@ -956,14 +956,14 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
) )
}">Créer une nouvelle version de la formation</a> (copie non verrouillée) }">Créer une nouvelle version de la formation</a> (copie non verrouillée)
</li> </li>
""" """
) )
if not len(formsemestres): if not len(formsemestres):
H.append( H.append(
f""" f"""
<li><a class="stdlink" href="{ <li><a class="stdlink" href="{
url_for('notes.formation_delete', url_for('notes.formation_delete',
scodoc_dept=g.scodoc_dept, formation_id=formation_id scodoc_dept=g.scodoc_dept, formation_id=formation_id
) )
}">Supprimer cette formation</a> (pas encore utilisée par des semestres) }">Supprimer cette formation</a> (pas encore utilisée par des semestres)
@ -976,7 +976,7 @@ du programme" (menu "Semestre") si vous avez un semestre en cours);
url_for('notes.formation_table_recap', scodoc_dept=g.scodoc_dept, url_for('notes.formation_table_recap', scodoc_dept=g.scodoc_dept,
formation_id=formation_id) formation_id=formation_id)
}">Table récapitulative de la formation</a> }">Table récapitulative de la formation</a>
</li> </li>
<li><a class="stdlink" href="{ <li><a class="stdlink" href="{
url_for('notes.formation_export', scodoc_dept=g.scodoc_dept, url_for('notes.formation_export', scodoc_dept=g.scodoc_dept,
formation_id=formation_id, fmt='xml') formation_id=formation_id, fmt='xml')
@ -1050,9 +1050,9 @@ def _html_select_semestre_idx(formation_id, semestre_ids, semestre_idx):
else: else:
label = f"S{i}" label = f"S{i}"
htm += f"""<option value="{i}" { htm += f"""<option value="{i}" {
'selected' 'selected'
if (semestre_idx == i) if (semestre_idx == i)
or (i == "all" and semestre_idx is None) or (i == "all" and semestre_idx is None)
else '' else ''
}>{label}</option> }>{label}</option>
""" """
@ -1172,7 +1172,7 @@ def _ue_table_ues(
) )
if (iue >= len(ues) - 1) or ue["semestre_id"] != ues[iue + 1]["semestre_id"]: if (iue >= len(ues) - 1) or ue["semestre_id"] != ues[iue + 1]["semestre_id"]:
H.append( H.append(
f"""</ul><ul><li><a href="{url_for('notes.ue_create', scodoc_dept=g.scodoc_dept, f"""</ul><ul><li><a href="{url_for('notes.ue_create', scodoc_dept=g.scodoc_dept,
formation_id=ue['formation_id'], semestre_idx=ue['semestre_id']) formation_id=ue['formation_id'], semestre_idx=ue['semestre_id'])
}">Ajouter une UE dans le semestre {ue['semestre_id'] or ''}</a></li></ul> }">Ajouter une UE dans le semestre {ue['semestre_id'] or ''}</a></li></ul>
</div> </div>
@ -1205,7 +1205,7 @@ def _ue_table_matieres(
if editable and not sco_edit_matiere.matiere_is_locked(mat["matiere_id"]): if editable and not sco_edit_matiere.matiere_is_locked(mat["matiere_id"]):
H.append( H.append(
f"""<a class="stdlink" href="{ f"""<a class="stdlink" href="{
url_for("notes.matiere_edit", url_for("notes.matiere_edit",
scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"]) scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"])
}"> }">
""" """
@ -1314,6 +1314,10 @@ def _ue_table_modules(
'<a class="discretelink" title="Modifier le module numéro %(numero)s, utilisé par %(nb_moduleimpls)d sessions" href="module_edit?module_id=%(module_id)s">' '<a class="discretelink" title="Modifier le module numéro %(numero)s, utilisé par %(nb_moduleimpls)d sessions" href="module_edit?module_id=%(module_id)s">'
% mod % mod
) )
if mod["module_type"] not in (scu.ModuleType.STANDARD, scu.ModuleType.MALUS):
H.append(
f"""<span class="invalid-module-type">{scu.EMO_WARNING} type incompatible </span>"""
)
H.append( H.append(
'<span class="formation_module_tit">%s</span>' '<span class="formation_module_tit">%s</span>'
% scu.join_words(mod["code"], mod["titre"]) % scu.join_words(mod["code"], mod["titre"])
@ -1358,7 +1362,7 @@ def _ue_table_modules(
if editable and add_suppress_link: if editable and add_suppress_link:
H.append( H.append(
f"""<a class="stdlink" href="{ f"""<a class="stdlink" href="{
url_for("notes.matiere_delete", url_for("notes.matiere_delete",
scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"])}" scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"])}"
>la supprimer</a> >la supprimer</a>
""" """
@ -1367,7 +1371,7 @@ def _ue_table_modules(
if editable: # and ((not parcours.UE_IS_MODULE) or len(Modlist) == 0): if editable: # and ((not parcours.UE_IS_MODULE) or len(Modlist) == 0):
H.append( H.append(
f"""<li> <a class="stdlink" href="{ f"""<li> <a class="stdlink" href="{
url_for("notes.module_create", url_for("notes.module_create",
scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"])}" scodoc_dept=g.scodoc_dept, matiere_id=mat["matiere_id"])}"
>{create_element_msg}</a></li> >{create_element_msg}</a></li>
""" """
@ -1451,7 +1455,7 @@ def do_ue_edit(args, bypass_lock=False, dont_invalidate_cache=False):
ues = ue_list({"formation_id": ue["formation_id"], "acronyme": new_acro}) ues = ue_list({"formation_id": ue["formation_id"], "acronyme": new_acro})
if ues and ues[0]["ue_id"] != ue_id: if ues and ues[0]["ue_id"] != ue_id:
raise ScoValueError( raise ScoValueError(
f"""Acronyme d'UE "{args['acronyme']}" déjà utilisé ! f"""Acronyme d'UE "{args['acronyme']}" déjà utilisé !
(chaque UE doit avoir un acronyme unique dans la formation.)""" (chaque UE doit avoir un acronyme unique dans la formation.)"""
) )
# On ne peut pas supprimer le code UE: # On ne peut pas supprimer le code UE:

View File

@ -257,6 +257,13 @@ def do_formsemestre_createwithmodules(edit=False, formsemestre: FormSemestre = N
.order_by(Module.module_type, UniteEns.numero, Module.numero) .order_by(Module.module_type, UniteEns.numero, Module.numero)
.all() .all()
) )
# Elimine les ressources et SAE sauf si déjà dans le semestre
modules = [
m
for m in modules
if (m.module_type not in (scu.ModuleType.RESSOURCE, scu.ModuleType.SAE))
or m.id in module_ids_set
]
# Pour regroupement des modules par semestres: # Pour regroupement des modules par semestres:
semestre_ids = {} semestre_ids = {}
for mod in modules: for mod in modules:

View File

@ -1176,11 +1176,18 @@ def formsemestre_status(formsemestre_id=None, check_parcours=True):
H += [_TABLEAU_MODULES_FOOT, "</div>"] H += [_TABLEAU_MODULES_FOOT, "</div>"]
else: else:
# formations classiques: groupe par UE # formations classiques: groupe par UE
# élimine les modules BUT qui aurait pu se glisser là suite à un
# changement de type de formation par exemple
modimpls_classic = [
m
for m in modimpls
if m["module"]["module_type"] not in (ModuleType.RESSOURCE, ModuleType.SAE)
]
H += [ H += [
"<p>", "<p>",
_TABLEAU_MODULES_HEAD, _TABLEAU_MODULES_HEAD,
formsemestre_tableau_modules( formsemestre_tableau_modules(
modimpls, modimpls_classic,
nt, nt,
formsemestre, formsemestre,
can_edit=can_edit, can_edit=can_edit,

View File

@ -2464,6 +2464,11 @@ li.module_malus span.formation_module_tit {
text-decoration: underline; text-decoration: underline;
} }
span.invalid-module-type {
color: red;
font-style: italic;
}
span.formation_module_ue { span.formation_module_ue {
color: #6e7d92; color: #6e7d92;
font-size: 75%; font-size: 75%;