Validations auto classic et BUT: accélération via DeferredSemCacheManager.

This commit is contained in:
Emmanuel Viennet 2022-07-11 18:28:58 +02:00
parent b698196a09
commit 60f5bdfc60
2 changed files with 60 additions and 59 deletions

View File

@ -4,15 +4,14 @@
# See LICENSE # See LICENSE
############################################################################## ##############################################################################
"""Jury BUT: clacul des décisions de jury annuelles "automatiques" """Jury BUT: calcul des décisions de jury annuelles "automatiques"
""" """
from flask import g, url_for
from app import db from app import db
from app.but import jury_but from app.but import jury_but
from app.models.etudiants import Identite from app.models.etudiants import Identite
from app.models.formsemestre import FormSemestre from app.models.formsemestre import FormSemestre
from app.scodoc import sco_cache
from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.sco_exceptions import ScoValueError
@ -23,12 +22,13 @@ def formsemestre_validation_auto_but(formsemestre: FormSemestre) -> int:
if not formsemestre.formation.is_apc(): if not formsemestre.formation.is_apc():
raise ScoValueError("fonction réservée aux formations BUT") raise ScoValueError("fonction réservée aux formations BUT")
nb_admis = 0 nb_admis = 0
for etudid in formsemestre.etuds_inscriptions: with sco_cache.DeferredSemCacheManager():
etud: Identite = Identite.query.get(etudid) for etudid in formsemestre.etuds_inscriptions:
deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre) etud: Identite = Identite.query.get(etudid)
if deca.admis: # année réussie deca = jury_but.DecisionsProposeesAnnee(etud, formsemestre)
deca.record_all() if deca.admis: # année réussie
nb_admis += 1 deca.record_all()
nb_admis += 1
db.session.commit() db.session.commit()
return nb_admis return nb_admis

View File

@ -871,10 +871,9 @@ def form_decision_manuelle(Se, formsemestre_id, etudid, desturl="", sortcol=None
# ----------- # -----------
def formsemestre_validation_auto(formsemestre_id): def formsemestre_validation_auto(formsemestre_id):
"Formulaire saisie automatisee des decisions d'un semestre" "Formulaire saisie automatisee des decisions d'un semestre"
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
H = [ H = [
html_sco_header.html_sem_header("Saisie automatique des décisions du semestre"), html_sco_header.html_sem_header("Saisie automatique des décisions du semestre"),
""" f"""
<ul> <ul>
<li>Seuls les étudiants qui obtiennent le semestre seront affectés (code ADM, moyenne générale et <li>Seuls les étudiants qui obtiennent le semestre seront affectés (code ADM, moyenne générale et
toutes les barres, semestre précédent validé);</li> toutes les barres, semestre précédent validé);</li>
@ -886,12 +885,11 @@ def formsemestre_validation_auto(formsemestre_id):
<p>Il est donc vivement conseillé de relire soigneusement les décisions à l'issue <p>Il est donc vivement conseillé de relire soigneusement les décisions à l'issue
de cette procédure !</p> de cette procédure !</p>
<form action="do_formsemestre_validation_auto"> <form action="do_formsemestre_validation_auto">
<input type="hidden" name="formsemestre_id" value="%s"/> <input type="hidden" name="formsemestre_id" value="{formsemestre_id}"/>
<input type="submit" value="Calculer automatiquement ces décisions"/> <input type="submit" value="Calculer automatiquement ces décisions"/>
<p><em>Le calcul prend quelques minutes, soyez patients !</em></p> <p><em>Le calcul prend quelques minutes, soyez patients !</em></p>
</form> </form>
""" """,
% formsemestre_id,
html_sco_header.sco_footer(), html_sco_header.sco_footer(),
] ]
return "\n".join(H) return "\n".join(H)
@ -906,53 +904,56 @@ def do_formsemestre_validation_auto(formsemestre_id):
etudids = nt.get_etudids() etudids = nt.get_etudids()
nb_valid = 0 nb_valid = 0
conflicts = [] # liste des etudiants avec decision differente déjà saisie conflicts = [] # liste des etudiants avec decision differente déjà saisie
for etudid in etudids: with sco_cache.DeferredSemCacheManager():
etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] for etudid in etudids:
Se = sco_cursus.get_situation_etud_cursus(etud, formsemestre_id) etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0]
ins = sco_formsemestre_inscriptions.do_formsemestre_inscription_list( Se = sco_cursus.get_situation_etud_cursus(etud, formsemestre_id)
{"etudid": etudid, "formsemestre_id": formsemestre_id} ins = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(
)[0] {"etudid": etudid, "formsemestre_id": formsemestre_id}
)[0]
# Conditions pour validation automatique: # Conditions pour validation automatique:
if ins["etat"] == "I" and ( if ins["etat"] == "I" and (
( (
(not Se.prev) (not Se.prev)
or (Se.prev_decision and Se.prev_decision["code"] in (ADM, ADC, ADJ)) or (
) Se.prev_decision and Se.prev_decision["code"] in (ADM, ADC, ADJ)
and Se.barre_moy_ok )
and Se.barres_ue_ok
and not etud_has_notes_attente(etudid, formsemestre_id)
):
# check: s'il existe une decision ou autorisation et qu'elles sont differentes,
# warning (et ne fait rien)
decision_sem = nt.get_etud_decision_sem(etudid)
ok = True
if decision_sem and decision_sem["code"] != ADM:
ok = False
conflicts.append(etud)
autorisations = ScolarAutorisationInscription.query.filter_by(
etudid=etudid, origin_formsemestre_id=formsemestre_id
).all()
if len(autorisations) != 0:
if (
len(autorisations) > 1
or autorisations[0].semestre_id != next_semestre_id
):
if ok:
conflicts.append(etud)
ok = False
# ok, valide !
if ok:
formsemestre_validation_etud_manu(
formsemestre_id,
etudid,
code_etat=ADM,
devenir="NEXT",
assidu=True,
redirect=False,
) )
nb_valid += 1 and Se.barre_moy_ok
and Se.barres_ue_ok
and not etud_has_notes_attente(etudid, formsemestre_id)
):
# check: s'il existe une decision ou autorisation et qu'elles sont differentes,
# warning (et ne fait rien)
decision_sem = nt.get_etud_decision_sem(etudid)
ok = True
if decision_sem and decision_sem["code"] != ADM:
ok = False
conflicts.append(etud)
autorisations = ScolarAutorisationInscription.query.filter_by(
etudid=etudid, origin_formsemestre_id=formsemestre_id
).all()
if len(autorisations) != 0:
if (
len(autorisations) > 1
or autorisations[0].semestre_id != next_semestre_id
):
if ok:
conflicts.append(etud)
ok = False
# ok, valide !
if ok:
formsemestre_validation_etud_manu(
formsemestre_id,
etudid,
code_etat=ADM,
devenir="NEXT",
assidu=True,
redirect=False,
)
nb_valid += 1
log( log(
"do_formsemestre_validation_auto: %d validations, %d conflicts" "do_formsemestre_validation_auto: %d validations, %d conflicts"
% (nb_valid, len(conflicts)) % (nb_valid, len(conflicts))