############################################################################## # ScoDoc # Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved. # See LICENSE ############################################################################## """ ScoDoc 9 API : jury WIP à compléter avec enregistrement décisions """ from flask import g, url_for from flask_json import as_json from flask_login import login_required import app from app import db, log from app.api import api_bp as bp, api_web_bp, tools from app.decorators import scodoc, permission_required from app.scodoc.sco_exceptions import ScoException from app.but import jury_but_results from app.models import ( ApcValidationAnnee, ApcValidationRCUE, FormSemestre, Identite, ScolarAutorisationInscription, ScolarFormSemestreValidation, ScolarNews, ) from app.scodoc import sco_cache from app.scodoc.sco_permissions import Permission @bp.route("/formsemestre//decisions_jury") @api_web_bp.route("/formsemestre//decisions_jury") @login_required @scodoc @permission_required(Permission.ScoView) @as_json def decisions_jury(formsemestre_id: int): """Décisions du jury des étudiants du formsemestre.""" # APC, pair: formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id) if formsemestre.formation.is_apc(): app.set_sco_dept(formsemestre.departement.acronym) rows = jury_but_results.get_jury_but_results(formsemestre) return rows else: raise ScoException("non implemente") def _news_delete_jury_etud(etud: Identite): "génère news sur effacement décision" # n'utilise pas g.scodoc_dept, pas toujours dispo en mode API url = url_for( "scolar.ficheEtud", scodoc_dept=etud.departement.acronym, etudid=etud.id ) ScolarNews.add( typ=ScolarNews.NEWS_JURY, obj=etud.id, text=f"""Suppression décision jury pour {etud.nomprenom}""", url=url, ) @bp.route( "/etudiant//jury/validation_ue//delete", methods=["POST"], ) @api_web_bp.route( "/etudiant//jury/validation_ue//delete", methods=["POST"], ) @login_required @scodoc @permission_required(Permission.ScoEtudInscrit) @as_json def validation_ue_delete(etudid: int, validation_id: int): "Efface cette validation" return _validation_ue_delete(etudid, validation_id) @bp.route( "/etudiant//jury/validation_formsemestre//delete", methods=["POST"], ) @api_web_bp.route( "/etudiant//jury/validation_formsemestre//delete", methods=["POST"], ) @login_required @scodoc @permission_required(Permission.ScoEtudInscrit) @as_json def validation_formsemestre_delete(etudid: int, validation_id: int): "Efface cette validation" # c'est la même chose (formations classiques) return _validation_ue_delete(etudid, validation_id) def _validation_ue_delete(etudid: int, validation_id: int): "Efface cette validation (semestres classiques ou UEs)" etud = tools.get_etud(etudid) if etud is None: return "étudiant inconnu", 404 validation = ScolarFormSemestreValidation.query.filter_by( id=validation_id, etudid=etudid ).first_or_404() log(f"validation_ue_delete: etuid={etudid} {validation}") db.session.delete(validation) sco_cache.invalidate_formsemestre_etud(etud) db.session.commit() _news_delete_jury_etud(etud) return "ok" @bp.route( "/etudiant//jury/autorisation_inscription//delete", methods=["POST"], ) @api_web_bp.route( "/etudiant//jury/autorisation_inscription//delete", methods=["POST"], ) @login_required @scodoc @permission_required(Permission.ScoEtudInscrit) @as_json def autorisation_inscription_delete(etudid: int, validation_id: int): "Efface cette validation" etud = tools.get_etud(etudid) if etud is None: return "étudiant inconnu", 404 validation = ScolarAutorisationInscription.query.filter_by( id=validation_id, etudid=etudid ).first_or_404() log(f"autorisation_inscription_delete: etuid={etudid} {validation}") db.session.delete(validation) sco_cache.invalidate_formsemestre_etud(etud) db.session.commit() _news_delete_jury_etud(etud) return "ok" @bp.route( "/etudiant//jury/validation_rcue//delete", methods=["POST"], ) @api_web_bp.route( "/etudiant//jury/validation_rcue//delete", methods=["POST"], ) @login_required @scodoc @permission_required(Permission.ScoEtudInscrit) @as_json def validation_rcue_delete(etudid: int, validation_id: int): "Efface cette validation" etud = tools.get_etud(etudid) if etud is None: return "étudiant inconnu", 404 validation = ApcValidationRCUE.query.filter_by( id=validation_id, etudid=etudid ).first_or_404() log(f"validation_ue_delete: etuid={etudid} {validation}") db.session.delete(validation) sco_cache.invalidate_formsemestre_etud(etud) db.session.commit() _news_delete_jury_etud(etud) return "ok" @bp.route( "/etudiant//jury/validation_annee_but//delete", methods=["POST"], ) @api_web_bp.route( "/etudiant//jury/validation_annee_but//delete", methods=["POST"], ) @login_required @scodoc @permission_required(Permission.ScoEtudInscrit) @as_json def validation_annee_but_delete(etudid: int, validation_id: int): "Efface cette validation" etud = tools.get_etud(etudid) if etud is None: return "étudiant inconnu", 404 validation = ApcValidationAnnee.query.filter_by( id=validation_id, etudid=etudid ).first_or_404() log(f"validation_annee_but: etuid={etudid} {validation}") db.session.delete(validation) sco_cache.invalidate_formsemestre_etud(etud) db.session.commit() _news_delete_jury_etud(etud) return "ok"