From c9aa55979bd92ea209a1770a921a6c5f693edbd3 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 6 Jul 2022 00:05:14 +0200 Subject: [PATCH] Misc fixes. Suppr. validations BUT. --- app/comp/res_common.py | 2 +- app/models/but_validations.py | 1 + app/scodoc/sco_bulletins.py | 10 --- app/scodoc/sco_formsemestre_validation.py | 56 +++++++------ .../but/documentation_codes_jury.html | 2 +- app/views/notes.py | 79 +++++++++++-------- tests/api/exemple-api-basic.py | 10 +-- 7 files changed, 88 insertions(+), 72 deletions(-) diff --git a/app/comp/res_common.py b/app/comp/res_common.py index 04bd92d1..98b5a9c6 100644 --- a/app/comp/res_common.py +++ b/app/comp/res_common.py @@ -650,7 +650,7 @@ class ResultatsSemestre(ResultatsCache): elif nb_ues_validables < len(ues_sans_bonus): row["_ues_validables_class"] += " moy_inf" row["_ues_validables_order"] = nb_ues_validables # pour tri - if mode_jury: + if mode_jury and self.validations: dec_sem = self.validations.decisions_jury.get(etudid) jury_code_sem = dec_sem["code"] if dec_sem else "" idx = add_cell( diff --git a/app/models/but_validations.py b/app/models/but_validations.py index ebedadd7..9d42c14d 100644 --- a/app/models/but_validations.py +++ b/app/models/but_validations.py @@ -43,6 +43,7 @@ class ApcValidationRCUE(db.Model): formsemestre_id = db.Column( db.Integer, db.ForeignKey("notes_formsemestre.id"), index=True, nullable=True ) + "formsemestre pair du RCUE" # Les deux UE associées à ce niveau: ue1_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False) ue2_id = db.Column(db.Integer, db.ForeignKey("notes_ue.id"), nullable=False) diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py index daf4a941..4a82674e 100644 --- a/app/scodoc/sco_bulletins.py +++ b/app/scodoc/sco_bulletins.py @@ -58,7 +58,6 @@ from app.scodoc import sco_formations from app.scodoc import sco_formsemestre from app.scodoc import sco_groups from app.scodoc import sco_permissions_check -from app.scodoc import sco_photos from app.scodoc import sco_preferences from app.scodoc import sco_pvjury from app.scodoc import sco_users @@ -66,15 +65,6 @@ import app.scodoc.sco_utils as scu from app.scodoc.sco_utils import ModuleType, fmt_note import app.scodoc.notesdb as ndb -# ----- CLASSES DE BULLETINS DE NOTES -from app.scodoc import sco_bulletins_standard -from app.scodoc import sco_bulletins_legacy - -# import sco_bulletins_example # format exemple (à désactiver en production) - -# ... ajouter ici vos modules ... -from app.scodoc import sco_bulletins_ucac # format expérimental UCAC Cameroun - def get_formsemestre_bulletin_etud_json( formsemestre: FormSemestre, diff --git a/app/scodoc/sco_formsemestre_validation.py b/app/scodoc/sco_formsemestre_validation.py index 2af209c2..a9d13c01 100644 --- a/app/scodoc/sco_formsemestre_validation.py +++ b/app/scodoc/sco_formsemestre_validation.py @@ -35,13 +35,17 @@ from app.models.etudiants import Identite import app.scodoc.notesdb as ndb import app.scodoc.sco_utils as scu -from app import log +from app import db, log from app.comp import res_sem from app.comp.res_compat import NotesTableCompat from app.models import FormSemestre from app.models.notes import etud_has_notes_attente - +from app.models.validations import ( + ScolarAutorisationInscription, + ScolarFormSemestreValidation, +) +from app.models.but_validations import ApcValidationRCUE, ApcValidationAnnee from app.scodoc.sco_exceptions import ScoValueError from app.scodoc.scolog import logdb from app.scodoc.sco_codes_parcours import * @@ -989,28 +993,32 @@ def do_formsemestre_validation_auto(formsemestre_id): def formsemestre_validation_suppress_etud(formsemestre_id, etudid): - """Suppression des decisions de jury pour un etudiant.""" - log("formsemestre_validation_suppress_etud( %s, %s)" % (formsemestre_id, etudid)) - cnx = ndb.GetDBConnexion() - cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor) - args = {"formsemestre_id": formsemestre_id, "etudid": etudid} - try: - # -- Validation du semestre et des UEs - cursor.execute( - """delete from scolar_formsemestre_validation - where etudid = %(etudid)s and formsemestre_id=%(formsemestre_id)s""", - args, - ) - # -- Autorisations d'inscription - cursor.execute( - """delete from scolar_autorisation_inscription - where etudid = %(etudid)s and origin_formsemestre_id=%(formsemestre_id)s""", - args, - ) - cnx.commit() - except: - cnx.rollback() - raise + """Suppression des décisions de jury pour un étudiant/formsemestre. + Efface toutes les décisions enregistrées concernant ce formsemestre et cet étudiant: + code semestre, UEs, autorisations d'inscription + """ + log(f"formsemestre_validation_suppress_etud( {formsemestre_id}, {etudid})") + + # Validations jury classiques (semestres, UEs, autorisations) + for v in ScolarFormSemestreValidation.query.filter_by( + etudid=etudid, formsemestre_id=formsemestre_id + ): + db.session.delete(v) + for v in ScolarAutorisationInscription.query.filter_by( + etudid=etudid, origin_formsemestre_id=formsemestre_id + ): + db.session.delete(v) + # Validations jury spécifiques BUT + for v in ApcValidationRCUE.query.filter_by( + etudid=etudid, formsemestre_id=formsemestre_id + ): + db.session.delete(v) + for v in ApcValidationAnnee.query.filter_by( + etudid=etudid, formsemestre_id=formsemestre_id + ): + db.session.delete(v) + + db.session.commit() sem = sco_formsemestre.get_formsemestre(formsemestre_id) _invalidate_etud_formation_caches( diff --git a/app/templates/but/documentation_codes_jury.html b/app/templates/but/documentation_codes_jury.html index dbaf51ca..abd3a742 100644 --- a/app/templates/but/documentation_codes_jury.html +++ b/app/templates/but/documentation_codes_jury.html @@ -258,7 +258,7 @@
  • Bulletin officiel spécial n°4 du 17 juin 2021
  • version + href="https://cache.media.enseignementsup-recherche.gouv.fr//file/SPE4-MESRI-17-6-2021/19/4/SP4_ESR_17_6_2021_1413194.pdf">Version pdf complète
  • diff --git a/app/views/notes.py b/app/views/notes.py index 11b79481..a5e50d3e 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -57,7 +57,7 @@ from app.models.ues import UniteEns from app import api from app import db from app import models -from app.models import ScolarNews +from app.models import ScolarNews, but_validations from app.auth.models import User from app.but import apc_edit_ue, jury_but_recap from app.decorators import ( @@ -71,7 +71,7 @@ from app.views import notes_bp as bp # --------------- -from app.scodoc import sco_utils as scu +from app.scodoc import sco_bulletins_json, sco_utils as scu from app.scodoc import notesdb as ndb from app import log, send_scodoc_alarm @@ -2515,51 +2515,68 @@ def do_formsemestre_validation_auto(formsemestre_id): def formsemestre_validation_suppress_etud( formsemestre_id, etudid, dialog_confirmed=False ): - """Suppression des decisions de jury pour un etudiant.""" + """Suppression des décisions de jury pour un étudiant.""" if not sco_permissions_check.can_validate_sem(formsemestre_id): return scu.confirm_dialog( message="

    Opération non autorisée pour %s" % current_user, dest_url=scu.ScoURL(), ) + etud = Identite.query.get_or_404(etudid) + formsemestre = FormSemestre.query.get_or_404(formsemestre_id) + if formsemestre.formation.is_apc(): + next_url = url_for( + "scolar.ficheEtud", + scodoc_dept=g.scodoc_dept, + etudid=etudid, + ) + else: + next_url = url_for( + "notes.formsemestre_validation_etud_form", + scodoc_dept=g.scodoc_dept, + formsemestre_id=formsemestre_id, + etudid=etudid, + ) if not dialog_confirmed: - etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] - formsemestre = FormSemestre.query.get_or_404(formsemestre_id) - sem = formsemestre.to_dict() - nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) - decision_jury = nt.get_etud_decision_sem(etudid) - if decision_jury: - existing = ( - "

    Décision existante: %(code)s du %(event_date)s

    " % decision_jury - ) + d = sco_bulletins_json.dict_decision_jury( + etudid, formsemestre_id, with_decisions=True + ) + d.update(but_validations.dict_decision_jury(etud, formsemestre)) + + descr_ues = [f"{u['acronyme']}: {u['code']}" for u in d.get("decision_ue", [])] + dec_annee = d.get("decision_annee") + if dec_annee: + descr_annee = dec_annee.get("code", "-") else: - existing = "" + descr_annee = "-" + + existing = f""" + + """ return scu.confirm_dialog( - """

    Confirmer la suppression des décisions du semestre %s (%s - %s) pour %s ?

    %s -

    Cette opération est irréversible. -

    - """ - % ( - sem["titre_num"], - sem["date_debut"], - sem["date_fin"], - etud["nomprenom"], - existing, - ), + f"""

    Confirmer la suppression des décisions du semestre + {formsemestre.titre_mois()} pour {etud.nomprenom} +

    +

    Cette opération est irréversible.

    +
    + {existing} +
    + """, OK="Supprimer", dest_url="", - cancel_url="formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s" - % (formsemestre_id, etudid), + cancel_url=next_url, parameters={"etudid": etudid, "formsemestre_id": formsemestre_id}, ) sco_formsemestre_validation.formsemestre_validation_suppress_etud( formsemestre_id, etudid ) - return flask.redirect( - scu.ScoURL() - + "/Notes/formsemestre_validation_etud_form?formsemestre_id=%s&etudid=%s&head_message=Décision%%20supprimée" - % (formsemestre_id, etudid) - ) + flash("Décisions supprimées") + return flask.redirect(next_url) # ------------- PV de JURY et archives diff --git a/tests/api/exemple-api-basic.py b/tests/api/exemple-api-basic.py index a581a878..50b4a11f 100644 --- a/tests/api/exemple-api-basic.py +++ b/tests/api/exemple-api-basic.py @@ -33,7 +33,7 @@ except NameError: load_dotenv(os.path.join(BASEDIR, ".env")) CHK_CERT = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) -SCODOC_URL = os.environ["SCODOC_URL"] or "http://localhost:5000" +SCODOC_URL = os.environ.get("SCODOC_URL") or "http://localhost:5000" API_URL = SCODOC_URL + "/ScoDoc/api" SCODOC_USER = os.environ["SCODOC_USER"] SCODOC_PASSWORD = os.environ["SCODOC_PASSWORD"] @@ -85,13 +85,13 @@ if r.status_code != 200: print(f"{len(r.json())} étudiants courants") # Bulletin d'un BUT -formsemestre_id = 1052 # A adapter -etudid = 16400 +formsemestre_id = 1063 # A adapter +etudid = 16450 bul = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin") # d'un DUT -formsemestre_id = 1028 # A adapter -etudid = 14721 +formsemestre_id = 1062 # A adapter +etudid = 16309 bul_dut = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin")