Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into dev93

This commit is contained in:
Emmanuel Viennet 2022-05-30 12:51:48 +02:00
commit 8cd6fb8320
3 changed files with 51 additions and 30 deletions

View File

@ -398,7 +398,7 @@ class ResultatsSemestre(ResultatsCache):
- titles: { column_id : title } - titles: { column_id : title }
- columns_ids: (liste des id de colonnes) - columns_ids: (liste des id de colonnes)
. Si convert_values, transforme les notes en chaines ("12.34"). Si convert_values, transforme les notes en chaines ("12.34").
Les colonnes générées sont: Les colonnes générées sont:
etudid etudid
rang : rang indicatif (basé sur moy gen) rang : rang indicatif (basé sur moy gen)
@ -590,7 +590,9 @@ class ResultatsSemestre(ResultatsCache):
f"moy_{modimpl.module.type_abbrv()}_{modimpl.id}_{ue.id}" f"moy_{modimpl.module.type_abbrv()}_{modimpl.id}_{ue.id}"
) )
val_fmt = val_fmt_html = fmt_note(val) val_fmt = val_fmt_html = fmt_note(val)
if modimpl.module.module_type == scu.ModuleType.MALUS: if convert_values and (
modimpl.module.module_type == scu.ModuleType.MALUS
):
val_fmt_html = ( val_fmt_html = (
(scu.EMO_RED_TRIANGLE_DOWN + val_fmt) if val else "" (scu.EMO_RED_TRIANGLE_DOWN + val_fmt) if val else ""
) )

View File

