#!/usr/bin/env python3 # -*- mode: python -*- # -*- coding: utf-8 -*- """Exemple utilisation API ScoDoc 9 avec jeton obtenu par basic authentication 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). Travail en cours. """ from dotenv import load_dotenv import os import requests import urllib3 from pprint import pprint as pp # --- Lecture configuration (variables d'env ou .env) try: BASEDIR = os.path.abspath(os.path.dirname(__file__)) except NameError: BASEDIR = "." load_dotenv(os.path.join(BASEDIR, ".env")) CHK_CERT = bool(int(os.environ.get("CHECK_CERTIFICATE", False))) SCODOC_URL = os.environ.get("SCODOC_URL") or "http://localhost:5000" API_URL = SCODOC_URL + "/ScoDoc/api" SCODOC_USER = os.environ["SCODOC_USER"] SCODOC_PASSWORD = os.environ["SCODOC_PASSWORD"] print(f"SCODOC_URL={SCODOC_URL}") print(f"API URL={API_URL}") # --- if not CHK_CERT: urllib3.disable_warnings() class ScoError(Exception): pass def GET(path: str, headers={}, errmsg=None): """Get and returns as JSON""" r = requests.get(API_URL + "/" + path, headers=headers or HEADERS, verify=CHK_CERT) if r.status_code != 200: raise ScoError(errmsg or f"erreur status={r.status_code} !") return r.json() # decode la reponse JSON def POST(path: str, data: dict = {}, headers={}, errmsg=None): """Post""" r = requests.post( API_URL + "/" + path, data=data, headers=headers or HEADERS, verify=CHK_CERT ) if r.status_code != 200: raise ScoError(errmsg or "erreur !") return r.json() # decode la reponse JSON # --- Obtention du jeton (token) r = requests.post(API_URL + "/tokens", auth=(SCODOC_USER, SCODOC_PASSWORD)) assert r.status_code == 200 token = r.json()["token"] HEADERS = {"Authorization": f"Bearer {token}"} r = requests.get(API_URL + "/departements", headers=HEADERS, verify=CHK_CERT) if r.status_code != 200: raise ScoError("erreur de connexion: vérifier adresse et identifiants") pp(r.json()) # Liste de tous les étudiants en cours (de tous les depts) r = requests.get(API_URL + "/etudiants/courant", headers=HEADERS, verify=CHK_CERT) if r.status_code != 200: raise ScoError("erreur de connexion: vérifier adresse et identifiants") print(f"{len(r.json())} étudiants courants") # Bulletin d'un BUT formsemestre_id = 1063 # A adapter etudid = 16450 bul = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin") # d'un DUT formsemestre_id = 1062 # A adapter etudid = 16309 bul_dut = GET(f"/etudiant/etudid/{etudid}/formsemestre/{formsemestre_id}/bulletin") # Infos sur un étudiant etudid = 3561 code_nip = "11303314" etud = GET(f"/etudiant/etudid/{etudid}") print(etud) etud = GET(f"/etudiant/nip/{code_nip}") print(etud) sems = GET(f"/etudiant/etudid/{etudid}/formsemestres") print("\n".join([s["titre_num"] for s in sems])) sems = GET(f"/etudiant/nip/{code_nip}/formsemestres") print("\n".join([s["titre_num"] for s in sems])) # Evaluation evals = GET("/evaluations/1") # Partitions d'un BUT formsemestre_id = 1063 # A adapter partitions = GET(f"/formsemestre/{formsemestre_id}/partitions") print(partitions) pid = partitions[1]["id"] partition = GET(f"/partition/{pid}") print(partition) group_id = partition["groups"][0]["id"] etuds = GET(f"/group/{group_id}/etudiants") print(f"{len(etuds)} étudiants") pp(etuds[1]) etuds_dem = GET(f"/group/{group_id}/etudiants/query?etat=D") print(f"{len(etuds_dem)} étudiants") etudid = 16650 group_id = 5315 POST(f"/group/{group_id}/set_etudiant/{etudid}") # # --- Recupere la liste de tous les semestres: # sems = GET(s, "Notes/formsemestre_list?format=json", "Aucun semestre !") # # sems est une liste de semestres (dictionnaires) # for sem in sems: # if sem["etat"]: # break # if sem["etat"] == "0": # raise ScoError("Aucun semestre non verrouillé !") # # Affiche le semestre trouvé: # pp(sem) # # ---- Récupère la description de ce semestre: # # semdescr = GET(s, f"Notes/formsemestre_description?formsemestre_id={sem['formsemestre_id']}&with_evals=0&format=json" ) # # ---- Liste les modules et prend le premier # mods = GET(s, f"/Notes/moduleimpl_list?formsemestre_id={sem['formsemestre_id']}") # print(f"{len(mods)} modules dans le semestre {sem['titre']}") # mod = mods[0] # # ---- Etudiants inscrits dans ce module # inscrits = GET( # s, f"Notes/do_moduleimpl_inscription_list?moduleimpl_id={mod['moduleimpl_id']}" # ) # print(f"{len(inscrits)} inscrits dans ce module") # # prend le premier inscrit, au hasard: # etudid = inscrits[0]["etudid"] # # ---- Création d'une evaluation le dernier jour du semestre # jour = sem["date_fin"] # evaluation_id = POST( # s, # "/Notes/do_evaluation_create", # data={ # "moduleimpl_id": mod["moduleimpl_id"], # "coefficient": 1, # "jour": jour, # "5/9/2019", # "heure_debut": "9h00", # "heure_fin": "10h00", # "note_max": 20, # notes sur 20 # "description": "essai", # }, # errmsg="échec création évaluation", # ) # print( # f"Evaluation créée dans le module {mod['moduleimpl_id']}, evaluation_id={evaluation_id}" # ) # print( # f"Pour vérifier, aller sur: {DEPT_URL}/Notes/moduleimpl_status?moduleimpl_id={mod['moduleimpl_id']}", # )