ScoDoc/misc/example-api-1.py

134 lines
3.3 KiB
Python
Raw Permalink Normal View History

2020-09-26 16:19:37 +02:00
#!/usr/bin/env python3
# -*- mode: python -*-
# -*- coding: utf-8 -*-
"""Exemple connexion sur ScoDoc et utilisation de l'API
- Ouverture session
- Liste semestres
- Liste modules
- Creation d'une évaluation
- Saisie d'une note
Attention: cet exemple est en Python 3 (>= 3.6)
"""
import requests
import urllib3
import pdb
from pprint import pprint as pp
2021-08-15 22:08:38 +02:00
from flask import g, url_for
2020-09-26 16:19:37 +02:00
# A modifier pour votre serveur:
CHECK_CERTIFICATE = False # set to True in production
BASEURL = "https://scodoc.xxx.net/ScoDoc/RT/Scolarite"
USER = "XXX"
PASSWORD = "XXX"
2021-08-10 12:57:38 +02:00
# ---
2020-09-26 16:19:37 +02:00
if not CHECK_CERTIFICATE:
urllib3.disable_warnings()
2021-08-10 12:57:38 +02:00
2020-09-26 16:19:37 +02:00
class ScoError(Exception):
pass
2021-08-10 12:57:38 +02:00
2020-09-26 16:19:37 +02:00
def GET(s, path, errmsg=None):
"""Get and returns as JSON"""
r = s.get(BASEURL + "/" + path, verify=CHECK_CERTIFICATE)
2020-09-26 16:19:37 +02:00
if r.status_code != 200:
raise ScoError(errmsg or "erreur !")
return r.json() # decode la reponse JSON
def POST(s, path, data, errmsg=None):
"""Post"""
r = s.post(BASEURL + "/" + path, data=data, verify=CHECK_CERTIFICATE)
2020-09-26 16:19:37 +02:00
if r.status_code != 200:
raise ScoError(errmsg or "erreur !")
return r.text
# --- Ouverture session (login)
s = requests.Session()
2021-09-09 12:49:23 +02:00
s.post(
"https://deb11.viennet.net/api/auth/login",
data={"user_name": USER, "password": PASSWORD},
)
2020-09-26 16:19:37 +02:00
r = s.get(BASEURL, auth=(USER, PASSWORD), verify=CHECK_CERTIFICATE)
if r.status_code != 200:
raise ScoError("erreur de connection: vérifier adresse et identifiants")
# --- 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:
2021-08-10 12:57:38 +02:00
if sem["etat"]:
2020-09-26 16:19:37 +02:00
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']}")
2020-09-26 16:19:37 +02:00
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(
"Pour vérifier, aller sur: ",
2021-08-15 22:08:38 +02:00
url_for(
"notes.moduleimpl_status",
scodoc_dept="DEPT",
moduleimpl_id=mod["moduleimpl_id"],
),
2020-09-26 16:19:37 +02:00
)
# ---- Saisie d'une note
junk = POST(
s,
"/Notes/save_note",
data={
"etudid": etudid,
"evaluation_id": evaluation_id,
"value": 16.66, # la note !
"comment": "test API",
},
)