@ -56,6 +56,7 @@ Solution proposée (nov 2014):
import flask import flask
from flask import request from flask import request
from flask_login import current_user from flask_login import current_user
from app.models.formsemestre import FormSemestre
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
@ -65,7 +66,6 @@ from app.scodoc import sco_codes_parcours
from app.scodoc import sco_edit_matiere from app.scodoc import sco_edit_matiere
from app.scodoc import sco_edit_module from app.scodoc import sco_edit_module
from app.scodoc import sco_edit_ue from app.scodoc import sco_edit_ue
from app.scodoc import sco_evaluations
from app.scodoc import sco_evaluation_db from app.scodoc import sco_evaluation_db
from app.scodoc import sco_formations from app.scodoc import sco_formations
from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre
@ -85,17 +85,21 @@ def external_ue_create(
ects=0.0, ects=0.0,
): ):
"""Crée UE/matiere/module/evaluation puis saisie les notes""" """Crée UE/matiere/module/evaluation puis saisie les notes"""
log("external_ue_create( formsemestre_id=%s, titre=%s )" % (formsemestre_id, titre)) formsemestre = FormSemestre.query.get_or_404(formsemestre_id)
sem = sco_formsemestre.get_formsemestre(formsemestre_id) log(f"creating external UE in {formsemestre}: {acronyme}")
# Contrôle d'accès: # Contrôle d'accès:
if not current_user.has_permission(Permission.ScoImplement): if not current_user.has_permission(Permission.ScoImplement):
if not sem["resp_can_edit"] or (current_user.id not in sem["responsables"]): if (not formsemestre.resp_can_edit) or (
current_user.id not in [u.id for u in formsemestre.responsables]
):
raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération") raise AccessDenied("vous n'avez pas le droit d'effectuer cette opération")
# #
formation_id = sem["formation_id"] formation_id = formsemestre.formation.id
log("creating external UE in %s: %s" % (formsemestre_id, acronyme))
numero = sco_edit_ue.next_ue_numero(formation_id, semestre_id=sem["semestre_id"]) numero = sco_edit_ue.next_ue_numero(
formation_id, semestre_id=formsemestre.semestre_id
)
ue_id = sco_edit_ue.do_ue_create( ue_id = sco_edit_ue.do_ue_create(
{ {
"formation_id": formation_id, "formation_id": formation_id,
@ -120,7 +124,8 @@ def external_ue_create(
"ue_id": ue_id, "ue_id": ue_id,
"matiere_id": matiere_id, "matiere_id": matiere_id,
"formation_id": formation_id, "formation_id": formation_id,
"semestre_id": sem["semestre_id"], "semestre_id": formsemestre.semestre_id,
"module_type": scu.ModuleType.STANDARD,
}, },
) )
@ -129,17 +134,23 @@ def external_ue_create(
"module_id": module_id, "module_id": module_id,
"formsemestre_id": formsemestre_id, "formsemestre_id": formsemestre_id,
# affecte le 1er responsable du semestre comme resp. du module # affecte le 1er responsable du semestre comme resp. du module
"responsable_id": sem["responsables"][0], "responsable_id": formsemestre.responsables[0].id
if len(formsemestre.responsables)
else None,
}, },
) )
return moduleimpl_id return moduleimpl_id
def external_ue_inscrit_et_note(moduleimpl_id, formsemestre_id, notes_etuds): def external_ue_inscrit_et_note(
moduleimpl_id: int, formsemestre_id: int, notes_etuds: dict
):
"""Inscrit les étudiants au moduleimpl, crée au besoin une évaluation
et enregistre les notes.
"""
log( log(
"external_ue_inscrit_et_note(moduleimpl_id=%s, notes_etuds=%s)" f"external_ue_inscrit_et_note(moduleimpl_id={moduleimpl_id}, notes_etuds={notes_etuds})"
% (moduleimpl_id, notes_etuds)
) )
# Inscription des étudiants # Inscription des étudiants
sco_moduleimpl.do_moduleimpl_inscrit_etuds( sco_moduleimpl.do_moduleimpl_inscrit_etuds(
@ -175,17 +186,17 @@ def external_ue_inscrit_et_note(moduleimpl_id, formsemestre_id, notes_etuds):
) )
def get_existing_external_ue(formation_id): def get_existing_external_ue(formation_id: int) -> list[dict]:
"la liste de toutes les UE externes définies dans cette formation" "Liste de toutes les UE externes définies dans cette formation"
return sco_edit_ue.ue_list(args={"formation_id": formation_id, "is_external": True}) return sco_edit_ue.ue_list(args={"formation_id": formation_id, "is_external": True})
def get_external_moduleimpl_id(formsemestre_id, ue_id): def get_external_moduleimpl_id(formsemestre_id: int, ue_id: int) -> int:
"moduleimpl correspondant à l'UE externe indiquée de ce formsemestre" "moduleimpl correspondant à l'UE externe indiquée de ce formsemestre"
r = ndb.SimpleDictFetch( r = ndb.SimpleDictFetch(
""" """
SELECT mi.id AS moduleimpl_id FROM notes_moduleimpl mi, notes_modules mo SELECT mi.id AS moduleimpl_id FROM notes_moduleimpl mi, notes_modules mo
WHERE mi.id = %(formsemestre_id)s WHERE mi.formsemestre_id = %(formsemestre_id)s
AND mi.module_id = mo.id AND mi.module_id = mo.id
AND mo.ue_id = %(ue_id)s AND mo.ue_id = %(ue_id)s
""", """,
@ -194,11 +205,14 @@ def get_external_moduleimpl_id(formsemestre_id, ue_id):
if r: if r:
return r[0]["moduleimpl_id"] return r[0]["moduleimpl_id"]
else: else:
raise ScoValueError("aucun module externe ne correspond") raise ScoValueError(
f"""Aucun module externe ne correspond
(formsemestre_id={formsemestre_id}, ue_id={ue_id})"""
)
# Web function # Web function
def external_ue_create_form(formsemestre_id, etudid): def external_ue_create_form(formsemestre_id: int, etudid: int):
"""Formulaire création UE externe + inscription étudiant et saisie note """Formulaire création UE externe + inscription étudiant et saisie note
- Demande UE: peut-être existante (liste les UE externes de cette formation), - Demande UE: peut-être existante (liste les UE externes de cette formation),
ou sinon spécifier titre, acronyme, type, ECTS ou sinon spécifier titre, acronyme, type, ECTS
@ -233,7 +247,9 @@ def external_ue_create_form(formsemestre_id, etudid):
html_footer = html_sco_header.sco_footer() html_footer = html_sco_header.sco_footer()
Fo = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0] Fo = sco_formations.formation_list(args={"formation_id": sem["formation_id"]})[0]
parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"]) parcours = sco_codes_parcours.get_parcours_from_code(Fo["type_parcours"])
ue_types = parcours.ALLOWED_UE_TYPES ue_types = [
typ for typ in parcours.ALLOWED_UE_TYPES if typ != sco_codes_parcours.UE_SPORT
]
ue_types.sort() ue_types.sort()
ue_types_names = [sco_codes_parcours.UE_TYPE_NAME[k] for k in ue_types] ue_types_names = [sco_codes_parcours.UE_TYPE_NAME[k] for k in ue_types]
ue_types = [str(x) for x in ue_types] ue_types = [str(x) for x in ue_types]
@ -255,7 +271,7 @@ def external_ue_create_form(formsemestre_id, etudid):
"input_type": "menu", "input_type": "menu",
"title": "UE externe existante:", "title": "UE externe existante:",
"allowed_values": [""] "allowed_values": [""]
+ [ue["ue_id"] for ue in existing_external_ue], + [str(ue["ue_id"]) for ue in existing_external_ue],
"labels": [default_label] "labels": [default_label]
+ [ + [
"%s (%s)" % (ue["titre"], ue["acronyme"]) "%s (%s)" % (ue["titre"], ue["acronyme"])
@ -337,7 +353,7 @@ def external_ue_create_form(formsemestre_id, etudid):
+ html_footer + html_footer
) )
if tf[2]["existing_ue"]: if tf[2]["existing_ue"]:
ue_id = tf[2]["existing_ue"] ue_id = int(tf[2]["existing_ue"])
moduleimpl_id = get_external_moduleimpl_id(formsemestre_id, ue_id) moduleimpl_id = get_external_moduleimpl_id(formsemestre_id, ue_id)
else: else:
acronyme = tf[2]["acronyme"].strip() acronyme = tf[2]["acronyme"].strip()

View File

@ -9,19 +9,22 @@ function toggle_new_ue_form(state) {
text_color = 'rgb(0,0,0)'; text_color = 'rgb(0,0,0)';
} }
$("#tf_extue_titre td:eq(1) input").prop( "disabled", state ); $("#tf_extue_titre td:eq(1) input").prop("disabled", state);
$("#tf_extue_titre td:eq(1) input").css('color', text_color) $("#tf_extue_titre").css('color', text_color)
$("#tf_extue_acronyme td:eq(1) input").prop( "disabled", state ); $("#tf_extue_acronyme td:eq(1) input").prop("disabled", state);
$("#tf_extue_acronyme td:eq(1) input").css('color', text_color) $("#tf_extue_acronyme").css('color', text_color)
$("#tf_extue_ects td:eq(1) input").prop( "disabled", state ); $("#tf_extue_type td:eq(1) select").prop("disabled", state);
$("#tf_extue_ects td:eq(1) input").css('color', text_color) $("#tf_extue_type").css('color', text_color)
$("#tf_extue_ects td:eq(1) input").prop("disabled", state);
$("#tf_extue_ects").css('color', text_color)
} }
function update_external_ue_form() { function update_external_ue_form() {
var state = (tf.existing_ue.value != "") var state = (tf.existing_ue.value != "");
toggle_new_ue_form(state); toggle_new_ue_form(state);
} }