123 lines
3.1 KiB
Python
123 lines
3.1 KiB
Python
|
#!/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
|
||
|
|
||
|
# 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"
|
||
|
|
||
|
# ---
|
||
|
if not CHECK_CERTIFICATE:
|
||
|
urllib3.disable_warnings()
|
||
|
|
||
|
class ScoError(Exception):
|
||
|
pass
|
||
|
|
||
|
def GET(s, path, errmsg=None):
|
||
|
"""Get and returns as JSON"""
|
||
|
r = s.get(BASEURL + "/" + path)
|
||
|
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)
|
||
|
if r.status_code != 200:
|
||
|
raise ScoError(errmsg or "erreur !")
|
||
|
return r.text
|
||
|
|
||
|
|
||
|
# --- Ouverture session (login)
|
||
|
s = requests.Session()
|
||
|
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:
|
||
|
if sem["etat"] == "1":
|
||
|
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/do_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(
|
||
|
"Pour vérifier, aller sur: ",
|
||
|
BASEURL + "/Notes/moduleimpl_status?moduleimpl_id=" + mod["moduleimpl_id"],
|
||
|
)
|
||
|
|
||
|
# ---- 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",
|
||
|
},
|
||
|
)
|