diff --git a/sco_version.py b/sco_version.py
index 4807fcb6e..436982a2a 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -10,6 +10,8 @@ SCONEWS = """
- ScoDoc 9.3
+ - Nouvelle API REST pour connecter ScoDoc à d'autres applications
-
+
- Module de gestion des relations avec les entreprises
- Prise en charge des parcours BUT
- Association des UEs aux compétences du référentiel
- Jury BUT1
@@ -21,7 +23,6 @@ SCONEWS = """
- Tableau récap. complet pour BUT et autres formations.
- Tableau état évaluations
- - Version alpha du module "relations entreprises"
- Export des trombinoscope en document docx
- Très nombreux correctifs
diff --git a/tests/api/exemple-api-basic.py b/tests/api/exemple-api-basic.py
index bd6248068..1938f728d 100644
--- a/tests/api/exemple-api-basic.py
+++ b/tests/api/exemple-api-basic.py
@@ -4,118 +4,55 @@
"""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).
+ Usage:
+ cd /opt/scodoc/tests/api
+ python -i exemple-api-basic.py
-Travail en cours.
+Pour utiliser l'API, (sur une base quelconque) je fais
+```
+cd /opt/scodoc/tests/api
+
+python
+>>> admin_h = get_auth_headers("admin", "xxx")
+>>> GET("/etudiant/etudid/14806", headers=admin_h)
+```
"""
-from dotenv import load_dotenv
-import json
-import os
-import requests
-import urllib3
+from email import message
from pprint import pprint as pp
+import urllib3
+from setup_test_api import (
+ API_PASSWORD,
+ API_URL,
+ API_USER,
+ APIError,
+ CHECK_CERTIFICATE,
+ get_auth_headers,
+ GET,
+ POST_JSON,
+ SCODOC_URL,
+)
-# --- 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"
-# Admin:
-SCODOC_USER = os.environ["SCODOC_USER"]
-SCODOC_PASSWORD = os.environ["SCODOC_PASSWORD"]
-# Lecteur
-SCODOC_USER_API_LECTEUR = os.environ["SCODOC_USER_API_LECTEUR"]
-SCODOC_PASSWORD_API_LECTEUR = os.environ["SCODOC_PASSWORD_API_LECTEUR"]
+if not CHECK_CERTIFICATE:
+ urllib3.disable_warnings()
print(f"SCODOC_URL={SCODOC_URL}")
print(f"API URL={API_URL}")
-# ---
-if not CHK_CERT:
- urllib3.disable_warnings()
+HEADERS = get_auth_headers(API_USER, API_PASSWORD)
-class ScoError(Exception):
- pass
-
-
-def GET(path: str, headers={}, errmsg=None, dept=None):
- """Get and returns as JSON"""
- if dept:
- url = SCODOC_URL + f"/ScoDoc/{dept}/api" + path
- else:
- url = API_URL + path
- r = requests.get(url, headers=headers or HEADERS, verify=CHK_CERT)
- if r.status_code != 200:
- raise ScoError(errmsg or f"""erreur status={r.status_code} !\n{r.text}""")
- 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 f"erreur status={r.status_code} !\n{r.text}")
- return r.json() # decode la reponse JSON
-
-
-def POST_JSON(path: str, data: dict = {}, headers={}, errmsg=None):
- """Post"""
- r = requests.post(
- API_URL + path,
- json=data,
- headers=headers or HEADERS,
- verify=CHK_CERT,
- )
- if r.status_code != 200:
- raise ScoError(errmsg or f"erreur status={r.status_code} !\n{r.text}")
- return r.json() # decode la reponse JSON
-
-
-def GET_TOKEN(user, password):
- "Obtention du jeton (token)"
- r = requests.post(API_URL + "/tokens", auth=(user, password))
- assert r.status_code == 200
- token = r.json()["token"]
- return {"Authorization": f"Bearer {token}"}
-
-
-HEADERS = GET_TOKEN(SCODOC_USER, SCODOC_PASSWORD)
-HEADERS_USER = GET_TOKEN(SCODOC_USER_API_LECTEUR, SCODOC_PASSWORD_API_LECTEUR)
-
-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())
+departements = GET("/departements", headers=HEADERS)
+pp(departements)
# 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")
+etuds = GET("/etudiants/courants", headers=HEADERS)
-print(f"{len(r.json())} étudiants courants")
+print(f"{len(etuds)} étudiants courants")
+
+raise Exception("arret en mode interactif")
# Bulletin d'un BUT
formsemestre_id = 1063 # A adapter
diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py
index eb926d591..b71467ca2 100644
--- a/tests/api/setup_test_api.py
+++ b/tests/api/setup_test_api.py
@@ -18,10 +18,15 @@ import requests
from dotenv import load_dotenv
import pytest
-BASEDIR = "/opt/scodoc/tests/api"
+# --- Lecture configuration (variables d'env ou .env)
+try:
+ BASEDIR = os.path.abspath(os.path.dirname(__file__))
+except NameError:
+ BASEDIR = "/opt/scodoc/tests/api"
+
load_dotenv(os.path.join(BASEDIR, ".env"))
CHECK_CERTIFICATE = bool(os.environ.get("CHECK_CERTIFICATE", False))
-SCODOC_URL = os.environ["SCODOC_URL"]
+SCODOC_URL = os.environ["SCODOC_URL"] or "http://localhost:5000"
API_URL = SCODOC_URL + "/ScoDoc/api"
API_USER = os.environ.get("API_USER", "test")
API_PASSWORD = os.environ.get("API_PASSWD", "test")