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

This commit is contained in:
Arthur ZHU 2022-07-13 12:18:47 +02:00
commit 9073983162
10 changed files with 71 additions and 33 deletions

View File

@ -260,6 +260,8 @@ class ApoEtud(dict):
self["naissance"] = naissance self["naissance"] = naissance
self.cols = cols self.cols = cols
"{ col_id : value } colid = 'apoL_c0001'" "{ col_id : value } colid = 'apoL_c0001'"
self.is_apc = None
"Vrai si BUT"
self.col_elts = {} self.col_elts = {}
"{'V1RT': {'R': 'ADM', 'J': '', 'B': 20, 'N': '12.14'}}" "{'V1RT': {'R': 'ADM', 'J': '', 'B': 20, 'N': '12.14'}}"
self.new_cols = {} # { col_id : value to record in csv } self.new_cols = {} # { col_id : value to record in csv }
@ -431,6 +433,8 @@ class ApoEtud(dict):
return VOID_APO_RES return VOID_APO_RES
# Elements UE # Elements UE
# if etudid == 3661 and nt.formsemestre.semestre_id == 2: # XXX XXX XXX
# breakpoint()
decisions_ue = nt.get_etud_decision_ues(etudid) decisions_ue = nt.get_etud_decision_ues(etudid)
for ue in nt.get_ues_stat_dict(): for ue in nt.get_ues_stat_dict():
if ue["code_apogee"] and code in { if ue["code_apogee"] and code in {
@ -472,6 +476,9 @@ class ApoEtud(dict):
def comp_elt_semestre(self, nt, decision, etudid): def comp_elt_semestre(self, nt, decision, etudid):
"""Calcul résultat apo semestre""" """Calcul résultat apo semestre"""
if self.is_apc:
# pas de code semestre en APC !
return dict(N="", B=20, J="", R="", M="")
if decision is None: if decision is None:
etud = Identite.query.get(etudid) etud = Identite.query.get(etudid)
nomprenom = etud.nomprenom if etud else "(inconnu)" nomprenom = etud.nomprenom if etud else "(inconnu)"
@ -565,7 +572,8 @@ class ApoEtud(dict):
il faut considérer les deux semestres ((S1,S2) ou (S3,S4)) pour calculer il faut considérer les deux semestres ((S1,S2) ou (S3,S4)) pour calculer
le code annuel (VET ou VRT1A (voir elt_annee_apo)). le code annuel (VET ou VRT1A (voir elt_annee_apo)).
Pour les jurys intermediaires (janvier, S1 ou S3): (S2 ou S4) de la même étape lors d'une année précédente ? Pour les jurys intermediaires (janvier, S1 ou S3): (S2 ou S4) de la même
étape lors d'une année précédente ?
Renvoie le semestre "courant" et l'autre semestre, ou None s'il n'y en a pas. Renvoie le semestre "courant" et l'autre semestre, ou None s'il n'y en a pas.
""" """
@ -687,6 +695,8 @@ class ApoData(object):
self.export_res_rat = export_res_rat self.export_res_rat = export_res_rat
self.orig_filename = orig_filename self.orig_filename = orig_filename
self.periode = periode # self.periode = periode #
self.is_apc = None
"Vrai si BUT"
try: try:
self.read_csv(data) self.read_csv(data)
except ScoFormatError as e: except ScoFormatError as e:
@ -722,8 +732,19 @@ class ApoData(object):
def setup(self): def setup(self):
"""Recherche semestres ScoDoc concernés""" """Recherche semestres ScoDoc concernés"""
self.sems_etape = comp_apo_sems(self.etape_apogee, self.annee_scolaire) self.sems_etape = comp_apo_sems(self.etape_apogee, self.annee_scolaire)
self.formsemestres_etape = [
FormSemestre.query.get_or_404(s["formsemestre_id"]) for s in self.sems_etape
]
apcs = {
formsemestre.formation.is_apc() for formsemestre in self.formsemestres_etape
}
if len(apcs) != 1:
raise ScoValueError(
"l'ensemble mixe des semestres BUT (APC) et des semestres classiques !"
)
self.is_apc = apcs.pop()
self.etape_formsemestre_ids = {s["formsemestre_id"] for s in self.sems_etape} self.etape_formsemestre_ids = {s["formsemestre_id"] for s in self.sems_etape}
if self.periode != None: if self.periode is not None:
self.sems_periode = [ self.sems_periode = [
s s
for s in self.sems_etape for s in self.sems_etape
@ -1126,7 +1147,7 @@ def _apo_skip_section(f):
# ------------------------------------- # -------------------------------------
def comp_apo_sems(etape_apogee, annee_scolaire): def comp_apo_sems(etape_apogee, annee_scolaire: int) -> list[dict]:
""" """
:param etape_apogee: etape (string or ApoEtapeVDI) :param etape_apogee: etape (string or ApoEtapeVDI)
:param annee_scolaire: annee (int) :param annee_scolaire: annee (int)
@ -1224,6 +1245,7 @@ def export_csv_to_apogee(
apo_data.setup() # -> .sems_etape apo_data.setup() # -> .sems_etape
for e in apo_data.etuds: for e in apo_data.etuds:
e.is_apc = apo_data.is_apc
e.lookup_scodoc(apo_data.etape_formsemestre_ids) e.lookup_scodoc(apo_data.etape_formsemestre_ids)
e.associate_sco(apo_data) e.associate_sco(apo_data)

View File

@ -148,12 +148,15 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"):
I["server_name"] = request.url_root I["server_name"] = request.url_root
# Formation et parcours # Formation et parcours
formation_dict = None
if I["sem"]["formation_id"]: if I["sem"]["formation_id"]:
I["formation"] = sco_formations.formation_list( formation_dicts = sco_formations.formation_list(
args={"formation_id": I["sem"]["formation_id"]} args={"formation_id": I["sem"]["formation_id"]}
)[0] )
else: # what's the fuck ? if formation_dicts:
I["formation"] = { formation_dict = formation_dicts[0]
if formation_dict is None: # what's the fuck ?
formation_dict = {
"acronyme": "?", "acronyme": "?",
"code_specialite": "", "code_specialite": "",
"dept_id": 1, "dept_id": 1,
@ -166,6 +169,7 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"):
"type_parcours": 0, "type_parcours": 0,
"version": 0, "version": 0,
} }
I["formation"] = formation_dict
I["parcours"] = sco_codes_parcours.get_parcours_from_code( I["parcours"] = sco_codes_parcours.get_parcours_from_code(
I["formation"]["type_parcours"] I["formation"]["type_parcours"]
) )

View File

@ -236,6 +236,7 @@ def do_module_edit(vals: dict) -> None:
mod = module_list({"module_id": vals["module_id"]})[0] mod = module_list({"module_id": vals["module_id"]})[0]
if module_is_locked(mod["module_id"]): if module_is_locked(mod["module_id"]):
# formation verrouillée: empeche de modifier certains champs: # formation verrouillée: empeche de modifier certains champs:
vals = vals.copy()
protected_fields = ("coefficient", "ue_id", "matiere_id", "semestre_id") protected_fields = ("coefficient", "ue_id", "matiere_id", "semestre_id")
for f in protected_fields: for f in protected_fields:
if f in vals: if f in vals:

View File

@ -89,6 +89,8 @@ def formation_list(formation_id=None, args={}):
def formation_has_locked_sems(formation_id): # XXX to remove def formation_has_locked_sems(formation_id): # XXX to remove
"backward compat: True if there is a locked formsemestre in this formation" "backward compat: True if there is a locked formsemestre in this formation"
formation = Formation.query.get(formation_id) formation = Formation.query.get(formation_id)
if formation is None:
return False
return formation.has_locked_sems() return formation.has_locked_sems()

View File

@ -419,7 +419,7 @@ def do_formsemestre_createwithmodules(edit=False):
{ {
"size": 32, "size": 32,
"title": "Element(s) Apogée:", "title": "Element(s) Apogée:",
"explanation": "du semestre (ex: VRTW1). Séparés par des virgules.", "explanation": "associé(s) au résultat du semestre (ex: VRTW1). Inutile en BUT. Séparés par des virgules.",
"allow_null": not sco_preferences.get_preference( "allow_null": not sco_preferences.get_preference(
"always_require_apo_sem_codes" "always_require_apo_sem_codes"
), ),
@ -432,7 +432,7 @@ def do_formsemestre_createwithmodules(edit=False):
{ {
"size": 32, "size": 32,
"title": "Element(s) Apogée:", "title": "Element(s) Apogée:",
"explanation": "de l'année (ex: VRT1A). Séparés par des virgules.", "explanation": "associé(s) au résultat de l'année (ex: VRT1A). Séparés par des virgules.",
"allow_null": not sco_preferences.get_preference( "allow_null": not sco_preferences.get_preference(
"always_require_apo_sem_codes" "always_require_apo_sem_codes"
), ),
@ -1785,7 +1785,7 @@ def get_formsemestre_session_id(sem, F, parcours):
"ImputationDept", sem["formsemestre_id"] "ImputationDept", sem["formsemestre_id"]
) )
if not imputation_dept: if not imputation_dept:
imputation_dept = sco_preferences.get_preference("DeptName") imputation_dept = sco_preferences.get_preference("DeptName") or ""
imputation_dept = imputation_dept.upper() imputation_dept = imputation_dept.upper()
parcours_type = parcours.NAME parcours_type = parcours.NAME
modalite = sem["modalite"] modalite = sem["modalite"]

View File

@ -236,8 +236,8 @@ def dict_pvjury(
has_prev = False # vrai si au moins un etudiant a un code prev has_prev = False # vrai si au moins un etudiant a un code prev
semestre_non_terminal = False # True si au moins un etudiant a un devenir semestre_non_terminal = False # True si au moins un etudiant a un devenir
L = [] decisions = []
D = {} # même chose que L, mais { etudid : dec } D = {} # même chose que decisions, mais { etudid : dec }
for etudid in etudids: for etudid in etudids:
# etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] # etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0]
etud: Identite = Identite.query.get(etudid) etud: Identite = Identite.query.get(etudid)
@ -353,7 +353,7 @@ def dict_pvjury(
d["prev_code_descr"] = "" d["prev_code_descr"] = ""
d["Se"] = Se d["Se"] = Se
L.append(d) decisions.append(d)
D[etudid] = d D[etudid] = d
return { return {
@ -364,7 +364,7 @@ def dict_pvjury(
"formation": sco_formations.formation_list( "formation": sco_formations.formation_list(
args={"formation_id": sem["formation_id"]} args={"formation_id": sem["formation_id"]}
)[0], )[0],
"decisions": L, "decisions": decisions,
"decisions_dict": D, "decisions_dict": D,
} }

View File

@ -631,12 +631,17 @@ def add_apc_infos(formsemestre: FormSemestre, params: dict, decision: dict):
"""Ajoute les champs pour les formations APC (BUT), donc avec codes RCUE et année""" """Ajoute les champs pour les formations APC (BUT), donc avec codes RCUE et année"""
annee_but = (formsemestre.semestre_id + 1) // 2 annee_but = (formsemestre.semestre_id + 1) // 2
params["decision_orig"] = f"année BUT{annee_but}" params["decision_orig"] = f"année BUT{annee_but}"
params["decision_sem_descr"] = decision.get("decision_annee", {}).get("code", "") if decision is None:
params[ params["decision_sem_descr"] = ""
"decision_ue_txt" params["decision_ue_txt"] = ""
] = f"""{params["decision_ue_txt"]}<br/> else:
<b>Niveaux de compétences:</b><br/> {decision.get("descr_decisions_rcue", "")} decision_annee = decision.get("decision_annee") or {}
""" params["decision_sem_descr"] = decision_annee.get("code") or ""
params[
"decision_ue_txt"
] = f"""{params["decision_ue_txt"]}<br/>
<b>Niveaux de compétences:</b><br/> {decision.get("descr_decisions_rcue") or ""}
"""
# ---------------------------------------------- # ----------------------------------------------

View File

@ -51,8 +51,12 @@
else '<span class="missing_ue_ects">aucun</span>'|safe else '<span class="missing_ue_ects">aucun</span>'|safe
}} ECTS }} ECTS
{%- endif -%} {%- endif -%}
{%- if ue.code_apogee -%}
{{ virg() }} Apo {{ue.code_apogee}}
{%- endif -%}
) )
</span> </span>
</span> </span>
{% if editable and not ue.is_locked() %} {% if editable and not ue.is_locked() %}

View File

@ -299,21 +299,21 @@ def formsemestre_bulletinetud(
raise ScoInvalidIdType( raise ScoInvalidIdType(
"formsemestre_bulletinetud: formsemestre_id must be an integer !" "formsemestre_bulletinetud: formsemestre_id must be an integer !"
) )
formsemestre = FormSemestre.query.get_or_404(formsemestre_id) formsemestre = FormSemestre.query.filter_by(
formsemestre_id=formsemestre_id, dept_id=g.scodoc_dept_id
).first_or_404()
if etudid: if etudid:
etud = models.Identite.query.get_or_404(etudid) etud = models.Identite.query.filter_by(
etudid=etudid, dept_id=formsemestre.dept_id
).first_or_404()
elif code_nip: elif code_nip:
etud = ( etud = models.Identite.query.filter_by(
models.Identite.query.filter_by(code_nip=str(code_nip)) code_nip=str(code_nip), dept_id=formsemestre.dept_id
.filter_by(dept_id=formsemestre.dept_id) ).first_or_404()
.first_or_404()
)
elif code_ine: elif code_ine:
etud = ( etud = models.Identite.query.filter_by(
models.Identite.query.filter_by(code_ine=str(code_ine)) code_ine=str(code_ine), dept_id=formsemestre.dept_id
.filter_by(dept_id=formsemestre.dept_id) ).first_or_404()
.first_or_404()
)
else: else:
raise ScoValueError( raise ScoValueError(
"Paramètre manquant: spécifier etudid, code_nip ou code_ine" "Paramètre manquant: spécifier etudid, code_nip ou code_ine"

View File

@ -1,7 +1,7 @@
# -*- mode: python -*- # -*- mode: python -*-
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
SCOVERSION = "9.3.19" SCOVERSION = "9.3.20"
SCONAME = "ScoDoc" SCONAME = "ScoDoc"