From 2e1dcce69d961c5cb9d32ce0c9e748a2c2d97efb Mon Sep 17 00:00:00 2001 From: leonard_montalbano Date: Fri, 18 Feb 2022 11:26:17 +0100 Subject: [PATCH 01/15] =?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 c8b20f91..22dbc3e5 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 02/15] 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 22dbc3e5..5f3bb7d9 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 03/15] 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 5f3bb7d9..bedda559 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 04/15] 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 bedda559..65678988 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 05/15] 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 65678988..491788d5 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 06/15] 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 491788d5..4fb1c0d4 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 07/15] 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 4fb1c0d4..f9802abe 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 08/15] =?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 f9802abe..39c1d977 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 09/15] =?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 39c1d977..f52f2ce7 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 10/15] =?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 d397a93d..acf16173 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 00000000..4f53c064 --- /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 00000000..725ba809 --- /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 00000000..5b0ac28a --- /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 00000000..2ca92d58 --- /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 00000000..327d0c14 --- /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 00000000..5b87de66 --- /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 00000000..11e87c49 --- /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 00000000..1a61beff --- /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 f52f2ce7..af4e8fdc 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 00000000..20f0dfbf --- /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 11/15] =?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 725ba809..6e4d2e5d 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 20f0dfbf..db498cc6 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 c72b3ff5..78cbc1c5 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 12/15] 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 4f53c064..38ec33fb 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 6e4d2e5d..063b0b7e 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 5b0ac28a..ae406e27 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 2ca92d58..db1b7e84 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 327d0c14..84c84b9c 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 5b87de66..2466562e 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 e32f6595..be689d72 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 1a61beff..3847bac4 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 db498cc6..4f3ff1bd 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 78cbc1c5..4915f290 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 13/15] =?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 4f3ff1bd..31df2c68 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 00000000..94fd538a --- /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 00000000..4d3fb36b --- /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 00000000..02f4f4b2 --- /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 00000000..610266c9 --- /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 00000000..b6d0871e --- /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 00000000..3c6d455a --- /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 00000000..73df0ab2 --- /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 00000000..8d006c21 --- /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 00000000..025fe962 --- /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 14/15] =?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 063b0b7e..a7cbc496 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 ae406e27..a39f00bf 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 31df2c68..c176342d 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 9529b031..2be20c8e 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 94fd538a..5338f6ff 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 4d3fb36b..3f8a8f0a 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 02f4f4b2..ca904f0e 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 610266c9..a5e114e6 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 b6d0871e..50b8ad52 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 3c6d455a..2afe7602 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 73df0ab2..5cd40c2a 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 8d006c21..f128d27d 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 025fe962..a3c33518 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 cd5a7e7e..8e19065a 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 15/15] =?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 a7cbc496..43137cd9 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 c176342d..e269412f 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 ca904f0e..b35e6959 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 a5e114e6..f58c6e62 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