From 1daafc9d16191f3f3208cd56aec04c07f485060c Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sat, 12 Feb 2022 09:33:06 +0100 Subject: [PATCH 01/49] Branche pour devel. API --- sco_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sco_version.py b/sco_version.py index 092dc38aaa..8b17fc2e6a 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.1.53" +SCOVERSION = "9.1.54api" SCONAME = "ScoDoc" From 2e1dcce69d961c5cb9d32ce0c9e748a2c2d97efb Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 18 Feb 2022 11:26:17 +0100 Subject: [PATCH 02/49] =?UTF-8?q?r=C3=A9solution=20des=20conflis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/sco_api.py | 531 +++++++++++++++++++++++++++++++-------------- 1 file changed, 363 insertions(+), 168 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index c8b20f9131..22dbc3e5bc 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -50,38 +50,17 @@ from app.api.errors import error_response from app import models from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import ApcReferentielCompetences +from app.scodoc.sco_abs import annule_absence, annule_justif +from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict +from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud +from app.scodoc.sco_formations import formation_export +from app.scodoc.sco_formsemestre_inscriptions import do_formsemestre_inscription_listinscrits +from app.scodoc.sco_groups import setGroups, get_etud_groups +from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission -@bp.route("/list_depts", methods=["GET"]) -@token_auth.login_required -def list_depts(): - depts = models.Departement.query.filter_by(visible=True).all() - data = [d.to_dict() for d in depts] - return jsonify(data) - - -@bp.route("/etudiants/courant", methods=["GET"]) -@token_auth.login_required -def etudiants(): - """Liste de tous les étudiants actuellement inscrits à un semestre - en cours. - """ - # Vérification de l'accès: permission Observateur sur tous les départements - # (c'est un exemple à compléter) - if not g.current_user.has_permission(Permission.ScoObservateur, None): - return error_response(401, message="accès interdit") - - query = db.session.query(Identite).filter( - FormSemestreInscription.formsemestre_id == FormSemestre.id, - FormSemestreInscription.etudid == Identite.id, - FormSemestre.date_debut <= func.now(), - FormSemestre.date_fin >= func.now(), - ) - return jsonify([e.to_dict_bul(include_urls=False) for e in query]) - - -######################## Departements ################################## +############################################### Departements ########################################################## @bp.route("/departements", methods=["GET"]) @@ -97,7 +76,7 @@ def departements(): @bp.route("/departements//etudiants/liste/", methods=["GET"]) @token_auth.login_required -def liste_etudiants(dept, *args, sem_id): # XXX TODO A REVOIR +def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR """ Liste des étudiants d'un département """ @@ -133,145 +112,273 @@ def liste_etudiants(dept, *args, sem_id): # XXX TODO A REVOIR @bp.route("/departements//semestres_actifs", methods=["GET"]) @token_auth.login_required -def liste_semestres_actifs(dept): # TODO : changer nom +def liste_semestres_courant(dept: str): """ Liste des semestres actifs d'un départements donné """ - # Récupération de l'id du dept - dept_id = models.Departement.query.filter(models.Departement.acronym == dept) - # Puis ici récupération du FormSemestre correspondant - depts_actifs = models.FormSemestre.query.filter_by( - etat=True, - dept_id=dept_id, - ) - data = [da.to_dict() for da in depts_actifs] + depts = models.Departement.query.filter_by(acronym=dept).all() - # return jsonify(data) - return error_response(501, message="Not implemented") + id_dept = depts[0].id + semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() -@bp.route("/referentiel_competences/") -@token_auth.login_required -def referentiel_competences(referentiel_competence_id): + data = semestres[0].to_dict() + + return jsonify(data) + +@bp.route( + "/departements//formations//referentiel_competences", + methods=["GET"], +) +def referenciel_competences(dept: str, formation_id: int): """ Le référentiel de compétences """ - ref = ApcReferentielCompetences.query.get_or_404(referentiel_competence_id) + # depts = models.Departement.query.filter_by(acronym=dept).all() + # + # id_dept = depts[0].id + # + # formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() + # + # ref_comp = formations[0].referentiel_competence_id + # + # if ref_comp is None: + # return error_response(204, message="Pas de référenciel de compétences pour cette formation") + # else: + # return jsonify(ref_comp) + + ref = ApcReferentielCompetences.query.get_or_404(formation_id) + return jsonify(ref.to_dict()) -####################### Etudiants ################################## - - -@bp.route("/etudiant/", methods=["GET"]) -@token_auth.login_required -def etudiant(etudid): +@bp.route("/departements//formations/programme/", methods=["GET"]) +def semestre_index(dept: str, sem_idx: str): """ - Un dictionnaire avec les informations de l'étudiant correspondant à l'id passé en paramètres. + """ - etud: Identite = Identite.query.get_or_404(etudid) - return jsonify(etud.to_dict_bul()) + return error_response(501, message="not implemented") -@bp.route("/etudiant//semestre//bulletin", methods=["GET"]) -@token_auth.login_required -def etudiant_bulletin_semestre(etudid, sem_id): +#################################################### Etudiants ######################################################## + + +@bp.route("/etudiants", methods=["GET"]) +def etudiants(): + """ + La liste des étudiants + """ + etu = models.Identite.query.all() + + data = [d.to_dict_bul(include_urls=False) for d in etu] + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/etudiants/courant", methods=["GET"]) +def etudiants_courant(): + """ + La liste des étudiants courant + """ + etus = models.Identite.query.all() + + data = [] + for etu in etus: + if etu.inscription_courante() is not None: + data.append(etu.to_dict_bul(include_urls=False)) + + return jsonify(data) + # return error_response(501, message="Not implemented") + +@bp.route("/etudiant/etudid/", methods=["GET"]) +@bp.route("/etudiant/nip/", methods=["GET"]) +@bp.route("/etudiant/ine/", methods=["GET"]) +def etudiant(etudid=None, nip=None, ine=None): + """ + Les informations de l'étudiant correspondant à l'id passé en paramètres. + """ + etu = [] + if etudid is not None: + etu = models.Identite.query.filter_by(id=etudid).first() + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=etudid).first() + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=etudid).first() + + data = etu.to_dict_bul(include_urls=False) + + return jsonify(data) + +@bp.route("/etudiant/etudid//formsemestres") +@bp.route("/etudiant/nip//formsemestres") +@bp.route("/etudiant/ine//formsemestres") +def etudiant_formsemestres(etudid=None, nip=None, ine=None): + """ + Retourne les semestres qu'un étudiant a suivi + """ + + inscriptions = models.FormSemestreInscription.query.all() + + sems = [] + for sem in inscriptions: + if etudid is not None: + if sem.etudid == etudid: + sems.append(sem) + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + if sem.etudid == etu.etudid: + sems.append(sem) + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).firt() + if sem.etudid == etu.etudid: + sems.append(sem) + + data_inscriptions = [d.to_dict() for d in sems] + + formsemestres = [] + + for sem in data_inscriptions: + res = models.FormSemestre.query.filter_by(id=sem['formsemestre_id']).first() + formsemestres.append(res) + + data = [] + for formsem in formsemestres: + data.append(formsem.to_dict()) + + return jsonify(data) + + +@bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) +@bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) +@bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) +def etudiant_bulletin_semestre(formsemestre_id, etudid=None, nip=None, ine=None): """ Le bulletin d'un étudiant en fonction de son id et d'un semestre donné """ - # return jsonify(models.BulAppreciations.query.filter_by(etudid=etudid, formsemestre_id=sem_id)) - return error_response(501, message="Not implemented") - - -@bp.route( - "/formsemestre//departements//etudiant/nip//releve", - methods=["GET"], -) -@bp.route( - "/formsemestre//departements//etudiant/id//releve", - methods=["GET"], -) -@bp.route( - "/formsemestre//departements//etudiant/ine//releve", - methods=["GET"], -) -@token_auth.login_required -def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): - """ - Un bulletin de note - """ - formsemestres = models.FormSemestre.query.filter_by(id=formsemestre_id) - depts = models.Departement.query.filter_by(acronym=dept) - etud = "" - - data = [] - if args[0] == "short": - pass - elif args[0] == "selectevals": - pass - elif args[0] == "long": - pass + # fonction to use: make_json_formsemestre_bulletinetud() + if etudid is not None: + return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) else: - return "erreur" + etu = None + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() - # return jsonify(data) - return error_response(501, message="Not implemented") + if ine is not None: + etu = models.Identite.query.filter_by(code_nip=ine).first() + + if etu is not None: + return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + + # return error_response(501, message="Not implemented") @bp.route( - "/etudiant//semestre//groups", methods=["GET"] + "/etudiant/etudid//semestre//groups", methods=["GET"] ) -@token_auth.login_required -def etudiant_groups(etudid: int, formsemestre_id: int): +@bp.route( + "/etudiant/nip//semestre//groups", methods=["GET"] +) +@bp.route( + "/etudiant/ine//semestre//groups", methods=["GET"] +) +def etudiant_groups(formsemestre_id: int, etudid=None, nip=None, ine=None): """ Liste des groupes auxquels appartient l'étudiant dans le semestre indiqué """ - semestre = models.FormSemestre.query.filter_by(id=formsemestre_id) - etudiant = models.Identite.query.filter_by(id=etudid) + # fonction to use : get_etud_groups - groups = models.Partition.query.filter( - models.Partition.formsemestre_id == semestre, - models.GroupDescr.etudiants == etudiant, - ) - data = [d.to_dict() for d in groups] - # return jsonify(data) + if etudid is None: + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + etudid = etu.etudid + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + etudid = etu.etudid + sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + try: + data = get_etud_groups(etudid, sem.to_dict()) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") - return error_response(501, message="Not implemented") + return jsonify(data) - -#######################" Programmes de formations ######################### +##############################################" Formations ############################################################ @bp.route("/formations", methods=["GET"]) -@bp.route("/formations/", methods=["GET"]) -@token_auth.login_required -def formations(formation_id: int): +def formations(): """ Liste des formations """ - formations = models.Formation.query.filter_by(id=formation_id) - data = [d.to_dict() for d in formations] - # return jsonify(data) + list_formations = models.Formation.query.all() - return error_response(501, message="Not implemented") + data = [d.to_dict() for d in list_formations] + + return jsonify(data) + + +@bp.route("/formations/", methods=["GET"]) +def formations_by_id(formation_id: int): + """ + Formation en fonction d'un id donné + """ + forma = models.Formation.query.filter_by(id=formation_id).all() + + data = [d.to_dict() for d in forma] + + return jsonify(data) @bp.route("/formations/formation_export/", methods=["GET"]) -@token_auth.login_required -def formation_export(formation_id: int, export_ids=False): +def formation_export_by_formation_id(formation_id: int, export_ids=False): """ La formation, avec UE, matières, modules """ + data = formation_export(formation_id) + + return jsonify(data) + + +@bp.route("/formations/apo/", methods=["GET"]) +def formsemestre_apo(etape_apo: int): + """ + Information sur les formsemestres + """ return error_response(501, message="Not implemented") -###################### UE ####################################### +@bp.route("/formations/moduleimpl/", methods=["GET"]) +def moduleimpls(moduleimpl_id: int): + """ + Liste des moduleimpl + """ + list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id) + + data = list_moduleimpls[0].to_dict() + + return jsonify(data) + + +@bp.route( + "/formations/moduleimpl//formsemestre/", + methods=["GET"], +) +def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): + """ + Liste de moduleimpl d'un semestre + """ + data = moduleimpl_list(moduleimpl_id, formsemestre_id) + return jsonify(data) + # return error_response(501, message="Not implemented") + + +#################################################### UE ############################################################### @bp.route( "/departements//formations/programme/", methods=["GET"] ) -@token_auth.login_required def eus(dept: str, sem_id: int): """ Liste des UES, ressources et SAE d'un semestre @@ -279,42 +386,70 @@ def eus(dept: str, sem_id: int): return error_response(501, message="Not implemented") -######## Semestres de formation ############### +########################################## Formsemestres ############################################################## @bp.route("/formations/formsemestre/", methods=["GET"]) -@bp.route("/formations/apo/", methods=["GET"]) -@token_auth.login_required -def formsemestre( - id: int, -): +def formsemestre(formsemestre_id: int): """ - Information sur les formsemestres + Information sur le formsemestre correspondant au formsemestre_id """ - return error_response(501, message="Not implemented") + list_formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id) + + data = list_formsemetre[0].to_dict() + + return jsonify(data) -############ Modules de formation ############## - - -@bp.route("/formations/moduleimpl/", methods=["GET"]) @bp.route( - "/formations/moduleimpl//formsemestre/", + "/formsemestre//departements//etudiant/etudid//bulletin", methods=["GET"], ) -@token_auth.login_required -def moduleimpl(id: int): +@bp.route( + "/formsemestre//departements//etudiant/nip//bulletin", + methods=["GET"], +) +@bp.route( + "/formsemestre//departements//etudiant/ine//bulletin", + methods=["GET"], +) +def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): """ - Liste de moduleimpl + Un bulletin de note + """ + data = [] + if args[0] == "short": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + elif args[0] == "selectevals": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + elif args[0] == "long": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) + else: + return error_response(501, message="Not implemented") + + return jsonify(data) + + +@bp.route("/formsemestre//bulletins", methods=["GET"]) +def bulletins(formsemestre_id: int): + """ + Les bulletins d'un formsemestre donné """ return error_response(501, message="Not implemented") -########### Groupes et partitions ############### +@bp.route("/formsemestre//jury", methods=["GET"]) +def jury(formsemestre_id: int): + """ + + """ + return error_response(501, message="Not implemented") + + +############################################### Partitions ############################################################ @bp.route("/partitions/", methods=["GET"]) -@token_auth.login_required def partition(formsemestre_id: int): """ La liste de toutes les partitions d'un formsemestre @@ -330,7 +465,6 @@ def partition(formsemestre_id: int): "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", methods=["GET"], ) -@token_auth.login_required def groups(formsemestre_id: int, group_ids: int): """ Liste des étudiants dans un groupe @@ -339,24 +473,27 @@ def groups(formsemestre_id: int, group_ids: int): @bp.route( - "/partitions/set_groups?partition_id=&groups=&groups_to_delete=&groups_to_create=", - methods=["POST"], + "/partitions/set_groups?partition_id=&groups_lists=&groups_to_create=&groups_to_delete=", methods=["POST"], ) @token_auth.login_required def set_groups( - partition_id: int, groups: int, groups_to_delete: int, groups_to_create: int + partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int ): """ Set les groups """ - return error_response(501, message="Not implemented") + try: + setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete) + return error_response(200, message="Groups set") + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") -####### Bulletins de notes ########### +################################################### Evaluations ####################################################### @bp.route("/evaluations/", methods=["GET"]) -@token_auth.login_required def evaluations(moduleimpl_id: int): """ Liste des évaluations à partir de l'id d'un moduleimpl @@ -364,22 +501,21 @@ def evaluations(moduleimpl_id: int): evals = models.Evaluation.query.filter_by(id=moduleimpl_id) data = [d.to_dict() for d in evals] - # return jsonify(data) - return error_response(501, message="Not implemented") + return jsonify(data) + # return error_response(501, message="Not implemented") @bp.route("/evaluations/eval_notes/", methods=["GET"]) -@token_auth.login_required def evaluation_notes(evaluation_id: int): """ Liste des notes à partir de l'id d'une évaluation donnée """ - evals = models.Evaluation.query.filter_by(id=evaluation_id) - notes = evals.get_notes() + notes = models.NotesNotes.query.filter_by(evaluation_id=evaluation_id).all() data = [d.to_dict() for d in notes] - # return jsonify(data) - return error_response(501, message="Not implemented") + + return jsonify(data) + # return error_response(501, message="Not implemented") @bp.route( @@ -394,20 +530,52 @@ def evaluation_set_notes(eval_id: int, etudid: int, note: float): return error_response(501, message="Not implemented") -############## Absences ############# +#################################################### Absences ######################################################### @bp.route("/absences/", methods=["GET"]) +def absences(etudid=None, nip=None, ine=None): + """ + Liste des absences d'un étudiant donné + """ + abs = "" + if etudid is not None: + abs = models.Absence.query.filter_by(etudid=etudid).all() + else: + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + + if abs != "": + data = [d.to_dict() for d in abs] + + return jsonify(data) + return error_response(501, message="Not implemented") + + @bp.route("/absences//abs_just_only", methods=["GET"]) -def absences(etudid: int): +def absences_justify(etudid=None, nip=None, ine=None): """ - Liste des absences d'un étudiant donnée + Liste des absences justifiés d'un étudiant donné """ - abs = models.Absence.query.filter_by(id=etudid) + abs = "" + if etudid is not None: + abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() + else: + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() - data = [d.to_dict() for d in abs] + if abs != "": + data = [d.to_dict() for d in abs] - # return jsonify(data) + return jsonify(data) return error_response(501, message="Not implemented") @@ -420,43 +588,73 @@ def abs_signale(): return error_response(501, message="Not implemented") -@bp.route("/absences/abs_annule", methods=["POST"]) +@bp.route("/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -def abs_annule(): +def abs_annule(jour: datetime, matin: str, etudid=None, nip=None, ine=None): """ Retourne un html """ - return error_response(501, message="Not implemented") + # fonction to use : annule_absence + if etudid is None: + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + etudid = etu.etudid + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + etudid = etu.etudid + try: + annule_absence(etudid, jour, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") -@bp.route("/absences/abs_annule_justif", methods=["POST"]) +@bp.route("/absences/abs_annule_justif?etudid=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -def abs_annule_justif(): +def abs_annule_justif(jour: datetime, matin: str, etudid=None, nip=None, ine=None): """ Retourne un html """ - return error_response(501, message="Not implemented") + # fonction to use : annule_justif + if etudid is None: + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + etudid = etu.etudid + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + etudid = etu.etudid + try: + annule_justif(etudid, jour, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") @bp.route( "/absences/abs_group_etat/?group_ids=&date_debut=date_debut&date_fin=date_fin", methods=["GET"], ) -@token_auth.login_required def abs_groupe_etat( - group_ids: int, date_debut, date_fin, with_boursier=True, format="html" + group_ids: int, date_debut, date_fin, with_boursier=True, format="html" ): """ Liste des absences d'un ou plusieurs groupes entre deux dates """ + + # list_abs_date return error_response(501, message="Not implemented") -################ Logos ################ +###################################################### Logos ########################################################## @bp.route("/logos", methods=["GET"]) -@token_auth.login_required def liste_logos(format="json"): """ Liste des logos définis pour le site scodoc. @@ -465,7 +663,6 @@ def liste_logos(format="json"): @bp.route("/logos/", methods=["GET"]) -@token_auth.login_required def recup_logo_global(nom: str): """ Retourne l'image au format png ou jpg @@ -474,7 +671,6 @@ def recup_logo_global(nom: str): @bp.route("/departements//logos", methods=["GET"]) -@token_auth.login_required def logo_dept(dept: str): """ Liste des logos définis pour le département visé. @@ -483,7 +679,6 @@ def logo_dept(dept: str): @bp.route("/departement//logos/", methods=["GET"]) -@token_auth.login_required def recup_logo_dept_global(dept: str, nom: str): """ L'image format png ou jpg From 79b5530813f0dc40442293067a4e573c7753a97c Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 18 Feb 2022 15:53:54 +0100 Subject: [PATCH 03/49] ajout des routes jury --- app/api/sco_api.py | 49 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 22dbc3e5bc..5f3bb7d9c7 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -110,7 +110,7 @@ def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR return error_response(501, message="Not implemented") -@bp.route("/departements//semestres_actifs", methods=["GET"]) +@bp.route("/departements//semestres_courant", methods=["GET"]) @token_auth.login_required def liste_semestres_courant(dept: str): """ @@ -126,6 +126,7 @@ def liste_semestres_courant(dept: str): return jsonify(data) + @bp.route( "/departements//formations//referentiel_competences", methods=["GET"], @@ -191,6 +192,7 @@ def etudiants_courant(): return jsonify(data) # return error_response(501, message="Not implemented") + @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) @@ -210,6 +212,7 @@ def etudiant(etudid=None, nip=None, ine=None): return jsonify(data) + @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") @@ -303,6 +306,7 @@ def etudiant_groups(formsemestre_id: int, etudid=None, nip=None, ine=None): return jsonify(data) + ##############################################" Formations ############################################################ @@ -490,7 +494,7 @@ def set_groups( return error_response(409, message="La requête ne peut être traitée en l’état actuel") -################################################### Evaluations ####################################################### +############################################### Evaluations ########################################################### @bp.route("/evaluations/", methods=["GET"]) @@ -530,6 +534,47 @@ def evaluation_set_notes(eval_id: int, etudid: int, note: float): return error_response(501, message="Not implemented") +#################################################### Jury ############################################################# +@bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) +def jury_preparation(formsemestre_id: int): + """ + Feuille de préparation du jury + """ + return error_response(501, message="Not implemented") + + +@bp.route("/jury/formsemestre//decisions_jury", methods=["GET"]) +def jury_decisions(formsemestre_id: int): + """ + Retourne les décisions du jury suivant un formsemestre donné + """ + return error_response(501, message="Not implemented") + + +@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) +def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, etudid=None, + nip=None, ine=None): + """ + Attribuer la décision du jury et le devenir à un etudiant + """ + return error_response(501, message="Not implemented") + + +@bp.route("/jury/etudid//formsemestre//annule_decision", methods=["DELETE"]) +@bp.route("/jury/nip//formsemestre//annule_decision", methods=["DELETE"]) +@bp.route("/jury/ine//formsemestre//annule_decision", methods=["DELETE"]) +def annule_decision_jury(formsemestre_id: int, etudid=None, nip=None, ine=None): + """ + Supprime la déciosion du jury pour un étudiant donné + """ + return error_response(501, message="Not implemented") + + #################################################### Absences ######################################################### From 84f43e1b361956b6e1daf5efc9054c52ba577b13 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 18 Feb 2022 16:08:50 +0100 Subject: [PATCH 04/49] avancement sur les routes jury --- app/api/sco_api.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 5f3bb7d9c7..bedda559d7 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -61,6 +61,8 @@ from app.scodoc.sco_permissions import Permission ############################################### Departements ########################################################## +from app.scodoc.sco_prepajury import feuille_preparation_jury +from app.scodoc.sco_pvjury import formsemestre_pvjury @bp.route("/departements", methods=["GET"]) @@ -534,20 +536,31 @@ def evaluation_set_notes(eval_id: int, etudid: int, note: float): return error_response(501, message="Not implemented") + #################################################### Jury ############################################################# + + @bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) -def jury_preparation(formsemestre_id: int): +def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction """ Feuille de préparation du jury """ + # fonction to use : feuille_preparation_jury() + + prepa_jury = feuille_preparation_jury(formsemestre_id) + return error_response(501, message="Not implemented") @bp.route("/jury/formsemestre//decisions_jury", methods=["GET"]) -def jury_decisions(formsemestre_id: int): +def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction """ Retourne les décisions du jury suivant un formsemestre donné """ + # fonction to use : formsemestre_pvjury + + decision_jury = formsemestre_pvjury(formsemestre_id) + return error_response(501, message="Not implemented") From ba0062135b8acf20a2b9f4ef6abe5012df3695d6 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Mon, 21 Feb 2022 16:12:31 +0100 Subject: [PATCH 05/49] formsemestre et etudiant fini --- app/api/sco_api.py | 62 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index bedda559d7..6567898827 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -53,9 +53,10 @@ from app.models import ApcReferentielCompetences from app.scodoc.sco_abs import annule_absence, annule_justif from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud +from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes from app.scodoc.sco_formations import formation_export from app.scodoc.sco_formsemestre_inscriptions import do_formsemestre_inscription_listinscrits -from app.scodoc.sco_groups import setGroups, get_etud_groups +from app.scodoc.sco_groups import setGroups, get_etud_groups, get_group_members from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission @@ -63,6 +64,7 @@ from app.scodoc.sco_permissions import Permission ############################################### Departements ########################################################## from app.scodoc.sco_prepajury import feuille_preparation_jury from app.scodoc.sco_pvjury import formsemestre_pvjury +from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet @bp.route("/departements", methods=["GET"]) @@ -441,15 +443,29 @@ def bulletins(formsemestre_id: int): """ Les bulletins d'un formsemestre donné """ - return error_response(501, message="Not implemented") + # fonction to use : formsemestre_recapcomplet + + try: + data = formsemestre_recapcomplet(formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) @bp.route("/formsemestre//jury", methods=["GET"]) def jury(formsemestre_id: int): """ - + Le récapitulatif des décisions jury """ - return error_response(501, message="Not implemented") + # fonction to use : formsemestre_pvjury + + try: + data = formsemestre_pvjury(formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) ############################################### Partitions ############################################################ @@ -467,15 +483,30 @@ def partition(formsemestre_id: int): return error_response(501, message="Not implemented") -@bp.route( - "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", - methods=["GET"], -) -def groups(formsemestre_id: int, group_ids: int): +# @bp.route( +# "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", +# methods=["GET"], +# ) +@bp.route("/partitions/groups/", methods=["GET"]) +@bp.route("/partitions/groups//etat/", methods=["GET"]) +def etud_in_group(group_id: int, etat=None): """ Liste des étudiants dans un groupe """ - return error_response(501, message="Not implemented") + # fonction to use : get_group_members + + if etat is None: + try: + data = get_group_members(group_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + else: + try: + data = get_group_members(group_id, etat) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) @bp.route( @@ -516,12 +547,13 @@ def evaluation_notes(evaluation_id: int): """ Liste des notes à partir de l'id d'une évaluation donnée """ - notes = models.NotesNotes.query.filter_by(evaluation_id=evaluation_id).all() - - data = [d.to_dict() for d in notes] + # fonction to use : do_evaluation_get_all_notes + try: + data = do_evaluation_get_all_notes(evaluation_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") return jsonify(data) - # return error_response(501, message="Not implemented") @bp.route( @@ -705,7 +737,7 @@ def abs_groupe_etat( Liste des absences d'un ou plusieurs groupes entre deux dates """ - # list_abs_date + # list_abs_date< return error_response(501, message="Not implemented") From 976fdf5b4e9114244540ffb7936318659de2f8dc Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 22 Feb 2022 15:50:52 +0100 Subject: [PATCH 06/49] partie formation fini --- app/api/sco_api.py | 124 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 110 insertions(+), 14 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 6567898827..491788d511 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -50,7 +50,7 @@ from app.api.errors import error_response from app import models from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import ApcReferentielCompetences -from app.scodoc.sco_abs import annule_absence, annule_justif +from app.scodoc.sco_abs import annule_absence, annule_justif, add_absence, add_justif from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes @@ -343,17 +343,27 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False): """ La formation, avec UE, matières, modules """ - data = formation_export(formation_id) + try: + data = formation_export(formation_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") return jsonify(data) -@bp.route("/formations/apo/", methods=["GET"]) +@bp.route("/formations/apo/", methods=["GET"]) def formsemestre_apo(etape_apo: int): """ Information sur les formsemestres """ - return error_response(501, message="Not implemented") + apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all() + + data = [] + for apo in apos: + formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first() + data.append(formsem.to_dict()) + return jsonify(data) + # return error_response(501, message="Not implemented") @bp.route("/formations/moduleimpl/", methods=["GET"]) @@ -376,9 +386,12 @@ def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ Liste de moduleimpl d'un semestre """ - data = moduleimpl_list(moduleimpl_id, formsemestre_id) + try: + data = moduleimpl_list(moduleimpl_id, formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return jsonify(data) - # return error_response(501, message="Not implemented") #################################################### UE ############################################################### @@ -433,7 +446,7 @@ def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size) elif args[0] == "long": data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) else: - return error_response(501, message="Not implemented") + return error_response(409, message="La requête ne peut être traitée en l’état actuel") return jsonify(data) @@ -623,7 +636,9 @@ def annule_decision_jury(formsemestre_id: int, etudid=None, nip=None, ine=None): #################################################### Absences ######################################################### -@bp.route("/absences/", methods=["GET"]) +@bp.route("/absences/etudid/", methods=["GET"]) +@bp.route("/absences/nip/", methods=["GET"]) +@bp.route("/absences/ine/", methods=["GET"]) def absences(etudid=None, nip=None, ine=None): """ Liste des absences d'un étudiant donné @@ -646,7 +661,9 @@ def absences(etudid=None, nip=None, ine=None): return error_response(501, message="Not implemented") -@bp.route("/absences//abs_just_only", methods=["GET"]) +@bp.route("/absences/etudid//abs_just_only", methods=["GET"]) +@bp.route("/absences/nip//abs_just_only", methods=["GET"]) +@bp.route("/absences/ine//abs_just_only", methods=["GET"]) def absences_justify(etudid=None, nip=None, ine=None): """ Liste des absences justifiés d'un étudiant donné @@ -669,13 +686,89 @@ def absences_justify(etudid=None, nip=None, ine=None): return error_response(501, message="Not implemented") -@bp.route("/absences/abs_signale", methods=["POST"]) +@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=", + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=", + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", methods=["POST"]) @token_auth.login_required -def abs_signale(): +def abs_signale(date: datetime, matin: bool, justif: bool, etudid=None, nip=None, ine=None, description=None, + moduleimpl_id=None): """ - Retourne un html + Permet d'ajouter une absence en base """ - return error_response(501, message="Not implemented") + # fonction to use : add_absence, add_justif + if description is not None: + if moduleimpl_id is not None: + if etudid is not None: + try: + add_absence(etudid, date, matin, justif, description, moduleimpl_id) + add_justif(etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + else: + if etudid is not None: + try: + add_absence(etudid, date, matin, justif, description) + add_justif(etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + add_absence(etu.etudid, date, matin, justif, description) + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + add_absence(etu.etudid, date, matin, justif, description) + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + else: + if etudid is not None: + try: + add_absence(etudid, date, matin, justif) + add_justif(etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if nip is not None: + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + add_absence(etu.etudid, date, matin, justif) + add_justif(etu.etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if ine is not None: + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + add_absence(etu.etudid, date, matin, justif) + add_justif(etu.etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") @bp.route("/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"]) @@ -737,7 +830,7 @@ def abs_groupe_etat( Liste des absences d'un ou plusieurs groupes entre deux dates """ - # list_abs_date< + # list_abs_date return error_response(501, message="Not implemented") @@ -749,6 +842,7 @@ def liste_logos(format="json"): """ Liste des logos définis pour le site scodoc. """ + # fonction to use : list_logos() return error_response(501, message="Not implemented") @@ -757,6 +851,7 @@ def recup_logo_global(nom: str): """ Retourne l'image au format png ou jpg """ + # fonction to use find_logo return error_response(501, message="Not implemented") @@ -773,4 +868,5 @@ def recup_logo_dept_global(dept: str, nom: str): """ L'image format png ou jpg """ + # fonction to use find_logo return error_response(501, message="Not implemented") From d468a3f49ed9cb75816fea32af2664d6630ec5cf Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Wed, 23 Feb 2022 16:10:10 +0100 Subject: [PATCH 07/49] soucis avec routes logos --- app/api/sco_api.py | 72 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 491788d511..4fb1c0d43e 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -50,13 +50,14 @@ from app.api.errors import error_response from app import models from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import ApcReferentielCompetences -from app.scodoc.sco_abs import annule_absence, annule_justif, add_absence, add_justif +from app.scodoc.sco_abs import annule_absence, annule_justif, add_absence, add_justif, list_abs_date from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes from app.scodoc.sco_formations import formation_export from app.scodoc.sco_formsemestre_inscriptions import do_formsemestre_inscription_listinscrits from app.scodoc.sco_groups import setGroups, get_etud_groups, get_group_members +from app.scodoc.sco_logos import list_logos, find_logo, _list_dept_logos from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission @@ -686,9 +687,9 @@ def absences_justify(etudid=None, nip=None, ine=None): return error_response(501, message="Not implemented") -@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=", +@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=" "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=", +@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=" "&description=", methods=["POST"]) @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=", methods=["POST"]) @@ -820,17 +821,25 @@ def abs_annule_justif(jour: datetime, matin: str, etudid=None, nip=None, ine=Non @bp.route( - "/absences/abs_group_etat/?group_ids=&date_debut=date_debut&date_fin=date_fin", + "/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"], ) def abs_groupe_etat( - group_ids: int, date_debut, date_fin, with_boursier=True, format="html" + group_id: int, date_debut, date_fin, with_boursier=True, format="html" ): """ Liste des absences d'un ou plusieurs groupes entre deux dates """ + try: + members = get_group_members(group_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + data = [] + for member in members: + abs = list_abs_date(member.id, date_debut, date_fin) + data.append(abs) - # list_abs_date + # return jsonify(data) # XXX TODO faire en sorte de pouvoir renvoyer sa (ex to_dict() dans absences) return error_response(501, message="Not implemented") @@ -843,16 +852,32 @@ def liste_logos(format="json"): Liste des logos définis pour le site scodoc. """ # fonction to use : list_logos() - return error_response(501, message="Not implemented") + try: + res = list_logos() + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if res is None: + return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + + return res -@bp.route("/logos/", methods=["GET"]) -def recup_logo_global(nom: str): +@bp.route("/logos/", methods=["GET"]) +def recup_logo_global(logo_name: str): """ Retourne l'image au format png ou jpg """ # fonction to use find_logo - return error_response(501, message="Not implemented") + try: + res = find_logo(logo_name) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if res is None: + return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + + return res @bp.route("/departements//logos", methods=["GET"]) @@ -860,13 +885,32 @@ def logo_dept(dept: str): """ Liste des logos définis pour le département visé. """ - return error_response(501, message="Not implemented") + # fonction to use: _list_dept_logos + dept_id = models.Departement.query.filter_by(acronym=dept).first() + try: + res = _list_dept_logos(dept_id.id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if res is None: + return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + + return res -@bp.route("/departement//logos/", methods=["GET"]) -def recup_logo_dept_global(dept: str, nom: str): +@bp.route("/departement//logos/", methods=["GET"]) +def recup_logo_dept_global(dept: str, logo_name: str): """ L'image format png ou jpg """ # fonction to use find_logo - return error_response(501, message="Not implemented") + dept_id = models.Departement.query.filter_by(acronym=dept).first() + try: + res = find_logo(logo_name, dept_id.id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if res is None: + return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + + return res From cd961e6e3ea65c52fbc40b2f59f198d5ff1f8847 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Thu, 24 Feb 2022 16:15:41 +0100 Subject: [PATCH 08/49] changement de strategie pour les routes logos --- app/api/sco_api.py | 93 +++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 4fb1c0d43e..f9802abe82 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -66,6 +66,7 @@ from app.scodoc.sco_permissions import Permission from app.scodoc.sco_prepajury import feuille_preparation_jury from app.scodoc.sco_pvjury import formsemestre_pvjury from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet +from app.scodoc.sco_saisie_notes import notes_add @bp.route("/departements", methods=["GET"]) @@ -158,11 +159,12 @@ def referenciel_competences(dept: str, formation_id: int): return jsonify(ref.to_dict()) -@bp.route("/departements//formations/programme/", methods=["GET"]) -def semestre_index(dept: str, sem_idx: str): +@bp.route("/departements//formsemestre/programme", methods=["GET"]) +def semestre_index(dept: str, formsemestre_id: int): + """ + Retourne la liste des Ues, ressources et SAE d'un semestre """ - """ return error_response(501, message="not implemented") @@ -570,15 +572,18 @@ def evaluation_notes(evaluation_id: int): return jsonify(data) -@bp.route( - "/evaluations/eval_set_notes?eval_id=&etudid=¬e=", - methods=["POST"], -) +@bp.route("/evaluations/eval_set_notes?eval_id=&etudid=¬e=", methods=["POST"]) +@bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) +@bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) @token_auth.login_required def evaluation_set_notes(eval_id: int, etudid: int, note: float): """ Set les notes d'une évaluation pour un étudiant donnée """ + # fonction to use : notes_add + + # Qu'est ce qu'un user ??? + #notes_add() return error_response(501, message="Not implemented") @@ -845,6 +850,7 @@ def abs_groupe_etat( ###################################################### Logos ########################################################## +# XXX TODO voir get_logo déjà existant dans app/views/scodoc.py @bp.route("/logos", methods=["GET"]) def liste_logos(format="json"): @@ -852,15 +858,16 @@ def liste_logos(format="json"): Liste des logos définis pour le site scodoc. """ # fonction to use : list_logos() - try: - res = list_logos() - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # try: + # res = list_logos() + # except ValueError: + # return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # + # if res is None: + # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + # + # return res - if res is None: - return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - - return res @bp.route("/logos/", methods=["GET"]) @@ -869,15 +876,17 @@ def recup_logo_global(logo_name: str): Retourne l'image au format png ou jpg """ # fonction to use find_logo - try: - res = find_logo(logo_name) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # try: + # res = find_logo(logo_name) + # except ValueError: + # return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # + # if res is None: + # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + # + # return res - if res is None: - return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - return res @bp.route("/departements//logos", methods=["GET"]) @@ -886,16 +895,16 @@ def logo_dept(dept: str): Liste des logos définis pour le département visé. """ # fonction to use: _list_dept_logos - dept_id = models.Departement.query.filter_by(acronym=dept).first() - try: - res = _list_dept_logos(dept_id.id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if res is None: - return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - - return res + # dept_id = models.Departement.query.filter_by(acronym=dept).first() + # try: + # res = _list_dept_logos(dept_id.id) + # except ValueError: + # return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # + # if res is None: + # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + # + # return res @bp.route("/departement//logos/", methods=["GET"]) @@ -904,13 +913,13 @@ def recup_logo_dept_global(dept: str, logo_name: str): L'image format png ou jpg """ # fonction to use find_logo - dept_id = models.Departement.query.filter_by(acronym=dept).first() - try: - res = find_logo(logo_name, dept_id.id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if res is None: - return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - - return res + # dept_id = models.Departement.query.filter_by(acronym=dept).first() + # try: + # res = find_logo(logo_name, dept_id.id) + # except ValueError: + # return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # + # if res is None: + # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") + # + # return res From afe43f98e386660d920b6e7d2a93c85c1f6c7d76 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 25 Feb 2022 16:03:05 +0100 Subject: [PATCH 09/49] =?UTF-8?q?code=20de=20sco=5Fapi.py=20comment=C3=A9?= =?UTF-8?q?=20et=20d=C3=A9but=20des=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/sco_api.py | 835 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 693 insertions(+), 142 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index f9802abe82..39c1d977eb 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -73,25 +73,32 @@ from app.scodoc.sco_saisie_notes import notes_add @token_auth.login_required def departements(): """ - Liste des ids de départements + Retourne la liste des ids de départements """ + # Récupération de tous les départements depts = models.Departement.query.filter_by(visible=True).all() + + # Mise en place de la liste avec tous les ids de départements data = [d.id for d in depts] + return jsonify(data) @bp.route("/departements//etudiants/liste/", methods=["GET"]) @token_auth.login_required -def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR +def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR """ - Liste des étudiants d'un département + Retourne la liste des étudiants d'un département + + dept: l'acronym d'un département + formsemestre_id: l'id d'un formesemestre """ - # Test si le sem_id à été renseigné ou non - if sem_id is not None: + # Si le formsemestre_id a été renseigné + if formsemestre_id is not None: # Récupération du/des depts list_depts = models.Departement.query.filter( models.Departement.acronym == dept, - models.FormSemestre.semestre_id == sem_id, + models.FormSemestre.semestre_id == formsemestre_id, ) list_etuds = [] for dept in list_depts: @@ -100,7 +107,7 @@ def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR for y in x: # Ajout des étudiants dans la liste global list_etuds.append(y) - else: + else: # Si le formsemestre_id n'a pas été renseigné list_depts = models.Departement.query.filter( models.Departement.acronym == dept, models.FormSemestre.semestre_id == models.Departement.formsemestres, @@ -111,6 +118,7 @@ def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR for y in x: list_etuds.append(y) + # Mise en forme des données data = [d.to_dict() for d in list_etuds] # return jsonify(data) return error_response(501, message="Not implemented") @@ -121,13 +129,19 @@ def liste_etudiants(dept: str, *args, sem_id): # XXX TODO A REVOIR def liste_semestres_courant(dept: str): """ Liste des semestres actifs d'un départements donné + + dept: l'acronym d'un département """ + # Récupération des départements comportant l'acronym mit en paramètre depts = models.Departement.query.filter_by(acronym=dept).all() + # Récupération de l'id id_dept = depts[0].id + # Récupération des semestres suivant id_dept semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() + # Mise en forme des données data = semestres[0].to_dict() return jsonify(data) @@ -139,7 +153,10 @@ def liste_semestres_courant(dept: str): ) def referenciel_competences(dept: str, formation_id: int): """ - Le référentiel de compétences + Retourne le référentiel de compétences + + dept : l'acronym d'un département + formation_id : l'id d'une formation """ # depts = models.Departement.query.filter_by(acronym=dept).all() # @@ -174,10 +191,12 @@ def semestre_index(dept: str, formsemestre_id: int): @bp.route("/etudiants", methods=["GET"]) def etudiants(): """ - La liste des étudiants + Retourne la liste de tous les étudiants """ + # Récupération de tous les étudiants etu = models.Identite.query.all() + # Mise en forme des données data = [d.to_dict_bul(include_urls=False) for d in etu] return jsonify(data) @@ -187,11 +206,13 @@ def etudiants(): @bp.route("/etudiants/courant", methods=["GET"]) def etudiants_courant(): """ - La liste des étudiants courant + Retourne la liste des étudiants courant """ + # Récupération de tous les étudiants etus = models.Identite.query.all() data = [] + # Récupère uniquement les étudiants courant for etu in etus: if etu.inscription_courante() is not None: data.append(etu.to_dict_bul(include_urls=False)) @@ -203,18 +224,29 @@ def etudiants_courant(): @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) -def etudiant(etudid=None, nip=None, ine=None): +def etudiant(etudid: int = None, nip: int = None, ine: int = None): """ - Les informations de l'étudiant correspondant à l'id passé en paramètres. + Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. + + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ etu = [] - if etudid is not None: - etu = models.Identite.query.filter_by(id=etudid).first() - if nip is not None: - etu = models.Identite.query.filter_by(code_nip=etudid).first() - if ine is not None: - etu = models.Identite.query.filter_by(code_ine=etudid).first() + if etudid is not None: # Si route etudid + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(id=etudid).first() + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + + # Mise en forme des données data = etu.to_dict_bul(include_urls=False) return jsonify(data) @@ -223,36 +255,49 @@ def etudiant(etudid=None, nip=None, ine=None): @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") -def etudiant_formsemestres(etudid=None, nip=None, ine=None): +def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ - Retourne les semestres qu'un étudiant a suivi + Retourne les semestres qu'un étudiant a suivis + + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ + # Récupération de toutes les inscriptions inscriptions = models.FormSemestreInscription.query.all() sems = [] + # Filtre les inscriptions contenant l'étudiant for sem in inscriptions: - if etudid is not None: + if etudid is not None: # Si route etudid if sem.etudid == etudid: sems.append(sem) - if nip is not None: + + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() if sem.etudid == etu.etudid: sems.append(sem) - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).firt() if sem.etudid == etu.etudid: sems.append(sem) + # Mise en forme des données data_inscriptions = [d.to_dict() for d in sems] formsemestres = [] + # Filtre les formsemestre contenant les inscriptions de l'étudiant for sem in data_inscriptions: res = models.FormSemestre.query.filter_by(id=sem['formsemestre_id']).first() formsemestres.append(res) data = [] + # Mise en forme des données for formsem in formsemestres: data.append(formsem.to_dict()) @@ -262,23 +307,29 @@ def etudiant_formsemestres(etudid=None, nip=None, ine=None): @bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) -def etudiant_bulletin_semestre(formsemestre_id, etudid=None, nip=None, ine=None): +def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): """ - Le bulletin d'un étudiant en fonction de son id et d'un semestre donné + Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ - # fonction to use: make_json_formsemestre_bulletinetud() - if etudid is not None: + # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() + + etu = None + if etudid is not None: # Si route etudid return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) else: - etu = None - if nip is not None: + if nip is not None: # Si route nip etu = models.Identite.query.filter_by(code_nip=nip).first() - if ine is not None: + if ine is not None: # Si route ine etu = models.Identite.query.filter_by(code_nip=ine).first() - if etu is not None: - return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + if etu is not None: # Si route nip ou ine + return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) # return error_response(501, message="Not implemented") @@ -292,21 +343,34 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid=None, nip=None, ine=None) @bp.route( "/etudiant/ine//semestre//groups", methods=["GET"] ) -def etudiant_groups(formsemestre_id: int, etudid=None, nip=None, ine=None): +def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): """ - Liste des groupes auxquels appartient l'étudiant dans le semestre indiqué + Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ - # fonction to use : get_etud_groups + # Fonction utilisée : app.scodoc.sco_groups.get_etud_groups() if etudid is None: - if nip is not None: + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de sont etudid etudid = etu.etudid - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de sont etudid etudid = etu.etudid + + # Récupération du formsemestre sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() try: + # Utilisation de la fonction get_etud_groups data = get_etud_groups(etudid, sem.to_dict()) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -320,10 +384,12 @@ def etudiant_groups(formsemestre_id: int, etudid=None, nip=None, ine=None): @bp.route("/formations", methods=["GET"]) def formations(): """ - Liste des formations + Retourne la liste des formations """ + # Récupération de toutes les formations list_formations = models.Formation.query.all() + # Mise en forme des données data = [d.to_dict() for d in list_formations] return jsonify(data) @@ -332,10 +398,14 @@ def formations(): @bp.route("/formations/", methods=["GET"]) def formations_by_id(formation_id: int): """ - Formation en fonction d'un id donné - """ - forma = models.Formation.query.filter_by(id=formation_id).all() + Retourne une formation en fonction d'un id donné + formation_id : l'id d'une formation + """ + # Récupération de la formation + forma = models.Formation.query.filter_by(id=formation_id).first() + + # Mise en forme des données data = [d.to_dict() for d in forma] return jsonify(data) @@ -344,9 +414,12 @@ def formations_by_id(formation_id: int): @bp.route("/formations/formation_export/", methods=["GET"]) def formation_export_by_formation_id(formation_id: int, export_ids=False): """ - La formation, avec UE, matières, modules + Retourne la formation, avec UE, matières, modules """ + # Fonction utilité : app.scodoc.sco_formations.formation_export() + try: + # Utilisation de la fonction formation_export data = formation_export(formation_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -357,14 +430,19 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False): @bp.route("/formations/apo/", methods=["GET"]) def formsemestre_apo(etape_apo: int): """ - Information sur les formsemestres + Retourne les informations sur les formsemestres + + etape_apo : l'id d'une étape apogée """ + # Récupération des formsemestres apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all() data = [] + # Filtre les formsemestres correspondant + mise en forme des données for apo in apos: formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first() data.append(formsem.to_dict()) + return jsonify(data) # return error_response(501, message="Not implemented") @@ -372,24 +450,32 @@ def formsemestre_apo(etape_apo: int): @bp.route("/formations/moduleimpl/", methods=["GET"]) def moduleimpls(moduleimpl_id: int): """ - Liste des moduleimpl - """ - list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id) + Retourne la liste des moduleimpl + moduleimpl_id : l'id d'un moduleimpl + """ + # Récupération des tous les moduleimpl + list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id).all() + + # Mise en forme des données data = list_moduleimpls[0].to_dict() return jsonify(data) @bp.route( - "/formations/moduleimpl//formsemestre/", - methods=["GET"], -) + "/formations/moduleimpl//formsemestre/", methods=["GET"]) def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ - Liste de moduleimpl d'un semestre + Retourne la liste des moduleimpl d'un semestre + + moduleimpl_id : l'id d'un moduleimpl + formsemestre_id : l'id d'un formsemestre """ + # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list() + try: + # Utilisation de la fonction moduleimpl_list data = moduleimpl_list(moduleimpl_id, formsemestre_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -416,10 +502,15 @@ def eus(dept: str, sem_id: int): @bp.route("/formations/formsemestre/", methods=["GET"]) def formsemestre(formsemestre_id: int): """ - Information sur le formsemestre correspondant au formsemestre_id + Retourne l'information sur le formsemestre correspondant au formsemestre_id + + formsemestre_id : l'id d'un formsemestre + """ + # Récupération de tous les formsemestres list_formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id) + # Mise en forme des données data = list_formsemetre[0].to_dict() return jsonify(data) @@ -439,8 +530,15 @@ def formsemestre(formsemestre_id: int): ) def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): """ - Un bulletin de note + Retourne le bulletin de note d'un étudiant + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ + # Fonction utilisée : app.scodoc.sco_bulletins.formsemestre_billetinetud_dict() + data = [] if args[0] == "short": data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) @@ -457,11 +555,14 @@ def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size) @bp.route("/formsemestre//bulletins", methods=["GET"]) def bulletins(formsemestre_id: int): """ - Les bulletins d'un formsemestre donné + Retourne les bulletins d'un formsemestre donné + + formsemestre_id : l'id d'un formesemestre """ - # fonction to use : formsemestre_recapcomplet + # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet() try: + # Utilisation de la fonction formsemestre_recapcomplet data = formsemestre_recapcomplet(formsemestre_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -472,11 +573,14 @@ def bulletins(formsemestre_id: int): @bp.route("/formsemestre//jury", methods=["GET"]) def jury(formsemestre_id: int): """ - Le récapitulatif des décisions jury + Retourne le récapitulatif des décisions jury + + formsemestre_id : l'id d'un formsemestre """ - # fonction to use : formsemestre_pvjury + # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() try: + # Utilisation de la fonction formsemestre_pvjury data = formsemestre_pvjury(formsemestre_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -490,13 +594,18 @@ def jury(formsemestre_id: int): @bp.route("/partitions/", methods=["GET"]) def partition(formsemestre_id: int): """ - La liste de toutes les partitions d'un formsemestre + Retourne la liste de toutes les partitions d'un formsemestre + + formsemestre_id : l'id d'un formsemestre """ - partitions = models.Partition.query.filter_by(id=formsemestre_id) + # Récupération de toutes les partitions + partitions = models.Partition.query.filter_by(id=formsemestre_id).all() + + # Mise en forme des données data = [d.to_dict() for d in partitions] - # return jsonify(data) - return error_response(501, message="Not implemented") + return jsonify(data) + # return error_response(501, message="Not implemented") # @bp.route( @@ -507,17 +616,22 @@ def partition(formsemestre_id: int): @bp.route("/partitions/groups//etat/", methods=["GET"]) def etud_in_group(group_id: int, etat=None): """ - Liste des étudiants dans un groupe - """ - # fonction to use : get_group_members + Retourne la liste des étudiants dans un groupe - if etat is None: + group_id : l'id d'un groupe + etat : + """ + # Fonction utilisée : app.scodoc.sco_groups.get_group_members() + + if etat is None: # Si l'état n'est pas renseigné try: + # Utilisation de la fonction get_group_members data = get_group_members(group_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: + else: # Si l'état est renseigné try: + # Utilisation de la fonction get_group_members data = get_group_members(group_id, etat) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -526,17 +640,22 @@ def etud_in_group(group_id: int, etat=None): @bp.route( - "/partitions/set_groups?partition_id=&groups_lists=&groups_to_create=&groups_to_delete=", methods=["POST"], + "/partitions/set_groups?partition_id=&groups_lists=&" + "groups_to_create=&groups_to_delete=", methods=["POST"], ) @token_auth.login_required -def set_groups( - partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int -): +def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): """ Set les groups + + partition_id : l'id d'une partition + groups_lists : + groups_ti_delete : les groupes à supprimer + groups_to_create : les groupes à créer """ + # Fonction utilisée : app.scodoc.sco_groups.setGroups() try: + # Utilisation de la fonction setGroups setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete) return error_response(200, message="Groups set") except ValueError: @@ -549,9 +668,14 @@ def set_groups( @bp.route("/evaluations/", methods=["GET"]) def evaluations(moduleimpl_id: int): """ - Liste des évaluations à partir de l'id d'un moduleimpl + Retourne la liste des évaluations à partir de l'id d'un moduleimpl + + moduleimpl_id : l'id d'un moduleimpl """ - evals = models.Evaluation.query.filter_by(id=moduleimpl_id) + # Récupération de toutes les évaluations + evals = models.Evaluation.query.filter_by(id=moduleimpl_id).all() + + # Mise en forme des données data = [d.to_dict() for d in evals] return jsonify(data) @@ -561,10 +685,14 @@ def evaluations(moduleimpl_id: int): @bp.route("/evaluations/eval_notes/", methods=["GET"]) def evaluation_notes(evaluation_id: int): """ - Liste des notes à partir de l'id d'une évaluation donnée + Retourne la liste des notes à partir de l'id d'une évaluation donnée + + evaluation_id : l'id d'une évaluation """ - # fonction to use : do_evaluation_get_all_notes + # Fonction utilisée : app.scodoc.sco_evaluation_db.do_evaluation_get_all_notes() + try: + # Utilisation de la fonction do_evaluation_get_all_notes data = do_evaluation_get_all_notes(evaluation_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -576,14 +704,20 @@ def evaluation_notes(evaluation_id: int): @bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) @bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) @token_auth.login_required -def evaluation_set_notes(eval_id: int, etudid: int, note: float): +def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): """ Set les notes d'une évaluation pour un étudiant donnée + + eval_id : l'id d'une évaluation + note : la note à attribuer + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant """ - # fonction to use : notes_add + # Fonction utilisée : app.scodoc.sco_saisie_notes.notes_add() # Qu'est ce qu'un user ??? - #notes_add() + # notes_add() return error_response(501, message="Not implemented") @@ -594,10 +728,13 @@ def evaluation_set_notes(eval_id: int, etudid: int, note: float): @bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction """ - Feuille de préparation du jury - """ - # fonction to use : feuille_preparation_jury() + Retourne la feuille de préparation du jury + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_prepajury.feuille_preparation_jury() + + # Utilisation de la fonction feuille_preparation_jury prepa_jury = feuille_preparation_jury(formsemestre_id) return error_response(501, message="Not implemented") @@ -607,24 +744,35 @@ def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction """ Retourne les décisions du jury suivant un formsemestre donné - """ - # fonction to use : formsemestre_pvjury + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() + + # Utilisation de la fonction formsemestre_pvjury decision_jury = formsemestre_pvjury(formsemestre_id) return error_response(501, message="Not implemented") -@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=&jury=&devenir=&assiduite=", methods=["POST"]) -def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, etudid=None, - nip=None, ine=None): +@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, + etudid: int = None, nip: int = None, ine: int = None): """ Attribuer la décision du jury et le devenir à un etudiant + + formsemestre_id : l'id d'un formsemestre + decision_jury : la décision du jury + devenir_jury : le devenir du jury + assiduite : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ return error_response(501, message="Not implemented") @@ -632,9 +780,14 @@ def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: st @bp.route("/jury/etudid//formsemestre//annule_decision", methods=["DELETE"]) @bp.route("/jury/nip//formsemestre//annule_decision", methods=["DELETE"]) @bp.route("/jury/ine//formsemestre//annule_decision", methods=["DELETE"]) -def annule_decision_jury(formsemestre_id: int, etudid=None, nip=None, ine=None): +def annule_decision_jury(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): """ Supprime la déciosion du jury pour un étudiant donné + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ return error_response(501, message="Not implemented") @@ -645,22 +798,33 @@ def annule_decision_jury(formsemestre_id: int, etudid=None, nip=None, ine=None): @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) -def absences(etudid=None, nip=None, ine=None): +def absences(etudid: int = None, nip: int = None, ine: int = None): """ - Liste des absences d'un étudiant donné + Retourne la liste des absences d'un étudiant donné + + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ - abs = "" - if etudid is not None: + abs = None + if etudid is not None: # Si route etudid + # Récupération des absences de l'étudiant abs = models.Absence.query.filter_by(etudid=etudid).all() else: - if nip is not None: + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() - abs = models.Absence.query.filter_by(etudid=etu.etudid).all() - if ine is not None: - etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid).all() - if abs != "": + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + + if abs is not None: # Si des absences ont bien été trouvé + # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) @@ -670,22 +834,33 @@ def absences(etudid=None, nip=None, ine=None): @bp.route("/absences/etudid//abs_just_only", methods=["GET"]) @bp.route("/absences/nip//abs_just_only", methods=["GET"]) @bp.route("/absences/ine//abs_just_only", methods=["GET"]) -def absences_justify(etudid=None, nip=None, ine=None): +def absences_justify(etudid: int = None, nip: int = None, ine: int = None): """ - Liste des absences justifiés d'un étudiant donné + Retourne la liste des absences justifiées d'un étudiant donné + + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ - abs = "" - if etudid is not None: + abs = None + if etudid is not None: # Si route etudid + # Récupération des absences justifiées de l'étudiant abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() else: - if nip is not None: + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() - abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() - if ine is not None: - etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences justifiées de l'étudiant abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() - if abs != "": + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences justifiées de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + + if abs is not None: # Si des absences ont bien été trouvé + # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) @@ -701,75 +876,117 @@ def absences_justify(etudid=None, nip=None, ine=None): @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=&moduleimpl_id=", methods=["POST"]) @token_auth.login_required -def abs_signale(date: datetime, matin: bool, justif: bool, etudid=None, nip=None, ine=None, description=None, - moduleimpl_id=None): +def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, + description: str = None, moduleimpl_id: int = None): """ Permet d'ajouter une absence en base + + date : la date de l'absence + matin : True ou False + justif : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + description : description possible à ajouter sur l'absence + moduleimpl_id : l'id d'un moduleimpl """ - # fonction to use : add_absence, add_justif - if description is not None: - if moduleimpl_id is not None: - if etudid is not None: + # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() + + if description is not None: # Si la description a été renseignée + if moduleimpl_id is not None: # Si le moduleimpl a été renseigné + if etudid is not None: # Si route etudid try: + # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif add_justif(etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if nip is not None: + + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: - if etudid is not None: + + else: # Si le moduleimpl n'a pas été renseigné + if etudid is not None: # Si route etudid try: + # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif add_justif(etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if nip is not None: + + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin, description) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") return error_response(409, message="La requête ne peut être traitée en l’état actuel") else: - if etudid is not None: + if etudid is not None: # Si route etudid try: + # Utilisation de la fonction add_absence add_absence(etudid, date, matin, justif) + # Utilisation de la fonction add_justif add_justif(etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if nip is not None: + + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() try: + # Utilisation de la fonction add_absence add_absence(etu.etudid, date, matin, justif) + # Utilisation de la fonction add_justif add_justif(etu.etudid, date, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -781,19 +998,32 @@ def abs_signale(date: datetime, matin: bool, justif: bool, etudid=None, nip=None @bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -def abs_annule(jour: datetime, matin: str, etudid=None, nip=None, ine=None): +def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html + + jour : la date de l'absence a annulé + matin : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ - # fonction to use : annule_absence + # Fonction utilisée : app.scodoc.sco_abs.annule_absence() + if etudid is None: - if nip is not None: + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de l'etudid de l'étudiant etudid = etu.etudid - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de l'etudid de l'étudiant etudid = etu.etudid try: + # Utilisation de la fonction annule_absence annule_absence(etudid, jour, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -805,19 +1035,32 @@ def abs_annule(jour: datetime, matin: str, etudid=None, nip=None, ine=None): @bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -def abs_annule_justif(jour: datetime, matin: str, etudid=None, nip=None, ine=None): +def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html + + jour : la date de l'absence a annulé + matin : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant """ - # fonction to use : annule_justif + # Fonction utilisée : app.scodoc.sco_abs.annule_justif() + if etudid is None: - if nip is not None: + if nip is not None: # Si route nip + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de l'etudid de l'étudiant etudid = etu.etudid - if ine is not None: + + if ine is not None: # Si route ine + # Récupération de l'étudiant etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de l'etudid de l'étudiant etudid = etu.etudid try: + # Utilisation de la fonction annule_justif annule_justif(etudid, jour, matin) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") @@ -825,21 +1068,21 @@ def abs_annule_justif(jour: datetime, matin: str, etudid=None, nip=None, ine=Non return error_response(200, message="OK") -@bp.route( - "/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", - methods=["GET"], -) -def abs_groupe_etat( - group_id: int, date_debut, date_fin, with_boursier=True, format="html" -): +@bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) +def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): """ - Liste des absences d'un ou plusieurs groupes entre deux dates + Retoune la liste des absences d'un ou plusieurs groupes entre deux dates """ + # Fonction utilisée : app.scodoc.sco_groups.get_group_members() et app.scodoc.sco_abs.list_abs_date() + try: + # Utilisation de la fonction get_group_members members = get_group_members(group_id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") + data = [] + # Filtre entre les deux dates renseignées for member in members: abs = list_abs_date(member.id, date_debut, date_fin) data.append(abs) @@ -874,6 +1117,8 @@ def liste_logos(format="json"): def recup_logo_global(logo_name: str): """ Retourne l'image au format png ou jpg + + logo_name : le nom du logo rechercher """ # fonction to use find_logo # try: @@ -887,12 +1132,12 @@ def recup_logo_global(logo_name: str): # return res - - @bp.route("/departements//logos", methods=["GET"]) def logo_dept(dept: str): """ Liste des logos définis pour le département visé. + + dept : l'id d'un département """ # fonction to use: _list_dept_logos # dept_id = models.Departement.query.filter_by(acronym=dept).first() @@ -911,6 +1156,9 @@ def logo_dept(dept: str): def recup_logo_dept_global(dept: str, logo_name: str): """ L'image format png ou jpg + + dept : l'id d'un département + logo_name : le nom du logo rechercher """ # fonction to use find_logo # dept_id = models.Departement.query.filter_by(acronym=dept).first() @@ -923,3 +1171,306 @@ def recup_logo_dept_global(dept: str, logo_name: str): # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") # # return res + + + +################################################## Tests ############################################################## + +import requests +import os + +SCODOC_USER = "" +SCODOC_PASSWORD = "" +SCODOC_URL = "" +CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) + +r0 = requests.post( + SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +token = r0.json()["token"] +HEADERS = {"Authorization": f"Bearer {token}"} + + +def test_routes_departements(): + """ + Test les routes de la partie Département + """ + # departements + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api/departements", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # liste_etudiants + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # liste_semestres_courant + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # referenciel_competences + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # semestre_index + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_etudiants(): + """ + Test les routes de la partie Etudiants + """ + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_formation(): + """ + Test les routes de la partie Formation + """ + # formations + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formations_by_id + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formation_export_by_formation_id + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formsemestre_apo + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # moduleimpls + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # moduleimpls_sem + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_formsemestres(): + """ + Test les routes de la partie Formsemestres + """ + # formsemestre + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant_bulletin + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # bulletins + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # jury + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_partitions(): + """ + Test les routes de la partie Partitions + """ + # partition + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etud_in_group + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # set_groups + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_evaluations(): + """ + Test les routes de la partie Evaluations + """ + # evaluations + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # evaluation_notes + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # evaluation_set_notes + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_jury(): + """ + Test les routes de la partie Jury + """ + # jury_preparation + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # jury_decisions + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # set_decision_jury + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # annule_decision_jury + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_absences(): + """ + Test les routes de la partie Absences + """ + # absences + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # absences_justify + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_signale + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_annule + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_annule_justif + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_groupe_etat + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_logos(): + """ + Test les routes de la partie Logos + """ + # liste_logos + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # recup_logo_global + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # logo_dept + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # recup_logo_dept_global + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) From 1cd7a84b15d12b7c0a6d2b0f4c7f0aef46aaba95 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 1 Mar 2022 16:00:41 +0100 Subject: [PATCH 10/49] =?UTF-8?q?test=20et=20r=C3=A9cup=C3=A9ration=20de?= =?UTF-8?q?=20dept,=20formsemestre=20et=20etu=20en=20variable=20global=20p?= =?UTF-8?q?our=20les=20tests=20suivant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/sco_api.py | 221 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 211 insertions(+), 10 deletions(-) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index 39c1d977eb..f52f2ce7ef 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -70,7 +70,7 @@ from app.scodoc.sco_saisie_notes import notes_add @bp.route("/departements", methods=["GET"]) -@token_auth.login_required +#@token_auth.login_required def departements(): """ Retourne la liste des ids de départements @@ -125,7 +125,7 @@ def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR @bp.route("/departements//semestres_courant", methods=["GET"]) -@token_auth.login_required +# @token_auth.login_required def liste_semestres_courant(dept: str): """ Liste des semestres actifs d'un départements donné @@ -142,7 +142,8 @@ def liste_semestres_courant(dept: str): semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() # Mise en forme des données - data = semestres[0].to_dict() + + data = [d.to_dict() for d in semestres] return jsonify(data) @@ -1184,11 +1185,205 @@ SCODOC_PASSWORD = "" SCODOC_URL = "" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) -r0 = requests.post( - SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) +# r0 = requests.post( +# SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) +# ) +# token = r0.json()["token"] +# HEADERS = {"Authorization": f"Bearer {token}"} + +DEPT = None +FORMSEMESTRE = None +ETU = None + + +@bp.route("/test_dept", methods=["GET"]) +def get_departement(): + """ + Retourne un département pour les tests + """ + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements", + auth=(SCODOC_USER, SCODOC_PASSWORD) ) -token = r0.json()["token"] -HEADERS = {"Authorization": f"Bearer {token}"} + + if r.status_code == 200: + dept_id = r.json()[0] + # print(dept_id) + + dept = models.Departement.query.filter_by(id=dept_id).first() + dept = dept.to_dict() + + if "id" in dept: + if "acronym" in dept: + if "description" in dept: + if "visible" in dept: + if "date_creation" in dept: + global DEPT + DEPT = dept + + return error_response(200, "OK") + + else: + return error_response(501, "date_creation field missing") + else: + return error_response(501, "visible field missing") + else: + return error_response(501, "description field missing") + else: + return error_response(501, "acronym field missing") + else: + return error_response(501, "id field missing") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + +@bp.route("/test_formsemestre", methods=["GET"]) +def get_formsemestre(): + """ + Retourne un formsemestre pour les tests + """ + + global DEPT + dept_acronym = DEPT["acronym"] + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courant", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + if r.status_code == 200: + formsemestre = r.json()[0] + # print(r.json()[0]) + + if "titre" in formsemestre: + if "gestion_semestrielle" in formsemestre: + if "scodoc7_id" in formsemestre: + if "date_debut" in formsemestre: + if "bul_bgcolor" in formsemestre: + if "date_fin" in formsemestre: + if "resp_can_edit" in formsemestre: + if "semestre_id" in formsemestre: + if "bul_hide_xml" in formsemestre: + if "elt_annee_apo" in formsemestre: + if "block_moyennes" in formsemestre: + if "formsemestre_id" in formsemestre: + if "titre_num" in formsemestre: + if "date_debut_iso" in formsemestre: + if "date_fin_iso" in formsemestre: + if "responsables" in formsemestre: + global FORMSEMESTRE + FORMSEMESTRE = formsemestre + + # print(FORMSEMESTRE) + + return error_response(200, "OK") + + else: + return error_response(501, + "responsables field " + "missing") + else: + return error_response(501, + "date_fin_iso field missing") + else: + return error_response(501, + "date_debut_iso field missing") + else: + return error_response(501, + "titre_num field missing") + else: + return error_response(501, + "formsemestre_id field missing") + else: + return error_response(501, + "block_moyennes field missing") + else: + return error_response(501, + "elt_annee_apo field missing") + else: + return error_response(501, + "bul_hide_xml field missing") + else: + return error_response(501, + "semestre_id field missing") + else: + return error_response(501, + "resp_can_edit field missing") + else: + return error_response(501, + "date_fin field missing") + else: + return error_response(501, + "bul_bgcolor field missing") + else: + return error_response(501, + "date_debut field missing") + else: + return error_response(501, + "scodoc7_id field missing") + else: + return error_response(501, + "gestion_semestrielle field missing") + else: + return error_response(501, + "titre field missing") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + + +@bp.route("/test_etu", methods=["GET"]) +def get_etudiant(): + """ + Retourne un étudiant pour les tests + """ + # print(DEPT.get_data().decode("utf-8")) + # dept = DEPT + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + if r.status_code == 200: + etu = r.json()[0] + + if "civilite" in etu: + if "code_ine" in etu: + if "code_nip" in etu: + if "date_naissance" in etu: + if "email" in etu: + if "emailperso" in etu: + if "etudid" in etu: + if "nom" in etu: + if "prenom" in etu: + global ETU + ETU = etu + # print(ETU) + + return error_response(200, "OK") + + else: + return error_response(501, "prenom field missing") + else: + return error_response(501, "nom field missing") + else: + return error_response(501, "etudid field missing") + else: + return error_response(501, "emailperso field missing") + else: + return error_response(501, "email field missing") + else: + return error_response(501, "date_naissance field missing") + else: + return error_response(501, "code_nip field missing") + else: + return error_response(501, "code_ine field missing") + else: + return error_response(501, "civilite field missing") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + def test_routes_departements(): @@ -1196,7 +1391,7 @@ def test_routes_departements(): Test les routes de la partie Département """ # departements - r1 = requests.post( + r1 = requests.get( SCODOC_URL + "/ScoDoc/api/departements", auth=(SCODOC_USER, SCODOC_PASSWORD) ) @@ -1230,31 +1425,37 @@ def test_routes_etudiants(): """ Test les routes de la partie Etudiants """ - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", + # etudiants + r1 = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + # etudiants_courant r2 = requests.post( SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + # etudiant r3 = requests.post( SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + # etudiant_formsemestres r4 = requests.post( SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + # etudiant_bulletin_semestre r5 = requests.post( SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + # etudiant_groups r6 = requests.post( SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD) From 4d49de397ce1e057b07cbd5504892466f5d387a8 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Wed, 2 Mar 2022 16:45:47 +0100 Subject: [PATCH 11/49] =?UTF-8?q?r=C3=A9organisation=20des=20fichiers=20de?= =?UTF-8?q?=20travail=20pour=20l'api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/__init__.py | 10 + app/api/absences.py | 307 +++++++ app/api/departements.py | 191 +++++ app/api/etudiants.py | 322 ++++++++ app/api/evaluations.py | 64 ++ app/api/formations.py | 110 +++ app/api/formsemestres.py | 98 +++ app/api/jury.py | 75 ++ app/api/partitions.py | 79 ++ app/api/sco_api.py | 1690 ++------------------------------------ app/api/test_api.py | 414 ++++++++++ 11 files changed, 1750 insertions(+), 1610 deletions(-) create mode 100644 app/api/absences.py create mode 100644 app/api/departements.py create mode 100644 app/api/etudiants.py create mode 100644 app/api/evaluations.py create mode 100644 app/api/formations.py create mode 100644 app/api/formsemestres.py create mode 100644 app/api/jury.py create mode 100644 app/api/partitions.py create mode 100644 app/api/test_api.py diff --git a/app/api/__init__.py b/app/api/__init__.py index d397a93d1d..acf16173b3 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -23,4 +23,14 @@ def requested_format(default_format="json", allowed_formats=None): from app.api import tokens from app.api import sco_api +from app.api import test_api +from app.api import departements +from app.api import etudiants +from app.api import formations +from app.api import formsemestres +from app.api import partitions +from app.api import evaluations +from app.api import jury +from app.api import absences from app.api import logos + diff --git a/app/api/absences.py b/app/api/absences.py new file mode 100644 index 0000000000..4f53c06457 --- /dev/null +++ b/app/api/absences.py @@ -0,0 +1,307 @@ +#################################################### Absences ######################################################### +from datetime import datetime + +from flask import jsonify + +from app import models +from app.api import bp +from app.api.auth import token_auth +from app.api.errors import error_response +from app.scodoc.sco_abs import add_absence, add_justif, annule_absence, annule_justif, list_abs_date +from app.scodoc.sco_groups import get_group_members + + +@bp.route("/absences/etudid/", methods=["GET"]) +@bp.route("/absences/nip/", methods=["GET"]) +@bp.route("/absences/ine/", methods=["GET"]) +def absences(etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne la liste des absences d'un étudiant donné + + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + abs = None + if etudid is not None: # Si route etudid + # Récupération des absences de l'étudiant + abs = models.Absence.query.filter_by(etudid=etudid).all() + else: + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération des absences de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + + if abs is not None: # Si des absences ont bien été trouvé + # Mise en forme des données + data = [d.to_dict() for d in abs] + + return jsonify(data) + return error_response(501, message="Not implemented") + + +@bp.route("/absences/etudid//abs_just_only", methods=["GET"]) +@bp.route("/absences/nip//abs_just_only", methods=["GET"]) +@bp.route("/absences/ine//abs_just_only", methods=["GET"]) +def absences_justify(etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne la liste des absences justifiées d'un étudiant donné + + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + abs = None + if etudid is not None: # Si route etudid + # Récupération des absences justifiées de l'étudiant + abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() + else: + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération des absences justifiées de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération des absences justifiées de l'étudiant + abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + + if abs is not None: # Si des absences ont bien été trouvé + # Mise en forme des données + data = [d.to_dict() for d in abs] + + return jsonify(data) + return error_response(501, message="Not implemented") + + +@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=" + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=" + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", methods=["POST"]) +@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", methods=["POST"]) +@token_auth.login_required +def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, + description: str = None, moduleimpl_id: int = None): + """ + Permet d'ajouter une absence en base + + date : la date de l'absence + matin : True ou False + justif : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + description : description possible à ajouter sur l'absence + moduleimpl_id : l'id d'un moduleimpl + """ + # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() + + if description is not None: # Si la description a été renseignée + if moduleimpl_id is not None: # Si le moduleimpl a été renseigné + if etudid is not None: # Si route etudid + try: + # Utilisation de la fonction add_absence + add_absence(etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif + add_justif(etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + else: # Si le moduleimpl n'a pas été renseigné + if etudid is not None: # Si route etudid + try: + # Utilisation de la fonction add_absence + add_absence(etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif + add_justif(etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif, description) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin, description) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + else: + if etudid is not None: # Si route etudid + try: + # Utilisation de la fonction add_absence + add_absence(etudid, date, matin, justif) + # Utilisation de la fonction add_justif + add_justif(etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + try: + # Utilisation de la fonction add_absence + add_absence(etu.etudid, date, matin, justif) + # Utilisation de la fonction add_justif + add_justif(etu.etudid, date, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") + + +@bp.route("/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) +@token_auth.login_required +def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne un html + + jour : la date de l'absence a annulé + matin : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + # Fonction utilisée : app.scodoc.sco_abs.annule_absence() + + if etudid is None: + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de l'etudid de l'étudiant + etudid = etu.etudid + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de l'etudid de l'étudiant + etudid = etu.etudid + try: + # Utilisation de la fonction annule_absence + annule_absence(etudid, jour, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") + + +@bp.route("/absences/abs_annule_justif?etudid=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) +@bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) +@token_auth.login_required +def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne un html + + jour : la date de l'absence a annulé + matin : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + # Fonction utilisée : app.scodoc.sco_abs.annule_justif() + + if etudid is None: + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de l'etudid de l'étudiant + etudid = etu.etudid + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de l'etudid de l'étudiant + etudid = etu.etudid + try: + # Utilisation de la fonction annule_justif + annule_justif(etudid, jour, matin) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return error_response(200, message="OK") + + +@bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) +def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): + """ + Retoune la liste des absences d'un ou plusieurs groupes entre deux dates + """ + # Fonction utilisée : app.scodoc.sco_groups.get_group_members() et app.scodoc.sco_abs.list_abs_date() + + try: + # Utilisation de la fonction get_group_members + members = get_group_members(group_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + data = [] + # Filtre entre les deux dates renseignées + for member in members: + abs = list_abs_date(member.id, date_debut, date_fin) + data.append(abs) + + # return jsonify(data) # XXX TODO faire en sorte de pouvoir renvoyer sa (ex to_dict() dans absences) + return error_response(501, message="Not implemented") \ No newline at end of file diff --git a/app/api/departements.py b/app/api/departements.py new file mode 100644 index 0000000000..725ba809a3 --- /dev/null +++ b/app/api/departements.py @@ -0,0 +1,191 @@ +############################################### Departements ########################################################## +from flask import jsonify + +from app import models +from app.api import bp +from app.api.auth import token_auth +from app.api.errors import error_response +from app.models import ApcReferentielCompetences +from app.scodoc.sco_prepajury import feuille_preparation_jury +from app.scodoc.sco_pvjury import formsemestre_pvjury +from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet +from app.scodoc.sco_saisie_notes import notes_add + + + +@bp.route("/departements", methods=["GET"]) +#@token_auth.login_required # Commenté le temps des tests +def departements(): + """ + Retourne la liste des ids de départements visibles + + Exemple de résultat : [2, 5, 8, 1, 4, 18] + """ + # Récupération de tous les départements + depts = models.Departement.query.filter_by(visible=True).all() + + # Mise en place de la liste avec tous les ids de départements + depts_ids = [d.id for d in depts] + + return jsonify(depts_ids) + + +@bp.route("/departements//etudiants/liste/", methods=["GET"]) +@token_auth.login_required +def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR + """ + Retourne la liste des étudiants d'un département + + dept: l'acronym d'un département + formsemestre_id: l'id d'un formesemestre + + Exemple de résultat : + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 18, + "nom": "MOREL", + "prenom": "JACQUES" + }, + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 19, + "nom": "FOURNIER", + "prenom": "ANNE" + }, + ... + """ + # Si le formsemestre_id a été renseigné + if formsemestre_id is not None: + # Récupération du/des depts + list_depts = models.Departement.query.filter( + models.Departement.acronym == dept, + models.FormSemestre.id == formsemestre_id, + ) + list_etuds = [] + for dept in list_depts: + # Récupération des étudiants d'un département + x = models.Identite.query.filter(models.Identite.dept_id == dept.id).all() + print(x) + for y in x: + # Ajout des étudiants dans la liste global + list_etuds.append(y) + else: # Si le formsemestre_id n'a pas été renseigné + list_depts = models.Departement.query.filter( + models.Departement.acronym == dept, + models.FormSemestre.semestre_id == models.Departement.formsemestres, + ) + list_etuds = [] + for dept in list_depts: + x = models.Identite.query.filter(models.Identite.dept_id == dept.id).all() + for y in x: + list_etuds.append(y) + + # Mise en forme des données + data = [d.to_dict_bul() for d in list_etuds] + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/departements//semestres_courants", methods=["GET"]) +# @token_auth.login_required # Commenté le temps des tests +def liste_semestres_courant(dept: str): + """ + Liste des semestres actifs d'un départements donné + + dept: l'acronym d'un département + + Exemple de résultat : + [ + { + "titre": "master machine info", + "gestion_semestrielle": false, + "scodoc7_id": null, + "date_debut": "01/09/2021", + "bul_bgcolor": null, + "date_fin": "15/12/2022", + "resp_can_edit": false, + "dept_id": 1, + "etat": true, + "resp_can_change_ens": false, + "id": 1, + "modalite": "FI", + "ens_can_edit_eval": false, + "formation_id": 1, + "gestion_compensation": false, + "elt_sem_apo": null, + "semestre_id": 1, + "bul_hide_xml": false, + "elt_annee_apo": null, + "block_moyennes": false, + "formsemestre_id": 1, + "titre_num": "master machine info semestre 1", + "date_debut_iso": "2021-09-01", + "date_fin_iso": "2022-12-15", + "responsables": [ + 3, + 2 + ] + }, + ... + ] + """ + # Récupération des départements comportant l'acronym mit en paramètre + depts = models.Departement.query.filter_by(acronym=dept).all() + + # Récupération de l'id + id_dept = depts[0].id + + # Récupération des semestres suivant id_dept + semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() + + # Mise en forme des données + + data = [d.to_dict() for d in semestres] + + return jsonify(data) + + +@bp.route( + "/departements//formations//referentiel_competences", methods=["GET"]) +def referenciel_competences(dept: str, formation_id: int): + """ + Retourne le référentiel de compétences + + dept : l'acronym d'un département + formation_id : l'id d'une formation + """ + # depts = models.Departement.query.filter_by(acronym=dept).all() + # + # id_dept = depts[0].id + # + # formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() + # + # ref_comp = formations[0].referentiel_competence_id + # + # if ref_comp is None: + # return error_response(204, message="Pas de référenciel de compétences pour cette formation") + # else: + # return jsonify(ref_comp) + + ref = ApcReferentielCompetences.query.get_or_404(formation_id) + + return jsonify(ref.to_dict()) + + +@bp.route("/departements//formsemestre/programme", methods=["GET"]) +def semestre_index(dept: str, formsemestre_id: int): + """ + Retourne la liste des Ues, ressources et SAE d'un semestre + """ + + return error_response(501, message="not implemented") \ No newline at end of file diff --git a/app/api/etudiants.py b/app/api/etudiants.py new file mode 100644 index 0000000000..5b0ac28a23 --- /dev/null +++ b/app/api/etudiants.py @@ -0,0 +1,322 @@ +#################################################### Etudiants ######################################################## +from flask import jsonify + +from app import models +from app.api import bp +from app.api.errors import error_response +from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud +from app.scodoc.sco_groups import get_etud_groups + + +@bp.route("/etudiants", methods=["GET"]) +def etudiants(): + """ + Retourne la liste de tous les étudiants + + Exemple de résultat : + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 18, + "nom": "MOREL", + "prenom": "JACQUES" + }, + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 19, + "nom": "FOURNIER", + "prenom": "ANNE" + }, + ... + """ + # Récupération de tous les étudiants + etu = models.Identite.query.all() + + # Mise en forme des données + data = [d.to_dict_bul(include_urls=False) for d in etu] + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/etudiants/courant", methods=["GET"]) +def etudiants_courant(): + """ + Retourne la liste des étudiants courant + + Exemple de résultat : + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 18, + "nom": "MOREL", + "prenom": "JACQUES" + }, + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 19, + "nom": "FOURNIER", + "prenom": "ANNE" + }, + ... + """ + # Récupération de tous les étudiants + etus = models.Identite.query.all() + + data = [] + # Récupère uniquement les étudiants courant + for etu in etus: + if etu.inscription_courante() is not None: + data.append(etu.to_dict_bul(include_urls=False)) + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/etudiant/etudid/", methods=["GET"]) +@bp.route("/etudiant/nip/", methods=["GET"]) +@bp.route("/etudiant/ine/", methods=["GET"]) +def etudiant(etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. + + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + + Exemple de résultat : + { + "civilite": "X", + "code_ine": null, + "code_nip": null, + "date_naissance": null, + "email": null, + "emailperso": null, + "etudid": 18, + "nom": "MOREL", + "prenom": "JACQUES" + } + """ + etu = [] + + if etudid is not None: # Si route etudid + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(id=etudid).first() + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + + # Mise en forme des données + data = etu.to_dict_bul(include_urls=False) + + return jsonify(data) + + +@bp.route("/etudiant/etudid//formsemestres") +@bp.route("/etudiant/nip//formsemestres") +@bp.route("/etudiant/ine//formsemestres") +def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne la liste des semestres qu'un étudiant a suivis + + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + + Exemple de résultat : + [ + { + "titre": "master machine info", + "gestion_semestrielle": false, + "scodoc7_id": null, + "date_debut": "01/09/2021", + "bul_bgcolor": null, + "date_fin": "15/12/2022", + "resp_can_edit": false, + "dept_id": 1, + "etat": true, + "resp_can_change_ens": false, + "id": 1, + "modalite": "FI", + "ens_can_edit_eval": false, + "formation_id": 1, + "gestion_compensation": false, + "elt_sem_apo": null, + "semestre_id": 1, + "bul_hide_xml": false, + "elt_annee_apo": null, + "block_moyennes": false, + "formsemestre_id": 1, + "titre_num": "master machine info semestre 1", + "date_debut_iso": "2021-09-01", + "date_fin_iso": "2022-12-15", + "responsables": [ + 3, + 2 + ] + }, + ... + ] + """ + + # Récupération de toutes les inscriptions + inscriptions = models.FormSemestreInscription.query.all() + + sems = [] + # Filtre les inscriptions contenant l'étudiant + for sem in inscriptions: + if etudid is not None: # Si route etudid + if sem.etudid == etudid: + sems.append(sem) + + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + if sem.etudid == etu.etudid: + sems.append(sem) + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).firt() + if sem.etudid == etu.etudid: + sems.append(sem) + + # Mise en forme des données + data_inscriptions = [d.to_dict() for d in sems] + + formsemestres = [] + + # Filtre les formsemestre contenant les inscriptions de l'étudiant + for sem in data_inscriptions: + res = models.FormSemestre.query.filter_by(id=sem['formsemestre_id']).first() + formsemestres.append(res) + + data = [] + # Mise en forme des données + for formsem in formsemestres: + data.append(formsem.to_dict()) + + return jsonify(data) + + +@bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) +@bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) +@bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) +def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() + + etu = None + if etudid is not None: # Si route etudid + return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) + else: + if nip is not None: # Si route nip + etu = models.Identite.query.filter_by(code_nip=nip).first() + + if ine is not None: # Si route ine + etu = models.Identite.query.filter_by(code_nip=ine).first() + + if etu is not None: # Si route nip ou ine + return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + + # return error_response(501, message="Not implemented") + + +@bp.route( + "/etudiant/etudid//semestre//groups", methods=["GET"] +) +@bp.route( + "/etudiant/nip//semestre//groups", methods=["GET"] +) +@bp.route( + "/etudiant/ine//semestre//groups", methods=["GET"] +) +def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): + """ + Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + + Exemple de résultat : + [ + { + "partition_id": 1, + "id": 1, + "formsemestre_id": 1, + "partition_name": null, + "numero": 0, + "bul_show_rank": false, + "show_in_lists": true, + "group_id": 1, + "group_name": null + }, + { + "partition_id": 2, + "id": 2, + "formsemestre_id": 1, + "partition_name": "TD", + "numero": 1, + "bul_show_rank": false, + "show_in_lists": true, + "group_id": 2, + "group_name": "A" + } + ] + """ + # Fonction utilisée : app.scodoc.sco_groups.get_etud_groups() + + if etudid is None: + if nip is not None: # Si route nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=nip).first() + # Récupération de sont etudid + etudid = etu.etudid + + if ine is not None: # Si route ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=ine).first() + # Récupération de sont etudid + etudid = etu.etudid + + # Récupération du formsemestre + sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + try: + # Utilisation de la fonction get_etud_groups + data = get_etud_groups(etudid, sem.to_dict()) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) \ No newline at end of file diff --git a/app/api/evaluations.py b/app/api/evaluations.py new file mode 100644 index 0000000000..2ca92d5853 --- /dev/null +++ b/app/api/evaluations.py @@ -0,0 +1,64 @@ +############################################### Evaluations ########################################################### +from flask import jsonify + +from app import models +from app.api import bp +from app.api.auth import token_auth +from app.api.errors import error_response +from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes + + +@bp.route("/evaluations/", methods=["GET"]) +def evaluations(moduleimpl_id: int): + """ + Retourne la liste des évaluations à partir de l'id d'un moduleimpl + + moduleimpl_id : l'id d'un moduleimpl + """ + # Récupération de toutes les évaluations + evals = models.Evaluation.query.filter_by(id=moduleimpl_id).all() + + # Mise en forme des données + data = [d.to_dict() for d in evals] + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/evaluations/eval_notes/", methods=["GET"]) +def evaluation_notes(evaluation_id: int): + """ + Retourne la liste des notes à partir de l'id d'une évaluation donnée + + evaluation_id : l'id d'une évaluation + """ + # Fonction utilisée : app.scodoc.sco_evaluation_db.do_evaluation_get_all_notes() + + try: + # Utilisation de la fonction do_evaluation_get_all_notes + data = do_evaluation_get_all_notes(evaluation_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) + + +@bp.route("/evaluations/eval_set_notes?eval_id=&etudid=¬e=", methods=["POST"]) +@bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) +@bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) +@token_auth.login_required +def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): + """ + Set les notes d'une évaluation pour un étudiant donnée + + eval_id : l'id d'une évaluation + note : la note à attribuer + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + # Fonction utilisée : app.scodoc.sco_saisie_notes.notes_add() + + # Qu'est ce qu'un user ??? + # notes_add() + return error_response(501, message="Not implemented") \ No newline at end of file diff --git a/app/api/formations.py b/app/api/formations.py new file mode 100644 index 0000000000..327d0c145a --- /dev/null +++ b/app/api/formations.py @@ -0,0 +1,110 @@ +##############################################" Formations ############################################################ +from flask import jsonify + +from app import models +from app.api import bp +from app.api.errors import error_response +from app.scodoc.sco_formations import formation_export +from app.scodoc.sco_moduleimpl import moduleimpl_list + + +@bp.route("/formations", methods=["GET"]) +def formations(): + """ + Retourne la liste des formations + """ + # Récupération de toutes les formations + list_formations = models.Formation.query.all() + + # Mise en forme des données + data = [d.to_dict() for d in list_formations] + + return jsonify(data) + + +@bp.route("/formations/", methods=["GET"]) +def formations_by_id(formation_id: int): + """ + Retourne une formation en fonction d'un id donné + + formation_id : l'id d'une formation + """ + # Récupération de la formation + forma = models.Formation.query.filter_by(id=formation_id).first() + + # Mise en forme des données + data = [d.to_dict() for d in forma] + + return jsonify(data) + + +@bp.route("/formations/formation_export/", methods=["GET"]) +def formation_export_by_formation_id(formation_id: int, export_ids=False): + """ + Retourne la formation, avec UE, matières, modules + """ + # Fonction utilité : app.scodoc.sco_formations.formation_export() + + try: + # Utilisation de la fonction formation_export + data = formation_export(formation_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) + + +@bp.route("/formations/apo/", methods=["GET"]) +def formsemestre_apo(etape_apo: int): + """ + Retourne les informations sur les formsemestres + + etape_apo : l'id d'une étape apogée + """ + # Récupération des formsemestres + apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all() + + data = [] + # Filtre les formsemestres correspondant + mise en forme des données + for apo in apos: + formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first() + data.append(formsem.to_dict()) + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +@bp.route("/formations/moduleimpl/", methods=["GET"]) +def moduleimpls(moduleimpl_id: int): + """ + Retourne la liste des moduleimpl + + moduleimpl_id : l'id d'un moduleimpl + """ + # Récupération des tous les moduleimpl + list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id).all() + + # Mise en forme des données + data = list_moduleimpls[0].to_dict() + + return jsonify(data) + + +@bp.route( + "/formations/moduleimpl//formsemestre/", methods=["GET"]) +def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): + """ + Retourne la liste des moduleimpl d'un semestre + + moduleimpl_id : l'id d'un moduleimpl + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list() + + try: + # Utilisation de la fonction moduleimpl_list + data = moduleimpl_list(moduleimpl_id, formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) \ No newline at end of file diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py new file mode 100644 index 0000000000..5b87de664c --- /dev/null +++ b/app/api/formsemestres.py @@ -0,0 +1,98 @@ +########################################## Formsemestres ############################################################## +from flask import jsonify + +from app import models +from app.api import bp +from app.api.errors import error_response +from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict +from app.scodoc.sco_pvjury import formsemestre_pvjury +from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet + + +@bp.route("/formations/formsemestre/", methods=["GET"]) +def formsemestre(formsemestre_id: int): + """ + Retourne l'information sur le formsemestre correspondant au formsemestre_id + + formsemestre_id : l'id d'un formsemestre + + """ + # Récupération de tous les formsemestres + list_formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id) + + # Mise en forme des données + data = list_formsemetre[0].to_dict() + + return jsonify(data) + + +@bp.route( + "/formsemestre//departements//etudiant/etudid//bulletin", + methods=["GET"], +) +@bp.route( + "/formsemestre//departements//etudiant/nip//bulletin", + methods=["GET"], +) +@bp.route( + "/formsemestre//departements//etudiant/ine//bulletin", + methods=["GET"], +) +def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): + """ + Retourne le bulletin de note d'un étudiant + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip : le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + # Fonction utilisée : app.scodoc.sco_bulletins.formsemestre_billetinetud_dict() + + data = [] + if args[0] == "short": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + elif args[0] == "selectevals": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + elif args[0] == "long": + data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) + else: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) + + +@bp.route("/formsemestre//bulletins", methods=["GET"]) +def bulletins(formsemestre_id: int): + """ + Retourne les bulletins d'un formsemestre donné + + formsemestre_id : l'id d'un formesemestre + """ + # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet() + + try: + # Utilisation de la fonction formsemestre_recapcomplet + data = formsemestre_recapcomplet(formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) + + +@bp.route("/formsemestre//jury", methods=["GET"]) +def jury(formsemestre_id: int): + """ + Retourne le récapitulatif des décisions jury + + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() + + try: + # Utilisation de la fonction formsemestre_pvjury + data = formsemestre_pvjury(formsemestre_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) \ No newline at end of file diff --git a/app/api/jury.py b/app/api/jury.py new file mode 100644 index 0000000000..11e87c49de --- /dev/null +++ b/app/api/jury.py @@ -0,0 +1,75 @@ +#################################################### Jury ############################################################# +from flask import jsonify + +from app import models +from app.api import bp +from app.api.errors import error_response +from app.scodoc.sco_prepajury import feuille_preparation_jury +from app.scodoc.sco_pvjury import formsemestre_pvjury + + +@bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) +def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction + """ + Retourne la feuille de préparation du jury + + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_prepajury.feuille_preparation_jury() + + # Utilisation de la fonction feuille_preparation_jury + prepa_jury = feuille_preparation_jury(formsemestre_id) + + return error_response(501, message="Not implemented") + + +@bp.route("/jury/formsemestre//decisions_jury", methods=["GET"]) +def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction + """ + Retourne les décisions du jury suivant un formsemestre donné + + formsemestre_id : l'id d'un formsemestre + """ + # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() + + # Utilisation de la fonction formsemestre_pvjury + decision_jury = formsemestre_pvjury(formsemestre_id) + + return error_response(501, message="Not implemented") + + +@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", methods=["POST"]) +def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, + etudid: int = None, nip: int = None, ine: int = None): + """ + Attribuer la décision du jury et le devenir à un etudiant + + formsemestre_id : l'id d'un formsemestre + decision_jury : la décision du jury + devenir_jury : le devenir du jury + assiduite : True ou False + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + return error_response(501, message="Not implemented") + + +@bp.route("/jury/etudid//formsemestre//annule_decision", methods=["DELETE"]) +@bp.route("/jury/nip//formsemestre//annule_decision", methods=["DELETE"]) +@bp.route("/jury/ine//formsemestre//annule_decision", methods=["DELETE"]) +def annule_decision_jury(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): + """ + Supprime la déciosion du jury pour un étudiant donné + + formsemestre_id : l'id d'un formsemestre + etudid : l'etudid d'un étudiant + nip: le code nip d'un étudiant + ine : le code ine d'un étudiant + """ + return error_response(501, message="Not implemented") \ No newline at end of file diff --git a/app/api/partitions.py b/app/api/partitions.py new file mode 100644 index 0000000000..1a61beff97 --- /dev/null +++ b/app/api/partitions.py @@ -0,0 +1,79 @@ +############################################### Partitions ############################################################ +from flask import jsonify + +from app import models +from app.api import bp +from app.api.auth import token_auth +from app.api.errors import error_response +from app.scodoc.sco_groups import get_group_members, setGroups + + +@bp.route("/partitions/", methods=["GET"]) +def partition(formsemestre_id: int): + """ + Retourne la liste de toutes les partitions d'un formsemestre + + formsemestre_id : l'id d'un formsemestre + """ + # Récupération de toutes les partitions + partitions = models.Partition.query.filter_by(id=formsemestre_id).all() + + # Mise en forme des données + data = [d.to_dict() for d in partitions] + + return jsonify(data) + # return error_response(501, message="Not implemented") + + +# @bp.route( +# "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", +# methods=["GET"], +# ) +@bp.route("/partitions/groups/", methods=["GET"]) +@bp.route("/partitions/groups//etat/", methods=["GET"]) +def etud_in_group(group_id: int, etat=None): + """ + Retourne la liste des étudiants dans un groupe + + group_id : l'id d'un groupe + etat : + """ + # Fonction utilisée : app.scodoc.sco_groups.get_group_members() + + if etat is None: # Si l'état n'est pas renseigné + try: + # Utilisation de la fonction get_group_members + data = get_group_members(group_id) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + else: # Si l'état est renseigné + try: + # Utilisation de la fonction get_group_members + data = get_group_members(group_id, etat) + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") + + return jsonify(data) + + +@bp.route( + "/partitions/set_groups?partition_id=&groups_lists=&" + "groups_to_create=&groups_to_delete=", methods=["POST"], +) +@token_auth.login_required +def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): + """ + Set les groups + + partition_id : l'id d'une partition + groups_lists : + groups_ti_delete : les groupes à supprimer + groups_to_create : les groupes à créer + """ + # Fonction utilisée : app.scodoc.sco_groups.setGroups() + try: + # Utilisation de la fonction setGroups + setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete) + return error_response(200, message="Groups set") + except ValueError: + return error_response(409, message="La requête ne peut être traitée en l’état actuel") \ No newline at end of file diff --git a/app/api/sco_api.py b/app/api/sco_api.py index f52f2ce7ef..af4e8fdc7d 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -62,1616 +62,86 @@ from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission -############################################### Departements ########################################################## -from app.scodoc.sco_prepajury import feuille_preparation_jury -from app.scodoc.sco_pvjury import formsemestre_pvjury -from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet -from app.scodoc.sco_saisie_notes import notes_add +# ###################################################### Logos ########################################################## +# +# # XXX TODO voir get_logo déjà existant dans app/views/scodoc.py +# +# @bp.route("/logos", methods=["GET"]) +# def liste_logos(format="json"): +# """ +# Liste des logos définis pour le site scodoc. +# """ +# # fonction to use : list_logos() +# # try: +# # res = list_logos() +# # except ValueError: +# # return error_response(409, message="La requête ne peut être traitée en l’état actuel") +# # +# # if res is None: +# # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") +# # +# # return res +# +# +# +# @bp.route("/logos/", methods=["GET"]) +# def recup_logo_global(logo_name: str): +# """ +# Retourne l'image au format png ou jpg +# +# logo_name : le nom du logo rechercher +# """ +# # fonction to use find_logo +# # try: +# # res = find_logo(logo_name) +# # except ValueError: +# # return error_response(409, message="La requête ne peut être traitée en l’état actuel") +# # +# # if res is None: +# # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") +# # +# # return res +# +# +# @bp.route("/departements//logos", methods=["GET"]) +# def logo_dept(dept: str): +# """ +# Liste des logos définis pour le département visé. +# +# dept : l'id d'un département +# """ +# # fonction to use: _list_dept_logos +# # dept_id = models.Departement.query.filter_by(acronym=dept).first() +# # try: +# # res = _list_dept_logos(dept_id.id) +# # except ValueError: +# # return error_response(409, message="La requête ne peut être traitée en l’état actuel") +# # +# # if res is None: +# # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") +# # +# # return res +# +# +# @bp.route("/departement//logos/", methods=["GET"]) +# def recup_logo_dept_global(dept: str, logo_name: str): +# """ +# L'image format png ou jpg +# +# dept : l'id d'un département +# logo_name : le nom du logo rechercher +# """ +# # fonction to use find_logo +# # dept_id = models.Departement.query.filter_by(acronym=dept).first() +# # try: +# # res = find_logo(logo_name, dept_id.id) +# # except ValueError: +# # return error_response(409, message="La requête ne peut être traitée en l’état actuel") +# # +# # if res is None: +# # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") +# # +# # return res -@bp.route("/departements", methods=["GET"]) -#@token_auth.login_required -def departements(): - """ - Retourne la liste des ids de départements - """ - # Récupération de tous les départements - depts = models.Departement.query.filter_by(visible=True).all() - # Mise en place de la liste avec tous les ids de départements - data = [d.id for d in depts] - - return jsonify(data) - - -@bp.route("/departements//etudiants/liste/", methods=["GET"]) -@token_auth.login_required -def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR - """ - Retourne la liste des étudiants d'un département - - dept: l'acronym d'un département - formsemestre_id: l'id d'un formesemestre - """ - # Si le formsemestre_id a été renseigné - if formsemestre_id is not None: - # Récupération du/des depts - list_depts = models.Departement.query.filter( - models.Departement.acronym == dept, - models.FormSemestre.semestre_id == formsemestre_id, - ) - list_etuds = [] - for dept in list_depts: - # Récupération des étudiants d'un département - x = models.Identite.query.filter(models.Identite.dept_id == dept.getId()) - for y in x: - # Ajout des étudiants dans la liste global - list_etuds.append(y) - else: # Si le formsemestre_id n'a pas été renseigné - list_depts = models.Departement.query.filter( - models.Departement.acronym == dept, - models.FormSemestre.semestre_id == models.Departement.formsemestres, - ) - list_etuds = [] - for dept in list_depts: - x = models.Identite.query.filter(models.Identite.dept_id == dept.getId()) - for y in x: - list_etuds.append(y) - - # Mise en forme des données - data = [d.to_dict() for d in list_etuds] - # return jsonify(data) - return error_response(501, message="Not implemented") - - -@bp.route("/departements//semestres_courant", methods=["GET"]) -# @token_auth.login_required -def liste_semestres_courant(dept: str): - """ - Liste des semestres actifs d'un départements donné - - dept: l'acronym d'un département - """ - # Récupération des départements comportant l'acronym mit en paramètre - depts = models.Departement.query.filter_by(acronym=dept).all() - - # Récupération de l'id - id_dept = depts[0].id - - # Récupération des semestres suivant id_dept - semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() - - # Mise en forme des données - - data = [d.to_dict() for d in semestres] - - return jsonify(data) - - -@bp.route( - "/departements//formations//referentiel_competences", - methods=["GET"], -) -def referenciel_competences(dept: str, formation_id: int): - """ - Retourne le référentiel de compétences - - dept : l'acronym d'un département - formation_id : l'id d'une formation - """ - # depts = models.Departement.query.filter_by(acronym=dept).all() - # - # id_dept = depts[0].id - # - # formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() - # - # ref_comp = formations[0].referentiel_competence_id - # - # if ref_comp is None: - # return error_response(204, message="Pas de référenciel de compétences pour cette formation") - # else: - # return jsonify(ref_comp) - - ref = ApcReferentielCompetences.query.get_or_404(formation_id) - - return jsonify(ref.to_dict()) - - -@bp.route("/departements//formsemestre/programme", methods=["GET"]) -def semestre_index(dept: str, formsemestre_id: int): - """ - Retourne la liste des Ues, ressources et SAE d'un semestre - """ - - return error_response(501, message="not implemented") - - -#################################################### Etudiants ######################################################## - - -@bp.route("/etudiants", methods=["GET"]) -def etudiants(): - """ - Retourne la liste de tous les étudiants - """ - # Récupération de tous les étudiants - etu = models.Identite.query.all() - - # Mise en forme des données - data = [d.to_dict_bul(include_urls=False) for d in etu] - - return jsonify(data) - # return error_response(501, message="Not implemented") - - -@bp.route("/etudiants/courant", methods=["GET"]) -def etudiants_courant(): - """ - Retourne la liste des étudiants courant - """ - # Récupération de tous les étudiants - etus = models.Identite.query.all() - - data = [] - # Récupère uniquement les étudiants courant - for etu in etus: - if etu.inscription_courante() is not None: - data.append(etu.to_dict_bul(include_urls=False)) - - return jsonify(data) - # return error_response(501, message="Not implemented") - - -@bp.route("/etudiant/etudid/", methods=["GET"]) -@bp.route("/etudiant/nip/", methods=["GET"]) -@bp.route("/etudiant/ine/", methods=["GET"]) -def etudiant(etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. - - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - etu = [] - - if etudid is not None: # Si route etudid - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(id=etudid).first() - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - - # Mise en forme des données - data = etu.to_dict_bul(include_urls=False) - - return jsonify(data) - - -@bp.route("/etudiant/etudid//formsemestres") -@bp.route("/etudiant/nip//formsemestres") -@bp.route("/etudiant/ine//formsemestres") -def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne les semestres qu'un étudiant a suivis - - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - - # Récupération de toutes les inscriptions - inscriptions = models.FormSemestreInscription.query.all() - - sems = [] - # Filtre les inscriptions contenant l'étudiant - for sem in inscriptions: - if etudid is not None: # Si route etudid - if sem.etudid == etudid: - sems.append(sem) - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - if sem.etudid == etu.etudid: - sems.append(sem) - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).firt() - if sem.etudid == etu.etudid: - sems.append(sem) - - # Mise en forme des données - data_inscriptions = [d.to_dict() for d in sems] - - formsemestres = [] - - # Filtre les formsemestre contenant les inscriptions de l'étudiant - for sem in data_inscriptions: - res = models.FormSemestre.query.filter_by(id=sem['formsemestre_id']).first() - formsemestres.append(res) - - data = [] - # Mise en forme des données - for formsem in formsemestres: - data.append(formsem.to_dict()) - - return jsonify(data) - - -@bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) -@bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) -@bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) -def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné - - formsemestre_id : l'id d'un formsemestre - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() - - etu = None - if etudid is not None: # Si route etudid - return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) - else: - if nip is not None: # Si route nip - etu = models.Identite.query.filter_by(code_nip=nip).first() - - if ine is not None: # Si route ine - etu = models.Identite.query.filter_by(code_nip=ine).first() - - if etu is not None: # Si route nip ou ine - return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) - - # return error_response(501, message="Not implemented") - - -@bp.route( - "/etudiant/etudid//semestre//groups", methods=["GET"] -) -@bp.route( - "/etudiant/nip//semestre//groups", methods=["GET"] -) -@bp.route( - "/etudiant/ine//semestre//groups", methods=["GET"] -) -def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué - - formsemestre_id : l'id d'un formsemestre - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_groups.get_etud_groups() - - if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération de sont etudid - etudid = etu.etudid - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération de sont etudid - etudid = etu.etudid - - # Récupération du formsemestre - sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() - try: - # Utilisation de la fonction get_etud_groups - data = get_etud_groups(etudid, sem.to_dict()) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -##############################################" Formations ############################################################ - - -@bp.route("/formations", methods=["GET"]) -def formations(): - """ - Retourne la liste des formations - """ - # Récupération de toutes les formations - list_formations = models.Formation.query.all() - - # Mise en forme des données - data = [d.to_dict() for d in list_formations] - - return jsonify(data) - - -@bp.route("/formations/", methods=["GET"]) -def formations_by_id(formation_id: int): - """ - Retourne une formation en fonction d'un id donné - - formation_id : l'id d'une formation - """ - # Récupération de la formation - forma = models.Formation.query.filter_by(id=formation_id).first() - - # Mise en forme des données - data = [d.to_dict() for d in forma] - - return jsonify(data) - - -@bp.route("/formations/formation_export/", methods=["GET"]) -def formation_export_by_formation_id(formation_id: int, export_ids=False): - """ - Retourne la formation, avec UE, matières, modules - """ - # Fonction utilité : app.scodoc.sco_formations.formation_export() - - try: - # Utilisation de la fonction formation_export - data = formation_export(formation_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -@bp.route("/formations/apo/", methods=["GET"]) -def formsemestre_apo(etape_apo: int): - """ - Retourne les informations sur les formsemestres - - etape_apo : l'id d'une étape apogée - """ - # Récupération des formsemestres - apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all() - - data = [] - # Filtre les formsemestres correspondant + mise en forme des données - for apo in apos: - formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first() - data.append(formsem.to_dict()) - - return jsonify(data) - # return error_response(501, message="Not implemented") - - -@bp.route("/formations/moduleimpl/", methods=["GET"]) -def moduleimpls(moduleimpl_id: int): - """ - Retourne la liste des moduleimpl - - moduleimpl_id : l'id d'un moduleimpl - """ - # Récupération des tous les moduleimpl - list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id).all() - - # Mise en forme des données - data = list_moduleimpls[0].to_dict() - - return jsonify(data) - - -@bp.route( - "/formations/moduleimpl//formsemestre/", methods=["GET"]) -def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): - """ - Retourne la liste des moduleimpl d'un semestre - - moduleimpl_id : l'id d'un moduleimpl - formsemestre_id : l'id d'un formsemestre - """ - # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list() - - try: - # Utilisation de la fonction moduleimpl_list - data = moduleimpl_list(moduleimpl_id, formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -#################################################### UE ############################################################### - - -@bp.route( - "/departements//formations/programme/", methods=["GET"] -) -def eus(dept: str, sem_id: int): - """ - Liste des UES, ressources et SAE d'un semestre - """ - return error_response(501, message="Not implemented") - - -########################################## Formsemestres ############################################################## - - -@bp.route("/formations/formsemestre/", methods=["GET"]) -def formsemestre(formsemestre_id: int): - """ - Retourne l'information sur le formsemestre correspondant au formsemestre_id - - formsemestre_id : l'id d'un formsemestre - - """ - # Récupération de tous les formsemestres - list_formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id) - - # Mise en forme des données - data = list_formsemetre[0].to_dict() - - return jsonify(data) - - -@bp.route( - "/formsemestre//departements//etudiant/etudid//bulletin", - methods=["GET"], -) -@bp.route( - "/formsemestre//departements//etudiant/nip//bulletin", - methods=["GET"], -) -@bp.route( - "/formsemestre//departements//etudiant/ine//bulletin", - methods=["GET"], -) -def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): - """ - Retourne le bulletin de note d'un étudiant - - formsemestre_id : l'id d'un formsemestre - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_bulletins.formsemestre_billetinetud_dict() - - data = [] - if args[0] == "short": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) - elif args[0] == "selectevals": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) - elif args[0] == "long": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) - else: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -@bp.route("/formsemestre//bulletins", methods=["GET"]) -def bulletins(formsemestre_id: int): - """ - Retourne les bulletins d'un formsemestre donné - - formsemestre_id : l'id d'un formesemestre - """ - # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet() - - try: - # Utilisation de la fonction formsemestre_recapcomplet - data = formsemestre_recapcomplet(formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -@bp.route("/formsemestre//jury", methods=["GET"]) -def jury(formsemestre_id: int): - """ - Retourne le récapitulatif des décisions jury - - formsemestre_id : l'id d'un formsemestre - """ - # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() - - try: - # Utilisation de la fonction formsemestre_pvjury - data = formsemestre_pvjury(formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -############################################### Partitions ############################################################ - - -@bp.route("/partitions/", methods=["GET"]) -def partition(formsemestre_id: int): - """ - Retourne la liste de toutes les partitions d'un formsemestre - - formsemestre_id : l'id d'un formsemestre - """ - # Récupération de toutes les partitions - partitions = models.Partition.query.filter_by(id=formsemestre_id).all() - - # Mise en forme des données - data = [d.to_dict() for d in partitions] - - return jsonify(data) - # return error_response(501, message="Not implemented") - - -# @bp.route( -# "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", -# methods=["GET"], -# ) -@bp.route("/partitions/groups/", methods=["GET"]) -@bp.route("/partitions/groups//etat/", methods=["GET"]) -def etud_in_group(group_id: int, etat=None): - """ - Retourne la liste des étudiants dans un groupe - - group_id : l'id d'un groupe - etat : - """ - # Fonction utilisée : app.scodoc.sco_groups.get_group_members() - - if etat is None: # Si l'état n'est pas renseigné - try: - # Utilisation de la fonction get_group_members - data = get_group_members(group_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: # Si l'état est renseigné - try: - # Utilisation de la fonction get_group_members - data = get_group_members(group_id, etat) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -@bp.route( - "/partitions/set_groups?partition_id=&groups_lists=&" - "groups_to_create=&groups_to_delete=", methods=["POST"], -) -@token_auth.login_required -def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): - """ - Set les groups - - partition_id : l'id d'une partition - groups_lists : - groups_ti_delete : les groupes à supprimer - groups_to_create : les groupes à créer - """ - # Fonction utilisée : app.scodoc.sco_groups.setGroups() - try: - # Utilisation de la fonction setGroups - setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete) - return error_response(200, message="Groups set") - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - -############################################### Evaluations ########################################################### - - -@bp.route("/evaluations/", methods=["GET"]) -def evaluations(moduleimpl_id: int): - """ - Retourne la liste des évaluations à partir de l'id d'un moduleimpl - - moduleimpl_id : l'id d'un moduleimpl - """ - # Récupération de toutes les évaluations - evals = models.Evaluation.query.filter_by(id=moduleimpl_id).all() - - # Mise en forme des données - data = [d.to_dict() for d in evals] - - return jsonify(data) - # return error_response(501, message="Not implemented") - - -@bp.route("/evaluations/eval_notes/", methods=["GET"]) -def evaluation_notes(evaluation_id: int): - """ - Retourne la liste des notes à partir de l'id d'une évaluation donnée - - evaluation_id : l'id d'une évaluation - """ - # Fonction utilisée : app.scodoc.sco_evaluation_db.do_evaluation_get_all_notes() - - try: - # Utilisation de la fonction do_evaluation_get_all_notes - data = do_evaluation_get_all_notes(evaluation_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return jsonify(data) - - -@bp.route("/evaluations/eval_set_notes?eval_id=&etudid=¬e=", methods=["POST"]) -@bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) -@bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) -@token_auth.login_required -def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): - """ - Set les notes d'une évaluation pour un étudiant donnée - - eval_id : l'id d'une évaluation - note : la note à attribuer - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_saisie_notes.notes_add() - - # Qu'est ce qu'un user ??? - # notes_add() - return error_response(501, message="Not implemented") - - - -#################################################### Jury ############################################################# - - -@bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) -def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction - """ - Retourne la feuille de préparation du jury - - formsemestre_id : l'id d'un formsemestre - """ - # Fonction utilisée : app.scodoc.sco_prepajury.feuille_preparation_jury() - - # Utilisation de la fonction feuille_preparation_jury - prepa_jury = feuille_preparation_jury(formsemestre_id) - - return error_response(501, message="Not implemented") - - -@bp.route("/jury/formsemestre//decisions_jury", methods=["GET"]) -def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction - """ - Retourne les décisions du jury suivant un formsemestre donné - - formsemestre_id : l'id d'un formsemestre - """ - # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() - - # Utilisation de la fonction formsemestre_pvjury - decision_jury = formsemestre_pvjury(formsemestre_id) - - return error_response(501, message="Not implemented") - - -@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, - etudid: int = None, nip: int = None, ine: int = None): - """ - Attribuer la décision du jury et le devenir à un etudiant - - formsemestre_id : l'id d'un formsemestre - decision_jury : la décision du jury - devenir_jury : le devenir du jury - assiduite : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - return error_response(501, message="Not implemented") - - -@bp.route("/jury/etudid//formsemestre//annule_decision", methods=["DELETE"]) -@bp.route("/jury/nip//formsemestre//annule_decision", methods=["DELETE"]) -@bp.route("/jury/ine//formsemestre//annule_decision", methods=["DELETE"]) -def annule_decision_jury(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): - """ - Supprime la déciosion du jury pour un étudiant donné - - formsemestre_id : l'id d'un formsemestre - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - return error_response(501, message="Not implemented") - - -#################################################### Absences ######################################################### - - -@bp.route("/absences/etudid/", methods=["GET"]) -@bp.route("/absences/nip/", methods=["GET"]) -@bp.route("/absences/ine/", methods=["GET"]) -def absences(etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne la liste des absences d'un étudiant donné - - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - abs = None - if etudid is not None: # Si route etudid - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid).all() - else: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid).all() - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid).all() - - if abs is not None: # Si des absences ont bien été trouvé - # Mise en forme des données - data = [d.to_dict() for d in abs] - - return jsonify(data) - return error_response(501, message="Not implemented") - - -@bp.route("/absences/etudid//abs_just_only", methods=["GET"]) -@bp.route("/absences/nip//abs_just_only", methods=["GET"]) -@bp.route("/absences/ine//abs_just_only", methods=["GET"]) -def absences_justify(etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne la liste des absences justifiées d'un étudiant donné - - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - abs = None - if etudid is not None: # Si route etudid - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() - else: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() - - if abs is not None: # Si des absences ont bien été trouvé - # Mise en forme des données - data = [d.to_dict() for d in abs] - - return jsonify(data) - return error_response(501, message="Not implemented") - - -@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=&moduleimpl_id=", methods=["POST"]) -@token_auth.login_required -def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, - description: str = None, moduleimpl_id: int = None): - """ - Permet d'ajouter une absence en base - - date : la date de l'absence - matin : True ou False - justif : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - description : description possible à ajouter sur l'absence - moduleimpl_id : l'id d'un moduleimpl - """ - # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() - - if description is not None: # Si la description a été renseignée - if moduleimpl_id is not None: # Si le moduleimpl a été renseigné - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - else: # Si le moduleimpl n'a pas été renseigné - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(200, message="OK") - - -@bp.route("/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) -@token_auth.login_required -def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne un html - - jour : la date de l'absence a annulé - matin : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_abs.annule_absence() - - if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid - try: - # Utilisation de la fonction annule_absence - annule_absence(etudid, jour, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(200, message="OK") - - -@bp.route("/absences/abs_annule_justif?etudid=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) -@token_auth.login_required -def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): - """ - Retourne un html - - jour : la date de l'absence a annulé - matin : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_abs.annule_justif() - - if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid - try: - # Utilisation de la fonction annule_justif - annule_justif(etudid, jour, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(200, message="OK") - - -@bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) -def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): - """ - Retoune la liste des absences d'un ou plusieurs groupes entre deux dates - """ - # Fonction utilisée : app.scodoc.sco_groups.get_group_members() et app.scodoc.sco_abs.list_abs_date() - - try: - # Utilisation de la fonction get_group_members - members = get_group_members(group_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - data = [] - # Filtre entre les deux dates renseignées - for member in members: - abs = list_abs_date(member.id, date_debut, date_fin) - data.append(abs) - - # return jsonify(data) # XXX TODO faire en sorte de pouvoir renvoyer sa (ex to_dict() dans absences) - return error_response(501, message="Not implemented") - - -###################################################### Logos ########################################################## - -# XXX TODO voir get_logo déjà existant dans app/views/scodoc.py - -@bp.route("/logos", methods=["GET"]) -def liste_logos(format="json"): - """ - Liste des logos définis pour le site scodoc. - """ - # fonction to use : list_logos() - # try: - # res = list_logos() - # except ValueError: - # return error_response(409, message="La requête ne peut être traitée en l’état actuel") - # - # if res is None: - # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - # - # return res - - - -@bp.route("/logos/", methods=["GET"]) -def recup_logo_global(logo_name: str): - """ - Retourne l'image au format png ou jpg - - logo_name : le nom du logo rechercher - """ - # fonction to use find_logo - # try: - # res = find_logo(logo_name) - # except ValueError: - # return error_response(409, message="La requête ne peut être traitée en l’état actuel") - # - # if res is None: - # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - # - # return res - - -@bp.route("/departements//logos", methods=["GET"]) -def logo_dept(dept: str): - """ - Liste des logos définis pour le département visé. - - dept : l'id d'un département - """ - # fonction to use: _list_dept_logos - # dept_id = models.Departement.query.filter_by(acronym=dept).first() - # try: - # res = _list_dept_logos(dept_id.id) - # except ValueError: - # return error_response(409, message="La requête ne peut être traitée en l’état actuel") - # - # if res is None: - # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - # - # return res - - -@bp.route("/departement//logos/", methods=["GET"]) -def recup_logo_dept_global(dept: str, logo_name: str): - """ - L'image format png ou jpg - - dept : l'id d'un département - logo_name : le nom du logo rechercher - """ - # fonction to use find_logo - # dept_id = models.Departement.query.filter_by(acronym=dept).first() - # try: - # res = find_logo(logo_name, dept_id.id) - # except ValueError: - # return error_response(409, message="La requête ne peut être traitée en l’état actuel") - # - # if res is None: - # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") - # - # return res - - - -################################################## Tests ############################################################## - -import requests -import os - -SCODOC_USER = "" -SCODOC_PASSWORD = "" -SCODOC_URL = "" -CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) - -# r0 = requests.post( -# SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) -# ) -# token = r0.json()["token"] -# HEADERS = {"Authorization": f"Bearer {token}"} - -DEPT = None -FORMSEMESTRE = None -ETU = None - - -@bp.route("/test_dept", methods=["GET"]) -def get_departement(): - """ - Retourne un département pour les tests - """ - r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - if r.status_code == 200: - dept_id = r.json()[0] - # print(dept_id) - - dept = models.Departement.query.filter_by(id=dept_id).first() - dept = dept.to_dict() - - if "id" in dept: - if "acronym" in dept: - if "description" in dept: - if "visible" in dept: - if "date_creation" in dept: - global DEPT - DEPT = dept - - return error_response(200, "OK") - - else: - return error_response(501, "date_creation field missing") - else: - return error_response(501, "visible field missing") - else: - return error_response(501, "description field missing") - else: - return error_response(501, "acronym field missing") - else: - return error_response(501, "id field missing") - - return error_response(409, "La requête ne peut être traitée en l’état actuel") - - -@bp.route("/test_formsemestre", methods=["GET"]) -def get_formsemestre(): - """ - Retourne un formsemestre pour les tests - """ - - global DEPT - dept_acronym = DEPT["acronym"] - - r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courant", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - if r.status_code == 200: - formsemestre = r.json()[0] - # print(r.json()[0]) - - if "titre" in formsemestre: - if "gestion_semestrielle" in formsemestre: - if "scodoc7_id" in formsemestre: - if "date_debut" in formsemestre: - if "bul_bgcolor" in formsemestre: - if "date_fin" in formsemestre: - if "resp_can_edit" in formsemestre: - if "semestre_id" in formsemestre: - if "bul_hide_xml" in formsemestre: - if "elt_annee_apo" in formsemestre: - if "block_moyennes" in formsemestre: - if "formsemestre_id" in formsemestre: - if "titre_num" in formsemestre: - if "date_debut_iso" in formsemestre: - if "date_fin_iso" in formsemestre: - if "responsables" in formsemestre: - global FORMSEMESTRE - FORMSEMESTRE = formsemestre - - # print(FORMSEMESTRE) - - return error_response(200, "OK") - - else: - return error_response(501, - "responsables field " - "missing") - else: - return error_response(501, - "date_fin_iso field missing") - else: - return error_response(501, - "date_debut_iso field missing") - else: - return error_response(501, - "titre_num field missing") - else: - return error_response(501, - "formsemestre_id field missing") - else: - return error_response(501, - "block_moyennes field missing") - else: - return error_response(501, - "elt_annee_apo field missing") - else: - return error_response(501, - "bul_hide_xml field missing") - else: - return error_response(501, - "semestre_id field missing") - else: - return error_response(501, - "resp_can_edit field missing") - else: - return error_response(501, - "date_fin field missing") - else: - return error_response(501, - "bul_bgcolor field missing") - else: - return error_response(501, - "date_debut field missing") - else: - return error_response(501, - "scodoc7_id field missing") - else: - return error_response(501, - "gestion_semestrielle field missing") - else: - return error_response(501, - "titre field missing") - - return error_response(409, "La requête ne peut être traitée en l’état actuel") - - - -@bp.route("/test_etu", methods=["GET"]) -def get_etudiant(): - """ - Retourne un étudiant pour les tests - """ - # print(DEPT.get_data().decode("utf-8")) - # dept = DEPT - r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - if r.status_code == 200: - etu = r.json()[0] - - if "civilite" in etu: - if "code_ine" in etu: - if "code_nip" in etu: - if "date_naissance" in etu: - if "email" in etu: - if "emailperso" in etu: - if "etudid" in etu: - if "nom" in etu: - if "prenom" in etu: - global ETU - ETU = etu - # print(ETU) - - return error_response(200, "OK") - - else: - return error_response(501, "prenom field missing") - else: - return error_response(501, "nom field missing") - else: - return error_response(501, "etudid field missing") - else: - return error_response(501, "emailperso field missing") - else: - return error_response(501, "email field missing") - else: - return error_response(501, "date_naissance field missing") - else: - return error_response(501, "code_nip field missing") - else: - return error_response(501, "code_ine field missing") - else: - return error_response(501, "civilite field missing") - - return error_response(409, "La requête ne peut être traitée en l’état actuel") - - - - -def test_routes_departements(): - """ - Test les routes de la partie Département - """ - # departements - r1 = requests.get( - SCODOC_URL + "/ScoDoc/api/departements", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # liste_etudiants - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # liste_semestres_courant - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # referenciel_competences - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # semestre_index - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_etudiants(): - """ - Test les routes de la partie Etudiants - """ - # etudiants - r1 = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiants_courant - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiant - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiant_formsemestres - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiant_bulletin_semestre - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiant_groups - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_formation(): - """ - Test les routes de la partie Formation - """ - # formations - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # formations_by_id - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # formation_export_by_formation_id - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # formsemestre_apo - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # moduleimpls - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # moduleimpls_sem - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_formsemestres(): - """ - Test les routes de la partie Formsemestres - """ - # formsemestre - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etudiant_bulletin - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # bulletins - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # jury - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_partitions(): - """ - Test les routes de la partie Partitions - """ - # partition - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # etud_in_group - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # set_groups - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_evaluations(): - """ - Test les routes de la partie Evaluations - """ - # evaluations - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # evaluation_notes - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # evaluation_set_notes - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_jury(): - """ - Test les routes de la partie Jury - """ - # jury_preparation - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # jury_decisions - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # set_decision_jury - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # annule_decision_jury - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_absences(): - """ - Test les routes de la partie Absences - """ - # absences - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # absences_justify - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # abs_signale - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # abs_annule - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # abs_annule_justif - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # abs_groupe_etat - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - -def test_routes_logos(): - """ - Test les routes de la partie Logos - """ - # liste_logos - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # recup_logo_global - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # logo_dept - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) - - # recup_logo_dept_global - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) diff --git a/app/api/test_api.py b/app/api/test_api.py new file mode 100644 index 0000000000..20f0dfbffe --- /dev/null +++ b/app/api/test_api.py @@ -0,0 +1,414 @@ +################################################## Tests ############################################################## + +import requests +import os + +from app import models +from app.api import bp, requested_format +from app.api.auth import token_auth +from app.api.errors import error_response + +SCODOC_USER = "admin" +SCODOC_PASSWORD = "admin" +SCODOC_URL = "http://192.168.1.12:5000" +CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) + +# r0 = requests.post( +# SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) +# ) +# token = r0.json()["token"] +# HEADERS = {"Authorization": f"Bearer {token}"} + +DEPT = None +FORMSEMESTRE = None +ETU = None + + +@bp.route("/test_dept", methods=["GET"]) +def get_departement(): + """ + Retourne un département pour les tests + """ + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + if r.status_code == 200: + dept_id = r.json()[0] + # print(dept_id) + + dept = models.Departement.query.filter_by(id=dept_id).first() + dept = dept.to_dict() + + fields = ["id", "acronym", "description", "visible", "date_creation"] + + for field in dept: + if field not in fields: + return error_response(501, field + " field missing") + + global DEPT + DEPT = dept + + return error_response(200, "OK") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + +@bp.route("/test_formsemestre", methods=["GET"]) +def get_formsemestre(): + """ + Retourne un formsemestre pour les tests + """ + + global DEPT + dept_acronym = DEPT["acronym"] + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courant", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + if r.status_code == 200: + formsemestre = r.json()[0] + # print(r.json()[0]) + + fields = ["gestion_semestrielle", "titre", "scodoc7_id", "date_debut", "bul_bgcolor", "date_fin", + "resp_can_edit", "dept_id", "etat", "resp_can_change_ens", "id", "modalite", "ens_can_edit_eval", + "formation_id", "gestion_compensation", "elt_sem_apo", "semestre_id", "bul_hide_xml", "elt_annee_apo", + "block_moyennes", "formsemestre_id", "titre_num", "date_debut_iso", "date_fin_iso", "responsables"] + + for field in formsemestre: + if field not in fields: + return error_response(501, field + " field missing") + + global FORMSEMESTRE + FORMSEMESTRE = formsemestre + + return error_response(200, "OK") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + + +@bp.route("/test_etu", methods=["GET"]) +def get_etudiant(): + """ + Retourne un étudiant pour les tests + """ + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + if r.status_code == 200: + etu = r.json()[0] + + fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", + "prenom"] + + for field in etu: + if field not in fields: + return error_response(501, field + " field missing") + + global ETU + ETU = etu + print(etu) + + return error_response(200, "OK") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + + + +def test_routes_departements(): + """ + Test les routes de la partie Département + """ + # departements + r1 = requests.get( + SCODOC_URL + "/ScoDoc/api/departements", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # liste_etudiants + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # liste_semestres_courant + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # referenciel_competences + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # semestre_index + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_etudiants(): + """ + Test les routes de la partie Etudiants + """ + # etudiants + r1 = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiants_courant + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant_formsemestres + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant_bulletin_semestre + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant_groups + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_formation(): + """ + Test les routes de la partie Formation + """ + # formations + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formations_by_id + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formation_export_by_formation_id + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # formsemestre_apo + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # moduleimpls + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # moduleimpls_sem + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_formsemestres(): + """ + Test les routes de la partie Formsemestres + """ + # formsemestre + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etudiant_bulletin + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # bulletins + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # jury + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_partitions(): + """ + Test les routes de la partie Partitions + """ + # partition + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # etud_in_group + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # set_groups + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_evaluations(): + """ + Test les routes de la partie Evaluations + """ + # evaluations + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # evaluation_notes + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # evaluation_set_notes + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_jury(): + """ + Test les routes de la partie Jury + """ + # jury_preparation + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # jury_decisions + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # set_decision_jury + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # annule_decision_jury + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_absences(): + """ + Test les routes de la partie Absences + """ + # absences + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # absences_justify + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_signale + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_annule + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_annule_justif + r5 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # abs_groupe_etat + r6 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + +def test_routes_logos(): + """ + Test les routes de la partie Logos + """ + # liste_logos + r1 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # recup_logo_global + r2 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # logo_dept + r3 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + + # recup_logo_dept_global + r4 = requests.post( + SCODOC_URL + "/ScoDoc/api", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) \ No newline at end of file From b1e0def55a06e6539caa8584958de592f8d492a4 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Thu, 3 Mar 2022 16:25:29 +0100 Subject: [PATCH 12/49] =?UTF-8?q?ajout=20des=20permissions,=20factorisatio?= =?UTF-8?q?n=20de=20liste=5Fetudiants=20et=20tests=20de=20la=20partie=20d?= =?UTF-8?q?=C3=A9partements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/departements.py | 98 ++++++++++++++++++++++---------- app/api/test_api.py | 103 ++++++++++++++++++++++++++-------- app/scodoc/sco_permissions.py | 5 ++ 3 files changed, 154 insertions(+), 52 deletions(-) diff --git a/app/api/departements.py b/app/api/departements.py index 725ba809a3..6e4d2e5ded 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -30,8 +30,9 @@ def departements(): return jsonify(depts_ids) +@bp.route("/departements//etudiants/liste", methods=["GET"]) @bp.route("/departements//etudiants/liste/", methods=["GET"]) -@token_auth.login_required +# @token_auth.login_required def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR """ Retourne la liste des étudiants d'un département @@ -66,33 +67,71 @@ def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR """ # Si le formsemestre_id a été renseigné if formsemestre_id is not None: - # Récupération du/des depts - list_depts = models.Departement.query.filter( - models.Departement.acronym == dept, - models.FormSemestre.id == formsemestre_id, - ) - list_etuds = [] - for dept in list_depts: - # Récupération des étudiants d'un département - x = models.Identite.query.filter(models.Identite.dept_id == dept.id).all() - print(x) - for y in x: - # Ajout des étudiants dans la liste global - list_etuds.append(y) - else: # Si le formsemestre_id n'a pas été renseigné - list_depts = models.Departement.query.filter( - models.Departement.acronym == dept, - models.FormSemestre.semestre_id == models.Departement.formsemestres, - ) - list_etuds = [] - for dept in list_depts: - x = models.Identite.query.filter(models.Identite.dept_id == dept.id).all() - for y in x: - list_etuds.append(y) + # Récupération du formsemestre + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + # Récupération du département + departement = formsemestre.departement + # Récupération des étudiants + etudiants = departement.etudiants.all() - # Mise en forme des données - data = [d.to_dict_bul() for d in list_etuds] - return jsonify(data) + # Mise en forme des données + list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants] + + # Si le formsemestre_id n'a pas été renseigné + else: + # Récupération du formsemestre + departement = models.Departement.query.filter_by(acronym=dept).first() + # Récupération des étudiants + etudiants = departement.etudiants.all() + + # Mise en forme des données + list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants] + + return jsonify(list_etu) + + + # Si le formsemestre_id a été renseigné + # if formsemestre_id is not None: + # a = 0 + # Récupération du/des depts + # list_depts = models.Departement.query.filter( + # models.Departement.acronym == dept, + # models.FormSemestre.id == formsemestre_id, + # ) + # + # formsemestre = models.FormSemestre.query.get_or_404(formsemestre_id) + # list_depts = formsemestre.departement + # print(formsemestre) + # + # dept_id = list_depts + + + # list_etuds = [] + # for dept in list_depts: + # # Récupération des étudiants d'un département + # etudiants = models.Identite.query.filter_by(dept_id=dept.id).all() + # print(etudiants) + # for etu in etudiants: + # # Ajout des étudiants dans la liste global + # list_etuds.append(etu) + + # Si le formsemestre_id n'a pas été renseigné + # else: + + # # list_depts = models.Departement.query.filter( + # # models.Departement.acronym == dept, + # # models.FormSemestre.id == formsemestre_id, + # # ) + # + # list_etuds = [] + # for dept in list_depts: + # etudiants = models.Identite.query.filter_by(dept_id=dept.id).all() + # for etu in etudiants: + # list_etuds.append(etu) + # + # # Mise en forme des données + # data = [d.to_dict_bul() for d in list_etuds] + # return jsonify(data) # return error_response(501, message="Not implemented") @@ -155,8 +194,7 @@ def liste_semestres_courant(dept: str): return jsonify(data) -@bp.route( - "/departements//formations//referentiel_competences", methods=["GET"]) +@bp.route("/departements//formations//referentiel_competences", methods=["GET"]) def referenciel_competences(dept: str, formation_id: int): """ Retourne le référentiel de compétences @@ -182,7 +220,7 @@ def referenciel_competences(dept: str, formation_id: int): return jsonify(ref.to_dict()) -@bp.route("/departements//formsemestre/programme", methods=["GET"]) +@bp.route("/departements//formsemestre//programme", methods=["GET"]) def semestre_index(dept: str, formsemestre_id: int): """ Retourne la liste des Ues, ressources et SAE d'un semestre diff --git a/app/api/test_api.py b/app/api/test_api.py index 20f0dfbffe..db498cc696 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -27,8 +27,9 @@ ETU = None @bp.route("/test_dept", methods=["GET"]) def get_departement(): """ - Retourne un département pour les tests + Permet de tester departements() mais également de set un département dans DEPT pour la suite des tests """ + # departements r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", auth=(SCODOC_USER, SCODOC_PASSWORD) @@ -58,20 +59,23 @@ def get_departement(): @bp.route("/test_formsemestre", methods=["GET"]) def get_formsemestre(): """ - Retourne un formsemestre pour les tests + Permet de tester liste_semestres_courant() mais également de set un formsemestre dans FORMSEMESTRE + pour la suite des tests """ + get_departement() global DEPT dept_acronym = DEPT["acronym"] + # liste_semestres_courant r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courant", + SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courants", auth=(SCODOC_USER, SCODOC_PASSWORD) ) if r.status_code == 200: formsemestre = r.json()[0] - # print(r.json()[0]) + print(r.json()[0]) fields = ["gestion_semestrielle", "titre", "scodoc7_id", "date_debut", "bul_bgcolor", "date_fin", "resp_can_edit", "dept_id", "etat", "resp_can_change_ens", "id", "modalite", "ens_can_edit_eval", @@ -94,11 +98,12 @@ def get_formsemestre(): @bp.route("/test_etu", methods=["GET"]) def get_etudiant(): """ - Retourne un étudiant pour les tests + Permet de tester etudiants() mais également de set un etudiant dans ETU pour la suite des tests """ + # etudiants r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", + SCODOC_URL + "/ScoDoc/api/etudiants/courant", auth=(SCODOC_USER, SCODOC_PASSWORD) ) @@ -121,43 +126,97 @@ def get_etudiant(): return error_response(409, "La requête ne peut être traitée en l’état actuel") +############################################### Departements ########################################################## -def test_routes_departements(): +@bp.route("/test_liste_etudiants") +def test_departements_liste_etudiants(): """ - Test les routes de la partie Département + Test la route liste_etudiants """ - # departements + # Set un département et un formsemestre pour les tests + get_departement() + get_formsemestre() + + global DEPT + global FORMSEMESTRE + + # Set les fields à vérifier + fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", "prenom"] + + # liste_etudiants (sans formsemestre) r1 = requests.get( - SCODOC_URL + "/ScoDoc/api/departements", + SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/etudiants/liste", auth=(SCODOC_USER, SCODOC_PASSWORD) ) - # liste_etudiants - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + if r1.status_code == 200: # Si la requête est "OK" + # On récupère la liste des étudiants + etudiants = r1.json() - # liste_semestres_courant - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", + # Vérification que tous les étudiants ont bien tous les bons champs + for etu in etudiants: + for field in etu: + if field not in fields: + return error_response(501, field + " field missing") + + + # liste_etudiants (avec formsemestre) + r2 = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/etudiants/liste/" + + str(FORMSEMESTRE["formsemestre_id"]), auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + ) + + if r2.status_code == 200: # Si la requête est "OK" + # On récupère la liste des étudiants + etudiants = r2.json() + + # Vérification que tous les étudiants ont bien tous les bons champs + for etu in etudiants: + for field in etu: + if field not in fields: + return error_response(501, field + " field missing") + + return error_response(200, "OK") + + return error_response(409, "La requête ne peut être traitée en l’état actuel") + + +@bp.route("/test_referenciel_competences") +def test_departements_referenciel_competences(): + """ + Test la route referenciel_competences + """ + get_departement() + get_formsemestre() + + global DEPT + global FORMSEMESTRE # referenciel_competences - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", + r = requests.post( + SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/formations/" + + FORMSEMESTRE["formation_id"] + "/referentiel_competences", auth=(SCODOC_USER, SCODOC_PASSWORD) ) + +@bp.route("/test_liste_semestre_index") +def test_departements_semestre_index(): + """ + Test la route semestre_index + """ # semestre_index r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", + SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/formsemestre/" + + FORMSEMESTRE["formation_id"] + "/programme", auth=(SCODOC_USER, SCODOC_PASSWORD) ) +#################################################### Etudiants ######################################################## + def test_routes_etudiants(): """ Test les routes de la partie Etudiants diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py index c72b3ff50b..78cbc1c592 100644 --- a/app/scodoc/sco_permissions.py +++ b/app/scodoc/sco_permissions.py @@ -47,6 +47,11 @@ _SCO_PERMISSIONS = ( ), (1 << 25, "RelationsEntreprisesSend", "Envoyer des offres"), (1 << 26, "RelationsEntreprisesValidate", "Valide les entreprises"), + # Api scodoc9 + (1 << 27, "APIView", ""), + (1 << 28, "APIEtudChangeGroups", ""), + (1 << 29, "APIEditAllNotes", ""), + (1 << 30, "APIAbsChange", ""), ) From 47123aeb1e5b042747876af8ee45863cceecfa28 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 4 Mar 2022 17:16:08 +0100 Subject: [PATCH 13/49] permissions non fonctionnel --- app/api/absences.py | 8 ++++++++ app/api/departements.py | 11 +++++++++-- app/api/etudiants.py | 20 +++++++++++--------- app/api/evaluations.py | 5 +++++ app/api/formations.py | 11 +++++++++-- app/api/formsemestres.py | 6 ++++++ app/api/logos.py | 5 +++++ app/api/partitions.py | 5 +++++ app/api/test_api.py | 26 ++++++++++++++++++++------ app/scodoc/sco_permissions.py | 8 ++++---- 10 files changed, 82 insertions(+), 23 deletions(-) diff --git a/app/api/absences.py b/app/api/absences.py index 4f53c06457..38ec33fb7d 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -7,13 +7,16 @@ from app import models from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_abs import add_absence, add_justif, annule_absence, annule_justif, list_abs_date from app.scodoc.sco_groups import get_group_members +from app.scodoc.sco_permissions import Permission @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) +@permission_required(Permission.APIView) def absences(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences d'un étudiant donné @@ -50,6 +53,7 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/absences/etudid//abs_just_only", methods=["GET"]) @bp.route("/absences/nip//abs_just_only", methods=["GET"]) @bp.route("/absences/ine//abs_just_only", methods=["GET"]) +@permission_required(Permission.APIView) def absences_justify(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences justifiées d'un étudiant donné @@ -92,6 +96,7 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=&moduleimpl_id=", methods=["POST"]) @token_auth.login_required +@permission_required(Permission.APIAbsChange) def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, description: str = None, moduleimpl_id: int = None): """ @@ -214,6 +219,7 @@ def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, n @bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required +@permission_required(Permission.APIAbsChange) def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html @@ -251,6 +257,7 @@ def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, @bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required +@permission_required(Permission.APIAbsChange) def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html @@ -285,6 +292,7 @@ def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = @bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) +@permission_required(Permission.APIView) def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): """ Retoune la liste des absences d'un ou plusieurs groupes entre deux dates diff --git a/app/api/departements.py b/app/api/departements.py index 6e4d2e5ded..063b0b7e37 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -5,7 +5,9 @@ from app import models from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response +from app.decorators import permission_required from app.models import ApcReferentielCompetences +from app.scodoc.sco_permissions import Permission from app.scodoc.sco_prepajury import feuille_preparation_jury from app.scodoc.sco_pvjury import formsemestre_pvjury from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet @@ -14,7 +16,8 @@ from app.scodoc.sco_saisie_notes import notes_add @bp.route("/departements", methods=["GET"]) -#@token_auth.login_required # Commenté le temps des tests +@token_auth.login_required # Commenté le temps des tests +@permission_required(Permission.APIView) def departements(): """ Retourne la liste des ids de départements visibles @@ -33,7 +36,8 @@ def departements(): @bp.route("/departements//etudiants/liste", methods=["GET"]) @bp.route("/departements//etudiants/liste/", methods=["GET"]) # @token_auth.login_required -def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR +@permission_required(Permission.APIView) +def liste_etudiants(dept: str, formsemestre_id=None): """ Retourne la liste des étudiants d'un département @@ -137,6 +141,7 @@ def liste_etudiants(dept: str, formsemestre_id=None): # XXX TODO A REVOIR @bp.route("/departements//semestres_courants", methods=["GET"]) # @token_auth.login_required # Commenté le temps des tests +# @permission_required(Permission.APIView) def liste_semestres_courant(dept: str): """ Liste des semestres actifs d'un départements donné @@ -195,6 +200,7 @@ def liste_semestres_courant(dept: str): @bp.route("/departements//formations//referentiel_competences", methods=["GET"]) +@permission_required(Permission.APIView) def referenciel_competences(dept: str, formation_id: int): """ Retourne le référentiel de compétences @@ -221,6 +227,7 @@ def referenciel_competences(dept: str, formation_id: int): @bp.route("/departements//formsemestre//programme", methods=["GET"]) +@permission_required(Permission.APIView) def semestre_index(dept: str, formsemestre_id: int): """ Retourne la liste des Ues, ressources et SAE d'un semestre diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 5b0ac28a23..ae406e2794 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -4,11 +4,14 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_groups import get_etud_groups +from app.scodoc.sco_permissions import Permission @bp.route("/etudiants", methods=["GET"]) +@permission_required(Permission.APIView) def etudiants(): """ Retourne la liste de tous les étudiants @@ -49,6 +52,7 @@ def etudiants(): @bp.route("/etudiants/courant", methods=["GET"]) +@permission_required(Permission.APIView) def etudiants_courant(): """ Retourne la liste des étudiants courant @@ -94,6 +98,7 @@ def etudiants_courant(): @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) +@permission_required(Permission.APIView) def etudiant(etudid: int = None, nip: int = None, ine: int = None): """ Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. @@ -138,6 +143,7 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") +@permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des semestres qu'un étudiant a suivis @@ -225,6 +231,7 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) @bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) +@permission_required(Permission.APIView) def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): """ Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné @@ -252,15 +259,10 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N # return error_response(501, message="Not implemented") -@bp.route( - "/etudiant/etudid//semestre//groups", methods=["GET"] -) -@bp.route( - "/etudiant/nip//semestre//groups", methods=["GET"] -) -@bp.route( - "/etudiant/ine//semestre//groups", methods=["GET"] -) +@bp.route("/etudiant/etudid//semestre//groups", methods=["GET"]) +@bp.route("/etudiant/nip//semestre//groups", methods=["GET"]) +@bp.route("/etudiant/ine//semestre//groups", methods=["GET"]) +@permission_required(Permission.APIView) def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué diff --git a/app/api/evaluations.py b/app/api/evaluations.py index 2ca92d5853..db1b7e8442 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -5,10 +5,13 @@ from app import models from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes +from app.scodoc.sco_permissions import Permission @bp.route("/evaluations/", methods=["GET"]) +@permission_required(Permission.APIView) def evaluations(moduleimpl_id: int): """ Retourne la liste des évaluations à partir de l'id d'un moduleimpl @@ -26,6 +29,7 @@ def evaluations(moduleimpl_id: int): @bp.route("/evaluations/eval_notes/", methods=["GET"]) +@permission_required(Permission.APIView) def evaluation_notes(evaluation_id: int): """ Retourne la liste des notes à partir de l'id d'une évaluation donnée @@ -47,6 +51,7 @@ def evaluation_notes(evaluation_id: int): @bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) @bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) @token_auth.login_required +@permission_required(Permission.APIEditAllNotes) def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): """ Set les notes d'une évaluation pour un étudiant donnée diff --git a/app/api/formations.py b/app/api/formations.py index 327d0c145a..84c84b9ce9 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -4,11 +4,14 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_formations import formation_export from app.scodoc.sco_moduleimpl import moduleimpl_list +from app.scodoc.sco_permissions import Permission @bp.route("/formations", methods=["GET"]) +@permission_required(Permission.APIView) def formations(): """ Retourne la liste des formations @@ -23,6 +26,7 @@ def formations(): @bp.route("/formations/", methods=["GET"]) +@permission_required(Permission.APIView) def formations_by_id(formation_id: int): """ Retourne une formation en fonction d'un id donné @@ -39,6 +43,7 @@ def formations_by_id(formation_id: int): @bp.route("/formations/formation_export/", methods=["GET"]) +@permission_required(Permission.APIView) def formation_export_by_formation_id(formation_id: int, export_ids=False): """ Retourne la formation, avec UE, matières, modules @@ -55,6 +60,7 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False): @bp.route("/formations/apo/", methods=["GET"]) +@permission_required(Permission.APIView) def formsemestre_apo(etape_apo: int): """ Retourne les informations sur les formsemestres @@ -75,6 +81,7 @@ def formsemestre_apo(etape_apo: int): @bp.route("/formations/moduleimpl/", methods=["GET"]) +@permission_required(Permission.APIView) def moduleimpls(moduleimpl_id: int): """ Retourne la liste des moduleimpl @@ -90,8 +97,8 @@ def moduleimpls(moduleimpl_id: int): return jsonify(data) -@bp.route( - "/formations/moduleimpl//formsemestre/", methods=["GET"]) +@bp.route("/formations/moduleimpl//formsemestre/", methods=["GET"]) +@permission_required(Permission.APIView) def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ Retourne la liste des moduleimpl d'un semestre diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 5b87de664c..2466562e9d 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -4,12 +4,15 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict +from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet @bp.route("/formations/formsemestre/", methods=["GET"]) +@permission_required(Permission.APIView) def formsemestre(formsemestre_id: int): """ Retourne l'information sur le formsemestre correspondant au formsemestre_id @@ -38,6 +41,7 @@ def formsemestre(formsemestre_id: int): "/formsemestre//departements//etudiant/ine//bulletin", methods=["GET"], ) +@permission_required(Permission.APIView) def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): """ Retourne le bulletin de note d'un étudiant @@ -63,6 +67,7 @@ def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size) @bp.route("/formsemestre//bulletins", methods=["GET"]) +@permission_required(Permission.APIView) def bulletins(formsemestre_id: int): """ Retourne les bulletins d'un formsemestre donné @@ -81,6 +86,7 @@ def bulletins(formsemestre_id: int): @bp.route("/formsemestre//jury", methods=["GET"]) +@permission_required(Permission.APIView) def jury(formsemestre_id: int): """ Retourne le récapitulatif des décisions jury diff --git a/app/api/logos.py b/app/api/logos.py index e32f6595c3..be689d7294 100644 --- a/app/api/logos.py +++ b/app/api/logos.py @@ -36,6 +36,7 @@ from app.api import bp from app.api import requested_format from app.api.auth import token_auth from app.api.errors import error_response +from app.decorators import permission_required from app.models import Departement from app.scodoc.sco_logos import list_logos, find_logo from app.scodoc.sco_permissions import Permission @@ -43,6 +44,7 @@ from app.scodoc.sco_permissions import Permission @bp.route("/logos", methods=["GET"]) @token_auth.login_required +@permission_required(Permission.APIView) def api_get_glob_logos(): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): return error_response(401, message="accès interdit") @@ -55,6 +57,7 @@ def api_get_glob_logos(): @bp.route("/logos/", methods=["GET"]) @token_auth.login_required +@permission_required(Permission.APIView) def api_get_glob_logo(logoname): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): return error_response(401, message="accès interdit") @@ -71,6 +74,7 @@ def api_get_glob_logo(logoname): @bp.route("/departements//logos", methods=["GET"]) @token_auth.login_required +@permission_required(Permission.APIView) def api_get_local_logos(departement): dept_id = Departement.from_acronym(departement).id if not g.current_user.has_permission(Permission.ScoChangePreferences, departement): @@ -81,6 +85,7 @@ def api_get_local_logos(departement): @bp.route("/departements//logos/", methods=["GET"]) @token_auth.login_required +@permission_required(Permission.APIView) def api_get_local_logo(departement, logoname): # format = requested_format("jpg", ['png', 'jpg']) XXX ? dept_id = Departement.from_acronym(departement).id diff --git a/app/api/partitions.py b/app/api/partitions.py index 1a61beff97..3847bac404 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -5,10 +5,13 @@ from app import models from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response +from app.decorators import permission_required from app.scodoc.sco_groups import get_group_members, setGroups +from app.scodoc.sco_permissions import Permission @bp.route("/partitions/", methods=["GET"]) +@permission_required(Permission.APIView) def partition(formsemestre_id: int): """ Retourne la liste de toutes les partitions d'un formsemestre @@ -31,6 +34,7 @@ def partition(formsemestre_id: int): # ) @bp.route("/partitions/groups/", methods=["GET"]) @bp.route("/partitions/groups//etat/", methods=["GET"]) +@permission_required(Permission.APIView) def etud_in_group(group_id: int, etat=None): """ Retourne la liste des étudiants dans un groupe @@ -61,6 +65,7 @@ def etud_in_group(group_id: int, etat=None): "groups_to_create=&groups_to_delete=", methods=["POST"], ) @token_auth.login_required +@permission_required(Permission.APIEtudChangeGroups) def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): """ Set les groups diff --git a/app/api/test_api.py b/app/api/test_api.py index db498cc696..4f3ff1bd5f 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -13,11 +13,19 @@ SCODOC_PASSWORD = "admin" SCODOC_URL = "http://192.168.1.12:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) -# r0 = requests.post( -# SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) -# ) -# token = r0.json()["token"] -# HEADERS = {"Authorization": f"Bearer {token}"} +HEADERS = None + +def get_token(): + """ + Permet de set le token dans le header + """ + global HEADERS + r0 = requests.post( + SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + token = r0.json()["token"] + HEADERS = {"Authorization": f"Bearer {token}"} + DEPT = None FORMSEMESTRE = None @@ -29,10 +37,16 @@ def get_departement(): """ Permet de tester departements() mais également de set un département dans DEPT pour la suite des tests """ + + get_token() + + global HEADERS + + print(HEADERS) # departements r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", - auth=(SCODOC_USER, SCODOC_PASSWORD) + headers=HEADERS, verify=CHECK_CERTIFICATE ) if r.status_code == 200: diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py index 78cbc1c592..4915f2904d 100644 --- a/app/scodoc/sco_permissions.py +++ b/app/scodoc/sco_permissions.py @@ -48,10 +48,10 @@ _SCO_PERMISSIONS = ( (1 << 25, "RelationsEntreprisesSend", "Envoyer des offres"), (1 << 26, "RelationsEntreprisesValidate", "Valide les entreprises"), # Api scodoc9 - (1 << 27, "APIView", ""), - (1 << 28, "APIEtudChangeGroups", ""), - (1 << 29, "APIEditAllNotes", ""), - (1 << 30, "APIAbsChange", ""), + (1 << 27, "APIView", "Voir"), + (1 << 28, "APIEtudChangeGroups", "Modifier les groupes"), + (1 << 29, "APIEditAllNotes", "Modifier toutes les notes"), + (1 << 30, "APIAbsChange", "Saisir des absences"), ) From f9817966cfa51453cae8bc2d45eca6e75a4d0755 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Wed, 9 Mar 2022 16:52:07 +0100 Subject: [PATCH 14/49] =?UTF-8?q?cr=C3=A9ation=20des=20fichiers=20tests=20?= =?UTF-8?q?et=20des=20requ=C3=AAtes=20aux=20routes=20de=20l'api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/test_api.py | 20 +++- tests/api/setup_test_api.py | 38 ++++++++ tests/api/test_api_absences.py | 140 ++++++++++++++++++++++++++++ tests/api/test_api_departements.py | 89 ++++++++++++++++++ tests/api/test_api_etudiants.py | 116 +++++++++++++++++++++++ tests/api/test_api_evaluations.py | 58 ++++++++++++ tests/api/test_api_formations.py | 67 +++++++++++++ tests/api/test_api_formsemestre_.py | 66 +++++++++++++ tests/api/test_api_jury.py | 81 ++++++++++++++++ tests/api/test_api_partitions.py | 52 +++++++++++ 10 files changed, 722 insertions(+), 5 deletions(-) create mode 100644 tests/api/setup_test_api.py create mode 100644 tests/api/test_api_absences.py create mode 100644 tests/api/test_api_departements.py create mode 100644 tests/api/test_api_etudiants.py create mode 100644 tests/api/test_api_evaluations.py create mode 100644 tests/api/test_api_formations.py create mode 100644 tests/api/test_api_formsemestre_.py create mode 100644 tests/api/test_api_jury.py create mode 100644 tests/api/test_api_partitions.py diff --git a/app/api/test_api.py b/app/api/test_api.py index 4f3ff1bd5f..31df2c6830 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -8,8 +8,8 @@ from app.api import bp, requested_format from app.api.auth import token_auth from app.api.errors import error_response -SCODOC_USER = "admin" -SCODOC_PASSWORD = "admin" +SCODOC_USER = "" +SCODOC_PASSWORD = "" SCODOC_URL = "http://192.168.1.12:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) @@ -20,6 +20,9 @@ def get_token(): Permet de set le token dans le header """ global HEADERS + global SCODOC_USER + global SCODOC_PASSWORD + r0 = requests.post( SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) ) @@ -40,15 +43,22 @@ def get_departement(): get_token() - global HEADERS + print("ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé") - print(HEADERS) + global HEADERS + global CHECK_CERTIFICATE + global SCODOC_USER + global SCODOC_PASSWORD + + # print(HEADERS) # departements r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, verify=CHECK_CERTIFICATE, ) + print("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii") + if r.status_code == 200: dept_id = r.json()[0] # print(dept_id) diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py new file mode 100644 index 0000000000..94fd538a9d --- /dev/null +++ b/tests/api/setup_test_api.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). +""" +import os +import requests + +SCODOC_USER = "" +SCODOC_PASSWORD = "" +SCODOC_URL = "" +CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) + +HEADERS = None + +def get_token(): + """ + Permet de set le token dans le header + """ + global HEADERS + global SCODOC_USER + global SCODOC_PASSWORD + + r0 = requests.post( + SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) + ) + token = r0.json()["token"] + HEADERS = {"Authorization": f"Bearer {token}"} \ No newline at end of file diff --git a/tests/api/test_api_absences.py b/tests/api/test_api_absences.py new file mode 100644 index 0000000000..4d3fb36bf2 --- /dev/null +++ b/tests/api/test_api_absences.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_absences.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + + +############################################# Absences ################################ + +# absences +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/etudid/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/nip/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/ine/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# absences_justify +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/etudid//abs_just_only", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/nip//abs_just_only", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/ine//abs_just_only", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# abs_signale +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?etudid=&date=&matin=&justif=" + "&description=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?nip=&date=&matin=&justif=" + "&description=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# abs_annule +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?etudid=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?nip=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?ine=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# abs_annule_justif +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?etudid=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?nip=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?ine=&jour=&matin=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# abs_groupe_etat +r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py new file mode 100644 index 0000000000..02f4f4b229 --- /dev/null +++ b/tests/api/test_api_departements.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_departements.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + + + +######################### Départements ###################### + +# departements +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements", + auth=(SCODOC_USER, SCODOC_PASSWORD) +) +assert r.status_code == 200 + + +# liste_etudiants +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# liste_semestres_courant +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# referenciel_competences +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements//formations//referentiel_competences", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# semestre_index +r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements//formsemestre//programme", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + + + + + + + + + + + + + + + + + diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py new file mode 100644 index 0000000000..610266c9bb --- /dev/null +++ b/tests/api/test_api_etudiants.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_etudiants.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + +################################## Etudiants #################################### + +# etudiants +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# etudiants_courant +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants/courant", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# etudiant +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# etudiant_formsemestres +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid//formsemestres", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestres", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestres", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# etudiant_bulletin_semestre +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid//formsemestre//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# etudiant_groups +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid//semestre//groups", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine//semestre//groups", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_evaluations.py b/tests/api/test_api_evaluations.py new file mode 100644 index 0000000000..b6d0871e72 --- /dev/null +++ b/tests/api/test_api_evaluations.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_evaluations.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + + +##################################### Evaluations ################################ + +# evaluations +r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# evaluation_notes +r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_notes/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# evaluation_set_notes +r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&etudid=¬e=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&nip=¬e=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&ine=¬e=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 diff --git a/tests/api/test_api_formations.py b/tests/api/test_api_formations.py new file mode 100644 index 0000000000..3c6d455aac --- /dev/null +++ b/tests/api/test_api_formations.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_formations.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + +##################################### Formations ############################ + +# formations +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# formations_by_id +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# formation_export_by_formation_id +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/formation_export/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# formsemestre_apo +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/apo/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# moduleimpls +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/moduleimpl/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# moduleimpls_sem +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/moduleimpl//formsemestre/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre_.py new file mode 100644 index 0000000000..73df0ab243 --- /dev/null +++ b/tests/api/test_api_formsemestre_.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_formsemestre.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + + +############################## Formsemestre ############################### + +# formsemestre +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# etudiant_bulletin +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# bulletins +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# jury +r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//jury", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_jury.py b/tests/api/test_api_jury.py new file mode 100644 index 0000000000..8d006c21b8 --- /dev/null +++ b/tests/api/test_api_jury.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_jury.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + +################################## Jury ###################################### + +# jury_preparation +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/formsemestre//preparation_jury", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# jury_decisions +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/formsemestre//decisions_jury", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# set_decision_jury +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# annule_decision_jury +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/etudid//formsemestre//annule_decision", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/nip//formsemestre//annule_decision", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/ine//formsemestre//annule_decision", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_partitions.py b/tests/api/test_api_partitions.py new file mode 100644 index 0000000000..025fe962cd --- /dev/null +++ b/tests/api/test_api_partitions.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +"""Test Logos + +Utilisation : + créer les variables d'environnement: (indiquer les valeurs + pour le serveur ScoDoc que vous voulez interroger) + + export SCODOC_URL="https://scodoc.xxx.net/" + export SCODOC_USER="xxx" + export SCODOC_PASSWD="xxx" + export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide + + (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api). + + Lancer : + pytest tests/api/test_api_partitions.py +""" +import os +import requests +from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token + + +############################# Partitions #################################### + +# partition +r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + +# etud_in_group +r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/groups/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 +r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/groups//etat/", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 + + +# set_groups +r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/set_groups?partition_id=&groups_lists=&" + "groups_to_create=&groups_to_delete=", + auth=(SCODOC_USER, SCODOC_PASSWORD) + ) +assert r.status_code == 200 \ No newline at end of file From 433b4b8f5c7839f7fb4ddd9bc5c504224a5dd63d Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Thu, 10 Mar 2022 17:43:12 +0100 Subject: [PATCH 15/49] =?UTF-8?q?d=C3=A9but=20de=20validation=20des=20rout?= =?UTF-8?q?es=20des=20parties=20d=C3=A9partements=20et=20etudiants=20par?= =?UTF-8?q?=20les=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/departements.py | 38 ++-- app/api/etudiants.py | 18 +- app/api/test_api.py | 4 +- app/scodoc/sco_roles_default.py | 1 + tests/api/setup_test_api.py | 10 +- tests/api/test_api_absences.py | 191 +++++++++--------- tests/api/test_api_departements.py | 75 +++---- tests/api/test_api_etudiants.py | 158 ++++++++------- tests/api/test_api_evaluations.py | 60 +++--- tests/api/test_api_formations.py | 73 +++---- tests/api/test_api_formsemestre_.py | 71 +++---- tests/api/test_api_jury.py | 96 ++++----- tests/api/test_api_partitions.py | 51 ++--- .../fakedatabase/create_test_api_database.py | 1 + 14 files changed, 434 insertions(+), 413 deletions(-) diff --git a/app/api/departements.py b/app/api/departements.py index 063b0b7e37..a7cbc49660 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -16,8 +16,8 @@ from app.scodoc.sco_saisie_notes import notes_add @bp.route("/departements", methods=["GET"]) -@token_auth.login_required # Commenté le temps des tests -@permission_required(Permission.APIView) +# @token_auth.login_required # Commenté le temps des tests +# @permission_required(Permission.APIView) def departements(): """ Retourne la liste des ids de départements visibles @@ -36,7 +36,7 @@ def departements(): @bp.route("/departements//etudiants/liste", methods=["GET"]) @bp.route("/departements//etudiants/liste/", methods=["GET"]) # @token_auth.login_required -@permission_required(Permission.APIView) +# @permission_required(Permission.APIView) def liste_etudiants(dept: str, formsemestre_id=None): """ Retourne la liste des étudiants d'un département @@ -200,7 +200,7 @@ def liste_semestres_courant(dept: str): @bp.route("/departements//formations//referentiel_competences", methods=["GET"]) -@permission_required(Permission.APIView) +# @permission_required(Permission.APIView) def referenciel_competences(dept: str, formation_id: int): """ Retourne le référentiel de compétences @@ -208,26 +208,26 @@ def referenciel_competences(dept: str, formation_id: int): dept : l'acronym d'un département formation_id : l'id d'une formation """ - # depts = models.Departement.query.filter_by(acronym=dept).all() - # - # id_dept = depts[0].id - # - # formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() - # - # ref_comp = formations[0].referentiel_competence_id - # - # if ref_comp is None: - # return error_response(204, message="Pas de référenciel de compétences pour cette formation") - # else: - # return jsonify(ref_comp) + depts = models.Departement.query.filter_by(acronym=dept).all() - ref = ApcReferentielCompetences.query.get_or_404(formation_id) + id_dept = depts[0].id - return jsonify(ref.to_dict()) + formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() + + ref_comp = formations[0].referentiel_competence_id + + if ref_comp is None: + return error_response(204, message="Pas de référenciel de compétences pour cette formation") + else: + return jsonify(ref_comp) + + # ref = ApcReferentielCompetences.query.get_or_404(formation_id) + # + # return jsonify(ref.to_dict()) @bp.route("/departements//formsemestre//programme", methods=["GET"]) -@permission_required(Permission.APIView) +# @permission_required(Permission.APIView) def semestre_index(dept: str, formsemestre_id: int): """ Retourne la liste des Ues, ressources et SAE d'un semestre diff --git a/app/api/etudiants.py b/app/api/etudiants.py index ae406e2794..a39f00bf96 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -11,7 +11,7 @@ from app.scodoc.sco_permissions import Permission @bp.route("/etudiants", methods=["GET"]) -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiants(): """ Retourne la liste de tous les étudiants @@ -52,7 +52,7 @@ def etudiants(): @bp.route("/etudiants/courant", methods=["GET"]) -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiants_courant(): """ Retourne la liste des étudiants courant @@ -98,7 +98,7 @@ def etudiants_courant(): @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiant(etudid: int = None, nip: int = None, ine: int = None): """ Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. @@ -143,7 +143,7 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des semestres qu'un étudiant a suivis @@ -211,13 +211,13 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) sems.append(sem) # Mise en forme des données - data_inscriptions = [d.to_dict() for d in sems] + # data_inscriptions = [d.to_dict() for d in sems] formsemestres = [] # Filtre les formsemestre contenant les inscriptions de l'étudiant - for sem in data_inscriptions: - res = models.FormSemestre.query.filter_by(id=sem['formsemestre_id']).first() + for sem in sems:#data_inscriptions: + res = models.FormSemestre.query.filter_by(id=sem.formsemestre_id).first() formsemestres.append(res) data = [] @@ -231,7 +231,7 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) @bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): """ Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné @@ -262,7 +262,7 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N @bp.route("/etudiant/etudid//semestre//groups", methods=["GET"]) @bp.route("/etudiant/nip//semestre//groups", methods=["GET"]) @bp.route("/etudiant/ine//semestre//groups", methods=["GET"]) -@permission_required(Permission.APIView) +#@permission_required(Permission.APIView) def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué diff --git a/app/api/test_api.py b/app/api/test_api.py index 31df2c6830..c176342de2 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -8,8 +8,8 @@ from app.api import bp, requested_format from app.api.auth import token_auth from app.api.errors import error_response -SCODOC_USER = "" -SCODOC_PASSWORD = "" +SCODOC_USER = "test" +SCODOC_PASSWORD = "test" SCODOC_URL = "http://192.168.1.12:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) diff --git a/app/scodoc/sco_roles_default.py b/app/scodoc/sco_roles_default.py index 9529b031c1..2be20c8eac 100644 --- a/app/scodoc/sco_roles_default.py +++ b/app/scodoc/sco_roles_default.py @@ -53,6 +53,7 @@ SCO_ROLES_DEFAULTS = { p.ScoUsersAdmin, p.ScoUsersView, p.ScoView, + p.APIView, ), # RespPE est le responsable poursuites d'études # il peut ajouter des tags sur les formations: diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py index 94fd538a9d..5338f6ff5c 100644 --- a/tests/api/setup_test_api.py +++ b/tests/api/setup_test_api.py @@ -16,9 +16,9 @@ Utilisation : import os import requests -SCODOC_USER = "" -SCODOC_PASSWORD = "" -SCODOC_URL = "" +SCODOC_USER = "test" +SCODOC_PASSWORD = "test" +SCODOC_URL = "http://192.168.1.12:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) HEADERS = None @@ -35,4 +35,6 @@ def get_token(): SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) ) token = r0.json()["token"] - HEADERS = {"Authorization": f"Bearer {token}"} \ No newline at end of file + HEADERS = {"Authorization": f"Bearer {token}"} + +get_token() \ No newline at end of file diff --git a/tests/api/test_api_absences.py b/tests/api/test_api_absences.py index 4d3fb36bf2..3f8a8f0a4b 100644 --- a/tests/api/test_api_absences.py +++ b/tests/api/test_api_absences.py @@ -16,125 +16,128 @@ Utilisation : Lancer : pytest tests/api/test_api_absences.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE - -############################################# Absences ################################ - # absences -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/etudid/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_absences(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/etudid/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/nip/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/nip/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/ine/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/ine/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # absences_justify -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/etudid//abs_just_only", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_absences_justify(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/etudid//abs_just_only", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/nip//abs_just_only", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/nip//abs_just_only", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/ine//abs_just_only", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/ine//abs_just_only", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # abs_signale -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?etudid=&date=&matin=&justif=" - "&description=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_abs_signale(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?etudid=&date=&matin=&justif=" + "&description=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?nip=&date=&matin=&justif=" - "&description=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?nip=&date=&matin=&justif=" + "&description=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=&moduleimpl_id=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # abs_annule -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?etudid=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_abs_annule(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?etudid=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?nip=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?nip=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?ine=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule?ine=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # abs_annule_justif -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?etudid=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_abs_annule_justif(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?etudid=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?nip=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?nip=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?ine=&jour=&matin=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?ine=&jour=&matin=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # abs_groupe_etat -r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_abs_groupe_etat(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index 02f4f4b229..ca904f0e0c 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -16,59 +16,60 @@ Utilisation : Lancer : pytest tests/api/test_api_departements.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE - - -######################### Départements ###################### - # departements -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements", - auth=(SCODOC_USER, SCODOC_PASSWORD) -) -assert r.status_code == 200 +def test_departements(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # liste_etudiants -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiants(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # liste_semestres_courant -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements//etudiants/liste/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_semestres_courant(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # referenciel_competences -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements//formations//referentiel_competences", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_referenciel_competences(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/formations/1/referentiel_competences", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 or 204 -# semestre_index -r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements//formsemestre//programme", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +# # semestre_index +# def test_semestre_index(): +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", +# headers=HEADERS, verify=CHECK_CERTIFICATE +# ) +# assert r.status_code == 200 diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index 610266c9bb..a5e114e644 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -16,101 +16,105 @@ Utilisation : Lancer : pytest tests/api/test_api_etudiants.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE -################################## Etudiants #################################### - # etudiants -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiants(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # etudiants_courant -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants/courant", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiants_courant(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants/courant", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # etudiant -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiant(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/nip/", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/ine/", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 # etudiant_formsemestres -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid//formsemestres", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiant_formsemestres(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestres", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 - -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestres", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestres", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 + # + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestres", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 # etudiant_bulletin_semestre -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid//formsemestre//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiant_bulletin_semestre(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 - -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 + # + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 # etudiant_groups -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid//semestre//groups", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiant_groups(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/semestre/1/groups", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 - -r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine//semestre//groups", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 \ No newline at end of file + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 + # + # r = requests.get( + # SCODOC_URL + "/ScoDoc/api/etudiant/ine//semestre//groups", + # headers=HEADERS, verify=CHECK_CERTIFICATE + # ) + # assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_evaluations.py b/tests/api/test_api_evaluations.py index b6d0871e72..50b8ad52d0 100644 --- a/tests/api/test_api_evaluations.py +++ b/tests/api/test_api_evaluations.py @@ -16,43 +16,43 @@ Utilisation : Lancer : pytest tests/api/test_api_evaluations.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE - -##################################### Evaluations ################################ - # evaluations -r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_evaluations(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # evaluation_notes -r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_notes/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_evaluation_notes(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_notes/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # evaluation_set_notes -r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&etudid=¬e=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_evaluation_set_notes(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&etudid=¬e=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&nip=¬e=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&nip=¬e=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&ine=¬e=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&ine=¬e=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_formations.py b/tests/api/test_api_formations.py index 3c6d455aac..2afe7602f6 100644 --- a/tests/api/test_api_formations.py +++ b/tests/api/test_api_formations.py @@ -16,52 +16,57 @@ Utilisation : Lancer : pytest tests/api/test_api_formations.py """ -import os -import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token -##################################### Formations ############################ +import requests +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE + # formations -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_formations(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # formations_by_id -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_formations_by_id(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # formation_export_by_formation_id -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/formation_export/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_formation_export_by_formation_id(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/formation_export/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # formsemestre_apo -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/apo/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_formsemestre_apo(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/apo/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # moduleimpls -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/moduleimpl/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_moduleimpls(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/moduleimpl/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # moduleimpls_sem -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/moduleimpl//formsemestre/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 \ No newline at end of file +def test_moduleimpls_sem(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/moduleimpl//formsemestre/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre_.py index 73df0ab243..5cd40c2ae7 100644 --- a/tests/api/test_api_formsemestre_.py +++ b/tests/api/test_api_formsemestre_.py @@ -16,51 +16,52 @@ Utilisation : Lancer : pytest tests/api/test_api_formsemestre.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE - -############################## Formsemestre ############################### - # formsemestre -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_formsemestre(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # etudiant_bulletin -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etudiant_bulletin(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # bulletins -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_bulletins(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # jury -r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//jury", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 \ No newline at end of file +def test_jury(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/formsemestre//jury", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_jury.py b/tests/api/test_api_jury.py index 8d006c21b8..f128d27d21 100644 --- a/tests/api/test_api_jury.py +++ b/tests/api/test_api_jury.py @@ -16,66 +16,68 @@ Utilisation : Lancer : pytest tests/api/test_api_jury.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE -################################## Jury ###################################### - # jury_preparation -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/formsemestre//preparation_jury", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_jury_preparation(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/formsemestre//preparation_jury", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # jury_decisions -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/formsemestre//decisions_jury", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_jury_decisions(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/formsemestre//decisions_jury", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # set_decision_jury -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/etudid?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_set_decision_jury(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/nip?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/ine?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # annule_decision_jury -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/etudid//formsemestre//annule_decision", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_annule_decision_jury(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/etudid//formsemestre//annule_decision", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/nip//formsemestre//annule_decision", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/nip//formsemestre//annule_decision", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/ine//formsemestre//annule_decision", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 \ No newline at end of file + r = requests.get( + SCODOC_URL + "/ScoDoc/api/jury/ine//formsemestre//annule_decision", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 \ No newline at end of file diff --git a/tests/api/test_api_partitions.py b/tests/api/test_api_partitions.py index 025fe962cd..a3c33518b3 100644 --- a/tests/api/test_api_partitions.py +++ b/tests/api/test_api_partitions.py @@ -16,37 +16,38 @@ Utilisation : Lancer : pytest tests/api/test_api_partitions.py """ -import os + import requests -from tests.api.setup_test_api import SCODOC_URL, SCODOC_USER, SCODOC_PASSWORD, get_token +from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE -############################# Partitions #################################### - # partition -r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_partition(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # etud_in_group -r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/groups/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 -r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/groups//etat/", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 +def test_etud_in_group(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/groups/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/groups//etat/", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 # set_groups -r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/set_groups?partition_id=&groups_lists=&" - "groups_to_create=&groups_to_delete=", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) -assert r.status_code == 200 \ No newline at end of file +def test_set_groups(): + r = requests.get( + SCODOC_URL + "/ScoDoc/api/partitions/set_groups?partition_id=&groups_lists=&" + "groups_to_create=&groups_to_delete=", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 \ No newline at end of file diff --git a/tools/fakedatabase/create_test_api_database.py b/tools/fakedatabase/create_test_api_database.py index cd5a7e7e35..8e19065a8f 100644 --- a/tools/fakedatabase/create_test_api_database.py +++ b/tools/fakedatabase/create_test_api_database.py @@ -13,6 +13,7 @@ flask db upgrade flask sco-db-init --erase flask init-test-database + flask user-role -a Admin -d TAPI test 3) relancer ScoDoc: flask run --host 0.0.0.0 From a43f1e0e229b394d79d8d37731bc557a4944b8c4 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 11 Mar 2022 16:18:50 +0100 Subject: [PATCH 16/49] =?UTF-8?q?am=C3=A9lioration=20des=20asserts=20de=20?= =?UTF-8?q?departement=20et=20etudiant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/departements.py | 51 ++-------------------- app/api/test_api.py | 4 -- tests/api/test_api_departements.py | 8 +++- tests/api/test_api_etudiants.py | 70 ++++++++++++++++++++---------- 4 files changed, 57 insertions(+), 76 deletions(-) diff --git a/app/api/departements.py b/app/api/departements.py index a7cbc49660..43137cd9fb 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -16,8 +16,8 @@ from app.scodoc.sco_saisie_notes import notes_add @bp.route("/departements", methods=["GET"]) -# @token_auth.login_required # Commenté le temps des tests -# @permission_required(Permission.APIView) +@token_auth.login_required # Commenté le temps des tests +# @permission_required(Permission.ScoView) def departements(): """ Retourne la liste des ids de départements visibles @@ -35,7 +35,7 @@ def departements(): @bp.route("/departements//etudiants/liste", methods=["GET"]) @bp.route("/departements//etudiants/liste/", methods=["GET"]) -# @token_auth.login_required +@token_auth.login_required # @permission_required(Permission.APIView) def liste_etudiants(dept: str, formsemestre_id=None): """ @@ -94,51 +94,6 @@ def liste_etudiants(dept: str, formsemestre_id=None): return jsonify(list_etu) - # Si le formsemestre_id a été renseigné - # if formsemestre_id is not None: - # a = 0 - # Récupération du/des depts - # list_depts = models.Departement.query.filter( - # models.Departement.acronym == dept, - # models.FormSemestre.id == formsemestre_id, - # ) - # - # formsemestre = models.FormSemestre.query.get_or_404(formsemestre_id) - # list_depts = formsemestre.departement - # print(formsemestre) - # - # dept_id = list_depts - - - # list_etuds = [] - # for dept in list_depts: - # # Récupération des étudiants d'un département - # etudiants = models.Identite.query.filter_by(dept_id=dept.id).all() - # print(etudiants) - # for etu in etudiants: - # # Ajout des étudiants dans la liste global - # list_etuds.append(etu) - - # Si le formsemestre_id n'a pas été renseigné - # else: - - # # list_depts = models.Departement.query.filter( - # # models.Departement.acronym == dept, - # # models.FormSemestre.id == formsemestre_id, - # # ) - # - # list_etuds = [] - # for dept in list_depts: - # etudiants = models.Identite.query.filter_by(dept_id=dept.id).all() - # for etu in etudiants: - # list_etuds.append(etu) - # - # # Mise en forme des données - # data = [d.to_dict_bul() for d in list_etuds] - # return jsonify(data) - # return error_response(501, message="Not implemented") - - @bp.route("/departements//semestres_courants", methods=["GET"]) # @token_auth.login_required # Commenté le temps des tests # @permission_required(Permission.APIView) diff --git a/app/api/test_api.py b/app/api/test_api.py index c176342de2..e269412fe1 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -43,8 +43,6 @@ def get_departement(): get_token() - print("ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé") - global HEADERS global CHECK_CERTIFICATE global SCODOC_USER @@ -57,8 +55,6 @@ def get_departement(): headers=HEADERS, verify=CHECK_CERTIFICATE, ) - print("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii") - if r.status_code == 200: dept_id = r.json()[0] # print(dept_id) diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index ca904f0e0c..b35e6959e2 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -28,30 +28,34 @@ def test_departements(): headers=HEADERS, verify=CHECK_CERTIFICATE ) assert r.status_code == 200 + assert len(r.json()) == 1 # liste_etudiants -def test_etudiants(): +def test_liste_etudiants(): r = requests.get( SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste", headers=HEADERS, verify=CHECK_CERTIFICATE ) assert r.status_code == 200 + assert len(r.json()) == 16 r = requests.get( SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", headers=HEADERS, verify=CHECK_CERTIFICATE ) assert r.status_code == 200 + assert len(r.json()) == 16 # liste_semestres_courant def test_semestres_courant(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", + SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", headers=HEADERS, verify=CHECK_CERTIFICATE ) assert r.status_code == 200 + assert len(r.json()) == 1 # referenciel_competences diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index a5e114e644..f58c6e62e4 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -16,6 +16,7 @@ Utilisation : Lancer : pytest tests/api/test_api_etudiants.py """ +from random import randint import requests from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE @@ -24,26 +25,46 @@ from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE # etudiants def test_etudiants(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiants", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) assert r.status_code == 200 + assert len(r.json()) == 16 + + # Choisis aléatoirement un étudiant dans la liste des étudiants + etu = r.json()[randint(0, len(r.json()))-1] + + fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", + "prenom", "nomprenom"] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in etu: + if field not in fields: + fields_OK = False + + assert fields_OK is True + # etudiants_courant def test_etudiants_courant(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants/courant", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiants/courant", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) assert r.status_code == 200 + assert len(r.json()) == 0 + # etudiant def test_etudiant(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) assert r.status_code == 200 + assert len(r.json()) == 10 # r = requests.get( # SCODOC_URL + "/ScoDoc/api/etudiant/nip/", @@ -60,10 +81,11 @@ def test_etudiant(): # etudiant_formsemestres def test_etudiant_formsemestres(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) assert r.status_code == 200 + assert len(r.json()) == 1 # r = requests.get( # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestres", @@ -79,12 +101,14 @@ def test_etudiant_formsemestres(): # etudiant_bulletin_semestre -def test_etudiant_bulletin_semestre(): - r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 +# def test_etudiant_bulletin_semestre(): +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", +# headers=HEADERS, verify=CHECK_CERTIFICATE +# ) +# assert r.status_code == 200 +# assert len(r.json()) == 1 + # r = requests.get( # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", @@ -102,10 +126,12 @@ def test_etudiant_bulletin_semestre(): # etudiant_groups def test_etudiant_groups(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/semestre/1/groups", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/semestre/1/groups", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) assert r.status_code == 200 + assert len(r.json()) == 1 + # r = requests.get( # SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", @@ -117,4 +143,4 @@ def test_etudiant_groups(): # SCODOC_URL + "/ScoDoc/api/etudiant/ine//semestre//groups", # headers=HEADERS, verify=CHECK_CERTIFICATE # ) - # assert r.status_code == 200 \ No newline at end of file + # assert r.status_code == 200 From c7dbb9b0a994db125885c8e28c92bfd4f726680d Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 13 Apr 2022 12:39:10 +0200 Subject: [PATCH 17/49] =?UTF-8?q?Utilisation=20du=20jeton=20pour=20prot?= =?UTF-8?q?=C3=A9ger=20les=20routes=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/auth.py | 26 ++- app/api/departements.py | 38 ++-- app/api/test_api.py | 293 ++++++++++++---------------- tests/api/exemple-api-basic.py | 4 +- tests/api/setup_test_api.py | 19 +- tests/api/test_api_absences.py | 142 ++++++++------ tests/api/test_api_departements.py | 53 ++--- tests/api/test_api_etudiants.py | 56 ++++-- tests/api/test_api_evaluations.py | 42 ++-- tests/api/test_api_formations.py | 50 +++-- tests/api/test_api_formsemestre_.py | 51 +++-- tests/api/test_api_jury.py | 83 ++++---- tests/api/test_api_logos.py | 2 +- tests/api/test_api_partitions.py | 34 ++-- 14 files changed, 471 insertions(+), 422 deletions(-) diff --git a/app/api/auth.py b/app/api/auth.py index 331cd388d7..20dd7ded8f 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -24,6 +24,10 @@ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +from functools import wraps + + +from flask import abort from flask import g from flask_httpauth import HTTPBasicAuth, HTTPTokenAuth from app.auth.models import User @@ -63,15 +67,17 @@ def get_user_roles(user): return user.roles -# def token_permission_required(permission): -# def decorator(f): -# @wraps(f) -# def decorated_function(*args, **kwargs): -# scodoc_dept = getattr(g, "scodoc_dept", None) -# if not current_user.has_permission(permission, scodoc_dept): -# abort(403) -# return f(*args, **kwargs) +def token_permission_required(permission): + def decorator(f): + @wraps(f) + def decorated_function(*args, **kwargs): + scodoc_dept = getattr(g, "scodoc_dept", None) + if hasattr(g, "current_user") and not g.current_user.has_permission( + permission, scodoc_dept + ): + abort(403) + return f(*args, **kwargs) -# return login_required(decorated_function) + return decorated_function # login_required(decorated_function) -# return decorator + return decorator diff --git a/app/api/departements.py b/app/api/departements.py index 43137cd9fb..ee7a8899b5 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -1,23 +1,17 @@ ############################################### Departements ########################################################## +from flask import g from flask import jsonify from app import models from app.api import bp -from app.api.auth import token_auth +from app.api.auth import token_auth, token_permission_required from app.api.errors import error_response -from app.decorators import permission_required -from app.models import ApcReferentielCompetences from app.scodoc.sco_permissions import Permission -from app.scodoc.sco_prepajury import feuille_preparation_jury -from app.scodoc.sco_pvjury import formsemestre_pvjury -from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet -from app.scodoc.sco_saisie_notes import notes_add - @bp.route("/departements", methods=["GET"]) -@token_auth.login_required # Commenté le temps des tests -# @permission_required(Permission.ScoView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def departements(): """ Retourne la liste des ids de départements visibles @@ -34,7 +28,9 @@ def departements(): @bp.route("/departements//etudiants/liste", methods=["GET"]) -@bp.route("/departements//etudiants/liste/", methods=["GET"]) +@bp.route( + "/departements//etudiants/liste/", methods=["GET"] +) @token_auth.login_required # @permission_required(Permission.APIView) def liste_etudiants(dept: str, formsemestre_id=None): @@ -154,7 +150,10 @@ def liste_semestres_courant(dept: str): return jsonify(data) -@bp.route("/departements//formations//referentiel_competences", methods=["GET"]) +@bp.route( + "/departements//formations//referentiel_competences", + methods=["GET"], +) # @permission_required(Permission.APIView) def referenciel_competences(dept: str, formation_id: int): """ @@ -167,12 +166,16 @@ def referenciel_competences(dept: str, formation_id: int): id_dept = depts[0].id - formations = models.Formation.query.filter_by(id=formation_id, dept_id=id_dept).all() + formations = models.Formation.query.filter_by( + id=formation_id, dept_id=id_dept + ).all() ref_comp = formations[0].referentiel_competence_id if ref_comp is None: - return error_response(204, message="Pas de référenciel de compétences pour cette formation") + return error_response( + 204, message="Pas de référenciel de compétences pour cette formation" + ) else: return jsonify(ref_comp) @@ -181,11 +184,14 @@ def referenciel_competences(dept: str, formation_id: int): # return jsonify(ref.to_dict()) -@bp.route("/departements//formsemestre//programme", methods=["GET"]) +@bp.route( + "/departements//formsemestre//programme", + methods=["GET"], +) # @permission_required(Permission.APIView) def semestre_index(dept: str, formsemestre_id: int): """ Retourne la liste des Ues, ressources et SAE d'un semestre """ - return error_response(501, message="not implemented") \ No newline at end of file + return error_response(501, message="not implemented") diff --git a/app/api/test_api.py b/app/api/test_api.py index e269412fe1..821e3a01d3 100644 --- a/app/api/test_api.py +++ b/app/api/test_api.py @@ -1,5 +1,8 @@ ################################################## Tests ############################################################## + +# XXX OBSOLETE ??? XXX + import requests import os @@ -15,6 +18,7 @@ CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) HEADERS = None + def get_token(): """ Permet de set le token dans le header @@ -25,7 +29,7 @@ def get_token(): r0 = requests.post( SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + ) token = r0.json()["token"] HEADERS = {"Authorization": f"Bearer {token}"} @@ -52,7 +56,8 @@ def get_departement(): # departements r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", - headers=HEADERS, verify=CHECK_CERTIFICATE, + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) if r.status_code == 200: @@ -90,17 +95,40 @@ def get_formsemestre(): # liste_semestres_courant r = requests.get( SCODOC_URL + "/ScoDoc/api/departements/" + dept_acronym + "/semestres_courants", - auth=(SCODOC_USER, SCODOC_PASSWORD) + auth=(SCODOC_USER, SCODOC_PASSWORD), ) if r.status_code == 200: formsemestre = r.json()[0] print(r.json()[0]) - fields = ["gestion_semestrielle", "titre", "scodoc7_id", "date_debut", "bul_bgcolor", "date_fin", - "resp_can_edit", "dept_id", "etat", "resp_can_change_ens", "id", "modalite", "ens_can_edit_eval", - "formation_id", "gestion_compensation", "elt_sem_apo", "semestre_id", "bul_hide_xml", "elt_annee_apo", - "block_moyennes", "formsemestre_id", "titre_num", "date_debut_iso", "date_fin_iso", "responsables"] + fields = [ + "gestion_semestrielle", + "titre", + "scodoc7_id", + "date_debut", + "bul_bgcolor", + "date_fin", + "resp_can_edit", + "dept_id", + "etat", + "resp_can_change_ens", + "id", + "modalite", + "ens_can_edit_eval", + "formation_id", + "gestion_compensation", + "elt_sem_apo", + "semestre_id", + "bul_hide_xml", + "elt_annee_apo", + "block_moyennes", + "formsemestre_id", + "titre_num", + "date_debut_iso", + "date_fin_iso", + "responsables", + ] for field in formsemestre: if field not in fields: @@ -114,7 +142,6 @@ def get_formsemestre(): return error_response(409, "La requête ne peut être traitée en l’état actuel") - @bp.route("/test_etu", methods=["GET"]) def get_etudiant(): """ @@ -124,14 +151,23 @@ def get_etudiant(): # etudiants r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants/courant", - auth=(SCODOC_USER, SCODOC_PASSWORD) + auth=(SCODOC_USER, SCODOC_PASSWORD), ) if r.status_code == 200: etu = r.json()[0] - fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", - "prenom"] + fields = [ + "civilite", + "code_ine", + "code_nip", + "date_naissance", + "email", + "emailperso", + "etudid", + "nom", + "prenom", + ] for field in etu: if field not in fields: @@ -162,15 +198,25 @@ def test_departements_liste_etudiants(): global FORMSEMESTRE # Set les fields à vérifier - fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", "prenom"] + fields = [ + "civilite", + "code_ine", + "code_nip", + "date_naissance", + "email", + "emailperso", + "etudid", + "nom", + "prenom", + ] # liste_etudiants (sans formsemestre) r1 = requests.get( SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/etudiants/liste", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + auth=(SCODOC_USER, SCODOC_PASSWORD), + ) - if r1.status_code == 200: # Si la requête est "OK" + if r1.status_code == 200: # Si la requête est "OK" # On récupère la liste des étudiants etudiants = r1.json() @@ -180,15 +226,17 @@ def test_departements_liste_etudiants(): if field not in fields: return error_response(501, field + " field missing") - # liste_etudiants (avec formsemestre) r2 = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/etudiants/liste/" + - str(FORMSEMESTRE["formsemestre_id"]), - auth=(SCODOC_USER, SCODOC_PASSWORD) + SCODOC_URL + + "/ScoDoc/api/departements/" + + DEPT["acronym"] + + "/etudiants/liste/" + + str(FORMSEMESTRE["formsemestre_id"]), + auth=(SCODOC_USER, SCODOC_PASSWORD), ) - if r2.status_code == 200: # Si la requête est "OK" + if r2.status_code == 200: # Si la requête est "OK" # On récupère la liste des étudiants etudiants = r2.json() @@ -216,10 +264,14 @@ def test_departements_referenciel_competences(): # referenciel_competences r = requests.post( - SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/formations/" + - FORMSEMESTRE["formation_id"] + "/referentiel_competences", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + SCODOC_URL + + "/ScoDoc/api/departements/" + + DEPT["acronym"] + + "/formations/" + + FORMSEMESTRE["formation_id"] + + "/referentiel_competences", + auth=(SCODOC_USER, SCODOC_PASSWORD), + ) @bp.route("/test_liste_semestre_index") @@ -229,53 +281,42 @@ def test_departements_semestre_index(): """ # semestre_index r5 = requests.post( - SCODOC_URL + "/ScoDoc/api/departements/" + DEPT["acronym"] + "/formsemestre/" + - FORMSEMESTRE["formation_id"] + "/programme", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + SCODOC_URL + + "/ScoDoc/api/departements/" + + DEPT["acronym"] + + "/formsemestre/" + + FORMSEMESTRE["formation_id"] + + "/programme", + auth=(SCODOC_USER, SCODOC_PASSWORD), + ) #################################################### Etudiants ######################################################## + def test_routes_etudiants(): """ Test les routes de la partie Etudiants """ # etudiants r1 = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + SCODOC_URL + "/ScoDoc/api/etudiants", auth=(SCODOC_USER, SCODOC_PASSWORD) + ) # etudiants_courant - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etudiant - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etudiant_formsemestres - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etudiant_bulletin_semestre - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r5 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etudiant_groups - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r6 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_formation(): @@ -283,40 +324,22 @@ def test_routes_formation(): Test les routes de la partie Formation """ # formations - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # formations_by_id - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # formation_export_by_formation_id - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # formsemestre_apo - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # moduleimpls - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r5 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # moduleimpls_sem - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r6 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_formsemestres(): @@ -324,28 +347,16 @@ def test_routes_formsemestres(): Test les routes de la partie Formsemestres """ # formsemestre - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etudiant_bulletin - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # bulletins - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # jury - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_partitions(): @@ -353,22 +364,13 @@ def test_routes_partitions(): Test les routes de la partie Partitions """ # partition - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # etud_in_group - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # set_groups - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_evaluations(): @@ -376,22 +378,13 @@ def test_routes_evaluations(): Test les routes de la partie Evaluations """ # evaluations - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # evaluation_notes - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # evaluation_set_notes - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_jury(): @@ -399,28 +392,16 @@ def test_routes_jury(): Test les routes de la partie Jury """ # jury_preparation - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # jury_decisions - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # set_decision_jury - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # annule_decision_jury - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_absences(): @@ -428,40 +409,22 @@ def test_routes_absences(): Test les routes de la partie Absences """ # absences - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # absences_justify - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # abs_signale - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # abs_annule - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # abs_annule_justif - r5 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r5 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # abs_groupe_etat - r6 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r6 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) def test_routes_logos(): @@ -469,25 +432,13 @@ def test_routes_logos(): Test les routes de la partie Logos """ # liste_logos - r1 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r1 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # recup_logo_global - r2 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r2 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # logo_dept - r3 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + r3 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) # recup_logo_dept_global - r4 = requests.post( - SCODOC_URL + "/ScoDoc/api", - auth=(SCODOC_USER, SCODOC_PASSWORD) - ) \ No newline at end of file + r4 = requests.post(SCODOC_URL + "/ScoDoc/api", auth=(SCODOC_USER, SCODOC_PASSWORD)) diff --git a/tests/api/exemple-api-basic.py b/tests/api/exemple-api-basic.py index 0975e10033..88ba892f6d 100644 --- a/tests/api/exemple-api-basic.py +++ b/tests/api/exemple-api-basic.py @@ -73,7 +73,9 @@ token = r.json()["token"] HEADERS = {"Authorization": f"Bearer {token}"} r = requests.get( - SCODOC_URL + "/ScoDoc/api/list_depts", headers=HEADERS, verify=CHECK_CERTIFICATE + SCODOC_URL + "/ScoDoc/api/list_depts", + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) if r.status_code != 200: raise ScoError("erreur de connexion: vérifier adresse et identifiants") diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py index 5338f6ff5c..8ca1635863 100644 --- a/tests/api/setup_test_api.py +++ b/tests/api/setup_test_api.py @@ -16,25 +16,22 @@ Utilisation : import os import requests -SCODOC_USER = "test" -SCODOC_PASSWORD = "test" -SCODOC_URL = "http://192.168.1.12:5000" + +SCODOC_USER = "api_tester" +SCODOC_PASSWORD = "api_tester" +SCODOC_URL = "http://deb11.viennet.net:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) -HEADERS = None def get_token(): """ Permet de set le token dans le header """ - global HEADERS - global SCODOC_USER - global SCODOC_PASSWORD - r0 = requests.post( SCODOC_URL + "/ScoDoc/api/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD) - ) + ) token = r0.json()["token"] - HEADERS = {"Authorization": f"Bearer {token}"} + return {"Authorization": f"Bearer {token}"} -get_token() \ No newline at end of file + +HEADERS = get_token() diff --git a/tests/api/test_api_absences.py b/tests/api/test_api_absences.py index 3f8a8f0a4b..bbe1588efb 100644 --- a/tests/api/test_api_absences.py +++ b/tests/api/test_api_absences.py @@ -18,126 +18,156 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # absences def test_absences(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/etudid/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/etudid/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/nip/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/nip/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/ine/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/ine/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # absences_justify def test_absences_justify(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/etudid//abs_just_only", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/etudid//abs_just_only", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/nip//abs_just_only", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/nip//abs_just_only", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/ine//abs_just_only", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/absences/ine//abs_just_only", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # abs_signale def test_abs_signale(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?etudid=&date=&matin=&justif=" - "&description=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_signale?etudid=&date=&matin=&justif=" + "&description=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?nip=&date=&matin=&justif=" - "&description=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_signale?nip=&date=&matin=&justif=" + "&description=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=&moduleimpl_id=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # abs_annule def test_abs_annule(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?etudid=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule?etudid=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?nip=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule?nip=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule?ine=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule?ine=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # abs_annule_justif def test_abs_annule_justif(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?etudid=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule_justif?etudid=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?nip=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule_justif?nip=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_annule_justif?ine=&jour=&matin=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_annule_justif?ine=&jour=&matin=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # abs_groupe_etat def test_abs_groupe_etat(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index b35e6959e2..1e5e901ef1 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -18,14 +18,16 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE + +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # departements def test_departements(): r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -34,16 +36,18 @@ def test_departements(): # liste_etudiants def test_liste_etudiants(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 16 r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste/1", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 16 @@ -51,9 +55,10 @@ def test_liste_etudiants(): # liste_semestres_courant def test_semestres_courant(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -61,9 +66,11 @@ def test_semestres_courant(): # referenciel_competences def test_referenciel_competences(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/formations/1/referentiel_competences", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/departements/TAPI/formations/1/referentiel_competences", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 or 204 @@ -74,21 +81,3 @@ def test_referenciel_competences(): # headers=HEADERS, verify=CHECK_CERTIFICATE # ) # assert r.status_code == 200 - - - - - - - - - - - - - - - - - - diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index f58c6e62e4..9c93804ffe 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -19,23 +19,34 @@ Utilisation : from random import randint import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # etudiants def test_etudiants(): r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 16 # Choisis aléatoirement un étudiant dans la liste des étudiants - etu = r.json()[randint(0, len(r.json()))-1] + etu = r.json()[randint(0, len(r.json())) - 1] - fields = ["civilite", "code_ine", "code_nip", "date_naissance", "email", "emailperso", "etudid", "nom", - "prenom", "nomprenom"] + fields = [ + "civilite", + "code_ine", + "code_nip", + "date_naissance", + "email", + "emailperso", + "etudid", + "nom", + "prenom", + "nomprenom", + ] fields_OK = True @@ -51,7 +62,8 @@ def test_etudiants(): def test_etudiants_courant(): r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants/courant", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 0 @@ -61,7 +73,8 @@ def test_etudiants_courant(): def test_etudiant(): r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 10 @@ -82,7 +95,8 @@ def test_etudiant(): def test_etudiant_formsemestres(): r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -110,29 +124,29 @@ def test_etudiant_formsemestres(): # assert len(r.json()) == 1 - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 - # - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", +# headers=HEADERS, verify=CHECK_CERTIFICATE +# ) +# assert r.status_code == 200 +# +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", +# headers=HEADERS, verify=CHECK_CERTIFICATE +# ) +# assert r.status_code == 200 # etudiant_groups def test_etudiant_groups(): r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/semestre/1/groups", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 1 - # r = requests.get( # SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", # headers=HEADERS, verify=CHECK_CERTIFICATE diff --git a/tests/api/test_api_evaluations.py b/tests/api/test_api_evaluations.py index 50b8ad52d0..0d67bc1caa 100644 --- a/tests/api/test_api_evaluations.py +++ b/tests/api/test_api_evaluations.py @@ -18,41 +18,51 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # evaluations def test_evaluations(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/evaluations/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # evaluation_notes def test_evaluation_notes(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_notes/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/evaluations/eval_notes/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # evaluation_set_notes def test_evaluation_set_notes(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&etudid=¬e=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&etudid=¬e=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&nip=¬e=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&nip=¬e=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&ine=¬e=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/evaluations/eval_set_notes?eval_id=&ine=¬e=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 diff --git a/tests/api/test_api_formations.py b/tests/api/test_api_formations.py index 2afe7602f6..14aa22852a 100644 --- a/tests/api/test_api_formations.py +++ b/tests/api/test_api_formations.py @@ -18,55 +18,65 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # formations def test_formations(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # formations_by_id def test_formations_by_id(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # formation_export_by_formation_id def test_formation_export_by_formation_id(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/formation_export/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations/formation_export/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # formsemestre_apo def test_formsemestre_apo(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/apo/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations/apo/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # moduleimpls def test_moduleimpls(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/moduleimpl/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations/moduleimpl/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # moduleimpls_sem def test_moduleimpls_sem(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/moduleimpl//formsemestre/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 \ No newline at end of file + SCODOC_URL + + "/ScoDoc/api/formations/moduleimpl//formsemestre/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre_.py index 5cd40c2ae7..d703ac7ed8 100644 --- a/tests/api/test_api_formsemestre_.py +++ b/tests/api/test_api_formsemestre_.py @@ -18,50 +18,61 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # formsemestre def test_formsemestre(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # etudiant_bulletin def test_etudiant_bulletin(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # bulletins def test_bulletins(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # jury def test_jury(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//jury", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 \ No newline at end of file + SCODOC_URL + "/ScoDoc/api/formsemestre//jury", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_jury.py b/tests/api/test_api_jury.py index f128d27d21..e9be6a017a 100644 --- a/tests/api/test_api_jury.py +++ b/tests/api/test_api_jury.py @@ -18,66 +18,83 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # jury_preparation def test_jury_preparation(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/formsemestre//preparation_jury", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/formsemestre//preparation_jury", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # jury_decisions def test_jury_decisions(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/formsemestre//decisions_jury", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/formsemestre//decisions_jury", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # set_decision_jury def test_set_decision_jury(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/etudid?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/nip?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/set_decision/ine?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # annule_decision_jury def test_annule_decision_jury(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/etudid//formsemestre//annule_decision", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 - - - r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/nip//formsemestre//annule_decision", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + + "/ScoDoc/api/jury/etudid//formsemestre//annule_decision", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/jury/ine//formsemestre//annule_decision", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 \ No newline at end of file + SCODOC_URL + + "/ScoDoc/api/jury/nip//formsemestre//annule_decision", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 + + r = requests.get( + SCODOC_URL + + "/ScoDoc/api/jury/ine//formsemestre//annule_decision", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_logos.py b/tests/api/test_api_logos.py index 22fcf709db..0e2250ffd0 100644 --- a/tests/api/test_api_logos.py +++ b/tests/api/test_api_logos.py @@ -9,7 +9,7 @@ utilisation: pytest tests/api/test_api_logos.py """ -import pytest +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS from scodoc import app from tests.unit.config_test_logos import ( diff --git a/tests/api/test_api_partitions.py b/tests/api/test_api_partitions.py index a3c33518b3..626ab9e3f8 100644 --- a/tests/api/test_api_partitions.py +++ b/tests/api/test_api_partitions.py @@ -18,36 +18,42 @@ Utilisation : """ import requests -from tests.api.setup_test_api import SCODOC_URL, HEADERS, CHECK_CERTIFICATE +from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # partition def test_partition(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/partitions/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 + # etud_in_group def test_etud_in_group(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/groups/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/partitions/groups/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/groups//etat/", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/partitions/groups//etat/", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 # set_groups def test_set_groups(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/partitions/set_groups?partition_id=&groups_lists=&" + SCODOC_URL + + "/ScoDoc/api/partitions/set_groups?partition_id=&groups_lists=&" "groups_to_create=&groups_to_delete=", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 \ No newline at end of file + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 From 92e9f4bc5f59268421855026ff7ac4100f2f74ca Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Thu, 14 Apr 2022 14:56:36 +0200 Subject: [PATCH 18/49] todo a focus --- app/api/absences.py | 16 +++++++++------ app/api/departements.py | 12 ++++++----- app/api/etudiants.py | 20 ++++++++++++------- app/api/evaluations.py | 11 +++++----- app/api/formations.py | 19 ++++++++++++------ app/api/formsemestres.py | 13 ++++++++---- app/api/jury.py | 1 + app/api/logos.py | 9 +++++---- app/api/partitions.py | 9 ++++++--- tests/api/setup_test_api.py | 6 +++--- tests/api/test_api_departements.py | 18 ++++++++--------- tests/api/test_api_etudiants.py | 6 +++--- tests/api/test_api_formsemestre_.py | 2 +- .../fakedatabase/create_test_api_database.py | 7 ++++++- 14 files changed, 92 insertions(+), 57 deletions(-) diff --git a/app/api/absences.py b/app/api/absences.py index 38ec33fb7d..08ba7ef1e1 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -8,6 +8,7 @@ from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response from app.decorators import permission_required +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_abs import add_absence, add_justif, annule_absence, annule_justif, list_abs_date from app.scodoc.sco_groups import get_group_members from app.scodoc.sco_permissions import Permission @@ -16,7 +17,8 @@ from app.scodoc.sco_permissions import Permission @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def absences(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences d'un étudiant donné @@ -53,7 +55,8 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/absences/etudid//abs_just_only", methods=["GET"]) @bp.route("/absences/nip//abs_just_only", methods=["GET"]) @bp.route("/absences/ine//abs_just_only", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def absences_justify(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des absences justifiées d'un étudiant donné @@ -96,7 +99,7 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" "&description=&moduleimpl_id=", methods=["POST"]) @token_auth.login_required -@permission_required(Permission.APIAbsChange) +@token_permission_required(Permission.APIAbsChange) def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, description: str = None, moduleimpl_id: int = None): """ @@ -219,7 +222,7 @@ def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, n @bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -@permission_required(Permission.APIAbsChange) +@token_permission_required(Permission.APIAbsChange) def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html @@ -257,7 +260,7 @@ def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, @bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) @bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) @token_auth.login_required -@permission_required(Permission.APIAbsChange) +@token_permission_required(Permission.APIAbsChange) def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): """ Retourne un html @@ -292,7 +295,8 @@ def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = @bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): """ Retoune la liste des absences d'un ou plusieurs groupes entre deux dates diff --git a/app/api/departements.py b/app/api/departements.py index ee7a8899b5..c4b689a1f0 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -32,7 +32,7 @@ def departements(): "/departements//etudiants/liste/", methods=["GET"] ) @token_auth.login_required -# @permission_required(Permission.APIView) +@token_permission_required(Permission.APIView) def liste_etudiants(dept: str, formsemestre_id=None): """ Retourne la liste des étudiants d'un département @@ -91,8 +91,8 @@ def liste_etudiants(dept: str, formsemestre_id=None): @bp.route("/departements//semestres_courants", methods=["GET"]) -# @token_auth.login_required # Commenté le temps des tests -# @permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def liste_semestres_courant(dept: str): """ Liste des semestres actifs d'un départements donné @@ -154,7 +154,8 @@ def liste_semestres_courant(dept: str): "/departements//formations//referentiel_competences", methods=["GET"], ) -# @permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def referenciel_competences(dept: str, formation_id: int): """ Retourne le référentiel de compétences @@ -188,7 +189,8 @@ def referenciel_competences(dept: str, formation_id: int): "/departements//formsemestre//programme", methods=["GET"], ) -# @permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def semestre_index(dept: str, formsemestre_id: int): """ Retourne la liste des Ues, ressources et SAE d'un semestre diff --git a/app/api/etudiants.py b/app/api/etudiants.py index a39f00bf96..f1d0300399 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -4,14 +4,15 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response -from app.decorators import permission_required +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_groups import get_etud_groups from app.scodoc.sco_permissions import Permission @bp.route("/etudiants", methods=["GET"]) -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiants(): """ Retourne la liste de tous les étudiants @@ -52,7 +53,8 @@ def etudiants(): @bp.route("/etudiants/courant", methods=["GET"]) -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiants_courant(): """ Retourne la liste des étudiants courant @@ -98,7 +100,8 @@ def etudiants_courant(): @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiant(etudid: int = None, nip: int = None, ine: int = None): """ Retourne les informations de l'étudiant correspondant à l'id passé en paramètres. @@ -143,7 +146,8 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des semestres qu'un étudiant a suivis @@ -231,7 +235,8 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) @bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) @bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): """ Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné @@ -262,7 +267,8 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N @bp.route("/etudiant/etudid//semestre//groups", methods=["GET"]) @bp.route("/etudiant/nip//semestre//groups", methods=["GET"]) @bp.route("/etudiant/ine//semestre//groups", methods=["GET"]) -#@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): """ Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué diff --git a/app/api/evaluations.py b/app/api/evaluations.py index db1b7e8442..e3ed707b43 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -3,15 +3,15 @@ from flask import jsonify from app import models from app.api import bp -from app.api.auth import token_auth +from app.api.auth import token_auth, token_permission_required from app.api.errors import error_response -from app.decorators import permission_required from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes from app.scodoc.sco_permissions import Permission @bp.route("/evaluations/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def evaluations(moduleimpl_id: int): """ Retourne la liste des évaluations à partir de l'id d'un moduleimpl @@ -29,7 +29,8 @@ def evaluations(moduleimpl_id: int): @bp.route("/evaluations/eval_notes/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def evaluation_notes(evaluation_id: int): """ Retourne la liste des notes à partir de l'id d'une évaluation donnée @@ -51,7 +52,7 @@ def evaluation_notes(evaluation_id: int): @bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) @bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) @token_auth.login_required -@permission_required(Permission.APIEditAllNotes) +@token_permission_required(Permission.APIEditAllNotes) def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): """ Set les notes d'une évaluation pour un étudiant donnée diff --git a/app/api/formations.py b/app/api/formations.py index 84c84b9ce9..bc7258bb9c 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -4,6 +4,7 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response +from app.api.auth import token_auth, token_permission_required from app.decorators import permission_required from app.scodoc.sco_formations import formation_export from app.scodoc.sco_moduleimpl import moduleimpl_list @@ -11,7 +12,8 @@ from app.scodoc.sco_permissions import Permission @bp.route("/formations", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def formations(): """ Retourne la liste des formations @@ -26,7 +28,8 @@ def formations(): @bp.route("/formations/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def formations_by_id(formation_id: int): """ Retourne une formation en fonction d'un id donné @@ -43,7 +46,8 @@ def formations_by_id(formation_id: int): @bp.route("/formations/formation_export/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def formation_export_by_formation_id(formation_id: int, export_ids=False): """ Retourne la formation, avec UE, matières, modules @@ -60,7 +64,8 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False): @bp.route("/formations/apo/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def formsemestre_apo(etape_apo: int): """ Retourne les informations sur les formsemestres @@ -81,7 +86,8 @@ def formsemestre_apo(etape_apo: int): @bp.route("/formations/moduleimpl/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def moduleimpls(moduleimpl_id: int): """ Retourne la liste des moduleimpl @@ -98,7 +104,8 @@ def moduleimpls(moduleimpl_id: int): @bp.route("/formations/moduleimpl//formsemestre/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ Retourne la liste des moduleimpl d'un semestre diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 2466562e9d..2b98c6d11f 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -5,6 +5,7 @@ from app import models from app.api import bp from app.api.errors import error_response from app.decorators import permission_required +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury @@ -12,7 +13,8 @@ from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet @bp.route("/formations/formsemestre/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def formsemestre(formsemestre_id: int): """ Retourne l'information sur le formsemestre correspondant au formsemestre_id @@ -41,7 +43,8 @@ def formsemestre(formsemestre_id: int): "/formsemestre//departements//etudiant/ine//bulletin", methods=["GET"], ) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): """ Retourne le bulletin de note d'un étudiant @@ -67,7 +70,8 @@ def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size) @bp.route("/formsemestre//bulletins", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def bulletins(formsemestre_id: int): """ Retourne les bulletins d'un formsemestre donné @@ -86,7 +90,8 @@ def bulletins(formsemestre_id: int): @bp.route("/formsemestre//jury", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def jury(formsemestre_id: int): """ Retourne le récapitulatif des décisions jury diff --git a/app/api/jury.py b/app/api/jury.py index 11e87c49de..0e72fc1ea6 100644 --- a/app/api/jury.py +++ b/app/api/jury.py @@ -4,6 +4,7 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_prepajury import feuille_preparation_jury from app.scodoc.sco_pvjury import formsemestre_pvjury diff --git a/app/api/logos.py b/app/api/logos.py index be689d7294..e1faf0bcf1 100644 --- a/app/api/logos.py +++ b/app/api/logos.py @@ -39,12 +39,13 @@ from app.api.errors import error_response from app.decorators import permission_required from app.models import Departement from app.scodoc.sco_logos import list_logos, find_logo +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_permissions import Permission @bp.route("/logos", methods=["GET"]) @token_auth.login_required -@permission_required(Permission.APIView) +@token_permission_required(Permission.APIView) def api_get_glob_logos(): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): return error_response(401, message="accès interdit") @@ -57,7 +58,7 @@ def api_get_glob_logos(): @bp.route("/logos/", methods=["GET"]) @token_auth.login_required -@permission_required(Permission.APIView) +@token_permission_required(Permission.APIView) def api_get_glob_logo(logoname): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): return error_response(401, message="accès interdit") @@ -74,7 +75,7 @@ def api_get_glob_logo(logoname): @bp.route("/departements//logos", methods=["GET"]) @token_auth.login_required -@permission_required(Permission.APIView) +@token_permission_required(Permission.APIView) def api_get_local_logos(departement): dept_id = Departement.from_acronym(departement).id if not g.current_user.has_permission(Permission.ScoChangePreferences, departement): @@ -85,7 +86,7 @@ def api_get_local_logos(departement): @bp.route("/departements//logos/", methods=["GET"]) @token_auth.login_required -@permission_required(Permission.APIView) +@token_permission_required(Permission.APIView) def api_get_local_logo(departement, logoname): # format = requested_format("jpg", ['png', 'jpg']) XXX ? dept_id = Departement.from_acronym(departement).id diff --git a/app/api/partitions.py b/app/api/partitions.py index 3847bac404..6369c3af39 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -6,12 +6,14 @@ from app.api import bp from app.api.auth import token_auth from app.api.errors import error_response from app.decorators import permission_required +from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_groups import get_group_members, setGroups from app.scodoc.sco_permissions import Permission @bp.route("/partitions/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def partition(formsemestre_id: int): """ Retourne la liste de toutes les partitions d'un formsemestre @@ -34,7 +36,8 @@ def partition(formsemestre_id: int): # ) @bp.route("/partitions/groups/", methods=["GET"]) @bp.route("/partitions/groups//etat/", methods=["GET"]) -@permission_required(Permission.APIView) +@token_auth.login_required +@token_permission_required(Permission.APIView) def etud_in_group(group_id: int, etat=None): """ Retourne la liste des étudiants dans un groupe @@ -65,7 +68,7 @@ def etud_in_group(group_id: int, etat=None): "groups_to_create=&groups_to_delete=", methods=["POST"], ) @token_auth.login_required -@permission_required(Permission.APIEtudChangeGroups) +@token_permission_required(Permission.APIEtudChangeGroups) def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): """ Set les groups diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py index 8ca1635863..a413f6fdcb 100644 --- a/tests/api/setup_test_api.py +++ b/tests/api/setup_test_api.py @@ -17,9 +17,9 @@ import os import requests -SCODOC_USER = "api_tester" -SCODOC_PASSWORD = "api_tester" -SCODOC_URL = "http://deb11.viennet.net:5000" +SCODOC_USER = "test" +SCODOC_PASSWORD = "test" +SCODOC_URL = "http://192.168.1.12:5000" CHECK_CERTIFICATE = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index 1e5e901ef1..7e68d3cc63 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -23,7 +23,7 @@ from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # departements -def test_departements(): +def test_departements(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/departements", headers=HEADERS, @@ -34,7 +34,7 @@ def test_departements(): # liste_etudiants -def test_liste_etudiants(): +def test_liste_etudiants(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/departements/TAPI/etudiants/liste", headers=HEADERS, @@ -53,7 +53,7 @@ def test_liste_etudiants(): # liste_semestres_courant -def test_semestres_courant(): +def test_semestres_courant(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", headers=HEADERS, @@ -75,9 +75,9 @@ def test_referenciel_competences(): # # semestre_index -# def test_semestre_index(): -# r = requests.get( -# SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", -# headers=HEADERS, verify=CHECK_CERTIFICATE -# ) -# assert r.status_code == 200 +def test_semestre_index(): #XXX TODO pour Seb + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index 9c93804ffe..3a71bc4826 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -59,7 +59,7 @@ def test_etudiants(): # etudiants_courant -def test_etudiants_courant(): +def test_etudiants_courant(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants/courant", headers=HEADERS, @@ -70,7 +70,7 @@ def test_etudiants_courant(): # etudiant -def test_etudiant(): +def test_etudiant(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", headers=HEADERS, @@ -92,7 +92,7 @@ def test_etudiant(): # etudiant_formsemestres -def test_etudiant_formsemestres(): +def test_etudiant_formsemestres(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", headers=HEADERS, diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre_.py index d703ac7ed8..4a702f37b1 100644 --- a/tests/api/test_api_formsemestre_.py +++ b/tests/api/test_api_formsemestre_.py @@ -32,7 +32,7 @@ def test_formsemestre(): # etudiant_bulletin -def test_etudiant_bulletin(): +def test_etudiant_bulletin(): #XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", diff --git a/tools/fakedatabase/create_test_api_database.py b/tools/fakedatabase/create_test_api_database.py index 8e19065a8f..19e7007482 100644 --- a/tools/fakedatabase/create_test_api_database.py +++ b/tools/fakedatabase/create_test_api_database.py @@ -14,6 +14,10 @@ flask sco-db-init --erase flask init-test-database flask user-role -a Admin -d TAPI test + flask user-password test + flask create-role APIUserViewer + flask edit-role APIUserViewer -a APIView + flask user-role test -a APIUserViewer 3) relancer ScoDoc: flask run --host 0.0.0.0 @@ -104,7 +108,7 @@ def create_formsemestre(formation, user, semestre_idx=1): semestre_id=semestre_idx, titre="Semestre test", date_debut=datetime.datetime(2021, 9, 1), - date_fin=datetime.datetime(2022, 1, 31), + date_fin=datetime.datetime(2022, 8, 31), modalite="FI", formation=formation, ) @@ -137,6 +141,7 @@ def inscrit_etudiants(etuds, formsemestre): def init_test_database(): + dept = init_departement("TAPI") user = create_user(dept) etuds = create_etuds(dept) From 6aba3a3ccdd6fc959ff28863210608b8fcdef8fc Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 15 Apr 2022 15:57:44 +0200 Subject: [PATCH 19/49] =?UTF-8?q?doc=20de=20create=5Ftest=5Fapi=5Fdatabase?= =?UTF-8?q?=20am=C3=A9lior=C3=A9=20+=20ajout=20du=20code=20nip=20et=20ine?= =?UTF-8?q?=20lors=20de=20la=20cr=C3=A9ation=20des=20etud=20+=20test=20dep?= =?UTF-8?q?t=20et=20etu=20presque=20fini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/etudiants.py | 34 +++++++++---- app/api/formsemestres.py | 1 - tests/api/test_api_departements.py | 12 ++--- tests/api/test_api_etudiants.py | 48 +++++++++++++------ tests/api/test_api_formsemestre_.py | 12 ++--- .../fakedatabase/create_test_api_database.py | 4 ++ 6 files changed, 73 insertions(+), 38 deletions(-) diff --git a/app/api/etudiants.py b/app/api/etudiants.py index f1d0300399..34f10a12ae 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -123,19 +123,32 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): "prenom": "JACQUES" } """ - etu = [] + # etu = [] - if etudid is not None: # Si route etudid - # Récupération de l'étudiant + if etudid is None: + if nip is None: # si ine + etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + else: # si nip + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + + else: # si etudid etu = models.Identite.query.filter_by(id=etudid).first() - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() + + # if etudid is not None: # Si route etudid + # # Récupération de l'étudiant + # etu = models.Identite.query.filter_by(id=etudid).first() + # + # if nip is not None: # Si route nip + # # Récupération de l'étudiant + # etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + # + # breakpoint() + # + # if ine is not None: # Si route ine + # # Récupération de l'étudiant + # etu = models.Identite.query.filter_by(code_ine=str(ine)).first() # Mise en forme des données data = etu.to_dict_bul(include_urls=False) @@ -321,9 +334,10 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, i # Récupération du formsemestre sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + #breakpoint() try: # Utilisation de la fonction get_etud_groups - data = get_etud_groups(etudid, sem.to_dict()) + data = get_etud_groups(etudid, sem.id) except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 2b98c6d11f..deba20bb0c 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -4,7 +4,6 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response -from app.decorators import permission_required from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_permissions import Permission diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index 7e68d3cc63..ac4f333973 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -75,9 +75,9 @@ def test_referenciel_competences(): # # semestre_index -def test_semestre_index(): #XXX TODO pour Seb - r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) - assert r.status_code == 200 +# def test_semestre_index(): #XXX TODO pour Seb +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", +# headers=HEADERS, verify=CHECK_CERTIFICATE +# ) +# assert r.status_code == 200 diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index 3a71bc4826..5f2e0c3f49 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -22,6 +22,7 @@ import requests from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS + # etudiants def test_etudiants(): r = requests.get( @@ -46,6 +47,20 @@ def test_etudiants(): "nom", "prenom", "nomprenom", + "lieu_naissance", + "dept_naissance", + "nationalite", + "boursier", + "id", + "domicile", + "villedomicile", + "telephone", + "fax", + "description", + "codepostaldomicile", + "paysdomicile", + "telephonemobile", + "typeadresse", ] fields_OK = True @@ -59,40 +74,43 @@ def test_etudiants(): # etudiants_courant -def test_etudiants_courant(): #XXX TODO pour Seb +def test_etudiants_courant(): # XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants/courant", headers=HEADERS, verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 - assert len(r.json()) == 0 + assert len(r.json()) == 16 # etudiant -def test_etudiant(): #XXX TODO pour Seb +def test_etudiant(): # XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", headers=HEADERS, verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 - assert len(r.json()) == 10 + assert len(r.json()) == 24 - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/nip/", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/ine/", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 24 + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 24 # etudiant_formsemestres -def test_etudiant_formsemestres(): #XXX TODO pour Seb +def test_etudiant_formsemestres(): # XXX TODO pour Seb r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", headers=HEADERS, diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre_.py index 4a702f37b1..fc926d1fe0 100644 --- a/tests/api/test_api_formsemestre_.py +++ b/tests/api/test_api_formsemestre_.py @@ -24,7 +24,7 @@ from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # formsemestre def test_formsemestre(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formations/formsemestre/", + SCODOC_URL + "/ScoDoc/api/formations/formsemestre/1", headers=HEADERS, verify=CHECK_CERTIFICATE, ) @@ -35,7 +35,7 @@ def test_formsemestre(): def test_etudiant_bulletin(): #XXX TODO pour Seb r = requests.get( SCODOC_URL - + "/ScoDoc/api/formsemestre//departements//etudiant/etudid//bulletin", + + "/ScoDoc/api/formsemestre/1/departements/TAPI/etudiant/etudid/1/bulletin", headers=HEADERS, verify=CHECK_CERTIFICATE, ) @@ -43,7 +43,7 @@ def test_etudiant_bulletin(): #XXX TODO pour Seb r = requests.get( SCODOC_URL - + "/ScoDoc/api/formsemestre//departements//etudiant/nip//bulletin", + + "/ScoDoc/api/formsemestre/1/departements/TAPI/etudiant/nip/1/bulletin", headers=HEADERS, verify=CHECK_CERTIFICATE, ) @@ -51,7 +51,7 @@ def test_etudiant_bulletin(): #XXX TODO pour Seb r = requests.get( SCODOC_URL - + "/ScoDoc/api/formsemestre//departements//etudiant/ine//bulletin", + + "/ScoDoc/api/formsemestre/1/departements/TAPI/etudiant/ine/1/bulletin", headers=HEADERS, verify=CHECK_CERTIFICATE, ) @@ -61,7 +61,7 @@ def test_etudiant_bulletin(): #XXX TODO pour Seb # bulletins def test_bulletins(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//bulletins", + SCODOC_URL + "/ScoDoc/api/formsemestre/1/bulletins", headers=HEADERS, verify=CHECK_CERTIFICATE, ) @@ -71,7 +71,7 @@ def test_bulletins(): # jury def test_jury(): r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre//jury", + SCODOC_URL + "/ScoDoc/api/formsemestre/1/jury", headers=HEADERS, verify=CHECK_CERTIFICATE, ) diff --git a/tools/fakedatabase/create_test_api_database.py b/tools/fakedatabase/create_test_api_database.py index 19e7007482..aba8cec76a 100644 --- a/tools/fakedatabase/create_test_api_database.py +++ b/tools/fakedatabase/create_test_api_database.py @@ -86,6 +86,10 @@ def create_fake_etud(dept): etud = models.Identite(civilite=civilite, nom=nom, prenom=prenom, dept_id=dept.id) db.session.add(etud) db.session.commit() + etud.code_nip = etud.id + etud.code_ine = etud.id + db.session.add(etud) + db.session.commit() adresse = models.Adresse( etudid=etud.id, email=f"{etud.prenom}.{etud.nom}@example.com" ) From 29715a740feab66c686d1b02b6432bf2bcf3cd44 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Wed, 20 Apr 2022 15:50:02 +0200 Subject: [PATCH 20/49] =?UTF-8?q?tests=20etudiant=20fini=20et=20formsemest?= =?UTF-8?q?re=20commenc=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/etudiants.py | 56 +-- app/api/formsemestres.py | 49 ++- tests/api/test_api_etudiants.py | 400 +++++++++++++++--- ...msemestre_.py => test_api_formsemestre.py} | 75 +++- 4 files changed, 473 insertions(+), 107 deletions(-) rename tests/api/{test_api_formsemestre_.py => test_api_formsemestre.py} (55%) diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 34f10a12ae..6a96d2120a 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -1,4 +1,6 @@ #################################################### Etudiants ######################################################## +import app + from flask import jsonify from app import models @@ -10,6 +12,7 @@ from app.scodoc.sco_groups import get_etud_groups from app.scodoc.sco_permissions import Permission + @bp.route("/etudiants", methods=["GET"]) @token_auth.login_required @token_permission_required(Permission.APIView) @@ -204,29 +207,27 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) ... ] """ - # Récupération de toutes les inscriptions inscriptions = models.FormSemestreInscription.query.all() sems = [] # Filtre les inscriptions contenant l'étudiant for sem in inscriptions: - if etudid is not None: # Si route etudid + if etudid is None: + if nip is None: # si ine + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + if sem.etudid == etu.etudid: + sems.append(sem) + else: # si nip + # Récupération de l'étudiant + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + if sem.etudid == etu.etudid: + sems.append(sem) + else: # si etudid if sem.etudid == etudid: sems.append(sem) - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - if sem.etudid == etu.etudid: - sems.append(sem) - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).firt() - if sem.etudid == etu.etudid: - sems.append(sem) - # Mise en forme des données # data_inscriptions = [d.to_dict() for d in sems] @@ -261,20 +262,21 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N """ # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() - etu = None - if etudid is not None: # Si route etudid - return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) - else: - if nip is not None: # Si route nip - etu = models.Identite.query.filter_by(code_nip=nip).first() + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() - if ine is not None: # Si route ine - etu = models.Identite.query.filter_by(code_nip=ine).first() + dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first() - if etu is not None: # Si route nip ou ine - return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + app.set_sco_dept(dept.acronym) - # return error_response(501, message="Not implemented") + if etudid is None: + if nip is None: # si ine + etu = models.Identite.query.filter_by(code_nip=str(ine)).first() + return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + else: # si nip + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + + return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) @bp.route("/etudiant/etudid//semestre//groups", methods=["GET"]) @@ -322,13 +324,13 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, i if etudid is None: if nip is not None: # Si route nip # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() # Récupération de sont etudid etudid = etu.etudid if ine is not None: # Si route ine # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() + etu = models.Identite.query.filter_by(code_ine=str(ine)).first() # Récupération de sont etudid etudid = etu.etudid diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index deba20bb0c..6f7778cb37 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -1,11 +1,13 @@ ########################################## Formsemestres ############################################################## from flask import jsonify +import app from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_auth, token_permission_required from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict +from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet @@ -44,7 +46,7 @@ def formsemestre(formsemestre_id: int): ) @token_auth.login_required @token_permission_required(Permission.APIView) -def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size): +def etudiant_bulletin(formsemestre_id, dept, format="json", etudid: int = None, nip: int = None, ine: int = None, ):#*args, size """ Retourne le bulletin de note d'un étudiant @@ -55,17 +57,42 @@ def etudiant_bulletin(formsemestre_id, dept, etudid, format="json", *args, size) """ # Fonction utilisée : app.scodoc.sco_bulletins.formsemestre_billetinetud_dict() - data = [] - if args[0] == "short": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) - elif args[0] == "selectevals": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) - elif args[0] == "long": - data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) - else: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # make_json_formsemestre_bulletinetud - return jsonify(data) + app.set_sco_dept(dept) + + data = [] + + if etudid is None: + if nip is None: # si ine + etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + # data = formsemestre_bulletinetud_dict(formsemestre_id, etu.id) + data = make_json_formsemestre_bulletinetud(formsemestre_id, etu.id) + return data + else: # si nip + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + # data = formsemestre_bulletinetud_dict(formsemestre_id, etu.id) + data = make_json_formsemestre_bulletinetud(formsemestre_id, etu.id) + return data + else: # si etudid + # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) + data = make_json_formsemestre_bulletinetud(formsemestre_id, etudid) + # return jsonify(data) + return data + + + + + # if args[0] == "short": + # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + # elif args[0] == "selectevals": + # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) + # elif args[0] == "long": + # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) + # else: + # return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # + # return jsonify(data) @bp.route("/formsemestre//bulletins", methods=["GET"]) diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index 5f2e0c3f49..cbcafdba65 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -25,16 +25,6 @@ from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS # etudiants def test_etudiants(): - r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - headers=HEADERS, - verify=CHECK_CERTIFICATE, - ) - assert r.status_code == 200 - assert len(r.json()) == 16 - - # Choisis aléatoirement un étudiant dans la liste des étudiants - etu = r.json()[randint(0, len(r.json())) - 1] fields = [ "civilite", @@ -63,6 +53,17 @@ def test_etudiants(): "typeadresse", ] + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiants", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 + assert len(r.json()) == 16 + + # Choisis aléatoirement un étudiant dans la liste des étudiants + etu = r.json()[randint(0, len(r.json())) - 1] + fields_OK = True # Vérifie si tous les champs sont bien présents @@ -75,6 +76,34 @@ def test_etudiants(): # etudiants_courant def test_etudiants_courant(): # XXX TODO pour Seb + + fields = [ + "civilite", + "code_ine", + "code_nip", + "date_naissance", + "email", + "emailperso", + "etudid", + "nom", + "prenom", + "nomprenom", + "lieu_naissance", + "dept_naissance", + "nationalite", + "boursier", + "id", + "domicile", + "villedomicile", + "telephone", + "fax", + "description", + "codepostaldomicile", + "paysdomicile", + "telephonemobile", + "typeadresse", + ] + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiants/courant", headers=HEADERS, @@ -83,9 +112,51 @@ def test_etudiants_courant(): # XXX TODO pour Seb assert r.status_code == 200 assert len(r.json()) == 16 + # Choisis aléatoirement un étudiant dans la liste des étudiants + etu = r.json()[randint(0, len(r.json())) - 1] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in etu: + if field not in fields: + fields_OK = False + + assert fields_OK is True + # etudiant def test_etudiant(): # XXX TODO pour Seb + + fields = [ + "civilite", + "code_ine", + "code_nip", + "date_naissance", + "email", + "emailperso", + "etudid", + "nom", + "prenom", + "nomprenom", + "lieu_naissance", + "dept_naissance", + "nationalite", + "boursier", + "id", + "domicile", + "villedomicile", + "telephone", + "fax", + "description", + "codepostaldomicile", + "paysdomicile", + "telephonemobile", + "typeadresse", + ] + + ######### Test etudid ######### + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1", headers=HEADERS, @@ -94,6 +165,19 @@ def test_etudiant(): # XXX TODO pour Seb assert r.status_code == 200 assert len(r.json()) == 24 + etu = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in etu: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + ######### Test code nip ######### + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/nip/1", headers=HEADERS, verify=CHECK_CERTIFICATE @@ -101,6 +185,19 @@ def test_etudiant(): # XXX TODO pour Seb assert r.status_code == 200 assert len(r.json()) == 24 + etu = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in etu: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + ######### Test code ine ######### + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/ine/1", headers=HEADERS, verify=CHECK_CERTIFICATE @@ -108,9 +205,51 @@ def test_etudiant(): # XXX TODO pour Seb assert r.status_code == 200 assert len(r.json()) == 24 + etu = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in etu: + if field not in fields: + fields_OK = False + + assert fields_OK is True + # etudiant_formsemestres def test_etudiant_formsemestres(): # XXX TODO pour Seb + + fields = [ + "date_fin", + "resp_can_edit", + "dept_id", + "etat", + "resp_can_change_ens", + "id", + "modalite", + "ens_can_edit_eval", + "formation_id", + "gestion_compensation", + "elt_sem_apo", + "semestre_id", + "bul_hide_xml", + "elt_annee_apo", + "titre", + "block_moyennes", + "scodoc7_id", + "date_debut", + "gestion_semestrielle", + "bul_bgcolor", + "formsemestre_id", + "titre_num", + "date_debut_iso", + "date_fin_iso", + "responsables", + ] + + ######### Test etudid ######### + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestres", headers=HEADERS, @@ -119,44 +258,162 @@ def test_etudiant_formsemestres(): # XXX TODO pour Seb assert r.status_code == 200 assert len(r.json()) == 1 - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestres", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 - # - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestres", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 + formsemestre = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in formsemestre: + if field not in fields: + fields_OK = False + + assert fields_OK is True -# etudiant_bulletin_semestre -# def test_etudiant_bulletin_semestre(): -# r = requests.get( -# SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", -# headers=HEADERS, verify=CHECK_CERTIFICATE -# ) -# assert r.status_code == 200 -# assert len(r.json()) == 1 + ######### Test code nip ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestres", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 1 + + formsemestre = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in formsemestre: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + ######### Test code ine ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestres", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 1 + + formsemestre = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in formsemestre: + if field not in fields: + fields_OK = False + + assert fields_OK is True -# r = requests.get( -# SCODOC_URL + "/ScoDoc/api/etudiant/nip//formsemestre//bulletin", -# headers=HEADERS, verify=CHECK_CERTIFICATE -# ) -# assert r.status_code == 200 -# -# r = requests.get( -# SCODOC_URL + "/ScoDoc/api/etudiant/ine//formsemestre//bulletin", -# headers=HEADERS, verify=CHECK_CERTIFICATE -# ) -# assert r.status_code == 200 +#etudiant_bulletin_semestre +def test_etudiant_bulletin_semestre(): + + fields = [ + "etudid", + "formsemestre_id", + "date", + "publie", + "etapes", + "etudiant", + "note", + "rang", + "rang_group", + "note_max", + "bonus_sport_culture", + "ue", + "ue_capitalisee", + "absences", + "appreciation", + ] + + ######### Test etudid ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 15 + + bulletin = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in bulletin: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + + ######### Test code nip ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestre/1/bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 15 + + bulletin = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in bulletin: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + + ######### Test code ine ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestre/1/bulletin", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 15 + + bulletin = r.json() + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in bulletin: + if field not in fields: + fields_OK = False + + assert fields_OK is True + # etudiant_groups def test_etudiant_groups(): + + fields = [ + "partition_id", + "id", + "formsemestre_id", + "partition_name", + "numero", + "bul_show_rank", + "show_in_lists", + "group_id", + "group_name", + ] + + + ######### Test etudid ######### + r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/semestre/1/groups", headers=HEADERS, @@ -165,14 +422,55 @@ def test_etudiant_groups(): assert r.status_code == 200 assert len(r.json()) == 1 - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/nip//semestre//groups", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 - # - # r = requests.get( - # SCODOC_URL + "/ScoDoc/api/etudiant/ine//semestre//groups", - # headers=HEADERS, verify=CHECK_CERTIFICATE - # ) - # assert r.status_code == 200 + groups = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in groups: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + + + ######### Test code nip ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/semestre/1/groups", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 1 + + groups = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in groups: + if field not in fields: + fields_OK = False + + assert fields_OK is True + + ######### Test code ine ######### + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/semestre/1/groups", + headers=HEADERS, verify=CHECK_CERTIFICATE + ) + assert r.status_code == 200 + assert len(r.json()) == 1 + + groups = r.json()[0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in groups: + if field not in fields: + fields_OK = False + + assert fields_OK is True diff --git a/tests/api/test_api_formsemestre_.py b/tests/api/test_api_formsemestre.py similarity index 55% rename from tests/api/test_api_formsemestre_.py rename to tests/api/test_api_formsemestre.py index fc926d1fe0..60eb9fa2cc 100644 --- a/tests/api/test_api_formsemestre_.py +++ b/tests/api/test_api_formsemestre.py @@ -30,6 +30,45 @@ def test_formsemestre(): ) assert r.status_code == 200 + formsemestre = r.json() + + fields = [ + "date_fin", + "resp_can_edit", + "dept_id", + "etat", + "resp_can_change_ens", + "id", + "modalite", + "ens_can_edit_eval", + "formation_id", + "gestion_compensation", + "elt_sem_apo", + "semestre_id", + "bul_hide_xml", + "elt_annee_apo", + "titre", + "block_moyennes", + "scodoc7_id", + "date_debut", + "gestion_semestrielle", + "bul_bgcolor", + "formsemestre_id", + "titre_num", + "date_debut_iso", + "date_fin_iso", + "responsables", + ] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in formsemestre: + if field not in fields: + fields_OK = False + + assert fields_OK is True + # etudiant_bulletin def test_etudiant_bulletin(): #XXX TODO pour Seb @@ -58,21 +97,21 @@ def test_etudiant_bulletin(): #XXX TODO pour Seb assert r.status_code == 200 -# bulletins -def test_bulletins(): - r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre/1/bulletins", - headers=HEADERS, - verify=CHECK_CERTIFICATE, - ) - assert r.status_code == 200 - - -# jury -def test_jury(): - r = requests.get( - SCODOC_URL + "/ScoDoc/api/formsemestre/1/jury", - headers=HEADERS, - verify=CHECK_CERTIFICATE, - ) - assert r.status_code == 200 +# # bulletins +# def test_bulletins(): +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/formsemestre/1/bulletins", +# headers=HEADERS, +# verify=CHECK_CERTIFICATE, +# ) +# assert r.status_code == 200 +# +# +# # jury +# def test_jury(): +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/formsemestre/1/jury", +# headers=HEADERS, +# verify=CHECK_CERTIFICATE, +# ) +# assert r.status_code == 200 From cf0a136071668c9c281466d8efba36763c79b802 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 20 Apr 2022 22:37:04 +0200 Subject: [PATCH 21/49] enrichissement correspondant, desactiver une entreprise --- app/entreprises/__init__.py | 8 +++ app/entreprises/forms.py | 50 ++++++++++++------- app/entreprises/models.py | 13 ++--- app/entreprises/routes.py | 25 +++++++++- app/templates/entreprises/_correspondant.html | 7 +++ app/templates/entreprises/_offre.html | 2 +- app/templates/entreprises/entreprises.html | 1 + app/templates/entreprises/offres_recues.html | 18 +++++-- 8 files changed, 89 insertions(+), 35 deletions(-) diff --git a/app/entreprises/__init__.py b/app/entreprises/__init__.py index b211670b21..7f100d51ed 100644 --- a/app/entreprises/__init__.py +++ b/app/entreprises/__init__.py @@ -39,4 +39,12 @@ def get_dept_acronym(id): return dept.acronym +@bp.app_template_filter() +def get_civilité(civ): + if civ == "H": + return "Monsieur" + else: + return "Madame" + + from app.entreprises import routes diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 654b261860..1305723723 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -80,6 +80,11 @@ class EntrepriseCreationForm(FlaskForm): ville = _build_string_field("Ville de l'entreprise (*)") pays = _build_string_field("Pays de l'entreprise", required=False) + civilite = SelectField( + "Civilité du correspondant", + choices=[("M", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + ) nom_correspondant = _build_string_field("Nom du correspondant", required=False) prenom_correspondant = _build_string_field( "Prénom du correspondant", required=False @@ -91,6 +96,8 @@ class EntrepriseCreationForm(FlaskForm): ) poste = _build_string_field("Poste du correspondant", required=False) service = _build_string_field("Service du correspondant", required=False) + origine = _build_string_field("Origine du correspondant", required=False) + notes = _build_string_field("Notes sur le correspondant", required=False) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) @@ -106,6 +113,8 @@ class EntrepriseCreationForm(FlaskForm): or self.mail.data.strip() or self.poste.data.strip() or self.service.data.strip() + or self.origine.data.strip() + or self.notes.data.strip() ): if not self.nom_correspondant.data.strip(): self.nom_correspondant.errors.append("Ce champ est requis") @@ -184,11 +193,11 @@ class OffreCreationForm(FlaskForm): "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = _build_string_field("Durée (*)") - depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + depts = MultiCheckboxField("Départements (*)", validators=[Optional()], coerce=int) expiration_date = DateField("Date expiration", validators=[Optional()]) correspondant = SelectField("Correspondant à contacté", validators=[Optional()]) fichier = FileField( - "Fichier (*)", + "Fichier", validators=[ Optional(), FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"), @@ -237,7 +246,7 @@ class OffreModificationForm(FlaskForm): "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) duree = _build_string_field("Durée (*)") - depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + depts = MultiCheckboxField("Départements (*)", validators=[Optional()], coerce=int) expiration_date = DateField("Date expiration", validators=[Optional()]) correspondant = SelectField("Correspondant à contacté", validators=[Optional()]) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) @@ -269,6 +278,12 @@ class OffreModificationForm(FlaskForm): class CorrespondantCreationForm(FlaskForm): + civilite = SelectField( + "Civilité (*)", + choices=[("H", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + render_kw={"class": "form-control"}, + ) nom = _build_string_field("Nom (*)", render_kw={"class": "form-control"}) prenom = _build_string_field("Prénom (*)", render_kw={"class": "form-control"}) telephone = _build_string_field( @@ -285,14 +300,12 @@ class CorrespondantCreationForm(FlaskForm): service = _build_string_field( "Service", required=False, render_kw={"class": "form-control"} ) - # depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) - - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - - # self.depts.choices = [ - # (dept.id, dept.acronym) for dept in Departement.query.all() - # ] + origine = _build_string_field( + "Origine", required=False, render_kw={"class": "form-control"} + ) + notes = _build_string_field( + "Notes", required=False, render_kw={"class": "form-control"} + ) def validate(self): validate = True @@ -351,6 +364,11 @@ class CorrespondantsCreationForm(FlaskForm): class CorrespondantModificationForm(FlaskForm): hidden_correspondant_id = HiddenField() hidden_entreprise_id = HiddenField() + civilite = SelectField( + "Civilité (*)", + choices=[("H", "Monsieur"), ("F", "Madame")], + validators=[DataRequired(message=CHAMP_REQUIS)], + ) nom = _build_string_field("Nom (*)") prenom = _build_string_field("Prénom (*)") telephone = _build_string_field("Téléphone (*)", required=False) @@ -360,16 +378,10 @@ class CorrespondantModificationForm(FlaskForm): ) poste = _build_string_field("Poste", required=False) service = _build_string_field("Service", required=False) - # depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) + origine = _build_string_field("Origine", required=False) + notes = _build_string_field("Notes", required=False) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - - # self.depts.choices = [ - # (dept.id, dept.acronym) for dept in Departement.query.all() - # ] - def validate(self): validate = True if not FlaskForm.validate(self): diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 90fcf33576..5e6de7469c 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -11,6 +11,7 @@ class Entreprise(db.Model): ville = db.Column(db.Text) pays = db.Column(db.Text, default="FRANCE") visible = db.Column(db.Boolean, default=False) + active = db.Column(db.Boolean, default=True) correspondants = db.relationship( "EntrepriseCorrespondant", backref="entreprise", @@ -51,12 +52,15 @@ class EntrepriseCorrespondant(db.Model): db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") ) # site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) + civilite = db.Column(db.String(1)) nom = db.Column(db.Text) prenom = db.Column(db.Text) telephone = db.Column(db.Text) mail = db.Column(db.Text) poste = db.Column(db.Text) service = db.Column(db.Text) + origine = db.Column(db.Text) + notes = db.Column(db.Text) def to_dict(self): entreprise = Entreprise.query.filter_by(id=self.entreprise_id).first() @@ -161,15 +165,6 @@ class EntrepriseOffreDepartement(db.Model): dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) -# class EntrepriseCorrespondantDepartement(db.Model): -# __tablename__ = "are_correspondant_departement" -# id = db.Column(db.Integer, primary_key=True) -# correspondant_id = db.Column( -# db.Integer, db.ForeignKey("are_correspondants.id", ondelete="cascade") -# ) -# dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) - - class EntreprisePreferences(db.Model): __tablename__ = "are_preferences" id = db.Column(db.Integer, primary_key=True) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 7fe2e7274b..cc9de05feb 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -59,7 +59,7 @@ def index(): """ Permet d'afficher une page avec la liste des entreprises (visible) et une liste des dernières opérations """ - entreprises = Entreprise.query.filter_by(visible=True) + entreprises = Entreprise.query.filter_by(visible=True, active=True) logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all() return render_template( "entreprises/entreprises.html", @@ -298,12 +298,15 @@ def add_entreprise(): db.session.refresh(entreprise) correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + civilite=form.civilite.data, nom=form.nom_correspondant.data.strip(), prenom=form.prenom_correspondant.data.strip(), telephone=form.telephone.data.strip(), mail=form.mail.data.strip(), poste=form.poste.data.strip(), service=form.service.data.strip(), + origine=form.origine.data.strip(), + notes=form.notes.data.strip(), ) db.session.add(correspondant) if current_user.has_permission(Permission.RelationsEntreprisesValidate, None): @@ -440,6 +443,17 @@ def delete_entreprise(id): ) +@bp.route("/fiche_entreprise/desactiver/", methods=["GET", "POST"]) +def fiche_entreprise_desactiver(id): + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnue" + ) + entreprise.active = False + db.session.commit() + flash("L'entreprise a été désactivé.") + return redirect(url_for("entreprises.index")) + + @bp.route( "/fiche_entreprise_validation//validate_entreprise", methods=["GET", "POST"] ) @@ -697,12 +711,15 @@ def add_correspondant(id): for correspondant_entry in form.correspondants.entries: correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + civilite=correspondant_entry.civilite.data, nom=correspondant_entry.nom.data.strip(), prenom=correspondant_entry.prenom.data.strip(), telephone=correspondant_entry.telephone.data.strip(), mail=correspondant_entry.mail.data.strip(), poste=correspondant_entry.poste.data.strip(), service=correspondant_entry.service.data.strip(), + origine=correspondant_entry.origine.data.strip(), + notes=correspondant_entry.notes.data.strip(), ) log = EntrepriseLog( authenticated_user=current_user.user_name, @@ -735,12 +752,15 @@ def edit_correspondant(id): hidden_correspondant_id=correspondant.id, ) if form.validate_on_submit(): + correspondant.civilite = form.civilite.data correspondant.nom = form.nom.data.strip() correspondant.prenom = form.prenom.data.strip() correspondant.telephone = form.telephone.data.strip() correspondant.mail = form.mail.data.strip() correspondant.poste = form.poste.data.strip() correspondant.service = form.service.data.strip() + correspondant.origine = form.origine.data.strip() + correspondant.notes = form.notes.data.strip() log = EntrepriseLog( authenticated_user=current_user.user_name, object=correspondant.entreprise_id, @@ -753,12 +773,15 @@ def edit_correspondant(id): url_for("entreprises.fiche_entreprise", id=correspondant.entreprise.id) ) elif request.method == "GET": + form.civilite.data = correspondant.civilite form.nom.data = correspondant.nom form.prenom.data = correspondant.prenom form.telephone.data = correspondant.telephone form.mail.data = correspondant.mail form.poste.data = correspondant.poste form.service.data = correspondant.service + form.origine.data = correspondant.origine + form.notes.data = correspondant.notes return render_template( "entreprises/form.html", title="Modification correspondant", diff --git a/app/templates/entreprises/_correspondant.html b/app/templates/entreprises/_correspondant.html index 0def6b89e7..d8c0084606 100644 --- a/app/templates/entreprises/_correspondant.html +++ b/app/templates/entreprises/_correspondant.html @@ -1,6 +1,7 @@ {# -*- mode: jinja-html -*- #}
+ Civilité : {{ correspondant.civilite|get_civilité }}
Nom : {{ correspondant.nom }}
Prénom : {{ correspondant.prenom }}
{% if correspondant.telephone %} @@ -15,6 +16,12 @@ {% if correspondant.service %} Service : {{ correspondant.service }}
{% endif %} + {% if correspondant.origine %} + Origine : {{ correspondant.origine }}
+ {% endif %} + {% if correspondant.notes %} + Notes : {{ correspondant.notes }}
+ {% endif %}
{% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} diff --git a/app/templates/entreprises/_offre.html b/app/templates/entreprises/_offre.html index 5654117860..c799b6f420 100644 --- a/app/templates/entreprises/_offre.html +++ b/app/templates/entreprises/_offre.html @@ -1,6 +1,6 @@ {# -*- mode: jinja-html -*- #}
-
+
Ajouté le {{ offre[0].date_ajout.strftime('%d/%m/%y') }} à {{ offre[0].date_ajout.strftime('%Hh%M') }}
Intitulé : {{ offre[0].intitule }}
Description : {{ offre[0].description }}
diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html index d870e59449..c5434c713a 100644 --- a/app/templates/entreprises/entreprises.html +++ b/app/templates/entreprises/entreprises.html @@ -67,6 +67,7 @@
diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html index 45ac0e540c..97904409f6 100644 --- a/app/templates/entreprises/offres_recues.html +++ b/app/templates/entreprises/offres_recues.html @@ -9,7 +9,7 @@ {% if offres_recues %} {% for offre in offres_recues %}
-
+
Envoyé le {{ offre[0].date_envoi.strftime('%d/%m/%Y') }} à {{ offre[0].date_envoi.strftime('%Hh%M') }} par {{ offre[0].sender_id|get_nomcomplet_by_id }}
Intitulé : {{ offre[1].intitule }}
Description : {{ offre[1].description }}
@@ -19,12 +19,20 @@ {% if offre[1].correspondant_id %} Contacté {{ offre[3].nom }} {{ offre[3].prenom }} - {% if offre[3].mail and offre[3].telephone %} - ({{ offre[3].mail }} - {{ offre[3].telephone }})
- {% else %} - ({{ offre[3].mail }}{{offre[3].telephone}})
+ {% if offre[3].mail and offre[3].telephone %} + ({{ offre[3].mail }} - {{ offre[3].telephone }}) + {% else %} + ({{ offre[3].mail }}{{ offre[3].telephone }}) + {% endif %} {% endif %} + + {% if offre[3].poste %} + , poste : {{ offre[3].poste }} {% endif %} + {% if offre[3].service %} + , service : {{ offre[3].service }} + {% endif %} +
lien vers l'entreprise
From 196f80e2105d39f3c61e82118bfa5ee06c069cdd Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 20 Apr 2022 22:37:45 +0200 Subject: [PATCH 22/49] fix downgrade, ajout colonnes sur les tables relations entreprises --- ...5bae70_ajout_colonnes_tables_relations_.py | 34 +++++++++++++++++++ ...0f86c_tables_module_gestions_relations_.py | 10 ++++-- 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py diff --git a/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py b/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py new file mode 100644 index 0000000000..68d6980427 --- /dev/null +++ b/migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py @@ -0,0 +1,34 @@ +"""ajout colonnes tables relations entreprises + +Revision ID: b1e6885bae70 +Revises: e97b2a10f86c +Create Date: 2022-04-20 21:45:42.828853 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b1e6885bae70' +down_revision = 'e97b2a10f86c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('are_correspondants', sa.Column('civilite', sa.String(length=1), nullable=True)) + op.add_column('are_correspondants', sa.Column('origine', sa.Text(), nullable=True)) + op.add_column('are_correspondants', sa.Column('notes', sa.Text(), nullable=True)) + op.add_column('are_entreprises', sa.Column('active', sa.Boolean(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('are_entreprises', 'active') + op.drop_column('are_correspondants', 'notes') + op.drop_column('are_correspondants', 'origine') + op.drop_column('are_correspondants', 'civilite') + # ### end Alembic commands ### diff --git a/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py b/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py index 3580022f9c..b4a1995e6c 100644 --- a/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py +++ b/migrations/versions/e97b2a10f86c_tables_module_gestions_relations_.py @@ -93,7 +93,9 @@ def upgrade(): def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_constraint(None, "are_offres", type_="foreignkey") + op.drop_constraint( + "are_offres_correspondant_id_fkey", "are_offres", type_="foreignkey" + ) op.drop_column("are_offres", "correspondant_id") op.add_column( "are_contacts", @@ -121,8 +123,10 @@ def downgrade(): op.add_column( "are_contacts", sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True) ) - op.drop_constraint(None, "are_contacts", type_="foreignkey") - op.drop_constraint(None, "are_contacts", type_="foreignkey") + op.drop_constraint( + "are_contacts_entreprise_fkey", "are_contacts", type_="foreignkey" + ) + op.drop_constraint("are_contacts_user_fkey", "are_contacts", type_="foreignkey") op.create_foreign_key( "are_contacts_entreprise_id_fkey", "are_contacts", From 07123089e285d0e1a7b0d2edca7bb69bf0374f6c Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Thu, 21 Apr 2022 15:57:02 +0200 Subject: [PATCH 23/49] =?UTF-8?q?test=20d=C3=A9partement,=20=C3=A9tudiant?= =?UTF-8?q?=20fini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/departements.py | 31 +++++++- tests/api/test_api_departements.py | 112 +++++++++++++++++++++++++---- 2 files changed, 126 insertions(+), 17 deletions(-) diff --git a/app/api/departements.py b/app/api/departements.py index c4b689a1f0..6eacf566c4 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -1,5 +1,5 @@ ############################################### Departements ########################################################## -from flask import g +import app from flask import jsonify from app import models @@ -196,4 +196,31 @@ def semestre_index(dept: str, formsemestre_id: int): Retourne la liste des Ues, ressources et SAE d'un semestre """ - return error_response(501, message="not implemented") + app.set_sco_dept(dept) + + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + + ues = formsemestre.query_ues() + + ues_dict = [] + for ue in ues: + ues_dict.append(ue.to_dict()) + ressources = ue.get_ressources() + saes = ue.get_saes() + + data_ressources = [] + for ressource in ressources: + data_ressources.append(ressource.to_dict()) + + data_saes = [] + for sae in saes: + data_saes.append(sae.to_dict()) + + data = { + "ues": ues_dict, + "ressources": data_ressources, + "saes": data_saes, + } + + return data + #return error_response(501, message="not implemented") diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py index ac4f333973..9e04e8d547 100644 --- a/tests/api/test_api_departements.py +++ b/tests/api/test_api_departements.py @@ -55,9 +55,9 @@ def test_liste_etudiants(): #XXX TODO pour Seb # liste_semestres_courant def test_semestres_courant(): #XXX TODO pour Seb r = requests.get( - SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", - headers=HEADERS, - verify=CHECK_CERTIFICATE, + SCODOC_URL + "/ScoDoc/api/departements/TAPI/semestres_courants", + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -66,18 +66,100 @@ def test_semestres_courant(): #XXX TODO pour Seb # referenciel_competences def test_referenciel_competences(): r = requests.get( - SCODOC_URL - + "/ScoDoc/api/departements/TAPI/formations/1/referentiel_competences", - headers=HEADERS, - verify=CHECK_CERTIFICATE, - ) + SCODOC_URL + + "/ScoDoc/api/departements/TAPI/formations/1/referentiel_competences", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 or 204 -# # semestre_index -# def test_semestre_index(): #XXX TODO pour Seb -# r = requests.get( -# SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", -# headers=HEADERS, verify=CHECK_CERTIFICATE -# ) -# assert r.status_code == 200 +# semestre_index +def test_semestre_index(): #XXX TODO pour Seb + + ue_fields = [ + "semestre_idx", + "type", + "formation_id", + "ue_code", + "id", + "ects", + "acronyme", + "is_external", + "numero", + "code_apogee", + "titre", + "coefficient", + "color", + "ue_id", + ] + + ressource_fields = [ + "heures_tp", + "code_apogee", + "titre", + "coefficient", + "module_type", + "id", + "ects", + "abbrev", + "ue_id", + "code", + "formation_id", + "heures_cours", + "matiere_id", + "heures_td", + "semestre_id", + "numero", + "module_id", + ] + + + sae_fields = [ + "heures_tp", + "code_apogee", + "titre", + "coefficient", + "module_type", + "id", + "ects", + "abbrev", + "ue_id", + "code", + "formation_id", + "heures_cours", + "matiere_id", + "heures_td", + "semestre_id", + "numero", + "module_id", + ] + + r = requests.get( + SCODOC_URL + "/ScoDoc/api/departements/TAPI/formsemestre/1/programme", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) + assert r.status_code == 200 + assert len(r.json()) == 3 + + ue = r.json()["ues"][0] + ressource = r.json()["ressources"][0] + sae = r.json()["saes"][0] + + fields_OK = True + + # Vérifie si tous les champs sont bien présents + for field in ue: + if field not in ue_fields: + fields_OK = False + + for field in ressource: + if field not in ressource_fields: + fields_OK = False + + for field in sae: + if field not in sae_fields: + fields_OK = False + + assert fields_OK is True From ff228aef4efdd7ca49d4355e56e08a690b4ae841 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Thu, 21 Apr 2022 21:18:47 +0200 Subject: [PATCH 24/49] =?UTF-8?q?desactiver=20entreprise,=20visibilit?= =?UTF-8?q?=C3=A9=20correspondants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/entreprises/app_relations_entreprises.py | 4 +- app/entreprises/forms.py | 7 ++- app/entreprises/models.py | 1 + app/entreprises/routes.py | 54 +++++++++++++------ app/scodoc/sco_permissions.py | 1 + app/scodoc/sco_roles_default.py | 7 ++- ...nfirmation.html => confirmation_form.html} | 2 +- .../entreprises/fiche_entreprise.html | 20 +++---- app/templates/entreprises/nav.html | 2 + ...09021e_ajout_colonnes_tables_relations_.py | 40 ++++++++++++++ ...5bae70_ajout_colonnes_tables_relations_.py | 34 ------------ 11 files changed, 107 insertions(+), 65 deletions(-) rename app/templates/entreprises/{delete_confirmation.html => confirmation_form.html} (75%) create mode 100644 migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py delete mode 100644 migrations/versions/b1e6885bae70_ajout_colonnes_tables_relations_.py diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index e3c0d1da4f..d0123bb203 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -137,7 +137,7 @@ def verif_correspondant_data(correspondant_data): correspondant_data[3]: mail correspondant_data[4]: poste correspondant_data[5]: service - correspondant_data[6]: entreprise_id + correspondant_data[6]: entreprise_siret """ # champs obligatoires if ( @@ -182,7 +182,7 @@ def verif_entreprise_data(entreprise_data): if data.strip() == "": return False if EntreprisePreferences.get_check_siret(): - siret = entreprise_data[0].replace(" ", "") # vérification sur le siret + siret = entreprise_data[0].strip().replace(" ", "") # vérification sur le siret if re.match("^\d{14}$", siret) is None: return False try: diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 1305723723..ff95217a24 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -135,7 +135,7 @@ class EntrepriseCreationForm(FlaskForm): def validate_siret(self, siret): if EntreprisePreferences.get_check_siret(): - siret_data = siret.data.replace(" ", "") + siret_data = siret.data.strip().replace(" ", "") self.siret.data = siret_data if re.match("^\d{14}$", siret_data) is None: raise ValidationError("Format incorrect") @@ -605,6 +605,11 @@ class SuppressionConfirmationForm(FlaskForm): submit = SubmitField("Supprimer", render_kw=SUBMIT_MARGE) +class DesactivationConfirmationForm(FlaskForm): + notes_active = TextAreaField("Notes sur la désactivation", validators=[Optional()]) + submit = SubmitField("Désactiver", render_kw=SUBMIT_MARGE) + + class ValidationConfirmationForm(FlaskForm): submit = SubmitField("Valider", render_kw=SUBMIT_MARGE) diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 5e6de7469c..8ea8ef2acf 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -12,6 +12,7 @@ class Entreprise(db.Model): pays = db.Column(db.Text, default="FRANCE") visible = db.Column(db.Boolean, default=False) active = db.Column(db.Boolean, default=True) + notes_active = db.Column(db.Text) correspondants = db.relationship( "EntrepriseCorrespondant", backref="entreprise", diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index cc9de05feb..107aa43677 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -13,6 +13,7 @@ from app.decorators import permission_required from app.entreprises import LOGS_LEN from app.entreprises.forms import ( CorrespondantsCreationForm, + DesactivationConfirmationForm, EntrepriseCreationForm, EntrepriseModificationForm, SuppressionConfirmationForm, @@ -101,7 +102,7 @@ def validation(): @bp.route("/correspondants", methods=["GET"]) -@permission_required(Permission.RelationsEntreprisesView) +@permission_required(Permission.RelationsEntreprisesCorrespondants) def correspondants(): """ Permet d'afficher une page avec la liste des correspondants des entreprises visibles et une liste des dernières opérations @@ -109,7 +110,7 @@ def correspondants(): correspondants = ( db.session.query(EntrepriseCorrespondant, Entreprise) .join(Entreprise, EntrepriseCorrespondant.entreprise_id == Entreprise.id) - .filter_by(visible=True) + .filter_by(visible=True, active=True) ) logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all() return render_template( @@ -129,9 +130,9 @@ def fiche_entreprise(id): La fiche entreprise comporte les informations de l'entreprise, les correspondants de l'entreprise et les offres de l'entreprise. """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnue" - ) + entreprise = Entreprise.query.filter_by( + id=id, visible=True, active=True + ).first_or_404(description=f"fiche entreprise {id} inconnue") offres_with_files = [] depts = are.get_depts() for offre in entreprise.offres: @@ -145,7 +146,9 @@ def fiche_entreprise(id): offre_with_files = are.get_offre_files_and_depts(offre, depts) if offre_with_files is not None: offres_with_files.append(offre_with_files) - correspondants = entreprise.correspondants[:] + correspondants = [] + if current_user.has_permission(Permission.RelationsEntreprisesCorrespondants, None): + correspondants = entreprise.correspondants[:] logs = ( EntrepriseLog.query.order_by(EntrepriseLog.date.desc()) .filter_by(object=id) @@ -437,21 +440,35 @@ def delete_entreprise(id): flash("L'entreprise a été supprimé de la liste.") return redirect(url_for("entreprises.index")) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression entreprise", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @bp.route("/fiche_entreprise/desactiver/", methods=["GET", "POST"]) +@permission_required(Permission.RelationsEntreprisesChange) def fiche_entreprise_desactiver(id): + """ + Permet de désactiver une entreprise + """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( description=f"entreprise {id} inconnue" ) - entreprise.active = False - db.session.commit() - flash("L'entreprise a été désactivé.") - return redirect(url_for("entreprises.index")) + form = DesactivationConfirmationForm() + if form.validate_on_submit(): + entreprise.notes_active = form.notes_active.data.strip() + entreprise.active = False + db.session.commit() + flash("L'entreprise a été désactivé.") + return redirect(url_for("entreprises.index")) + return render_template( + "entreprises/confirmation_form.html", + title="Désactiver entreprise", + form=form, + info_message="Cliquez sur le bouton Désactiver pour confirmer la désactivation", + ) @bp.route( @@ -503,9 +520,10 @@ def delete_validation_entreprise(id): flash("L'entreprise a été supprimé de la liste des entreprise à valider.") return redirect(url_for("entreprises.validation")) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression entreprise", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -659,9 +677,10 @@ def delete_offre(id): flash("L'offre a été supprimé de la fiche entreprise.") return redirect(url_for("entreprises.fiche_entreprise", id=entreprise_id)) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression offre", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -813,9 +832,10 @@ def delete_correspondant(id): url_for("entreprises.fiche_entreprise", id=correspondant.entreprise_id) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression correspondant", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -1039,9 +1059,10 @@ def delete_stage_apprentissage(id): ) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Supression stage/apprentissage", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) @@ -1503,9 +1524,10 @@ def delete_offre_file(offre_id, filedir): url_for("entreprises.fiche_entreprise", id=offre.entreprise_id) ) return render_template( - "entreprises/delete_confirmation.html", + "entreprises/confirmation_form.html", title="Suppression fichier d'une offre", form=form, + info_message="Cliquez sur le bouton Supprimer pour confirmer votre supression", ) diff --git a/app/scodoc/sco_permissions.py b/app/scodoc/sco_permissions.py index c72b3ff50b..b57374fba2 100644 --- a/app/scodoc/sco_permissions.py +++ b/app/scodoc/sco_permissions.py @@ -47,6 +47,7 @@ _SCO_PERMISSIONS = ( ), (1 << 25, "RelationsEntreprisesSend", "Envoyer des offres"), (1 << 26, "RelationsEntreprisesValidate", "Valide les entreprises"), + (1 << 27, "RelationsEntreprisesCorrespondants", "Voir les correspondants"), ) diff --git a/app/scodoc/sco_roles_default.py b/app/scodoc/sco_roles_default.py index 9529b031c1..df0cd4539c 100644 --- a/app/scodoc/sco_roles_default.py +++ b/app/scodoc/sco_roles_default.py @@ -62,7 +62,11 @@ SCO_ROLES_DEFAULTS = { # ObservateurEntreprise est un observateur de l'application entreprise "ObservateurEntreprise": (p.RelationsEntreprisesView,), # UtilisateurEntreprise est un utilisateur de l'application entreprise (droit de modification) - "UtilisateurEntreprise": (p.RelationsEntreprisesView, p.RelationsEntreprisesChange), + "UtilisateurEntreprise": ( + p.RelationsEntreprisesView, + p.RelationsEntreprisesChange, + p.RelationsEntreprisesCorrespondants, + ), # AdminEntreprise est un admin de l'application entreprise (toutes les actions possibles de l'application) "AdminEntreprise": ( p.RelationsEntreprisesView, @@ -70,6 +74,7 @@ SCO_ROLES_DEFAULTS = { p.RelationsEntreprisesExport, p.RelationsEntreprisesSend, p.RelationsEntreprisesValidate, + p.RelationsEntreprisesCorrespondants, ), # Super Admin est un root: création/suppression de départements # _tous_ les droits diff --git a/app/templates/entreprises/delete_confirmation.html b/app/templates/entreprises/confirmation_form.html similarity index 75% rename from app/templates/entreprises/delete_confirmation.html rename to app/templates/entreprises/confirmation_form.html index abd59c47eb..fb87378872 100644 --- a/app/templates/entreprises/delete_confirmation.html +++ b/app/templates/entreprises/confirmation_form.html @@ -5,7 +5,7 @@ {% block app_content %}

{{ title }}


-
Cliquez sur le bouton Supprimer pour confirmer votre supression
+
{{ info_message }}

diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html index b8d4b123d7..938be46be3 100644 --- a/app/templates/entreprises/fiche_entreprise.html +++ b/app/templates/entreprises/fiche_entreprise.html @@ -71,20 +71,20 @@
- {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} - Ajouter stage ou apprentissage - {% endif %}

Liste des stages et apprentissages réalisés au sein de l'entreprise

+ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} + Ajouter stage ou apprentissage + {% endif %} - - - - - - - + + + + + + + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} {% endif %} diff --git a/app/templates/entreprises/nav.html b/app/templates/entreprises/nav.html index 50bca60170..3cd9636dc9 100644 --- a/app/templates/entreprises/nav.html +++ b/app/templates/entreprises/nav.html @@ -2,7 +2,9 @@
Date débutDate finDuréeTypeÉtudiantFormationNotesDate débutDate finDuréeTypeÉtudiantFormationNotesAction
+
  • `); }); } diff --git a/app/templates/entreprises/import_correspondants.html b/app/templates/entreprises/import_correspondants.html index cfbaf11a45..796c2135b4 100644 --- a/app/templates/entreprises/import_correspondants.html +++ b/app/templates/entreprises/import_correspondants.html @@ -25,13 +25,16 @@ {% if not correspondants_import %} + - + + +
    AttributTypeDescription
    civilitetextcivilite du correspondant (H ou F)
    nomtextnom du correspondant
    prenomtextprenom du correspondant
    telephonetexttelephone du correspondant
    mailtextmail du correspondant
    postetextposte du correspondant
    servicetextservice dans lequel travaille le correspondant
    entreprise_siretintegerSIRET de l'entreprise
    originetextorigine du correspondant
    notestextnotes sur le correspondant
    entreprise_sirettextSIRET de l'entreprise
    {% endif %} @@ -40,6 +43,7 @@ {% for correspondant in correspondants_import %}
    + Civilité : {{ correspondant.civilite|get_civilité }}
    Nom : {{ correspondant.nom }}
    Prénom : {{ correspondant.prenom }}
    {% if correspondant.telephone %} @@ -54,7 +58,13 @@ {% if correspondant.service %} Service : {{ correspondant.service }}
    {% endif %} - lien vers l'entreprise + {% if correspondant.origine %} + Origine : {{ correspondant.origine }}
    + {% endif %} + {% if correspondant.notes %} + Notes : {{ correspondant.notes }}
    + {% endif %} + lien vers l'entreprise
    {% endfor %} From 79b79ddc76eea11452d25961fbe7502bdd6e4a19 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 22 Apr 2022 16:22:10 +0200 Subject: [PATCH 26/49] factorisation des fichiers departements.py etudiant.py et formsemestre.py --- app/api/departements.py | 17 ++++----- app/api/etudiants.py | 80 ++++++++-------------------------------- app/api/formsemestres.py | 28 ++++---------- app/api/tools.py | 22 +++++++++++ 4 files changed, 54 insertions(+), 93 deletions(-) create mode 100644 app/api/tools.py diff --git a/app/api/departements.py b/app/api/departements.py index 6eacf566c4..8d977ce254 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -71,21 +71,17 @@ def liste_etudiants(dept: str, formsemestre_id=None): formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() # Récupération du département departement = formsemestre.departement - # Récupération des étudiants - etudiants = departement.etudiants.all() - - # Mise en forme des données - list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants] # Si le formsemestre_id n'a pas été renseigné else: # Récupération du formsemestre departement = models.Departement.query.filter_by(acronym=dept).first() - # Récupération des étudiants - etudiants = departement.etudiants.all() - # Mise en forme des données - list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants] + # Récupération des étudiants + etudiants = departement.etudiants.all() + + # Mise en forme des données + list_etu = [etu.to_dict_bul(include_urls=False) for etu in etudiants] return jsonify(list_etu) @@ -203,6 +199,9 @@ def semestre_index(dept: str, formsemestre_id: int): ues = formsemestre.query_ues() ues_dict = [] + ressources = [] + saes = [] + for ue in ues: ues_dict.append(ue.to_dict()) ressources = ue.get_ressources() diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 6a96d2120a..87692ad468 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -7,6 +7,7 @@ from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_auth, token_permission_required +from app.api.tools import get_etu_from_request from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_groups import get_etud_groups from app.scodoc.sco_permissions import Permission @@ -52,7 +53,6 @@ def etudiants(): data = [d.to_dict_bul(include_urls=False) for d in etu] return jsonify(data) - # return error_response(501, message="Not implemented") @bp.route("/etudiants/courant", methods=["GET"]) @@ -97,7 +97,6 @@ def etudiants_courant(): data.append(etu.to_dict_bul(include_urls=False)) return jsonify(data) - # return error_response(501, message="Not implemented") @bp.route("/etudiant/etudid/", methods=["GET"]) @@ -126,32 +125,8 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): "prenom": "JACQUES" } """ - # etu = [] - - if etudid is None: - if nip is None: # si ine - etu = models.Identite.query.filter_by(code_ine=str(ine)).first() - else: # si nip - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - - else: # si etudid - etu = models.Identite.query.filter_by(id=etudid).first() - - - - # if etudid is not None: # Si route etudid - # # Récupération de l'étudiant - # etu = models.Identite.query.filter_by(id=etudid).first() - # - # if nip is not None: # Si route nip - # # Récupération de l'étudiant - # etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - # - # breakpoint() - # - # if ine is not None: # Si route ine - # # Récupération de l'étudiant - # etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + # Récupération de l'étudiant + etu = get_etu_from_request(etudid, nip, ine) # Mise en forme des données data = etu.to_dict_bul(include_urls=False) @@ -210,31 +185,19 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) # Récupération de toutes les inscriptions inscriptions = models.FormSemestreInscription.query.all() + # Récupération de l'étudiant + etu = get_etu_from_request(etudid, nip, ine) + sems = [] # Filtre les inscriptions contenant l'étudiant for sem in inscriptions: - if etudid is None: - if nip is None: # si ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=str(ine)).first() - if sem.etudid == etu.etudid: - sems.append(sem) - else: # si nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - if sem.etudid == etu.etudid: - sems.append(sem) - else: # si etudid - if sem.etudid == etudid: - sems.append(sem) - - # Mise en forme des données - # data_inscriptions = [d.to_dict() for d in sems] + if sem.etudid == etu.etudid: + sems.append(sem) formsemestres = [] # Filtre les formsemestre contenant les inscriptions de l'étudiant - for sem in sems:#data_inscriptions: + for sem in sems: #data_inscriptions: res = models.FormSemestre.query.filter_by(id=sem.formsemestre_id).first() formsemestres.append(res) @@ -269,12 +232,9 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N app.set_sco_dept(dept.acronym) if etudid is None: - if nip is None: # si ine - etu = models.Identite.query.filter_by(code_nip=str(ine)).first() - return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) - else: # si nip - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - return make_json_formsemestre_bulletinetud(formsemestre_id, etu.etudid) + # Récupération de l'étudiant + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) @@ -322,17 +282,9 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, i # Fonction utilisée : app.scodoc.sco_groups.get_etud_groups() if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - # Récupération de sont etudid - etudid = etu.etudid - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=str(ine)).first() - # Récupération de sont etudid - etudid = etu.etudid + # Récupération de l'étudiant + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid # Récupération du formsemestre sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() @@ -343,4 +295,4 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, i except ValueError: return error_response(409, message="La requête ne peut être traitée en l’état actuel") - return jsonify(data) \ No newline at end of file + return jsonify(data) diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 6f7778cb37..e13eda3b1e 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -6,7 +6,7 @@ from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_auth, token_permission_required -from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict +from app.api.tools import get_etu_from_request from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury @@ -24,10 +24,10 @@ def formsemestre(formsemestre_id: int): """ # Récupération de tous les formsemestres - list_formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id) + formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() # Mise en forme des données - data = list_formsemetre[0].to_dict() + data = formsemetre.to_dict() return jsonify(data) @@ -61,26 +61,14 @@ def etudiant_bulletin(formsemestre_id, dept, format="json", etudid: int = None, app.set_sco_dept(dept) - data = [] - if etudid is None: - if nip is None: # si ine - etu = models.Identite.query.filter_by(code_ine=str(ine)).first() - # data = formsemestre_bulletinetud_dict(formsemestre_id, etu.id) - data = make_json_formsemestre_bulletinetud(formsemestre_id, etu.id) - return data - else: # si nip - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - # data = formsemestre_bulletinetud_dict(formsemestre_id, etu.id) - data = make_json_formsemestre_bulletinetud(formsemestre_id, etu.id) - return data - else: # si etudid - # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid) - data = make_json_formsemestre_bulletinetud(formsemestre_id, etudid) - # return jsonify(data) - return data + # Récupération de l'étudiant + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + data = make_json_formsemestre_bulletinetud(formsemestre_id, etudid) + return data # if args[0] == "short": diff --git a/app/api/tools.py b/app/api/tools.py new file mode 100644 index 0000000000..1daed5b41e --- /dev/null +++ b/app/api/tools.py @@ -0,0 +1,22 @@ +from app import models + +def get_etu_from_request(etudid, nip, ine): + """ + Fonction qui retourne un etudiant en fonction de l'etudid, code nip et code ine rentré en paramètres + + etudid : None ou un int etudid + nip : None ou un int code_nip + ine : None ou un int code_ine + + Exemple de résultat: + """ + + if etudid is None: + if nip is None: # si ine + etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + else: # si nip + etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + else: # si etudid + etu = models.Identite.query.filter_by(id=etudid).first() + + return etu From fd597b87d47efc49096ae4a612d5f07eb79a7908 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Mon, 25 Apr 2022 15:25:45 +0200 Subject: [PATCH 27/49] prise en compte des remarques du 21/04/2022 --- app/api/absences.py | 355 ++++++++++++++++++--------------------- app/api/departements.py | 10 +- app/api/etudiants.py | 102 +++++++---- app/api/evaluations.py | 34 ++-- app/api/formations.py | 35 ++-- app/api/formsemestres.py | 66 ++++++-- app/api/jury.py | 63 +++++-- app/api/logos.py | 4 - app/api/partitions.py | 48 +++--- app/api/tools.py | 8 +- app/models/absences.py | 14 ++ 11 files changed, 414 insertions(+), 325 deletions(-) diff --git a/app/api/absences.py b/app/api/absences.py index 08ba7ef1e1..1ab8807fb0 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -5,11 +5,16 @@ from flask import jsonify from app import models from app.api import bp -from app.api.auth import token_auth from app.api.errors import error_response -from app.decorators import permission_required -from app.api.auth import token_auth, token_permission_required -from app.scodoc.sco_abs import add_absence, add_justif, annule_absence, annule_justif, list_abs_date +from app.api.auth import token_permission_required +from app.api.tools import get_etu_from_request +from app.scodoc.sco_abs import ( + add_absence, + add_justif, + annule_absence, + annule_justif, + list_abs_date, +) from app.scodoc.sco_groups import get_group_members from app.scodoc.sco_permissions import Permission @@ -17,7 +22,6 @@ from app.scodoc.sco_permissions import Permission @bp.route("/absences/etudid/", methods=["GET"]) @bp.route("/absences/nip/", methods=["GET"]) @bp.route("/absences/ine/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def absences(etudid: int = None, nip: int = None, ine: int = None): """ @@ -27,35 +31,34 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): nip: le code nip d'un étudiant ine : le code ine d'un étudiant """ - abs = None - if etudid is not None: # Si route etudid - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid).all() - else: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + if etudid is None: + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid).all() + # Récupération des absences de l'étudiant + abs = models.Absence.query.filter_by(etudid=etudid).all() - if abs is not None: # Si des absences ont bien été trouvé + # Si l'étudiant a au minimum une absence + if len(abs) > 0: # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) - return error_response(501, message="Not implemented") + + return error_response(200, message="Aucune absence trouvé pour cet étudiant") @bp.route("/absences/etudid//abs_just_only", methods=["GET"]) @bp.route("/absences/nip//abs_just_only", methods=["GET"]) @bp.route("/absences/ine//abs_just_only", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def absences_justify(etudid: int = None, nip: int = None, ine: int = None): """ @@ -65,43 +68,65 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): nip: le code nip d'un étudiant ine : le code ine d'un étudiant """ - abs = None - if etudid is not None: # Si route etudid - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() - else: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + if etudid is None: + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etu.etudid, estjust=True).all() + # Récupération des absences justifiées de l'étudiant + abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() - if abs is not None: # Si des absences ont bien été trouvé + # Si l'étudiant a au minimum une absence justifiées + if len(abs) > 0: # Mise en forme des données data = [d.to_dict() for d in abs] return jsonify(data) - return error_response(501, message="Not implemented") + + return error_response( + 200, message="Aucune absence justifié trouvé pour cet étudiant" + ) -@bp.route("/absences/abs_signale?etudid=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?nip=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=", methods=["POST"]) -@bp.route("/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=&moduleimpl_id=", methods=["POST"]) -@token_auth.login_required +### Inutil en définitif ### +@bp.route( + "/absences/abs_signale?etudid=&date=&matin=&justif=" + "&description=", + methods=["POST"], +) +@bp.route( + "/absences/abs_signale?nip=&date=&matin=&justif=" + "&description=", + methods=["POST"], +) +@bp.route( + "/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=", + methods=["POST"], +) +@bp.route( + "/absences/abs_signale?ine=&date=&matin=&justif=" + "&description=&moduleimpl_id=", + methods=["POST"], +) @token_permission_required(Permission.APIAbsChange) -def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, nip: int = None, ine: int = None, - description: str = None, moduleimpl_id: int = None): +def abs_signale( + date: datetime, + matin: bool, + justif: bool, + etudid: int = None, + nip: int = None, + ine: int = None, ### Inutil en définitif + description: str = None, + moduleimpl_id: int = None, +): """ Permet d'ajouter une absence en base @@ -116,114 +141,45 @@ def abs_signale(date: datetime, matin: bool, justif: bool, etudid: int = None, n """ # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() - if description is not None: # Si la description a été renseignée - if moduleimpl_id is not None: # Si le moduleimpl a été renseigné - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description, moduleimpl_id) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - else: # Si le moduleimpl n'a pas été renseigné - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif, description) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin, description) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: - if etudid is not None: # Si route etudid - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - try: - # Utilisation de la fonction add_absence - add_absence(etu.etudid, date, matin, justif) - # Utilisation de la fonction add_justif - add_justif(etu.etudid, date, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - - return error_response(200, message="OK") + if etudid is None: + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) + try: + # Utilisation de la fonction add_absence + add_absence(etudid, date, matin, justif, description, moduleimpl_id) + if justif == True: + # Utilisation de la fonction add_justif + add_justif(etudid, date, matin, description) + except ValueError: + return error_response( + 409, message="La requête ne peut être traitée en l’état actuel" + ) -@bp.route("/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule?nip=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule?ine=&jour=&matin=", methods=["POST"]) -@token_auth.login_required +@bp.route( + "/absences/abs_annule?etudid=&jour=&matin=", + methods=["POST"], +) +@bp.route( + "/absences/abs_annule?nip=&jour=&matin=", + methods=["POST"], +) +@bp.route( + "/absences/abs_annule?ine=&jour=&matin=", + methods=["POST"], +) @token_permission_required(Permission.APIAbsChange) -def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): +def abs_annule( + jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None +): """ Retourne un html @@ -236,32 +192,46 @@ def abs_annule(jour: datetime, matin: str, etudid: int = None, nip: int = None, # Fonction utilisée : app.scodoc.sco_abs.annule_absence() if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération de l'etudid de l'étudiant + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid try: # Utilisation de la fonction annule_absence annule_absence(etudid, jour, matin) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que le 'jour' et le 'matin' sont valides", + ) return error_response(200, message="OK") -@bp.route("/absences/abs_annule_justif?etudid=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule_justif?nip=&jour=&matin=", methods=["POST"]) -@bp.route("/absences/abs_annule_justif?ine=&jour=&matin=", methods=["POST"]) -@token_auth.login_required +@bp.route( + "/absences/abs_annule_justif?etudid=&jour=&matin=", + methods=["POST"], +) +@bp.route( + "/absences/abs_annule_justif?nip=&jour=&matin=", + methods=["POST"], +) +@bp.route( + "/absences/abs_annule_justif?ine=&jour=&matin=", + methods=["POST"], +) @token_permission_required(Permission.APIAbsChange) -def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None): +def abs_annule_justif( + jour: datetime, matin: str, etudid: int = None, nip: int = None, ine: int = None +): """ Retourne un html @@ -274,30 +244,37 @@ def abs_annule_justif(jour: datetime, matin: str, etudid: int = None, nip: int = # Fonction utilisée : app.scodoc.sco_abs.annule_justif() if etudid is None: - if nip is not None: # Si route nip - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_nip=nip).first() - # Récupération de l'etudid de l'étudiant - etudid = etu.etudid - - if ine is not None: # Si route ine - # Récupération de l'étudiant - etu = models.Identite.query.filter_by(code_ine=ine).first() - # Récupération de l'etudid de l'étudiant + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) try: # Utilisation de la fonction annule_justif annule_justif(etudid, jour, matin) except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que le 'jour' et le 'matin' sont valides", + ) return error_response(200, message="OK") -@bp.route("/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", methods=["GET"]) -@token_auth.login_required +@bp.route( + "/absences/abs_group_etat/?group_id=&date_debut=date_debut&date_fin=date_fin", + methods=["GET"], +) @token_permission_required(Permission.APIView) -def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, format="html"): +def abs_groupe_etat( + group_id: int, date_debut, date_fin, with_boursier=True, format="html" +): """ Retoune la liste des absences d'un ou plusieurs groupes entre deux dates """ @@ -307,7 +284,9 @@ def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, for # Utilisation de la fonction get_group_members members = get_group_members(group_id) except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response( + 409, message="La requête ne peut être traitée en l’état actuel" + ) data = [] # Filtre entre les deux dates renseignées @@ -316,4 +295,4 @@ def abs_groupe_etat(group_id: int, date_debut, date_fin, with_boursier=True, for data.append(abs) # return jsonify(data) # XXX TODO faire en sorte de pouvoir renvoyer sa (ex to_dict() dans absences) - return error_response(501, message="Not implemented") \ No newline at end of file + return error_response(501, message="Not implemented") diff --git a/app/api/departements.py b/app/api/departements.py index 8d977ce254..940bd70039 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -1,6 +1,5 @@ ############################################### Departements ########################################################## import app -from flask import jsonify from app import models from app.api import bp @@ -8,9 +7,10 @@ from app.api.auth import token_auth, token_permission_required from app.api.errors import error_response from app.scodoc.sco_permissions import Permission +from flask import jsonify + @bp.route("/departements", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def departements(): """ @@ -31,7 +31,6 @@ def departements(): @bp.route( "/departements//etudiants/liste/", methods=["GET"] ) -@token_auth.login_required @token_permission_required(Permission.APIView) def liste_etudiants(dept: str, formsemestre_id=None): """ @@ -87,7 +86,6 @@ def liste_etudiants(dept: str, formsemestre_id=None): @bp.route("/departements//semestres_courants", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def liste_semestres_courant(dept: str): """ @@ -150,7 +148,6 @@ def liste_semestres_courant(dept: str): "/departements//formations//referentiel_competences", methods=["GET"], ) -@token_auth.login_required @token_permission_required(Permission.APIView) def referenciel_competences(dept: str, formation_id: int): """ @@ -185,7 +182,6 @@ def referenciel_competences(dept: str, formation_id: int): "/departements//formsemestre//programme", methods=["GET"], ) -@token_auth.login_required @token_permission_required(Permission.APIView) def semestre_index(dept: str, formsemestre_id: int): """ @@ -222,4 +218,4 @@ def semestre_index(dept: str, formsemestre_id: int): } return data - #return error_response(501, message="not implemented") + # return error_response(501, message="not implemented") diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 87692ad468..df9b713f03 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -13,9 +13,7 @@ from app.scodoc.sco_groups import get_etud_groups from app.scodoc.sco_permissions import Permission - @bp.route("/etudiants", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def etudiants(): """ @@ -56,7 +54,6 @@ def etudiants(): @bp.route("/etudiants/courant", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def etudiants_courant(): """ @@ -102,7 +99,6 @@ def etudiants_courant(): @bp.route("/etudiant/etudid/", methods=["GET"]) @bp.route("/etudiant/nip/", methods=["GET"]) @bp.route("/etudiant/ine/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def etudiant(etudid: int = None, nip: int = None, ine: int = None): """ @@ -137,7 +133,6 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @bp.route("/etudiant/etudid//formsemestres") @bp.route("/etudiant/nip//formsemestres") @bp.route("/etudiant/ine//formsemestres") -@token_auth.login_required @token_permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ @@ -182,39 +177,46 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) ... ] """ - # Récupération de toutes les inscriptions - inscriptions = models.FormSemestreInscription.query.all() - # Récupération de l'étudiant etu = get_etu_from_request(etudid, nip, ine) - sems = [] - # Filtre les inscriptions contenant l'étudiant - for sem in inscriptions: - if sem.etudid == etu.etudid: - sems.append(sem) + # Récupération de toutes les inscriptions de l'étudiant + formsemestres_inscriptions = models.FormSemestreInscription.query.filter_by( + etud=etu + ).all() formsemestres = [] - - # Filtre les formsemestre contenant les inscriptions de l'étudiant - for sem in sems: #data_inscriptions: - res = models.FormSemestre.query.filter_by(id=sem.formsemestre_id).first() + # Récupération des formsemestres contenant les inscriptions de l'étudiant + for formsemestre_inscription in formsemestres_inscriptions: + res = models.FormSemestre.query.filter_by( + id=formsemestre_inscription.formsemestre_id + ).first() formsemestres.append(res) data = [] # Mise en forme des données - for formsem in formsemestres: - data.append(formsem.to_dict()) + for formsemestre in formsemestres: + data.append(formsemestre.to_dict()) return jsonify(data) -@bp.route("/etudiant/etudid//formsemestre//bulletin", methods=["GET"]) -@bp.route("/etudiant/nip//formsemestre//bulletin", methods=["GET"]) -@bp.route("/etudiant/ine//formsemestre//bulletin", methods=["GET"]) -@token_auth.login_required +@bp.route( + "/etudiant/etudid//formsemestre//bulletin", + methods=["GET"], +) +@bp.route( + "/etudiant/nip//formsemestre//bulletin", + methods=["GET"], +) +@bp.route( + "/etudiant/ine//formsemestre//bulletin", + methods=["GET"], +) @token_permission_required(Permission.APIView) -def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = None, ine: int = None): +def etudiant_bulletin_semestre( + formsemestre_id, etudid: int = None, nip: int = None, ine: int = None +): """ Retourne le bulletin d'un étudiant en fonction de son id et d'un semestre donné @@ -223,7 +225,7 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N nip : le code nip d'un étudiant ine : le code ine d'un étudiant """ - # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() + # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() @@ -233,18 +235,33 @@ def etudiant_bulletin_semestre(formsemestre_id, etudid: int = None, nip: int = N if etudid is None: # Récupération de l'étudiant - etu = get_etu_from_request(etudid, nip, ine) - etudid = etu.etudid + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) -@bp.route("/etudiant/etudid//semestre//groups", methods=["GET"]) -@bp.route("/etudiant/nip//semestre//groups", methods=["GET"]) -@bp.route("/etudiant/ine//semestre//groups", methods=["GET"]) -@token_auth.login_required +@bp.route( + "/etudiant/etudid//semestre//groups", + methods=["GET"], +) +@bp.route( + "/etudiant/nip//semestre//groups", methods=["GET"] +) +@bp.route( + "/etudiant/ine//semestre//groups", methods=["GET"] +) @token_permission_required(Permission.APIView) -def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): +def etudiant_groups( + formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None +): """ Retourne la liste des groupes auxquels appartient l'étudiant dans le semestre indiqué @@ -283,16 +300,27 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None, nip: int = None, i if etudid is None: # Récupération de l'étudiant - etu = get_etu_from_request(etudid, nip, ine) - etudid = etu.etudid + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) # Récupération du formsemestre sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() - #breakpoint() try: # Utilisation de la fonction get_etud_groups data = get_etud_groups(etudid, sem.id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide" + " et le formsemestre_id sont valides", + ) return jsonify(data) diff --git a/app/api/evaluations.py b/app/api/evaluations.py index e3ed707b43..0fac4b49bc 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -3,14 +3,13 @@ from flask import jsonify from app import models from app.api import bp -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.api.errors import error_response from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes from app.scodoc.sco_permissions import Permission @bp.route("/evaluations/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def evaluations(moduleimpl_id: int): """ @@ -29,7 +28,6 @@ def evaluations(moduleimpl_id: int): @bp.route("/evaluations/eval_notes/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def evaluation_notes(evaluation_id: int): """ @@ -42,18 +40,32 @@ def evaluation_notes(evaluation_id: int): try: # Utilisation de la fonction do_evaluation_get_all_notes data = do_evaluation_get_all_notes(evaluation_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Veillez vérifier la conformité du 'evaluation_id'", + ) return jsonify(data) -@bp.route("/evaluations/eval_set_notes?eval_id=&etudid=¬e=", methods=["POST"]) -@bp.route("/evaluations/eval_set_notes?eval_id=&nip=¬e=", methods=["POST"]) -@bp.route("/evaluations/eval_set_notes?eval_id=&ine=¬e=", methods=["POST"]) -@token_auth.login_required +@bp.route( + "/evaluations/eval_set_notes?eval_id=&etudid=¬e=", + methods=["POST"], +) +@bp.route( + "/evaluations/eval_set_notes?eval_id=&nip=¬e=", + methods=["POST"], +) +@bp.route( + "/evaluations/eval_set_notes?eval_id=&ine=¬e=", + methods=["POST"], +) @token_permission_required(Permission.APIEditAllNotes) -def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None): +def evaluation_set_notes( + eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None +): """ Set les notes d'une évaluation pour un étudiant donnée @@ -67,4 +79,4 @@ def evaluation_set_notes(eval_id: int, note: float, etudid: int = None, nip: int # Qu'est ce qu'un user ??? # notes_add() - return error_response(501, message="Not implemented") \ No newline at end of file + return error_response(501, message="Not implemented") diff --git a/app/api/formations.py b/app/api/formations.py index bc7258bb9c..c9c80d7d3c 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -5,14 +5,12 @@ from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_auth, token_permission_required -from app.decorators import permission_required from app.scodoc.sco_formations import formation_export from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission @bp.route("/formations", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def formations(): """ @@ -28,7 +26,6 @@ def formations(): @bp.route("/formations/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def formations_by_id(formation_id: int): """ @@ -46,7 +43,6 @@ def formations_by_id(formation_id: int): @bp.route("/formations/formation_export/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def formation_export_by_formation_id(formation_id: int, export_ids=False): """ @@ -58,13 +54,16 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False): # Utilisation de la fonction formation_export data = formation_export(formation_id) except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Veillez vérifier la conformité du 'formation_id'", + ) return jsonify(data) @bp.route("/formations/apo/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def formsemestre_apo(etape_apo: int): """ @@ -86,7 +85,6 @@ def formsemestre_apo(etape_apo: int): @bp.route("/formations/moduleimpl/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def moduleimpls(moduleimpl_id: int): """ @@ -103,8 +101,10 @@ def moduleimpls(moduleimpl_id: int): return jsonify(data) -@bp.route("/formations/moduleimpl//formsemestre/", methods=["GET"]) -@token_auth.login_required +@bp.route( + "/formations/moduleimpl//formsemestre/", + methods=["GET"], +) @token_permission_required(Permission.APIView) def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ @@ -115,10 +115,15 @@ def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): """ # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list() - try: - # Utilisation de la fonction moduleimpl_list - data = moduleimpl_list(moduleimpl_id, formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # Utilisation de la fonction moduleimpl_list + data = moduleimpl_list(moduleimpl_id, formsemestre_id) - return jsonify(data) \ No newline at end of file + if len(data) == 0: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Aucun moduleimpl ne correspond au 'moduleimpl_id' ou " + "'formsemestre_id' renseigné", + ) + + return jsonify(data) diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index e13eda3b1e..78c6df6f21 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -10,11 +10,13 @@ from app.api.tools import get_etu_from_request from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury -from app.scodoc.sco_recapcomplet import formsemestre_recapcomplet +from app.scodoc.sco_recapcomplet import ( + formsemestre_recapcomplet, + gen_formsemestre_recapcomplet_json, +) @bp.route("/formations/formsemestre/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def formsemestre(formsemestre_id: int): """ @@ -44,9 +46,15 @@ def formsemestre(formsemestre_id: int): "/formsemestre//departements//etudiant/ine//bulletin", methods=["GET"], ) -@token_auth.login_required @token_permission_required(Permission.APIView) -def etudiant_bulletin(formsemestre_id, dept, format="json", etudid: int = None, nip: int = None, ine: int = None, ):#*args, size +def etudiant_bulletin( + formsemestre_id, + dept, + format="json", + etudid: int = None, + nip: int = None, + ine: int = None, +): # *args, size """ Retourne le bulletin de note d'un étudiant @@ -59,18 +67,30 @@ def etudiant_bulletin(formsemestre_id, dept, format="json", etudid: int = None, # make_json_formsemestre_bulletinetud - app.set_sco_dept(dept) - + try: + app.set_sco_dept(dept) + except: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que le nom de département est valide", + ) if etudid is None: # Récupération de l'étudiant - etu = get_etu_from_request(etudid, nip, ine) - etudid = etu.etudid + try: + etu = get_etu_from_request(etudid, nip, ine) + etudid = etu.etudid + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) data = make_json_formsemestre_bulletinetud(formsemestre_id, etudid) return data - # if args[0] == "short": # data = formsemestre_bulletinetud_dict(formsemestre_id, etudid, version=args[0]) # elif args[0] == "selectevals": @@ -83,8 +103,9 @@ def etudiant_bulletin(formsemestre_id, dept, format="json", etudid: int = None, # return jsonify(data) -@bp.route("/formsemestre//bulletins", methods=["GET"]) -@token_auth.login_required +@bp.route( + "/formsemestre//bulletins", methods=["GET"] +) # XXX TODO à revoir @token_permission_required(Permission.APIView) def bulletins(formsemestre_id: int): """ @@ -93,18 +114,23 @@ def bulletins(formsemestre_id: int): formsemestre_id : l'id d'un formesemestre """ # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet() + # gen_formsemestre_recapcomplet_json ?? try: # Utilisation de la fonction formsemestre_recapcomplet - data = formsemestre_recapcomplet(formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + # data = formsemestre_recapcomplet(formsemestre_id) + data = gen_formsemestre_recapcomplet_json(formsemestre_id) + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Veillez vérifier la conformité du 'formation_id'", + ) return jsonify(data) @bp.route("/formsemestre//jury", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def jury(formsemestre_id: int): """ @@ -117,7 +143,11 @@ def jury(formsemestre_id: int): try: # Utilisation de la fonction formsemestre_pvjury data = formsemestre_pvjury(formsemestre_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Veillez vérifier la conformité du 'formation_id'", + ) - return jsonify(data) \ No newline at end of file + return jsonify(data) diff --git a/app/api/jury.py b/app/api/jury.py index 0e72fc1ea6..664e982b04 100644 --- a/app/api/jury.py +++ b/app/api/jury.py @@ -4,13 +4,14 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.scodoc.sco_prepajury import feuille_preparation_jury from app.scodoc.sco_pvjury import formsemestre_pvjury @bp.route("/jury/formsemestre//preparation_jury", methods=["GET"]) -def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction +# @token_permission_required(Permission.) +def jury_preparation(formsemestre_id: int): """ Retourne la feuille de préparation du jury @@ -25,7 +26,8 @@ def jury_preparation(formsemestre_id: int): # XXX TODO check à quoi resemble le @bp.route("/jury/formsemestre//decisions_jury", methods=["GET"]) -def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le retour de la fonction +# @token_permission_required(Permission.) +def jury_decisions(formsemestre_id: int): """ Retourne les décisions du jury suivant un formsemestre donné @@ -39,14 +41,31 @@ def jury_decisions(formsemestre_id: int): # XXX TODO check à quoi resemble le r return error_response(501, message="Not implemented") -@bp.route("/jury/set_decision/etudid?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/nip?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -@bp.route("/jury/set_decision/ine?etudid=&formsemestre_id=" - "&jury=&devenir=&assiduite=", methods=["POST"]) -def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: str, assiduite: bool, - etudid: int = None, nip: int = None, ine: int = None): +@bp.route( + "/jury/set_decision/etudid?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + methods=["POST"], +) +@bp.route( + "/jury/set_decision/nip?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + methods=["POST"], +) +@bp.route( + "/jury/set_decision/ine?etudid=&formsemestre_id=" + "&jury=&devenir=&assiduite=", + methods=["POST"], +) +# @token_permission_required(Permission.) +def set_decision_jury( + formsemestre_id: int, + decision_jury: str, + devenir_jury: str, + assiduite: bool, + etudid: int = None, + nip: int = None, + ine: int = None, +): """ Attribuer la décision du jury et le devenir à un etudiant @@ -61,10 +80,22 @@ def set_decision_jury(formsemestre_id: int, decision_jury: str, devenir_jury: st return error_response(501, message="Not implemented") -@bp.route("/jury/etudid//formsemestre//annule_decision", methods=["DELETE"]) -@bp.route("/jury/nip//formsemestre//annule_decision", methods=["DELETE"]) -@bp.route("/jury/ine//formsemestre//annule_decision", methods=["DELETE"]) -def annule_decision_jury(formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None): +@bp.route( + "/jury/etudid//formsemestre//annule_decision", + methods=["DELETE"], +) +@bp.route( + "/jury/nip//formsemestre//annule_decision", + methods=["DELETE"], +) +@bp.route( + "/jury/ine//formsemestre//annule_decision", + methods=["DELETE"], +) +# @token_permission_required(Permission.) +def annule_decision_jury( + formsemestre_id: int, etudid: int = None, nip: int = None, ine: int = None +): """ Supprime la déciosion du jury pour un étudiant donné @@ -73,4 +104,4 @@ def annule_decision_jury(formsemestre_id: int, etudid: int = None, nip: int = No nip: le code nip d'un étudiant ine : le code ine d'un étudiant """ - return error_response(501, message="Not implemented") \ No newline at end of file + return error_response(501, message="Not implemented") diff --git a/app/api/logos.py b/app/api/logos.py index e1faf0bcf1..663ef602ad 100644 --- a/app/api/logos.py +++ b/app/api/logos.py @@ -44,7 +44,6 @@ from app.scodoc.sco_permissions import Permission @bp.route("/logos", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def api_get_glob_logos(): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): @@ -57,7 +56,6 @@ def api_get_glob_logos(): @bp.route("/logos/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def api_get_glob_logo(logoname): if not g.current_user.has_permission(Permission.ScoSuperAdmin, None): @@ -74,7 +72,6 @@ def api_get_glob_logo(logoname): @bp.route("/departements//logos", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def api_get_local_logos(departement): dept_id = Departement.from_acronym(departement).id @@ -85,7 +82,6 @@ def api_get_local_logos(departement): @bp.route("/departements//logos/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def api_get_local_logo(departement, logoname): # format = requested_format("jpg", ['png', 'jpg']) XXX ? diff --git a/app/api/partitions.py b/app/api/partitions.py index 6369c3af39..03bc24513c 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -3,16 +3,14 @@ from flask import jsonify from app import models from app.api import bp -from app.api.auth import token_auth + from app.api.errors import error_response -from app.decorators import permission_required -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.scodoc.sco_groups import get_group_members, setGroups from app.scodoc.sco_permissions import Permission @bp.route("/partitions/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def partition(formsemestre_id: int): """ @@ -30,13 +28,8 @@ def partition(formsemestre_id: int): # return error_response(501, message="Not implemented") -# @bp.route( -# "/partitions/formsemestre//groups/group_ids?with_codes=&all_groups=&etat=", -# methods=["GET"], -# ) @bp.route("/partitions/groups/", methods=["GET"]) @bp.route("/partitions/groups//etat/", methods=["GET"]) -@token_auth.login_required @token_permission_required(Permission.APIView) def etud_in_group(group_id: int, etat=None): """ @@ -47,29 +40,30 @@ def etud_in_group(group_id: int, etat=None): """ # Fonction utilisée : app.scodoc.sco_groups.get_group_members() - if etat is None: # Si l'état n'est pas renseigné - try: - # Utilisation de la fonction get_group_members - data = get_group_members(group_id) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") - else: # Si l'état est renseigné - try: - # Utilisation de la fonction get_group_members - data = get_group_members(group_id, etat) - except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") + if etat is None: + data = get_group_members(group_id) + else: + data = get_group_members(group_id, etat) + + if len(data) == 0: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Aucun groupe ne correspond au 'group_id' renseigné", + ) return jsonify(data) @bp.route( "/partitions/set_groups?partition_id=&groups_lists=&" - "groups_to_create=&groups_to_delete=", methods=["POST"], + "groups_to_create=&groups_to_delete=", + methods=["POST"], ) -@token_auth.login_required @token_permission_required(Permission.APIEtudChangeGroups) -def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int): +def set_groups( + partition_id: int, groups_lists: int, groups_to_delete: int, groups_to_create: int +): """ Set les groups @@ -84,4 +78,8 @@ def set_groups(partition_id: int, groups_lists: int, groups_to_delete: int, grou setGroups(partition_id, groups_lists, groups_to_create, groups_to_delete) return error_response(200, message="Groups set") except ValueError: - return error_response(409, message="La requête ne peut être traitée en l’état actuel") \ No newline at end of file + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel. \n" + "Veillez vérifier la conformité des éléments passé en paramètres", + ) diff --git a/app/api/tools.py b/app/api/tools.py index 1daed5b41e..4ac0aeda8c 100644 --- a/app/api/tools.py +++ b/app/api/tools.py @@ -1,5 +1,6 @@ from app import models + def get_etu_from_request(etudid, nip, ine): """ Fonction qui retourne un etudiant en fonction de l'etudid, code nip et code ine rentré en paramètres @@ -10,13 +11,12 @@ def get_etu_from_request(etudid, nip, ine): Exemple de résultat: """ - if etudid is None: - if nip is None: # si ine + if nip is None: # si ine etu = models.Identite.query.filter_by(code_ine=str(ine)).first() - else: # si nip + else: # si nip etu = models.Identite.query.filter_by(code_nip=str(nip)).first() - else: # si etudid + else: # si etudid etu = models.Identite.query.filter_by(id=etudid).first() return etu diff --git a/app/models/absences.py b/app/models/absences.py index bbff2c5cf2..830d46f9e4 100644 --- a/app/models/absences.py +++ b/app/models/absences.py @@ -27,6 +27,20 @@ class Absence(db.Model): # XXX TODO: contrainte ajoutée: vérifier suppression du module # (mettre à NULL sans supprimer) + def to_dict(self): + data = { + "id": self.id, + "etudid": self.etudid, + "jour": self.jour, + "estabs": self.estabs, + "estjust": self.estjust, + "matin": self.matin, + "description": self.description, + "entry_date": self.entry_date, + "moduleimpl_id": self.moduleimpl_id, + } + return data + class AbsenceNotification(db.Model): """Notification d'absence émise""" From 128fa38d8203b176a8c917ec818925383c9e01ca Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Mon, 25 Apr 2022 20:49:21 +0200 Subject: [PATCH 28/49] ajout site pour les entreprises, corrections de bugs --- app/entreprises/forms.py | 32 +++++---- app/entreprises/models.py | 35 +++++++--- app/entreprises/routes.py | 69 ++++++++++++++++--- app/static/css/entreprises.css | 9 +-- .../entreprises/fiche_entreprise.html | 33 ++++++--- ...09021e_ajout_colonnes_tables_relations_.py | 40 ----------- ...d1d622_ajout_colonnes_tables_relations_.py | 65 +++++++++++++++++ 7 files changed, 195 insertions(+), 88 deletions(-) delete mode 100644 migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py create mode 100644 migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index ff95217a24..33b5c22de4 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -123,12 +123,9 @@ class EntrepriseCreationForm(FlaskForm): self.prenom_correspondant.errors.append("Ce champ est requis") validate = False if not self.telephone.data.strip() and not self.mail.data.strip(): - self.telephone.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) - self.mail.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate @@ -173,6 +170,15 @@ class EntrepriseModificationForm(FlaskForm): } +class SiteCreationForm(FlaskForm): + nom = _build_string_field("Nom du site (*)") + adresse = _build_string_field("Adresse (*)") + codepostal = _build_string_field("Code postal (*)") + ville = _build_string_field("Ville (*)") + pays = _build_string_field("Pays", required=False) + submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) + + class MultiCheckboxField(SelectMultipleField): widget = ListWidget(prefix_label=False) option_widget = CheckboxInput() @@ -313,10 +319,9 @@ class CorrespondantCreationForm(FlaskForm): validate = False if not self.telephone.data and not self.mail.data: - self.telephone.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) - self.mail.errors.append("Saisir un moyen de contact (mail ou téléphone)") + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate @@ -399,10 +404,9 @@ class CorrespondantModificationForm(FlaskForm): validate = False if not self.telephone.data and not self.mail.data: - self.telephone.errors.append( - "Saisir un moyen de contact (mail ou téléphone)" - ) - self.mail.errors.append("Saisir un moyen de contact (mail ou téléphone)") + msg = "Saisir un moyen de contact (mail ou téléphone)" + self.telephone.errors.append(msg) + self.mail.errors.append(msg) validate = False return validate diff --git a/app/entreprises/models.py b/app/entreprises/models.py index f04d1a231a..4a318d24ab 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -9,16 +9,18 @@ class Entreprise(db.Model): adresse = db.Column(db.Text) codepostal = db.Column(db.Text) ville = db.Column(db.Text) - pays = db.Column(db.Text, default="FRANCE") + pays = db.Column(db.Text) visible = db.Column(db.Boolean, default=False) active = db.Column(db.Boolean, default=True) notes_active = db.Column(db.Text) - correspondants = db.relationship( - "EntrepriseCorrespondant", + + sites = db.relationship( + "EntrepriseSite", backref="entreprise", lazy="dynamic", cascade="all, delete-orphan", ) + offres = db.relationship( "EntrepriseOffre", backref="entreprise", @@ -37,13 +39,24 @@ class Entreprise(db.Model): } -# class EntrepriseSite(db.Model): -# __tablename__ = "are_sites" -# id = db.Column(db.Integer, primary_key=True) -# entreprise_id = db.Column( -# db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") -# ) -# nom = db.Column(db.Text) +class EntrepriseSite(db.Model): + __tablename__ = "are_sites" + id = db.Column(db.Integer, primary_key=True) + entreprise_id = db.Column( + db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") + ) + nom = db.Column(db.Text) + adresse = db.Column(db.Text) + codepostal = db.Column(db.Text) + ville = db.Column(db.Text) + pays = db.Column(db.Text) + + correspondants = db.relationship( + "EntrepriseCorrespondant", + backref="site", + lazy="dynamic", + cascade="all, delete-orphan", + ) class EntrepriseCorrespondant(db.Model): @@ -52,7 +65,7 @@ class EntrepriseCorrespondant(db.Model): entreprise_id = db.Column( db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") ) - # site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) + site_id = db.Column(db.Integer, db.ForeignKey("are_sites.id", ondelete="cascade")) civilite = db.Column(db.String(1)) nom = db.Column(db.Text) prenom = db.Column(db.Text) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index d7c6ec132b..edb5361775 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -16,6 +16,7 @@ from app.entreprises.forms import ( DesactivationConfirmationForm, EntrepriseCreationForm, EntrepriseModificationForm, + SiteCreationForm, SuppressionConfirmationForm, OffreCreationForm, OffreModificationForm, @@ -37,6 +38,7 @@ from app.entreprises.models import ( EntrepriseCorrespondant, EntrepriseLog, EntrepriseContact, + EntrepriseSite, EntrepriseStageApprentissage, EntrepriseEnvoiOffre, EntrepriseOffreDepartement, @@ -146,9 +148,7 @@ def fiche_entreprise(id): offre_with_files = are.get_offre_files_and_depts(offre, depts) if offre_with_files is not None: offres_with_files.append(offre_with_files) - correspondants = [] - if current_user.has_permission(Permission.RelationsEntreprisesCorrespondants, None): - correspondants = entreprise.correspondants[:] + sites = entreprise.sites[:] logs = ( EntrepriseLog.query.order_by(EntrepriseLog.date.desc()) .filter_by(object=id) @@ -166,7 +166,7 @@ def fiche_entreprise(id): "entreprises/fiche_entreprise.html", title="Fiche entreprise", entreprise=entreprise, - correspondants=correspondants, + sites=sites, offres=offres_with_files, logs=logs, stages_apprentissages=stages_apprentissages, @@ -297,10 +297,22 @@ def add_entreprise(): ) db.session.add(entreprise) db.session.commit() + db.session.refresh(entreprise) + site = EntrepriseSite( + entreprise_id=entreprise.id, + nom=form.nom_entreprise.data.strip(), + adresse=form.adresse.data.strip(), + codepostal=form.codepostal.data.strip(), + ville=form.ville.data.strip(), + pays=form.pays.data.strip() if form.pays.data.strip() else "FRANCE", + ) + db.session.add(site) + db.session.commit() if form.nom_correspondant.data.strip(): - db.session.refresh(entreprise) + db.session.refresh(site) correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + site_id=site.id, civilite=form.civilite.data, nom=form.nom_correspondant.data.strip(), prenom=form.prenom_correspondant.data.strip(), @@ -716,20 +728,57 @@ def expired(id): return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id)) -@bp.route("/fiche_entreprise//add_correspondant", methods=["GET", "POST"]) +@bp.route( + "/fiche_entreprise//add_site", + methods=["GET", "POST"], +) @permission_required(Permission.RelationsEntreprisesChange) -def add_correspondant(id): +def add_site(id): + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnue" + ) + form = SiteCreationForm() + if form.validate_on_submit(): + site = EntrepriseSite( + entreprise_id=entreprise.id, + nom=form.nom.data.strip(), + adresse=form.adresse.data.strip(), + codepostal=form.codepostal.data.strip(), + ville=form.ville.data.strip(), + pays=form.pays.data.strip() if form.pays.data.strip() else "FRANCE", + ) + db.session.add(site) + db.session.commit() + flash("Le site a été créé et ajouté à la fiche entreprise") + return redirect(url_for("entreprises.fiche_entreprise", id=entreprise.id)) + return render_template( + "entreprises/form.html", + title="Ajout site", + form=form, + ) + + +@bp.route( + "/fiche_entreprise//add_correspondant/", + methods=["GET", "POST"], +) +@permission_required(Permission.RelationsEntreprisesChange) +def add_correspondant(id_entreprise, id_site): """ Permet d'ajouter un correspondant a une entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnue" + entreprise = Entreprise.query.filter_by( + id=id_entreprise, visible=True + ).first_or_404(description=f"entreprise {id_entreprise} inconnue") + site = EntrepriseSite.query.filter_by(id=id_site).first_or_404( + description=f"site {id_site} inconnue" ) form = CorrespondantsCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): for correspondant_entry in form.correspondants.entries: correspondant = EntrepriseCorrespondant( entreprise_id=entreprise.id, + site_id=site.id, civilite=correspondant_entry.civilite.data, nom=correspondant_entry.nom.data.strip(), prenom=correspondant_entry.prenom.data.strip(), @@ -789,7 +838,7 @@ def edit_correspondant(id): db.session.commit() flash("Le correspondant a été modifié.") return redirect( - url_for("entreprises.fiche_entreprise", id=correspondant.entreprise.id) + url_for("entreprises.fiche_entreprise", id=correspondant.entreprise_id) ) elif request.method == "GET": form.civilite.data = correspondant.civilite diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css index 1f4e5f233a..4362886665 100644 --- a/app/static/css/entreprises.css +++ b/app/static/css/entreprises.css @@ -54,23 +54,24 @@ margin-bottom: -5px; } -.entreprise, .correspondant, .offre { +.entreprise, .correspondant, .offre, .site{ border: solid 2px; border-radius: 10px; padding: 10px; margin-bottom: 10px; + margin-top: 10px; } -.correspondants-et-offres { +.sites-et-offres { display: flex; justify-content: space-between; } -.correspondants-et-offres > div { +.sites-et-offres > div { flex: 1 0 0; } -.correspondants-et-offres > div:nth-child(2) { +.sites-et-offres > div:nth-child(2) { margin-left: 20px; } diff --git a/app/templates/entreprises/fiche_entreprise.html b/app/templates/entreprises/fiche_entreprise.html index 938be46be3..c58dfeb71d 100644 --- a/app/templates/entreprises/fiche_entreprise.html +++ b/app/templates/entreprises/fiche_entreprise.html @@ -37,24 +37,39 @@
    - {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %}
    + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} Modifier + Désactiver Supprimer + Ajouter site Ajouter offre - Ajouter correspondant {% endif %} Liste contacts Voir les offres expirées -
    +
    -
    - {% if correspondants %} +
    + {% if sites %}
    -

    Correspondants

    - {% for correspondant in correspondants %} - {% include 'entreprises/_correspondant.html' %} +

    Sites

    + {% for site in sites %} +
    + Nom : {{ site.nom }}
    + Adresse : {{ site.adresse }}
    + Code postal : {{ site.codepostal }}
    + Ville : {{ site.ville }}
    + Pays : {{ site.pays }} + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} +
    Ajouter correspondant + {% endif %} + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesCorrespondants, None) %} + {% for correspondant in site.correspondants %} + {% include 'entreprises/_correspondant.html' %} + {% endfor %} + {% endif %} +
    {% endfor %}
    {% endif %} @@ -63,7 +78,7 @@

    Offres - Voir les offres expirées

    {% for offre in offres %} - {% include 'entreprises/_offre.html' %} + {% include 'entreprises/_offre.html' %} {% endfor %}
    {% endif %} diff --git a/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py b/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py deleted file mode 100644 index 94a586f5db..0000000000 --- a/migrations/versions/01d13209021e_ajout_colonnes_tables_relations_.py +++ /dev/null @@ -1,40 +0,0 @@ -"""ajout colonnes tables relations entreprises - -Revision ID: 01d13209021e -Revises: e97b2a10f86c -Create Date: 2022-04-21 21:02:01.319876 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = "01d13209021e" -down_revision = "e97b2a10f86c" -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column( - "are_correspondants", sa.Column("civilite", sa.String(length=1), nullable=True) - ) - op.add_column("are_correspondants", sa.Column("origine", sa.Text(), nullable=True)) - op.add_column("are_correspondants", sa.Column("notes", sa.Text(), nullable=True)) - op.add_column("are_entreprises", sa.Column("active", sa.Boolean(), nullable=True)) - op.add_column( - "are_entreprises", sa.Column("notes_active", sa.Text(), nullable=True) - ) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column("are_entreprises", "notes_active") - op.drop_column("are_entreprises", "active") - op.drop_column("are_correspondants", "notes") - op.drop_column("are_correspondants", "origine") - op.drop_column("are_correspondants", "civilite") - # ### end Alembic commands ### diff --git a/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py b/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py new file mode 100644 index 0000000000..dd5a5982bb --- /dev/null +++ b/migrations/versions/d5b3bdd1d622_ajout_colonnes_tables_relations_.py @@ -0,0 +1,65 @@ +"""ajout colonnes tables relations entreprises, sites + +Revision ID: d5b3bdd1d622 +Revises: e97b2a10f86c +Create Date: 2022-04-25 18:29:50.841280 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "d5b3bdd1d622" +down_revision = "e97b2a10f86c" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "are_sites", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("entreprise_id", sa.Integer(), nullable=True), + sa.Column("nom", sa.Text(), nullable=True), + sa.Column("adresse", sa.Text(), nullable=True), + sa.Column("codepostal", sa.Text(), nullable=True), + sa.Column("ville", sa.Text(), nullable=True), + sa.Column("pays", sa.Text(), nullable=True), + sa.ForeignKeyConstraint( + ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade" + ), + sa.PrimaryKeyConstraint("id"), + ) + op.add_column( + "are_correspondants", sa.Column("site_id", sa.Integer(), nullable=True) + ) + op.add_column( + "are_correspondants", sa.Column("civilite", sa.String(length=1), nullable=True) + ) + op.add_column("are_correspondants", sa.Column("origine", sa.Text(), nullable=True)) + op.add_column("are_correspondants", sa.Column("notes", sa.Text(), nullable=True)) + op.create_foreign_key( + None, "are_correspondants", "are_sites", ["site_id"], ["id"], ondelete="cascade" + ) + op.add_column("are_entreprises", sa.Column("active", sa.Boolean(), nullable=True)) + op.add_column( + "are_entreprises", sa.Column("notes_active", sa.Text(), nullable=True) + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("are_entreprises", "notes_active") + op.drop_column("are_entreprises", "active") + op.drop_constraint( + "are_correspondants_site_id_fkey", "are_correspondants", type_="foreignkey" + ) + op.drop_column("are_correspondants", "notes") + op.drop_column("are_correspondants", "origine") + op.drop_column("are_correspondants", "civilite") + op.drop_column("are_correspondants", "site_id") + op.drop_table("are_sites") + # ### end Alembic commands ### From 458aae82d00f2171bd8b24ce7f1c2037f607b59f Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 26 Apr 2022 13:46:09 +0200 Subject: [PATCH 29/49] relecture etudiants.py --- app/api/etudiants.py | 60 +++++++++++++++++--------------------------- app/api/tools.py | 8 +++--- 2 files changed, 27 insertions(+), 41 deletions(-) diff --git a/app/api/etudiants.py b/app/api/etudiants.py index abf951756c..5d50cf2a47 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -1,16 +1,16 @@ #################################################### Etudiants ######################################################## -import app from flask import jsonify +import app from app import models from app.api import bp from app.api.errors import error_response -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.api.tools import get_etu_from_request from app.models import FormSemestreInscription, FormSemestre, Identite -from app.scodoc.sco_bulletins import get_formsemestre_bulletin_etud_json -from app.scodoc.sco_groups import get_etud_groups +from app.scodoc import sco_bulletins +from app.scodoc import sco_groups from app.scodoc.sco_permissions import Permission @@ -46,13 +46,14 @@ def etudiants_courant(): ... """ # Récupération de tous les étudiants - etus = Identite.query.filter( + etuds = Identite.query.filter( Identite.id == FormSemestreInscription.etudid, FormSemestreInscription.formsemestre_id == FormSemestre.id, FormSemestre.date_debut <= app.db.func.now(), - FormSemestre.date_fin >= app.db.func.now()) + FormSemestre.date_fin >= app.db.func.now(), + ) - data = [etu.to_dict_bul(include_urls=False) for etu in etus] + data = [etu.to_dict_bul(include_urls=False) for etu in etuds] return jsonify(data) @@ -97,7 +98,7 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @token_permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ - Retourne la liste des semestres qu'un étudiant a suivis + Retourne la liste des semestres qu'un étudiant a suivi, triés par ordre chronologique. etudid : l'etudid d'un étudiant nip : le code nip d'un étudiant @@ -108,7 +109,6 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) { "titre": "master machine info", "gestion_semestrielle": false, - "scodoc7_id": null, "date_debut": "01/09/2021", "bul_bgcolor": null, "date_fin": "15/12/2022", @@ -139,27 +139,14 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) ] """ # Récupération de l'étudiant - etu = get_etu_from_request(etudid, nip, ine) + etud = get_etu_from_request(etudid, nip, ine) - # Récupération de toutes les inscriptions de l'étudiant - formsemestres_inscriptions = models.FormSemestreInscription.query.filter_by( - etud=etu - ).all() + formsemestres = models.FormSemestre.query.filter( + models.FormSemestreInscription.etudid == etud.id, + models.FormSemestreInscription.formsemestre_id == models.FormSemestre.id, + ).order_by(models.FormSemestre.date_debut) - formsemestres = [] - # Récupération des formsemestres contenant les inscriptions de l'étudiant - for formsemestre_inscription in formsemestres_inscriptions: - res = models.FormSemestre.query.filter_by( - id=formsemestre_inscription.formsemestre_id - ).first_or_404() - formsemestres.append(res) - - data = [] - # Mise en forme des données - for formsemestre in formsemestres: - data.append(formsemestre.to_dict()) - - return jsonify(data) + return jsonify([formsemestre.to_dict() for formsemestre in formsemestres]) @bp.route( @@ -188,7 +175,9 @@ def etudiant_bulletin_semestre( """ # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() @@ -201,10 +190,10 @@ def etudiant_bulletin_semestre( return error_response( 409, message="La requête ne peut être traitée en l’état actuel.\n " - "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + "Veuillez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", ) - return get_formsemestre_bulletin_etud_json(formsemestre, etu) + return sco_bulletins.get_formsemestre_bulletin_etud_json(formsemestre, etu) @bp.route( @@ -255,8 +244,6 @@ def etudiant_groups( } ] """ - # Fonction utilisée : app.scodoc.sco_groups.get_etud_groups() - if etudid is None: # Récupération de l'étudiant try: @@ -266,19 +253,18 @@ def etudiant_groups( return error_response( 409, message="La requête ne peut être traitée en l’état actuel.\n " - "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + "Veuillez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", ) # Récupération du formsemestre sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() try: - # Utilisation de la fonction get_etud_groups - data = get_etud_groups(etudid, sem.id) + data = sco_groups.get_etud_groups(etudid, sem.id) except AttributeError: return error_response( 409, message="La requête ne peut être traitée en l’état actuel.\n " - "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide" + "Veuillez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide" " et le formsemestre_id sont valides", ) diff --git a/app/api/tools.py b/app/api/tools.py index 4ac0aeda8c..775660bdbc 100644 --- a/app/api/tools.py +++ b/app/api/tools.py @@ -13,10 +13,10 @@ def get_etu_from_request(etudid, nip, ine): """ if etudid is None: if nip is None: # si ine - etu = models.Identite.query.filter_by(code_ine=str(ine)).first() + etud = models.Identite.query.filter_by(code_ine=str(ine)).first() else: # si nip - etu = models.Identite.query.filter_by(code_nip=str(nip)).first() + etud = models.Identite.query.filter_by(code_nip=str(nip)).first() else: # si etudid - etu = models.Identite.query.filter_by(id=etudid).first() + etud = models.Identite.query.filter_by(id=etudid).first() - return etu + return etud From 4c28d140a60bdc494c00fa9f2eaf8f3a55c9ba23 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 14:48:43 +0200 Subject: [PATCH 30/49] prise en compte des remarques sur etudiants.py --- app/api/etudiants.py | 85 ++++++++++++-------------------------------- 1 file changed, 22 insertions(+), 63 deletions(-) diff --git a/app/api/etudiants.py b/app/api/etudiants.py index df9b713f03..abf951756c 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -8,51 +8,12 @@ from app.api import bp from app.api.errors import error_response from app.api.auth import token_auth, token_permission_required from app.api.tools import get_etu_from_request -from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud +from app.models import FormSemestreInscription, FormSemestre, Identite +from app.scodoc.sco_bulletins import get_formsemestre_bulletin_etud_json from app.scodoc.sco_groups import get_etud_groups from app.scodoc.sco_permissions import Permission -@bp.route("/etudiants", methods=["GET"]) -@token_permission_required(Permission.APIView) -def etudiants(): - """ - Retourne la liste de tous les étudiants - - Exemple de résultat : - { - "civilite": "X", - "code_ine": null, - "code_nip": null, - "date_naissance": null, - "email": null, - "emailperso": null, - "etudid": 18, - "nom": "MOREL", - "prenom": "JACQUES" - }, - { - "civilite": "X", - "code_ine": null, - "code_nip": null, - "date_naissance": null, - "email": null, - "emailperso": null, - "etudid": 19, - "nom": "FOURNIER", - "prenom": "ANNE" - }, - ... - """ - # Récupération de tous les étudiants - etu = models.Identite.query.all() - - # Mise en forme des données - data = [d.to_dict_bul(include_urls=False) for d in etu] - - return jsonify(data) - - @bp.route("/etudiants/courant", methods=["GET"]) @token_permission_required(Permission.APIView) def etudiants_courant(): @@ -85,13 +46,13 @@ def etudiants_courant(): ... """ # Récupération de tous les étudiants - etus = models.Identite.query.all() + etus = Identite.query.filter( + Identite.id == FormSemestreInscription.etudid, + FormSemestreInscription.formsemestre_id == FormSemestre.id, + FormSemestre.date_debut <= app.db.func.now(), + FormSemestre.date_fin >= app.db.func.now()) - data = [] - # Récupère uniquement les étudiants courant - for etu in etus: - if etu.inscription_courante() is not None: - data.append(etu.to_dict_bul(include_urls=False)) + data = [etu.to_dict_bul(include_urls=False) for etu in etus] return jsonify(data) @@ -190,7 +151,7 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) for formsemestre_inscription in formsemestres_inscriptions: res = models.FormSemestre.query.filter_by( id=formsemestre_inscription.formsemestre_id - ).first() + ).first_or_404() formsemestres.append(res) data = [] @@ -227,25 +188,23 @@ def etudiant_bulletin_semestre( """ # Fonction utilisée : app.scodoc.sco_bulletins_json.make_json_formsemestre_bulletinetud() - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() - dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first() + dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() app.set_sco_dept(dept.acronym) - if etudid is None: - # Récupération de l'étudiant - try: - etu = get_etu_from_request(etudid, nip, ine) - etudid = etu.etudid - except AttributeError: - return error_response( - 409, - message="La requête ne peut être traitée en l’état actuel.\n " - "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", - ) + # Récupération de l'étudiant + try: + etu = get_etu_from_request(etudid, nip, ine) + except AttributeError: + return error_response( + 409, + message="La requête ne peut être traitée en l’état actuel.\n " + "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", + ) - return make_json_formsemestre_bulletinetud(formsemestre_id, etudid) + return get_formsemestre_bulletin_etud_json(formsemestre, etu) @bp.route( @@ -311,7 +270,7 @@ def etudiant_groups( ) # Récupération du formsemestre - sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + sem = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() try: # Utilisation de la fonction get_etud_groups data = get_etud_groups(etudid, sem.id) From be3df71ad63914503dbbf14e7253a9f8f359fdb6 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 15:23:10 +0200 Subject: [PATCH 31/49] prise en compte des remarques pour departement.py --- app/api/departements.py | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/app/api/departements.py b/app/api/departements.py index 940bd70039..eef35853b0 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -3,7 +3,7 @@ import app from app import models from app.api import bp -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.api.errors import error_response from app.scodoc.sco_permissions import Permission @@ -19,7 +19,7 @@ def departements(): Exemple de résultat : [2, 5, 8, 1, 4, 18] """ # Récupération de tous les départements - depts = models.Departement.query.filter_by(visible=True).all() + depts = models.Departement.query.filter_by(visible=True) # Mise en place de la liste avec tous les ids de départements depts_ids = [d.id for d in depts] @@ -67,14 +67,14 @@ def liste_etudiants(dept: str, formsemestre_id=None): # Si le formsemestre_id a été renseigné if formsemestre_id is not None: # Récupération du formsemestre - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() # Récupération du département departement = formsemestre.departement # Si le formsemestre_id n'a pas été renseigné else: # Récupération du formsemestre - departement = models.Departement.query.filter_by(acronym=dept).first() + departement = models.Departement.query.filter_by(acronym=dept).first_or_404() # Récupération des étudiants etudiants = departement.etudiants.all() @@ -129,16 +129,12 @@ def liste_semestres_courant(dept: str): ] """ # Récupération des départements comportant l'acronym mit en paramètre - depts = models.Departement.query.filter_by(acronym=dept).all() - - # Récupération de l'id - id_dept = depts[0].id + dept = models.Departement.query.filter_by(acronym=dept).first_or_404() # Récupération des semestres suivant id_dept - semestres = models.FormSemestre.query.filter_by(dept_id=id_dept, etat=True).all() + semestres = models.FormSemestre.query.filter_by(dept_id=dept.id, etat=True) # Mise en forme des données - data = [d.to_dict() for d in semestres] return jsonify(data) @@ -156,15 +152,13 @@ def referenciel_competences(dept: str, formation_id: int): dept : l'acronym d'un département formation_id : l'id d'une formation """ - depts = models.Departement.query.filter_by(acronym=dept).all() + dept = models.Departement.query.filter_by(acronym=dept).first_or_404() - id_dept = depts[0].id + formation = models.Formation.query.filter_by( + id=formation_id, dept_id=dept.id + ).first_or_404() - formations = models.Formation.query.filter_by( - id=formation_id, dept_id=id_dept - ).all() - - ref_comp = formations[0].referentiel_competence_id + ref_comp = formation.referentiel_competence_id if ref_comp is None: return error_response( @@ -173,10 +167,6 @@ def referenciel_competences(dept: str, formation_id: int): else: return jsonify(ref_comp) - # ref = ApcReferentielCompetences.query.get_or_404(formation_id) - # - # return jsonify(ref.to_dict()) - @bp.route( "/departements//formsemestre//programme", @@ -190,7 +180,7 @@ def semestre_index(dept: str, formsemestre_id: int): app.set_sco_dept(dept) - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() ues = formsemestre.query_ues() @@ -218,4 +208,3 @@ def semestre_index(dept: str, formsemestre_id: int): } return data - # return error_response(501, message="not implemented") From 2cf1e162df17ae8e214baac576ec0a714fe5f427 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 15:26:20 +0200 Subject: [PATCH 32/49] prise en compte des remarques d'evaluations.py --- app/api/evaluations.py | 97 +++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/app/api/evaluations.py b/app/api/evaluations.py index 0fac4b49bc..2c63a8059c 100644 --- a/app/api/evaluations.py +++ b/app/api/evaluations.py @@ -1,6 +1,8 @@ ############################################### Evaluations ########################################################### from flask import jsonify +import app + from app import models from app.api import bp from app.api.auth import token_permission_required @@ -16,15 +18,39 @@ def evaluations(moduleimpl_id: int): Retourne la liste des évaluations à partir de l'id d'un moduleimpl moduleimpl_id : l'id d'un moduleimpl + + Exemple de résultat : + [ + { + "jour": "20/04/2022", + "id": 1, + "heure_fin": "09h00", + "note_max": 20.0, + "visibulletin": true, + "evaluation_type": 0, + "moduleimpl_id": 1, + "heure_debut": "08h00", + "description": "eval1", + "coefficient": 1.0, + "publish_incomplete": false, + "numero": 0, + "evaluation_id": 1, + "jouriso": "2022-04-20", + "duree": "1h", + "descrheure": " de 08h00 \u00e0 09h00", + "matin": 1, + "apresmidi": 0 + }, + ... + ] """ # Récupération de toutes les évaluations - evals = models.Evaluation.query.filter_by(id=moduleimpl_id).all() + evals = models.Evaluation.query.filter_by(id=moduleimpl_id) # Mise en forme des données data = [d.to_dict() for d in evals] return jsonify(data) - # return error_response(501, message="Not implemented") @bp.route("/evaluations/eval_notes/", methods=["GET"]) @@ -34,9 +60,44 @@ def evaluation_notes(evaluation_id: int): Retourne la liste des notes à partir de l'id d'une évaluation donnée evaluation_id : l'id d'une évaluation + + Exemple de résultat : + { + "1": { + "id": 1, + "etudid": 10, + "evaluation_id": 1, + "value": 15.0, + "comment": "", + "date": "Wed, 20 Apr 2022 06:49:05 GMT", + "uid": 2 + }, + "2": { + "id": 2, + "etudid": 1, + "evaluation_id": 1, + "value": 12.0, + "comment": "", + "date": "Wed, 20 Apr 2022 06:49:06 GMT", + "uid": 2 + }, + ... + } """ # Fonction utilisée : app.scodoc.sco_evaluation_db.do_evaluation_get_all_notes() + eval = models.Evaluation.query.filter_by(id=evaluation_id).first_or_404() + + moduleimpl = models.ModuleImpl.query.filter_by(id=eval.moduleimpl_id).first_or_404() + + formsemestre = models.FormSemestre.query.filter_by( + id=moduleimpl.formsemestre_id + ).first_or_404() + + dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() + + app.set_sco_dept(dept.acronym) + try: # Utilisation de la fonction do_evaluation_get_all_notes data = do_evaluation_get_all_notes(evaluation_id) @@ -48,35 +109,3 @@ def evaluation_notes(evaluation_id: int): ) return jsonify(data) - - -@bp.route( - "/evaluations/eval_set_notes?eval_id=&etudid=¬e=", - methods=["POST"], -) -@bp.route( - "/evaluations/eval_set_notes?eval_id=&nip=¬e=", - methods=["POST"], -) -@bp.route( - "/evaluations/eval_set_notes?eval_id=&ine=¬e=", - methods=["POST"], -) -@token_permission_required(Permission.APIEditAllNotes) -def evaluation_set_notes( - eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None -): - """ - Set les notes d'une évaluation pour un étudiant donnée - - eval_id : l'id d'une évaluation - note : la note à attribuer - etudid : l'etudid d'un étudiant - nip : le code nip d'un étudiant - ine : le code ine d'un étudiant - """ - # Fonction utilisée : app.scodoc.sco_saisie_notes.notes_add() - - # Qu'est ce qu'un user ??? - # notes_add() - return error_response(501, message="Not implemented") From c6187cbe0dd9f689a34eff486f2f0fd717ec405e Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 15:28:53 +0200 Subject: [PATCH 33/49] ajout du fichier remiser.py --- app/api/remiser.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 app/api/remiser.py diff --git a/app/api/remiser.py b/app/api/remiser.py new file mode 100644 index 0000000000..e2baf4c3b5 --- /dev/null +++ b/app/api/remiser.py @@ -0,0 +1,72 @@ +# @bp.route("/etudiants", methods=["GET"]) +# @token_permission_required(Permission.APIView) +# def etudiants(): +# """ +# Retourne la liste de tous les étudiants +# +# Exemple de résultat : +# { +# "civilite": "X", +# "code_ine": null, +# "code_nip": null, +# "date_naissance": null, +# "email": null, +# "emailperso": null, +# "etudid": 18, +# "nom": "MOREL", +# "prenom": "JACQUES" +# }, +# { +# "civilite": "X", +# "code_ine": null, +# "code_nip": null, +# "date_naissance": null, +# "email": null, +# "emailperso": null, +# "etudid": 19, +# "nom": "FOURNIER", +# "prenom": "ANNE" +# }, +# ... +# """ +# # Récupération de tous les étudiants +# etu = models.Identite.query.all() +# +# # Mise en forme des données +# data = [d.to_dict_bul(include_urls=False) for d in etu] +# +# return jsonify(data) + + + + +# @bp.route( +# "/evaluations/eval_set_notes?eval_id=&etudid=¬e=", +# methods=["POST"], +# ) +# @bp.route( +# "/evaluations/eval_set_notes?eval_id=&nip=¬e=", +# methods=["POST"], +# ) +# @bp.route( +# "/evaluations/eval_set_notes?eval_id=&ine=¬e=", +# methods=["POST"], +# ) +# @token_permission_required(Permission.APIEditAllNotes) +# def evaluation_set_notes( +# eval_id: int, note: float, etudid: int = None, nip: int = None, ine: int = None +# ): +# """ +# Set les notes d'une évaluation pour un étudiant donnée +# +# eval_id : l'id d'une évaluation +# note : la note à attribuer +# etudid : l'etudid d'un étudiant +# nip : le code nip d'un étudiant +# ine : le code ine d'un étudiant +# """ +# # Fonction utilisée : app.scodoc.sco_saisie_notes.notes_add() +# +# # Qu'est ce qu'un user ??? +# # notes_add() +# return error_response(501, message="Not implemented") \ No newline at end of file From ce2b7334c61c4bdb5ca0a85580f2e2b889961221 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 15:46:28 +0200 Subject: [PATCH 34/49] prise en compte des remarques de formations.py --- app/api/formations.py | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/app/api/formations.py b/app/api/formations.py index c9c80d7d3c..b5fb0ecbc3 100644 --- a/app/api/formations.py +++ b/app/api/formations.py @@ -4,9 +4,8 @@ from flask import jsonify from app import models from app.api import bp from app.api.errors import error_response -from app.api.auth import token_auth, token_permission_required +from app.api.auth import token_permission_required from app.scodoc.sco_formations import formation_export -from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission @@ -34,7 +33,7 @@ def formations_by_id(formation_id: int): formation_id : l'id d'une formation """ # Récupération de la formation - forma = models.Formation.query.filter_by(id=formation_id).first() + forma = models.Formation.query.filter_by(id=formation_id).first_or_404() # Mise en forme des données data = [d.to_dict() for d in forma] @@ -72,12 +71,14 @@ def formsemestre_apo(etape_apo: int): etape_apo : l'id d'une étape apogée """ # Récupération des formsemestres - apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo).all() + apos = models.FormSemestreEtape.query.filter_by(etape_apo=etape_apo) data = [] # Filtre les formsemestres correspondant + mise en forme des données for apo in apos: - formsem = models.FormSemestre.query.filter_by(id=apo["formsemestre_id"]).first() + formsem = models.FormSemestre.query.filter_by( + id=apo["formsemestre_id"] + ).first_or_404() data.append(formsem.to_dict()) return jsonify(data) @@ -93,37 +94,32 @@ def moduleimpls(moduleimpl_id: int): moduleimpl_id : l'id d'un moduleimpl """ # Récupération des tous les moduleimpl - list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id).all() + list_moduleimpls = models.ModuleImpl.query.filter_by(id=moduleimpl_id) # Mise en forme des données - data = list_moduleimpls[0].to_dict() + data = [moduleimpl.to_dict() for moduleimpl in list_moduleimpls] return jsonify(data) @bp.route( - "/formations/moduleimpl//formsemestre/", + "/formations/moduleimpl/formsemestre//liste", methods=["GET"], -) +) # XXX TODO penser à changer la route sur la doc @token_permission_required(Permission.APIView) -def moduleimpls_sem(moduleimpl_id: int, formsemestre_id: int): +def moduleimpls_sem(formsemestre_id: int): """ Retourne la liste des moduleimpl d'un semestre moduleimpl_id : l'id d'un moduleimpl formsemestre_id : l'id d'un formsemestre """ - # Fonction utilisée : app.scodoc.sco_moduleimpl.moduleimpl_list() + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() - # Utilisation de la fonction moduleimpl_list - data = moduleimpl_list(moduleimpl_id, formsemestre_id) + moduleimpls = formsemestre.modimpls_sorted - if len(data) == 0: - return error_response( - 409, - message="La requête ne peut être traitée en l’état actuel. \n" - "Aucun moduleimpl ne correspond au 'moduleimpl_id' ou " - "'formsemestre_id' renseigné", - ) + data = [moduleimpl.to_dict() for moduleimpl in moduleimpls] return jsonify(data) From 46d99a5735f55dba24e39a12ea187261437461d7 Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Tue, 26 Apr 2022 17:12:30 +0200 Subject: [PATCH 35/49] =?UTF-8?q?Prise=20en=20compte=20des=20remarques=20d?= =?UTF-8?q?u=2026/04/2022=20sur=20diff=C3=A9rents=20fichiers=20de=20/api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/__init__.py | 1 - app/api/absences.py | 83 +--------- app/api/departements.py | 8 +- app/api/etudiants.py | 14 +- app/api/formsemestres.py | 72 +++++---- app/api/partitions.py | 2 +- app/api/remiser.py | 73 ++++++++- app/api/sco_api.py | 15 +- app/api/tools.py | 2 +- tests/api/test_api_etudiants.py | 268 ++++++++++++++++---------------- 10 files changed, 278 insertions(+), 260 deletions(-) diff --git a/app/api/__init__.py b/app/api/__init__.py index acf16173b3..36da5c561e 100644 --- a/app/api/__init__.py +++ b/app/api/__init__.py @@ -33,4 +33,3 @@ from app.api import evaluations from app.api import jury from app.api import absences from app.api import logos - diff --git a/app/api/absences.py b/app/api/absences.py index 1ab8807fb0..261cc3337e 100644 --- a/app/api/absences.py +++ b/app/api/absences.py @@ -7,7 +7,7 @@ from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_permission_required -from app.api.tools import get_etu_from_request +from app.api.tools import get_etu_from_etudid_or_nip_or_ine from app.scodoc.sco_abs import ( add_absence, add_justif, @@ -34,7 +34,7 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( @@ -44,7 +44,7 @@ def absences(etudid: int = None, nip: int = None, ine: int = None): ) # Récupération des absences de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid).all() + abs = models.Absence.query.filter_by(etudid=etudid) # Si l'étudiant a au minimum une absence if len(abs) > 0: @@ -71,7 +71,7 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( @@ -81,7 +81,7 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): ) # Récupération des absences justifiées de l'étudiant - abs = models.Absence.query.filter_by(etudid=etudid, estjust=True).all() + abs = models.Absence.query.filter_by(etudid=etudid, estjust=True) # Si l'étudiant a au minimum une absence justifiées if len(abs) > 0: @@ -95,75 +95,6 @@ def absences_justify(etudid: int = None, nip: int = None, ine: int = None): ) -### Inutil en définitif ### -@bp.route( - "/absences/abs_signale?etudid=&date=&matin=&justif=" - "&description=", - methods=["POST"], -) -@bp.route( - "/absences/abs_signale?nip=&date=&matin=&justif=" - "&description=", - methods=["POST"], -) -@bp.route( - "/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=", - methods=["POST"], -) -@bp.route( - "/absences/abs_signale?ine=&date=&matin=&justif=" - "&description=&moduleimpl_id=", - methods=["POST"], -) -@token_permission_required(Permission.APIAbsChange) -def abs_signale( - date: datetime, - matin: bool, - justif: bool, - etudid: int = None, - nip: int = None, - ine: int = None, ### Inutil en définitif - description: str = None, - moduleimpl_id: int = None, -): - """ - Permet d'ajouter une absence en base - - date : la date de l'absence - matin : True ou False - justif : True ou False - etudid : l'etudid d'un étudiant - nip: le code nip d'un étudiant - ine : le code ine d'un étudiant - description : description possible à ajouter sur l'absence - moduleimpl_id : l'id d'un moduleimpl - """ - # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() - - if etudid is None: - # Récupération de l'étudiant - try: - etu = get_etu_from_request(etudid, nip, ine) - etudid = etu.etudid - except AttributeError: - return error_response( - 409, - message="La requête ne peut être traitée en l’état actuel.\n " - "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", - ) - try: - # Utilisation de la fonction add_absence - add_absence(etudid, date, matin, justif, description, moduleimpl_id) - if justif == True: - # Utilisation de la fonction add_justif - add_justif(etudid, date, matin, description) - except ValueError: - return error_response( - 409, message="La requête ne peut être traitée en l’état actuel" - ) - - @bp.route( "/absences/abs_annule?etudid=&jour=&matin=", methods=["POST"], @@ -194,7 +125,7 @@ def abs_annule( if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( @@ -246,7 +177,7 @@ def abs_annule_justif( if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( diff --git a/app/api/departements.py b/app/api/departements.py index eef35853b0..2a3458d53b 100644 --- a/app/api/departements.py +++ b/app/api/departements.py @@ -67,7 +67,9 @@ def liste_etudiants(dept: str, formsemestre_id=None): # Si le formsemestre_id a été renseigné if formsemestre_id is not None: # Récupération du formsemestre - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() # Récupération du département departement = formsemestre.departement @@ -180,7 +182,9 @@ def semestre_index(dept: str, formsemestre_id: int): app.set_sco_dept(dept) - formsemestre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() ues = formsemestre.query_ues() diff --git a/app/api/etudiants.py b/app/api/etudiants.py index 5d50cf2a47..673f9f01c4 100644 --- a/app/api/etudiants.py +++ b/app/api/etudiants.py @@ -7,7 +7,7 @@ from app import models from app.api import bp from app.api.errors import error_response from app.api.auth import token_permission_required -from app.api.tools import get_etu_from_request +from app.api.tools import get_etu_from_etudid_or_nip_or_ine from app.models import FormSemestreInscription, FormSemestre, Identite from app.scodoc import sco_bulletins from app.scodoc import sco_groups @@ -21,6 +21,7 @@ def etudiants_courant(): Retourne la liste des étudiants courant Exemple de résultat : + { { "civilite": "X", "code_ine": null, @@ -44,6 +45,7 @@ def etudiants_courant(): "prenom": "ANNE" }, ... + } """ # Récupération de tous les étudiants etuds = Identite.query.filter( @@ -84,7 +86,7 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): } """ # Récupération de l'étudiant - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) # Mise en forme des données data = etu.to_dict_bul(include_urls=False) @@ -98,7 +100,7 @@ def etudiant(etudid: int = None, nip: int = None, ine: int = None): @token_permission_required(Permission.APIView) def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None): """ - Retourne la liste des semestres qu'un étudiant a suivi, triés par ordre chronologique. + Retourne la liste des semestres qu'un étudiant a suivis, triés par ordre chronologique. etudid : l'etudid d'un étudiant nip : le code nip d'un étudiant @@ -139,7 +141,7 @@ def etudiant_formsemestres(etudid: int = None, nip: int = None, ine: int = None) ] """ # Récupération de l'étudiant - etud = get_etu_from_request(etudid, nip, ine) + etud = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) formsemestres = models.FormSemestre.query.filter( models.FormSemestreInscription.etudid == etud.id, @@ -185,7 +187,7 @@ def etudiant_bulletin_semestre( # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) except AttributeError: return error_response( 409, @@ -247,7 +249,7 @@ def etudiant_groups( if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py index 78c6df6f21..75cfa1d114 100644 --- a/app/api/formsemestres.py +++ b/app/api/formsemestres.py @@ -5,15 +5,12 @@ import app from app import models from app.api import bp from app.api.errors import error_response -from app.api.auth import token_auth, token_permission_required -from app.api.tools import get_etu_from_request +from app.api.auth import token_permission_required +from app.api.tools import get_etu_from_etudid_or_nip_or_ine +from app.scodoc.sco_bulletins import get_formsemestre_bulletin_etud_json from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_permissions import Permission from app.scodoc.sco_pvjury import formsemestre_pvjury -from app.scodoc.sco_recapcomplet import ( - formsemestre_recapcomplet, - gen_formsemestre_recapcomplet_json, -) @bp.route("/formations/formsemestre/", methods=["GET"]) @@ -26,7 +23,7 @@ def formsemestre(formsemestre_id: int): """ # Récupération de tous les formsemestres - formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id).first() + formsemetre = models.FormSemestre.query.filter_by(id=formsemestre_id).first_or_404() # Mise en forme des données data = formsemetre.to_dict() @@ -78,7 +75,7 @@ def etudiant_bulletin( if etudid is None: # Récupération de l'étudiant try: - etu = get_etu_from_request(etudid, nip, ine) + etu = get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine) etudid = etu.etudid except AttributeError: return error_response( @@ -103,9 +100,7 @@ def etudiant_bulletin( # return jsonify(data) -@bp.route( - "/formsemestre//bulletins", methods=["GET"] -) # XXX TODO à revoir +@bp.route("/formsemestre//bulletins", methods=["GET"]) @token_permission_required(Permission.APIView) def bulletins(formsemestre_id: int): """ @@ -113,19 +108,22 @@ def bulletins(formsemestre_id: int): formsemestre_id : l'id d'un formesemestre """ - # Fonction utilisée : app.scodoc.sco_recapcomplet.formsemestre_recapcomplet() - # gen_formsemestre_recapcomplet_json ?? + # Fonction utilisée : app.scodoc.sco_bulletins.get_formsemestre_bulletin_etud_json() - try: - # Utilisation de la fonction formsemestre_recapcomplet - # data = formsemestre_recapcomplet(formsemestre_id) - data = gen_formsemestre_recapcomplet_json(formsemestre_id) - except AttributeError: - return error_response( - 409, - message="La requête ne peut être traitée en l’état actuel. \n" - "Veillez vérifier la conformité du 'formation_id'", - ) + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() + + dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() + + app.set_sco_dept(dept.acronym) + + etuds = formsemestre.etuds + + data = [] + for etu in etuds: + bul_etu = get_formsemestre_bulletin_etud_json(formsemestre, etu) + data.append(bul_etu.json) return jsonify(data) @@ -140,14 +138,24 @@ def jury(formsemestre_id: int): """ # Fonction utilisée : app.scodoc.sco_pvjury.formsemestre_pvjury() - try: - # Utilisation de la fonction formsemestre_pvjury - data = formsemestre_pvjury(formsemestre_id) - except AttributeError: - return error_response( - 409, - message="La requête ne peut être traitée en l’état actuel. \n" - "Veillez vérifier la conformité du 'formation_id'", - ) + formsemestre = models.FormSemestre.query.filter_by( + id=formsemestre_id + ).first_or_404() + + dept = models.Departement.query.filter_by(id=formsemestre.dept_id).first_or_404() + + app.set_sco_dept(dept.acronym) + + data = formsemestre_pvjury(formsemestre_id) + + # try: + # # Utilisation de la fonction formsemestre_pvjury + # data = formsemestre_pvjury(formsemestre_id) + # except AttributeError: + # return error_response( + # 409, + # message="La requête ne peut être traitée en l’état actuel. \n" + # "Veillez vérifier la conformité du 'formation_id'", + # ) return jsonify(data) diff --git a/app/api/partitions.py b/app/api/partitions.py index 03bc24513c..5926ede884 100644 --- a/app/api/partitions.py +++ b/app/api/partitions.py @@ -19,7 +19,7 @@ def partition(formsemestre_id: int): formsemestre_id : l'id d'un formsemestre """ # Récupération de toutes les partitions - partitions = models.Partition.query.filter_by(id=formsemestre_id).all() + partitions = models.Partition.query.filter_by(id=formsemestre_id) # Mise en forme des données data = [d.to_dict() for d in partitions] diff --git a/app/api/remiser.py b/app/api/remiser.py index e2baf4c3b5..b9635eed9a 100644 --- a/app/api/remiser.py +++ b/app/api/remiser.py @@ -38,8 +38,6 @@ # return jsonify(data) - - # @bp.route( # "/evaluations/eval_set_notes?eval_id=&etudid=¬e=", # methods=["POST"], @@ -69,4 +67,73 @@ # # # Qu'est ce qu'un user ??? # # notes_add() -# return error_response(501, message="Not implemented") \ No newline at end of file +# return error_response(501, message="Not implemented") + + +# ### Inutil en définitif ### +# @bp.route( +# "/absences/abs_signale?etudid=&date=&matin=&justif=" +# "&description=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_signale?nip=&date=&matin=&justif=" +# "&description=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_signale?ine=&date=&matin=&justif=" +# "&description=", +# methods=["POST"], +# ) +# @bp.route( +# "/absences/abs_signale?ine=&date=&matin=&justif=" +# "&description=&moduleimpl_id=", +# methods=["POST"], +# ) +# @token_permission_required(Permission.APIAbsChange) +# def abs_signale( +# date: datetime, +# matin: bool, +# justif: bool, +# etudid: int = None, +# nip: int = None, +# ine: int = None, ### Inutil en définitif +# description: str = None, +# moduleimpl_id: int = None, +# ): +# """ +# Permet d'ajouter une absence en base +# +# date : la date de l'absence +# matin : True ou False +# justif : True ou False +# etudid : l'etudid d'un étudiant +# nip: le code nip d'un étudiant +# ine : le code ine d'un étudiant +# description : description possible à ajouter sur l'absence +# moduleimpl_id : l'id d'un moduleimpl +# """ +# # Fonctions utilisées : app.scodoc.sco_abs.add_absence() et app.scodoc.sco_abs.add_justif() +# +# if etudid is None: +# # Récupération de l'étudiant +# try: +# etu = get_etu_from_request(etudid, nip, ine) +# etudid = etu.etudid +# except AttributeError: +# return error_response( +# 409, +# message="La requête ne peut être traitée en l’état actuel.\n " +# "Veilliez vérifier que l'id de l'étudiant (etudid, nip, ine) est valide", +# ) +# try: +# # Utilisation de la fonction add_absence +# add_absence(etudid, date, matin, justif, description, moduleimpl_id) +# if justif == True: +# # Utilisation de la fonction add_justif +# add_justif(etudid, date, matin, description) +# except ValueError: +# return error_response( +# 409, message="La requête ne peut être traitée en l’état actuel" +# ) diff --git a/app/api/sco_api.py b/app/api/sco_api.py index af4e8fdc7d..8440aa556c 100644 --- a/app/api/sco_api.py +++ b/app/api/sco_api.py @@ -50,19 +50,26 @@ from app.api.errors import error_response from app import models from app.models import FormSemestre, FormSemestreInscription, Identite from app.models import ApcReferentielCompetences -from app.scodoc.sco_abs import annule_absence, annule_justif, add_absence, add_justif, list_abs_date +from app.scodoc.sco_abs import ( + annule_absence, + annule_justif, + add_absence, + add_justif, + list_abs_date, +) from app.scodoc.sco_bulletins import formsemestre_bulletinetud_dict from app.scodoc.sco_bulletins_json import make_json_formsemestre_bulletinetud from app.scodoc.sco_evaluation_db import do_evaluation_get_all_notes from app.scodoc.sco_formations import formation_export -from app.scodoc.sco_formsemestre_inscriptions import do_formsemestre_inscription_listinscrits +from app.scodoc.sco_formsemestre_inscriptions import ( + do_formsemestre_inscription_listinscrits, +) from app.scodoc.sco_groups import setGroups, get_etud_groups, get_group_members from app.scodoc.sco_logos import list_logos, find_logo, _list_dept_logos from app.scodoc.sco_moduleimpl import moduleimpl_list from app.scodoc.sco_permissions import Permission - # ###################################################### Logos ########################################################## # # # XXX TODO voir get_logo déjà existant dans app/views/scodoc.py @@ -143,5 +150,3 @@ from app.scodoc.sco_permissions import Permission # # return error_response(200, message="Aucun logo trouvé correspondant aux informations renseignés") # # # # return res - - diff --git a/app/api/tools.py b/app/api/tools.py index 775660bdbc..35b07cf283 100644 --- a/app/api/tools.py +++ b/app/api/tools.py @@ -1,7 +1,7 @@ from app import models -def get_etu_from_request(etudid, nip, ine): +def get_etu_from_etudid_or_nip_or_ine(etudid, nip, ine): """ Fonction qui retourne un etudiant en fonction de l'etudid, code nip et code ine rentré en paramètres diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py index cbcafdba65..e568a4f9b0 100644 --- a/tests/api/test_api_etudiants.py +++ b/tests/api/test_api_etudiants.py @@ -23,55 +23,55 @@ import requests from tests.api.setup_test_api import SCODOC_URL, CHECK_CERTIFICATE, HEADERS -# etudiants -def test_etudiants(): - - fields = [ - "civilite", - "code_ine", - "code_nip", - "date_naissance", - "email", - "emailperso", - "etudid", - "nom", - "prenom", - "nomprenom", - "lieu_naissance", - "dept_naissance", - "nationalite", - "boursier", - "id", - "domicile", - "villedomicile", - "telephone", - "fax", - "description", - "codepostaldomicile", - "paysdomicile", - "telephonemobile", - "typeadresse", - ] - - r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiants", - headers=HEADERS, - verify=CHECK_CERTIFICATE, - ) - assert r.status_code == 200 - assert len(r.json()) == 16 - - # Choisis aléatoirement un étudiant dans la liste des étudiants - etu = r.json()[randint(0, len(r.json())) - 1] - - fields_OK = True - - # Vérifie si tous les champs sont bien présents - for field in etu: - if field not in fields: - fields_OK = False - - assert fields_OK is True +# # etudiants +# def test_etudiants(): +# +# fields = [ +# "civilite", +# "code_ine", +# "code_nip", +# "date_naissance", +# "email", +# "emailperso", +# "etudid", +# "nom", +# "prenom", +# "nomprenom", +# "lieu_naissance", +# "dept_naissance", +# "nationalite", +# "boursier", +# "id", +# "domicile", +# "villedomicile", +# "telephone", +# "fax", +# "description", +# "codepostaldomicile", +# "paysdomicile", +# "telephonemobile", +# "typeadresse", +# ] +# +# r = requests.get( +# SCODOC_URL + "/ScoDoc/api/etudiants", +# headers=HEADERS, +# verify=CHECK_CERTIFICATE, +# ) +# assert r.status_code == 200 +# assert len(r.json()) == 16 +# +# # Choisis aléatoirement un étudiant dans la liste des étudiants +# etu = r.json()[randint(0, len(r.json())) - 1] +# +# fields_OK = True +# +# # Vérifie si tous les champs sont bien présents +# for field in etu: +# if field not in fields: +# fields_OK = False +# +# assert fields_OK is True # etudiants_courant @@ -179,9 +179,10 @@ def test_etudiant(): # XXX TODO pour Seb ######### Test code nip ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip/1", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 24 @@ -199,9 +200,10 @@ def test_etudiant(): # XXX TODO pour Seb ######### Test code ine ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine/1", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 24 @@ -269,13 +271,13 @@ def test_etudiant_formsemestres(): # XXX TODO pour Seb assert fields_OK is True - ######### Test code nip ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestres", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestres", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -293,9 +295,10 @@ def test_etudiant_formsemestres(): # XXX TODO pour Seb ######### Test code ine ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestres", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestres", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -311,89 +314,89 @@ def test_etudiant_formsemestres(): # XXX TODO pour Seb assert fields_OK is True -#etudiant_bulletin_semestre +# etudiant_bulletin_semestre def test_etudiant_bulletin_semestre(): - fields = [ - "etudid", - "formsemestre_id", - "date", - "publie", - "etapes", - "etudiant", - "note", - "rang", - "rang_group", - "note_max", - "bonus_sport_culture", - "ue", - "ue_capitalisee", - "absences", - "appreciation", - ] + # fields = [ + # "etudid", + # "formsemestre_id", + # "date", + # "publie", + # "etapes", + # "etudiant", + # "note", + # "rang", + # "rang_group", + # "note_max", + # "bonus_sport_culture", + # "ue", + # "ue_capitalisee", + # "absences", + # "appreciation", + # ] ######### Test etudid ######### r = requests.get( SCODOC_URL + "/ScoDoc/api/etudiant/etudid/1/formsemestre/1/bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE + headers=HEADERS, + verify=CHECK_CERTIFICATE, ) assert r.status_code == 200 - assert len(r.json()) == 15 - - bulletin = r.json() - - fields_OK = True - - # Vérifie si tous les champs sont bien présents - for field in bulletin: - if field not in fields: - fields_OK = False - - assert fields_OK is True + assert len(r.json()) == 13 + # bulletin = r.json() + # + # fields_OK = True + # + # # Vérifie si tous les champs sont bien présents + # for field in bulletin: + # if field not in fields: + # fields_OK = False + # + # assert fields_OK is True ######### Test code nip ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestre/1/bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/formsemestre/1/bulletin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 - assert len(r.json()) == 15 - - bulletin = r.json() - - fields_OK = True - - # Vérifie si tous les champs sont bien présents - for field in bulletin: - if field not in fields: - fields_OK = False - - assert fields_OK is True + assert len(r.json()) == 13 + # bulletin = r.json() + # + # fields_OK = True + # + # # Vérifie si tous les champs sont bien présents + # for field in bulletin: + # if field not in fields: + # fields_OK = False + # + # assert fields_OK is True ######### Test code ine ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestre/1/bulletin", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/formsemestre/1/bulletin", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 - assert len(r.json()) == 15 - - bulletin = r.json() - - fields_OK = True - - # Vérifie si tous les champs sont bien présents - for field in bulletin: - if field not in fields: - fields_OK = False - - assert fields_OK is True + assert len(r.json()) == 13 + # bulletin = r.json() + # + # fields_OK = True + # + # # Vérifie si tous les champs sont bien présents + # for field in bulletin: + # if field not in fields: + # fields_OK = False + # + # assert fields_OK is True # etudiant_groups @@ -409,8 +412,7 @@ def test_etudiant_groups(): "show_in_lists", "group_id", "group_name", - ] - + ] ######### Test etudid ######### @@ -433,14 +435,13 @@ def test_etudiant_groups(): assert fields_OK is True - - ######### Test code nip ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/semestre/1/groups", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/nip/1/semestre/1/groups", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 1 @@ -458,9 +459,10 @@ def test_etudiant_groups(): ######### Test code ine ######### r = requests.get( - SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/semestre/1/groups", - headers=HEADERS, verify=CHECK_CERTIFICATE - ) + SCODOC_URL + "/ScoDoc/api/etudiant/ine/1/semestre/1/groups", + headers=HEADERS, + verify=CHECK_CERTIFICATE, + ) assert r.status_code == 200 assert len(r.json()) == 1 From 94f1e24d3676db4df3eb07b42c88e71c17b8f80c Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Tue, 26 Apr 2022 20:21:56 +0200 Subject: [PATCH 36/49] ajout bouton retirer sur les formulaires --- app/entreprises/forms.py | 2 +- app/static/css/entreprises.css | 5 +++++ .../entreprises/ajout_correspondants.html | 17 ++++++++++++++++- app/templates/entreprises/envoi_offre_form.html | 17 ++++++++++++++++- app/templates/entreprises/form.html | 6 +++--- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 33b5c22de4..a16190070a 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -339,7 +339,7 @@ class CorrespondantsCreationForm(FlaskForm): correspondant_list = [] for entry in self.correspondants.entries: - if entry.nom.data.strip() and entry.prenom.data.strip(): + if entry.nom.data and entry.prenom.data: if ( entry.nom.data.strip(), entry.prenom.data.strip(), diff --git a/app/static/css/entreprises.css b/app/static/css/entreprises.css index 4362886665..0ede866cb6 100644 --- a/app/static/css/entreprises.css +++ b/app/static/css/entreprises.css @@ -40,6 +40,11 @@ *background-color: #151515; } +.btn-remove { + margin-top: 5px; + margin-bottom: 5px; +} + .fiche-entreprise .btn { margin-top: 5px; margin-bottom: 5px; diff --git a/app/templates/entreprises/ajout_correspondants.html b/app/templates/entreprises/ajout_correspondants.html index be8e5cc813..18070b7fc1 100644 --- a/app/templates/entreprises/ajout_correspondants.html +++ b/app/templates/entreprises/ajout_correspondants.html @@ -35,6 +35,14 @@
    {% endblock %} \ No newline at end of file diff --git a/app/templates/entreprises/envoi_offre_form.html b/app/templates/entreprises/envoi_offre_form.html index ca5ba131e4..6ead6477df 100644 --- a/app/templates/entreprises/envoi_offre_form.html +++ b/app/templates/entreprises/envoi_offre_form.html @@ -36,6 +36,14 @@
    {% endblock %} \ No newline at end of file diff --git a/app/templates/entreprises/form.html b/app/templates/entreprises/form.html index fe51a97b4e..067f4a5085 100644 --- a/app/templates/entreprises/form.html +++ b/app/templates/entreprises/form.html @@ -23,15 +23,15 @@