diff --git a/app/api/billets_absences.py b/app/api/billets_absences.py
index e5d0a536208a9596eeab2c36b10161d9d4f1c987..1cb24cb0cc213c1b7244d0aebf7f29a7c7b6c95a 100644
--- a/app/api/billets_absences.py
+++ b/app/api/billets_absences.py
@@ -25,6 +25,7 @@ from app.models import BilletAbsence
from app.models.etudiants import Identite
from app.scodoc import sco_abs_billets
from app.scodoc.sco_permissions import Permission
+from app.scodoc import sco_utils as scu
@bp.route("/billets_absence/etudiant/<int:etudid>")
@@ -59,13 +60,17 @@ def billets_absence_create():
"justified" : bool
}
```
+
+ SAMPLES
+ -------
+ /billets_absence/create;{""etudid"":""1"",""abs_begin"":""2023-10-27T10:00"",""abs_end"":""2023-10-28T10:00"",""description"":""grave malade"",""justified"":""1""}
"""
data = request.get_json(force=True) # may raise 400 Bad Request
etudid = data.get("etudid")
abs_begin = data.get("abs_begin")
abs_end = data.get("abs_end")
description = data.get("description", "")
- justified = data.get("justified", False)
+ justified = scu.to_bool(data.get("justified", False))
if None in (etudid, abs_begin, abs_end):
return json_error(
404, message="Paramètre manquant: etudid, abs_begin, abs_end requis"
diff --git a/app/api/departements.py b/app/api/departements.py
index 26e3ec43c689d5e21fdd5fcc47b41e7a6c9d25cc..787193e232f15947da0053171dae95eac1c2549b 100644
--- a/app/api/departements.py
+++ b/app/api/departements.py
@@ -38,7 +38,13 @@ from app.scodoc.sco_utils import json_error
@permission_required(Permission.ScoView)
@as_json
def departements_list():
- """Liste tous les départements."""
+ """Liste tous les départements.
+
+ SAMPLES
+ -------
+ /departements;
+
+ """
return [dept.to_dict(with_dept_name=True) for dept in Departement.query]
@@ -48,7 +54,13 @@ def departements_list():
@permission_required(Permission.ScoView)
@as_json
def departements_ids():
- """Liste des ids de tous les départements."""
+ """Liste des ids de tous les départements.
+
+ SAMPLES
+ -------
+ /departements_ids;
+
+ """
return [dept.id for dept in Departement.query]
@@ -61,17 +73,10 @@ def departement_by_acronym(acronym: str):
"""
Info sur un département. Accès par acronyme.
- Exemple de résultat :
- ```json
- {
- "id": 1,
- "acronym": "TAPI",
- "dept_name" : "TEST",
- "description": null,
- "visible": true,
- "date_creation": "Fri, 15 Apr 2022 12:19:28 GMT"
- }
- ```
+ SAMPLES
+ -------
+ /departement/TAPI;
+
"""
dept = Departement.query.filter_by(acronym=acronym).first_or_404()
return dept.to_dict(with_dept_name=True)
@@ -82,9 +87,14 @@ def departement_by_acronym(acronym: str):
@scodoc
@permission_required(Permission.ScoView)
@as_json
-def departement_by_id(dept_id: int):
+def departement_get(dept_id: int):
"""
Info sur un département. Accès par id.
+
+ SAMPLES
+ -------
+ /departement/id/1;
+
"""
dept = Departement.query.get_or_404(dept_id)
return dept.to_dict()
@@ -107,6 +117,10 @@ def departement_create():
"visible": bool,
}
```
+
+ SAMPLES
+ -------
+ /departement/create;{""acronym"":""MYDEPT"",""visible"":""1""}
"""
data = request.get_json(force=True) # may raise 400 Bad Request
acronym = str(data.get("acronym", ""))
@@ -180,23 +194,10 @@ def departement_etudiants(acronym: str):
------
acronym : l'acronyme d'un département
- Exemple de résultat :
- ```json
- [
- {
- "civilite": "M",
- "code_ine": "7899X61616",
- "code_nip": "F6777H88",
- "date_naissance": null,
- "email": "toto@toto.fr",
- "emailperso": null,
- "etudid": 18,
- "nom": "MOREL",
- "prenom": "JACQUES"
- },
- ...
- ]
- ```
+ SAMPLES
+ -------
+ /departement/TAPI/etudiants;
+
"""
dept = Departement.query.filter_by(acronym=acronym).first_or_404()
return [etud.to_dict_short() for etud in dept.etudiants]
@@ -221,7 +222,13 @@ def departement_etudiants_by_id(dept_id: int):
@permission_required(Permission.ScoView)
@as_json
def departement_formsemestres_ids(acronym: str):
- """Liste des ids de tous les formsemestres du département."""
+ """Liste des ids de tous les formsemestres du département.
+
+ SAMPLES
+ -------
+ /departement/TAPI/formsemestres_ids;
+
+ """
dept = Departement.query.filter_by(acronym=acronym).first_or_404()
return [formsemestre.id for formsemestre in dept.formsemestres]
@@ -232,7 +239,13 @@ def departement_formsemestres_ids(acronym: str):
@permission_required(Permission.ScoView)
@as_json
def departement_formsemestres_ids_by_id(dept_id: int):
- """Liste des ids de tous les formsemestres du département."""
+ """Liste des ids de tous les formsemestres du département.
+
+ SAMPLES
+ -------
+ /departement/id/1/formsemestres_ids;
+
+ """
dept = Departement.query.get_or_404(dept_id)
return [formsemestre.id for formsemestre in dept.formsemestres]
@@ -253,6 +266,9 @@ def departement_formsemestres_courants(acronym: str = "", dept_id: int | None =
-----
date_courante:<string:date_courante>
+ SAMPLES
+ -------
+ /departement/id/1/formsemestres_courants?date_courante=2022-01-01
"""
dept = (
Departement.query.filter_by(acronym=acronym).first_or_404()
diff --git a/app/api/etudiants.py b/app/api/etudiants.py
index 92211542dfd844df571e77abbb2f751256aaabd9..476cdbe838a6995ac9b82bf35036f4458949e8cf 100755
--- a/app/api/etudiants.py
+++ b/app/api/etudiants.py
@@ -101,27 +101,16 @@ def etudiants_courants(long: bool = False):
et les formsemestres contenant la date courante,
ou à défaut celle indiquée en argument (au format ISO).
+ En format "long": voir l'exemple.
+
QUERY
-----
date_courante:<string:date_courante>
- Exemple de résultat :
- ```json
- [
- {
- "id": 1234,
- "code_nip": "12345678",
- "code_ine": null,
- "nom": "JOHN",
- "nom_usuel": None,
- "prenom": "DEUF",
- "civilite": "M",
- }
- ...
- ]
- ```
-
- En format "long": voir documentation.
+ SAMPLES
+ -------
+ /etudiants/courants?date_courante=2022-05-01;
+ /etudiants/courants/long?date_courante=2022-05-01;
"""
allowed_depts = current_user.get_depts_with_permission(Permission.ScoView)
@@ -436,6 +425,10 @@ def bulletin(
version : type de bulletin (par défaut, "selectedevals"): short, long, selectedevals, butcourt
pdf : si spécifié, bulletin au format PDF (et non JSON).
+ SAMPLES
+ -------
+ /etudiant/etudid/1/formsemestre/1/bulletin
+
"""
if version == "pdf":
version = "long"
@@ -494,33 +487,9 @@ def etudiant_groups(formsemestre_id: int, etudid: int = None):
formsemestre_id : l'id d'un formsemestre
etudid : l'etudid d'un étudiant
- Exemple de résultat :
- ```json
- [
- {
- "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"
- }
- ]
- ```
+ SAMPLES
+ -------
+ /etudiant/etudid/1/formsemestre/1/groups
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -627,6 +596,10 @@ def etudiant_edit(
------
`code_type`: le type du code, `etudid`, `ine` ou `nip`.
`code`: la valeur du code
+
+ SAMPLES
+ -------
+ /etudiant/ine/INE1/edit;{""prenom"":""Nouveau Prénom"", ""adresses"":[{""email"":""nouvelle@adresse.fr""}]}
"""
ok, etud = _get_etud_by_code(code_type, code, g.scodoc_dept)
if not ok:
@@ -682,6 +655,10 @@ def etudiant_annotation(
"comment" : string
}
```
+
+ SAMPLES
+ -------
+ /etudiant/etudid/1/annotation;{""comment"":""une annotation sur l'étudiant""}
"""
if not current_user.has_permission(Permission.ViewEtudData):
return json_error(403, "non autorisé (manque ViewEtudData)")
diff --git a/app/api/evaluations.py b/app/api/evaluations.py
index 86509059e765691eebaff6c7554c53340e4e4a6f..498d886cc5d23860ad85812d3f69f76decdddda5 100644
--- a/app/api/evaluations.py
+++ b/app/api/evaluations.py
@@ -84,7 +84,9 @@ def moduleimpl_evaluations(moduleimpl_id: int):
------
moduleimpl_id : l'id d'un moduleimpl
- Exemple de résultat : voir `/evaluation`.
+ SAMPLES
+ -------
+ /moduleimpl/1/evaluations
"""
modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
return [evaluation.to_dict_api() for evaluation in modimpl.evaluations]
@@ -104,30 +106,9 @@ def evaluation_notes(evaluation_id: int):
------
evaluation_id : l'id de l'évaluation
- Exemple de résultat :
- ```json
- {
- "11": {
- "etudid": 11,
- "evaluation_id": 1,
- "value": 15.0,
- "note_max" : 20.0,
- "comment": "",
- "date": "2024-07-19T19:08:44+02:00",
- "uid": 2
- },
- "12": {
- "etudid": 12,
- "evaluation_id": 1,
- "value": "ABS",
- "note_max" : 20.0,
- "comment": "",
- "date": "2024-07-19T19:08:44+02:00",
- "uid": 2
- },
- ...
- }
- ```
+ SAMPLES
+ -------
+ /evaluation/2/notes;
"""
query = Evaluation.query.filter_by(id=evaluation_id)
if g.scodoc_dept:
@@ -173,10 +154,14 @@ def evaluation_set_notes(evaluation_id: int): # evaluation-notes-set
Résultat:
- - nb_changed: nombre de notes changées
- - nb_suppress: nombre de notes effacées
+ - etudids_changed: étudiants dont la note est modifiée
- etudids_with_decision: liste des etudiants dont la note a changé
alors qu'ils ont une décision de jury enregistrée.
+ - history_menu: un fragment de HTML expliquant l'historique de la note de chaque étudiant modifié.
+
+ SAMPLES
+ -------
+ /evaluation/1/notes/set;{""notes"": [[1, 17], [2, ""SUPR""]], ""comment"" : ""sample test""}
"""
query = Evaluation.query.filter_by(id=evaluation_id)
if g.scodoc_dept:
@@ -224,6 +209,11 @@ def evaluation_create(moduleimpl_id: int):
}
Résultat: l'évaluation créée.
+
+ SAMPLES
+ -------
+ /moduleimpl/1/evaluation/create;{""description"":""Exemple éval.""}
+
"""
moduleimpl: ModuleImpl = ModuleImpl.query.get_or_404(moduleimpl_id)
if not moduleimpl.can_edit_evaluation(current_user):
diff --git a/app/api/formations.py b/app/api/formations.py
index 7f8146cc054fb2f5664b1f22273e5101d651c09a..f675acc32647570d14f07d876c19608e1b08ab22 100644
--- a/app/api/formations.py
+++ b/app/api/formations.py
@@ -44,6 +44,11 @@ def formations():
"""
Retourne la liste de toutes les formations (tous départements,
sauf si route départementale).
+
+ SAMPLES
+ -------
+ /formations;
+
"""
query = Formation.query
if g.scodoc_dept:
@@ -64,6 +69,11 @@ def formations_ids():
(tous départements, ou du département indiqué dans la route)
Exemple de résultat : `[ 17, 99, 32 ]`.
+
+ SAMPLES
+ -------
+ /formations_ids;
+
"""
query = Formation.query
if g.scodoc_dept:
@@ -77,28 +87,14 @@ def formations_ids():
@scodoc
@permission_required(Permission.ScoView)
@as_json
-def formation_by_id(formation_id: int):
+def formation_get(formation_id: int):
"""
La formation d'id donné.
+ SAMPLES
+ -------
+ /formation/1;
- Exemple de résultat :
-
- ```json
- {
- "id": 1,
- "acronyme": "BUT R&T",
- "titre_officiel": "Bachelor technologique réseaux et télécommunications",
- "formation_code": "V1RET",
- "code_specialite": null,
- "dept_id": 1,
- "titre": "BUT R&T",
- "version": 1,
- "type_parcours": 700,
- "referentiel_competence_id": null,
- "formation_id": 1
- }
- ```
"""
query = Formation.query.filter_by(id=formation_id)
if g.scodoc_dept:
@@ -135,97 +131,9 @@ def formation_export_by_formation_id(formation_id: int, export_ids=False):
formation_id : l'id d'une formation
export_with_ids : si présent, exporte aussi les ids des objets ScoDoc de la formation.
- Exemple de résultat :
-
- ```json
- {
- "id": 1,
- "acronyme": "BUT R&T",
- "titre_officiel": "Bachelor technologique r\u00e9seaux et t\u00e9l\u00e9communications",
- "formation_code": "V1RET",
- "code_specialite": null,
- "dept_id": 1,
- "titre": "BUT R&T",
- "version": 1,
- "type_parcours": 700,
- "referentiel_competence_id": null,
- "formation_id": 1,
- "ue": [
- {
- "acronyme": "RT1.1",
- "numero": 1,
- "titre": "Administrer les r\u00e9seaux et l\u2019Internet",
- "type": 0,
- "ue_code": "UCOD11",
- "ects": 12.0,
- "is_external": false,
- "code_apogee": "",
- "coefficient": 0.0,
- "semestre_idx": 1,
- "color": "#B80004",
- "reference": 1,
- "matiere": [
- {
- "titre": "Administrer les r\u00e9seaux et l\u2019Internet",
- "numero": 1,
- "module": [
- {
- "titre": "Initiation aux r\u00e9seaux informatiques",
- "abbrev": "Init aux r\u00e9seaux informatiques",
- "code": "R101",
- "heures_cours": 0.0,
- "heures_td": 0.0,
- "heures_tp": 0.0,
- "coefficient": 1.0,
- "ects": "",
- "semestre_id": 1,
- "numero": 10,
- "code_apogee": "",
- "module_type": 2,
- "coefficients": [
- {
- "ue_reference": "1",
- "coef": "12.0"
- },
- {
- "ue_reference": "2",
- "coef": "4.0"
- },
- {
- "ue_reference": "3",
- "coef": "4.0"
- }
- ]
- },
- {
- "titre": "Se sensibiliser \u00e0 l'hygi\u00e8ne informatique...",
- "abbrev": "Hygi\u00e8ne informatique",
- "code": "SAE11",
- "heures_cours": 0.0,
- "heures_td": 0.0,
- "heures_tp": 0.0,
- "coefficient": 1.0,
- "ects": "",
- "semestre_id": 1,
- "numero": 10,
- "code_apogee": "",
- "module_type": 3,
- "coefficients": [
- {
- "ue_reference": "1",
- "coef": "16.0"
- }
- ]
- },
- ...
- ]
- },
- ...
- ]
- },
- ]
- }
- ```
+ SAMPLES
+ -------
+ /formation/1/export
"""
query = Formation.query.filter_by(id=formation_id)
if g.scodoc_dept:
@@ -250,6 +158,11 @@ def referentiel_competences(formation_id: int):
"""
Retourne le référentiel de compétences de la formation
ou null si pas de référentiel associé.
+
+ SAMPLES
+ -------
+ /formation/1/referentiel_competences;
+
"""
query = Formation.query.filter_by(id=formation_id)
if g.scodoc_dept:
@@ -360,7 +273,12 @@ def ue_desassoc_niveau(ue_id: int):
@scodoc
@permission_required(Permission.ScoView)
def get_ue(ue_id: int):
- """Renvoie l'UE."""
+ """Renvoie l'UE.
+
+ SAMPLES
+ -------
+ /formation/ue/1;
+ """
query = UniteEns.query.filter_by(id=ue_id)
if g.scodoc_dept:
query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id)
@@ -374,7 +292,12 @@ def get_ue(ue_id: int):
@scodoc
@permission_required(Permission.ScoView)
def formation_module_get(module_id: int):
- """Renvoie le module."""
+ """Renvoie le module.
+
+ SAMPLES
+ -------
+ /formation/module/1;
+ """
query = Module.query.filter_by(id=module_id)
if g.scodoc_dept:
query = query.join(Formation).filter_by(dept_id=g.scodoc_dept_id)
diff --git a/app/api/formsemestres.py b/app/api/formsemestres.py
index 1a1fd9e9b3b681c42826a17203c0d86e5b58d60f..7dc8ccf17f46dd51e664e6b6b1e061452484332c 100644
--- a/app/api/formsemestres.py
+++ b/app/api/formsemestres.py
@@ -54,44 +54,15 @@ from app.tables.recap import TableRecap, RowRecap
@scodoc
@permission_required(Permission.ScoView)
@as_json
-def formsemestre_infos(formsemestre_id: int):
+def formsemestre_get(formsemestre_id: int):
"""
Information sur le formsemestre indiqué.
formsemestre_id : l'id du formsemestre
- Exemple de résultat :
- ```json
- {
- "block_moyennes": false,
- "bul_bgcolor": "white",
- "bul_hide_xml": false,
- "date_debut_iso": "2021-09-01",
- "date_debut": "01/09/2021",
- "date_fin_iso": "2022-08-31",
- "date_fin": "31/08/2022",
- "dept_id": 1,
- "elt_annee_apo": null,
- "elt_passage_apo" : null,
- "elt_sem_apo": null,
- "ens_can_edit_eval": false,
- "etat": true,
- "formation_id": 1,
- "formsemestre_id": 1,
- "gestion_compensation": false,
- "gestion_semestrielle": false,
- "id": 1,
- "modalite": "FI",
- "resp_can_change_ens": true,
- "resp_can_edit": false,
- "responsables": [1, 99], // uids
- "scodoc7_id": null,
- "semestre_id": 1,
- "titre_formation" : "BUT GEA",
- "titre_num": "BUT GEA semestre 1",
- "titre": "BUT GEA",
- }
- ```
+ SAMPLES
+ -------
+ /formsemestre/1
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -270,7 +241,7 @@ def formsemestre_set_apo_etapes():
Le code est une chaîne, avec éventuellement plusieurs valeurs séparées
par des virgules.
- Ce changement peut être fait sur un semestre verrouillé
+ Ce changement peut être fait sur un semestre verrouillé.
DATA
----
@@ -378,7 +349,7 @@ def formsemestre_set_elt_annee_apo():
@scodoc
@permission_required(Permission.EditApogee)
def formsemestre_set_elt_passage_apo():
- """Change les codes apogée de passage du semestre indiqué (par le champ oid).
+ """Change les codes Apogée de passage du semestre indiqué (par le champ oid).
Le code est une chaîne, avec éventuellement plusieurs valeurs séparées
par des virgules.
@@ -425,7 +396,9 @@ def bulletins(formsemestre_id: int, version: str = "long"):
formsemestre_id : int
version : string ("long", "short", "selectedevals")
- Exemple de résultat : liste, voir https://scodoc.org/ScoDoc9API/#bulletin
+ SAMPLES
+ -------
+ /formsemestre/1/bulletins
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -455,67 +428,9 @@ def formsemestre_programme(formsemestre_id: int):
"""
Retourne la liste des UEs, ressources et SAEs d'un semestre
-
- Exemple de résultat :
- ```json
- {
- "ues": [
- {
- "type": 0,
- "formation_id": 1,
- "ue_code": "UCOD11",
- "id": 1,
- "ects": 12.0,
- "acronyme": "RT1.1",
- "is_external": false,
- "numero": 1,
- "code_apogee": "",
- "titre": "Administrer les r\u00e9seaux et l\u2019Internet",
- "coefficient": 0.0,
- "semestre_idx": 1,
- "color": "#B80004",
- "ue_id": 1
- },
- ...
- ],
- "ressources": [
- {
- "ens": [ 10, 18 ],
- "formsemestre_id": 1,
- "id": 15,
- "module": {
- "abbrev": "Programmer",
- "code": "SAE15",
- "code_apogee": "V7GOP",
- "coefficient": 1.0,
- "formation_id": 1,
- "heures_cours": 0.0,
- "heures_td": 0.0,
- "heures_tp": 0.0,
- "id": 15,
- "matiere_id": 3,
- "module_id": 15,
- "module_type": 3,
- "numero": 50,
- "semestre_id": 1,
- "titre": "Programmer en Python",
- "ue_id": 3
- },
- "module_id": 15,
- "moduleimpl_id": 15,
- "responsable_id": 2
- },
- ...
- ],
- "saes": [
- {
- ...
- },
- ...
- ],
- "modules" : [ ... les modules qui ne sont ni des SAEs ni des ressources ... ]
- }
- ```
+ SAMPLES
+ -------
+ /formsemestre/1/programme
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -588,6 +503,10 @@ def formsemestre_etudiants(
-----
etat:<string:etat>
+ SAMPLES
+ -------
+ /formsemestre/1/etudiants/query;
+
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -634,37 +553,9 @@ def formsemestre_etat_evaluations(formsemestre_id: int):
"""
Informations sur l'état des évaluations d'un formsemestre.
- Exemple de résultat :
-
- ```json
- [
- {
- "id": 1, // moduleimpl_id
- "titre": "Initiation aux réseaux informatiques",
- "evaluations": [
- {
- "id": 1,
- "description": null,
- "datetime_epreuve": null,
- "heure_fin": "09:00:00",
- "coefficient": "02.00"
- "is_complete": true,
- "nb_inscrits": 16,
- "nb_manquantes": 0,
- "ABS": 0,
- "ATT": 0,
- "EXC": 0,
- "saisie_notes": {
- "datetime_debut": "2021-09-11T00:00:00+02:00",
- "datetime_fin": "2022-08-25T00:00:00+02:00",
- "datetime_mediane": "2022-03-19T00:00:00+01:00"
- }
- },
- ...
- ]
- },
- ]
- ```
+ SAMPLES
+ -------
+ /formsemestre/1/etat_evals
"""
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
app.set_sco_dept(formsemestre.departement.acronym)
@@ -749,6 +640,9 @@ def formsemestre_resultat(formsemestre_id: int):
-----
format:<string:format>
+ SAMPLES
+ -------
+ /formsemestre/1/resultats;
"""
format_spec = request.args.get("format", None)
if format_spec is not None and format_spec != "raw":
diff --git a/app/api/jury.py b/app/api/jury.py
index 29ed2dc76285126f0949eccf14b748a07f969521..66324ab347e84ef15df885c119160798fcd75326 100644
--- a/app/api/jury.py
+++ b/app/api/jury.py
@@ -53,7 +53,12 @@ from app.scodoc.sco_utils import json_error
@permission_required(Permission.ScoView)
@as_json
def decisions_jury(formsemestre_id: int):
- """Décisions du jury des étudiants du formsemestre."""
+ """Décisions du jury des étudiants du formsemestre.
+
+ SAMPLES
+ -------
+ /formsemestre/1/decisions_jury
+ """
# APC, pair:
formsemestre: FormSemestre = db.session.get(FormSemestre, formsemestre_id)
if formsemestre is None:
diff --git a/app/api/justificatifs.py b/app/api/justificatifs.py
index cde11c050adf09b6a64ee39c639940e434010008..4a7f3649ba9a9e79244f18a02fdc7c3e791a132f 100644
--- a/app/api/justificatifs.py
+++ b/app/api/justificatifs.py
@@ -165,7 +165,7 @@ def justificatifs(etudid: int = None, nip=None, ine=None, with_query: bool = Fal
def justificatifs_dept(dept_id: int = None, with_query: bool = False):
"""
Renvoie tous les justificatifs d'un département
- (en ajoutant un champ "formsemestre" si possible)
+ (en ajoutant un champ "`formsemestre`" si possible).
QUERY
-----
@@ -220,9 +220,9 @@ def justificatifs_dept(dept_id: int = None, with_query: bool = False):
def _set_sems(justi: Justificatif, restrict: bool) -> dict:
"""
- _set_sems Ajoute le formsemestre associé au justificatif s'il existe
+ _set_sems Ajoute le formsemestre associé au justificatif s'il existe.
- Si le formsemestre n'existe pas, renvoie la simple représentation du justificatif
+ Si le formsemestre n'existe pas, renvoie la simple représentation du justificatif.
Args:
justi (Justificatif): Le justificatif
@@ -263,7 +263,7 @@ def _set_sems(justi: Justificatif, restrict: bool) -> dict:
@as_json
@permission_required(Permission.ScoView)
def justificatifs_formsemestre(formsemestre_id: int, with_query: bool = False):
- """Retourne tous les justificatifs du formsemestre
+ """Retourne tous les justificatifs du formsemestre.
QUERY
-----
@@ -337,7 +337,7 @@ def justificatifs_formsemestre(formsemestre_id: int, with_query: bool = False):
@permission_required(Permission.AbsChange)
def justif_create(etudid: int = None, nip=None, ine=None):
"""
- Création d'un justificatif pour l'étudiant (etudid)
+ Création d'un justificatif pour l'étudiant.
DATA
----
@@ -489,7 +489,7 @@ def _create_one(
@permission_required(Permission.AbsChange)
def justif_edit(justif_id: int):
"""
- Edition d'un justificatif à partir de son id
+ Édition d'un justificatif à partir de son id.
DATA
----
@@ -611,7 +611,7 @@ def justif_edit(justif_id: int):
@permission_required(Permission.AbsChange)
def justif_delete():
"""
- Suppression d'un justificatif à partir de son id
+ Suppression d'un justificatif à partir de son id.
DATA
----
@@ -699,7 +699,7 @@ def _delete_one(justif_id: int) -> tuple[int, str]:
@permission_required(Permission.AbsChange)
def justif_import(justif_id: int = None):
"""
- Importation d'un fichier (création d'archive)
+ Importation d'un fichier (création d'archive).
> Procédure d'importation de fichier : [importer un justificatif](FichiersJustificatifs.md#importer-un-fichier)
"""
@@ -752,7 +752,8 @@ def justif_import(justif_id: int = None):
def justif_export(justif_id: int | None = None, filename: str | None = None):
"""
Retourne un fichier d'une archive d'un justificatif.
- La permission est ScoView + (AbsJustifView ou être l'auteur du justifcatif)
+
+ La permission est `ScoView` + (`AbsJustifView` ou être l'auteur du justificatif).
> Procédure de téléchargement de fichier : [télécharger un justificatif](FichiersJustificatifs.md#télécharger-un-fichier)
"""
@@ -791,7 +792,7 @@ def justif_export(justif_id: int | None = None, filename: str | None = None):
@permission_required(Permission.AbsChange)
def justif_remove(justif_id: int = None):
"""
- Supression d'un fichier ou d'une archive
+ Supression d'un fichier ou d'une archive.
> Procédure de suppression de fichier : [supprimer un justificatif](FichiersJustificatifs.md#supprimer-un-fichier)
@@ -870,7 +871,7 @@ def justif_remove(justif_id: int = None):
@permission_required(Permission.ScoView)
def justif_list(justif_id: int = None):
"""
- Liste les fichiers du justificatif
+ Liste les fichiers du justificatif.
SAMPLES
-------
@@ -917,7 +918,7 @@ def justif_list(justif_id: int = None):
@permission_required(Permission.AbsChange)
def justif_justifies(justif_id: int = None):
"""
- Liste assiduite_id justifiées par le justificatif
+ Liste `assiduite_id` justifiées par le justificatif.
SAMPLES
-------
diff --git a/app/api/logos.py b/app/api/logos.py
index 42f10513ad2413d7d2a444b93fa0a9ba387faaa3..a97d782da51012f5619958cc3e94fcde0189c3de 100644
--- a/app/api/logos.py
+++ b/app/api/logos.py
@@ -50,7 +50,12 @@ from app.scodoc.sco_utils import json_error
@permission_required(Permission.ScoSuperAdmin)
@as_json
def logo_list_globals():
- """Liste des noms des logos définis pour le site ScoDoc."""
+ """Liste des noms des logos définis pour le site ScoDoc.
+
+ SAMPLES
+ -------
+ /logos
+ """
logos = list_logos()[None]
return list(logos.keys())
@@ -63,6 +68,10 @@ def logo_get_global(logoname):
L'image est au format png ou jpg; le format retourné dépend du format sous lequel
l'image a été initialement enregistrée.
+
+ SAMPLES
+ -------
+ /logo/B
"""
logo = find_logo(logoname=logoname)
if logo is None:
@@ -80,15 +89,19 @@ def _core_get_logos(dept_id) -> list:
return list(logos.keys())
-@bp.route("/departement/<string:departement>/logos")
+@bp.route("/departement/<string:dept_acronym>/logos")
@scodoc
@permission_required(Permission.ScoSuperAdmin)
@as_json
-def logo_get_local_by_acronym(departement):
+def departement_logos(dept_acronym: str):
"""Liste des noms des logos définis pour le département
désigné par son acronyme.
+
+ SAMPLES
+ -------
+ /departement/TAPI/logos
"""
- dept_id = Departement.from_acronym(departement).id
+ dept_id = Departement.from_acronym(dept_acronym).id
return _core_get_logos(dept_id)
@@ -96,7 +109,7 @@ def logo_get_local_by_acronym(departement):
@scodoc
@permission_required(Permission.ScoSuperAdmin)
@as_json
-def logo_get_local_by_id(dept_id):
+def departement_logos_by_id(dept_id):
"""Liste des noms des logos définis pour le département
désigné par son id.
"""
diff --git a/app/api/moduleimpl.py b/app/api/moduleimpl.py
index 26cafa0343366171f6a3d84894ccdd73b4e75e9b..b5dea29b87bf76f5a7e1fe0e20908db2ee90ad41 100644
--- a/app/api/moduleimpl.py
+++ b/app/api/moduleimpl.py
@@ -38,37 +38,9 @@ def moduleimpl(moduleimpl_id: int):
------
moduleimpl_id : l'id d'un moduleimpl
- Exemple de résultat :
-
- ```json
- {
- "id": 1,
- "formsemestre_id": 1,
- "module_id": 1,
- "responsable_id": 2,
- "moduleimpl_id": 1,
- "ens": [],
- "module": {
- "heures_tp": 0,
- "code_apogee": "",
- "titre": "Initiation aux réseaux informatiques",
- "coefficient": 1,
- "module_type": 2,
- "id": 1,
- "ects": null,
- "abbrev": "Init aux réseaux informatiques",
- "ue_id": 1,
- "code": "R101",
- "formation_id": 1,
- "heures_cours": 0,
- "matiere_id": 1,
- "heures_td": 0,
- "semestre_id": 1,
- "numero": 10,
- "module_id": 1
- }
- }
- ```
+ SAMPLES
+ -------
+ /moduleimpl/1
"""
modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
return modimpl.to_dict(convert_objects=True)
@@ -83,18 +55,9 @@ def moduleimpl(moduleimpl_id: int):
def moduleimpl_inscriptions(moduleimpl_id: int):
"""Liste des inscriptions à ce moduleimpl.
- Exemple de résultat :
-
- ```json
- [
- {
- "id": 1,
- "etudid": 666,
- "moduleimpl_id": 1234,
- },
- ...
- ]
- ```
+ SAMPLES
+ -------
+ /moduleimpl/1/inscriptions
"""
modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
return [i.to_dict() for i in modimpl.inscriptions]
@@ -108,24 +71,9 @@ def moduleimpl_inscriptions(moduleimpl_id: int):
def moduleimpl_notes(moduleimpl_id: int):
"""Liste des notes dans ce moduleimpl.
- Exemple de résultat :
-
- ```json
- [
- {
- "etudid": 17776, // code de l'étudiant
- "nom": "DUPONT",
- "prenom": "Luz",
- "38411": 16.0, // Note dans l'évaluation d'id 38411
- "38410": 15.0,
- "moymod": 15.5, // Moyenne INDICATIVE module
- "moy_ue_2875": 15.5, // Moyenne vers l'UE 2875
- "moy_ue_2876": 15.5, // Moyenne vers l'UE 2876
- "moy_ue_2877": 15.5 // Moyenne vers l'UE 2877
- },
- ...
- ]
- ```
+ SAMPLES
+ -------
+ /moduleimpl/1/notes
"""
modimpl = ModuleImpl.get_modimpl(moduleimpl_id)
app.set_sco_dept(modimpl.formsemestre.departement.acronym)
diff --git a/app/api/partitions.py b/app/api/partitions.py
index 61aaca6fc86da89805b34b3c1a59f9ef50c6e7d9..515615015641ce25fb19f39a7bef191e1bd7ded5 100644
--- a/app/api/partitions.py
+++ b/app/api/partitions.py
@@ -45,23 +45,9 @@ from app.scodoc import sco_utils as scu
def partition_info(partition_id: int):
"""Info sur une partition.
- Exemple de résultat :
-
- ```json
- {
- 'bul_show_rank': False,
- 'formsemestre_id': 39,
- 'groups': [
- {'id': 268, 'name': 'A', 'partition_id': 100},
- {'id': 269, 'name': 'B', 'partition_id': 100}
- ],
- 'groups_editable': True,
- 'id': 100,
- 'numero': 100,
- 'partition_name': 'TD',
- 'show_in_lists': True
- }
- ```
+ SAMPLES
+ -------
+ /partition/1
"""
query = Partition.query.filter_by(id=partition_id)
if g.scodoc_dept:
@@ -79,23 +65,9 @@ def partition_info(partition_id: int):
def formsemestre_partitions(formsemestre_id: int):
"""Liste de toutes les partitions d'un formsemestre.
- Exemple de résultat :
-
- ```json
- {
- partition_id : {
- "bul_show_rank": False,
- "formsemestre_id": 1063,
- "groups" :
- group_id : {
- "id" : 12,
- "name" : "A",
- "partition_id" : partition_id,
- }
- },
- ...
- }
- ```
+ SAMPLES
+ -------
+ /formsemestre/1/partitions
"""
query = FormSemestre.query.filter_by(id=formsemestre_id)
if g.scodoc_dept:
@@ -124,22 +96,9 @@ def group_etudiants(group_id: int):
------
group_id : l'id d'un groupe
- Exemple de résultat :
-
- ```json
- [
- {
- 'civilite': 'M',
- 'id': 123456,
- 'ine': None,
- 'nip': '987654321',
- 'nom': 'MARTIN',
- 'nom_usuel': null,
- 'prenom': 'JEAN'}
- },
- ...
- ]
- ```
+ SAMPLES
+ -------
+ /group/1/etudiants
"""
query = GroupDescr.query.filter_by(id=group_id)
if g.scodoc_dept:
@@ -316,6 +275,10 @@ def group_create(partition_id: int): # partition-group-create
"group_name" : nom_du_groupe,
}
```
+
+ SAMPLES
+ -------
+ /partition/1/group/create;{""group_name"" : ""Nouveau Groupe""}
"""
query = Partition.query.filter_by(id=partition_id)
if g.scodoc_dept:
@@ -391,7 +354,19 @@ def group_delete(group_id: int):
@permission_required(Permission.ScoView)
@as_json
def group_edit(group_id: int):
- """Édition d'un groupe."""
+ """Édition d'un groupe.
+
+ DATA
+ ----
+ ```json
+ {
+ "group_name" : "A1"
+ }
+
+ SAMPLES
+ -------
+ /group/1/edit;{""group_name"":""A1""}
+ """
query = GroupDescr.query.filter_by(id=group_id)
if g.scodoc_dept:
query = (
@@ -436,6 +411,10 @@ def group_set_edt_id(group_id: int, edt_id: str):
Contrairement à `/edit`, peut-être changé pour toute partition
d'un formsemestre non verrouillé.
+
+ SAMPLES
+ -------
+ /group/1/set_edt_id/EDT_GR1
"""
query = GroupDescr.query.filter_by(id=group_id)
if g.scodoc_dept:
@@ -632,6 +611,10 @@ def partition_edit(partition_id: int):
"groups_editable":bool
}
```
+
+ SAMPLES
+ -------
+ /partition/1/edit;{""bul_show_rank"":1}
"""
query = Partition.query.filter_by(id=partition_id)
if g.scodoc_dept:
@@ -666,9 +649,8 @@ def partition_edit(partition_id: int):
for boolean_field in ("bul_show_rank", "show_in_lists", "groups_editable"):
value = data.get(boolean_field)
+ value = scu.to_bool(value) if value is not None else None
if value is not None and value != getattr(partition, boolean_field):
- if not isinstance(value, bool):
- return json_error(API_CLIENT_ERROR, f"invalid type for {boolean_field}")
if boolean_field == "groups_editable" and partition.is_parcours():
return json_error(
API_CLIENT_ERROR, f"can't change {scu.PARTITION_PARCOURS}"
diff --git a/app/api/users.py b/app/api/users.py
index a323ff19584a0b34bd225b929a6cd8479883b44b..f446c72792ab3f283b75b630c6132839f0cc0116 100644
--- a/app/api/users.py
+++ b/app/api/users.py
@@ -37,6 +37,10 @@ from app.scodoc.sco_utils import json_error
def user_info(uid: int):
"""
Info sur un compte utilisateur ScoDoc.
+
+ SAMPLES
+ -------
+ /user/2
"""
user: User = db.session.get(User, uid)
if user is None:
@@ -222,14 +226,19 @@ def user_edit(uid: int):
def user_password(uid: int):
"""Modification du mot de passe d'un utilisateur.
- Champs modifiables:
+ Si le mot de passe ne convient pas, erreur 400.
+
+ DATA
+ ----
```json
{
"password": str
}
- ```.
+ ```
- Si le mot de passe ne convient pas, erreur 400.
+ SAMPLES
+ -------
+ /user/3/password;{""password"" : ""rePlaCemeNT456averylongandcomplicated""}
"""
data = request.get_json(force=True) # may raise 400 Bad Request
user: User = User.query.get_or_404(uid)
@@ -318,7 +327,12 @@ def user_role_remove(uid: int, role_name: str, dept: str = None):
@permission_required(Permission.UsersView)
@as_json
def permissions_list():
- """Liste des noms de permissions définies."""
+ """Liste des noms de permissions définies.
+
+ SAMPLES
+ -------
+ /permissions
+ """
return list(Permission.permission_by_name.keys())
@@ -329,7 +343,12 @@ def permissions_list():
@permission_required(Permission.UsersView)
@as_json
def role_get(role_name: str):
- """Un rôle"""
+ """Un rôle.
+
+ SAMPLES
+ -------
+ /role/Ens
+ """
return Role.query.filter_by(name=role_name).first_or_404().to_dict()
@@ -340,7 +359,12 @@ def role_get(role_name: str):
@permission_required(Permission.UsersView)
@as_json
def roles_list():
- """Tous les rôles définis."""
+ """Tous les rôles définis.
+
+ SAMPLES
+ -------
+ /roles
+ """
return [role.to_dict() for role in Role.query]
@@ -410,6 +434,10 @@ def role_create(role_name: str):
"permissions" : [ 'ScoView', ... ]
}
```
+
+ SAMPLES
+ -------
+ /role/create/customRole;{""permissions"": [""ScoView"", ""UsersView""]}
"""
role: Role = Role.query.filter_by(name=role_name).first()
if role:
@@ -471,7 +499,12 @@ def role_edit(role_name: str):
@permission_required(Permission.ScoSuperAdmin)
@as_json
def role_delete(role_name: str):
- """Suprression d'un rôle."""
+ """Suppression d'un rôle.
+
+ SAMPLES
+ -------
+ /role/customRole/delete
+ """
role: Role = Role.query.filter_by(name=role_name).first_or_404()
db.session.delete(role)
db.session.commit()
diff --git a/app/models/groups.py b/app/models/groups.py
index 429989f4b9619f0e481b5bde3721f4b3d464f671..bc5943a96ce3c6ffdbd637a546c00622776dbab2 100644
--- a/app/models/groups.py
+++ b/app/models/groups.py
@@ -242,6 +242,16 @@ class GroupDescr(ScoDocModel):
f"""<{self.__class__.__name__} {self.id} "{self.group_name or '(tous)'}">"""
)
+ @classmethod
+ def filter_model_attributes(cls, data: dict, excluded: set[str] = None) -> dict:
+ """Returns a copy of dict with only the keys belonging to the Model and not in excluded.
+ Exclude `partition_id` : a group cannot be moved from a partition to another.
+ """
+ return super().filter_model_attributes(
+ data,
+ excluded=(excluded or set()) | {"partition_id"},
+ )
+
def get_nom_with_part(self, default="-") -> str:
"""Nom avec partition: 'TD A'
Si groupe par défaut (tous), utilise default ou "-"
diff --git a/tests/api/dump_all_results.py b/tests/api/dump_all_results.py
index 65d58d617a5ddc11ace26b33da2951600f9fde93..9b1aee6410b908706cb17e0f591bd56014dba0ba 100644
--- a/tests/api/dump_all_results.py
+++ b/tests/api/dump_all_results.py
@@ -30,7 +30,7 @@ from setup_test_api import (
CHECK_CERTIFICATE,
get_auth_headers,
GET,
- POST_JSON,
+ POST,
SCODOC_URL,
)
diff --git a/tests/api/essai_tous_semestres.py b/tests/api/essai_tous_semestres.py
index d5cd3f56e23dfe73eeb8757a2d3eb4bd42ce8cd9..d158923ac2237162ec82790c84d3d149c973fdbb 100644
--- a/tests/api/essai_tous_semestres.py
+++ b/tests/api/essai_tous_semestres.py
@@ -23,7 +23,7 @@ from setup_test_api import (
CHECK_CERTIFICATE,
get_auth_headers,
GET,
- POST_JSON,
+ POST,
SCODOC_URL,
)
diff --git a/tests/api/exemple-api-basic.py b/tests/api/exemple-api-basic.py
index 8b0abad353b101ac884cfb5c5bb46f3cd08a408b..ace7cb44fb2836d70c8105592528e89cc71754e0 100644
--- a/tests/api/exemple-api-basic.py
+++ b/tests/api/exemple-api-basic.py
@@ -39,7 +39,7 @@ from setup_test_api import (
CHECK_CERTIFICATE,
get_auth_headers,
GET,
- POST_JSON,
+ POST,
SCODOC_URL,
)
@@ -127,14 +127,12 @@ group_id = 5315
POST(f"/group/{group_id}/set_etudiant/{etudid}", headers=HEADERS)
-POST_JSON(
- f"/partition/{pid}/group/create", data={"group_name": "Omega10"}, headers=HEADERS
-)
+POST(f"/partition/{pid}/group/create", data={"group_name": "Omega10"}, headers=HEADERS)
partitions = GET(f"/formsemestre/{formsemestre_id}/partitions", headers=HEADERS)
pp(partitions)
-POST_JSON(f"/group/5559/delete", headers=HEADERS)
-POST_JSON(f"/group/5327/edit", data={"group_name": "TDXXX"}, headers=HEADERS)
+POST(f"/group/5559/delete", headers=HEADERS)
+POST(f"/group/5327/edit", data={"group_name": "TDXXX"}, headers=HEADERS)
# --------- Toutes les bulletins, un à un, et les décisions de jury d'un semestre
formsemestre_id = 911
@@ -178,19 +176,19 @@ etud = GET(f"/formsemestre/{formsemestre_id}/etudiants", headers=HEADERS)[10]
etudid = etud["id"]
# 1- Crée une partition, puis la change de nom
-js = POST_JSON(
+js = POST(
f"/formsemestre/{formsemestre_id}/partition/create",
data={"partition_name": "PART"},
)
partition_id = js["id"]
-POST_JSON(
+POST(
f"/partition/{partition_id}/edit",
data={"partition_name": "PART1", "show_in_lists": True},
headers=HEADERS,
)
# 2- Crée un groupe
-js = POST_JSON(
+js = POST(
f"/partition/{partition_id}/group/create",
data={"group_name": "G1"},
headers=HEADERS,
@@ -198,28 +196,28 @@ js = POST_JSON(
group_1 = js["id"]
# 3- Crée deux autres groupes
-js = POST_JSON(
+js = POST(
f"/partition/{partition_id}/group/create",
data={"group_name": "G2"},
headers=HEADERS,
)
-js = POST_JSON(
+js = POST(
f"/partition/{partition_id}/group/create",
data={"group_name": "G3"},
headers=HEADERS,
)
# 4- Affecte étudiant au groupe G1
-POST_JSON(f"/group/{group_1}/set_etudiant/{etudid}", headers=HEADERS)
+POST(f"/group/{group_1}/set_etudiant/{etudid}", headers=HEADERS)
# 5- retire du groupe
-POST_JSON(f"/group/{group_1}/remove_etudiant/{etudid}", headers=HEADERS)
+POST(f"/group/{group_1}/remove_etudiant/{etudid}", headers=HEADERS)
# 6- affecte au groupe G2
partition = GET(f"/partition/{partition_id}")
assert len(partition["groups"]) == 3
group_2 = [g for g in partition["groups"].values() if g["group_name"] == "G2"][0]["id"]
-POST_JSON(f"/group/{group_2}/set_etudiant/{etudid}", headers=HEADERS)
+POST(f"/group/{group_2}/set_etudiant/{etudid}", headers=HEADERS)
# 7- Membres du groupe
etuds_g2 = GET(f"/group/{group_2}/etudiants", headers=HEADERS)
@@ -229,7 +227,7 @@ assert etuds_g2[0]["id"] == etudid
# 8- Ordres des groupes
group_3 = [g for g in partition["groups"].values() if g["group_name"] == "G3"][0]["id"]
-POST_JSON(
+POST(
f"/partition/{partition_id}/groups/order",
data=[group_2, group_1, group_3],
headers=HEADERS,
@@ -242,7 +240,7 @@ new_groups = [
assert new_groups == [group_2, group_1, group_3]
# 9- Suppression
-POST_JSON(f"/partition/{partition_id}/delete")
+POST(f"/partition/{partition_id}/delete")
# ------
# Tests accès API:
@@ -260,13 +258,13 @@ POST_JSON(f"/partition/{partition_id}/delete")
"""
#
-POST_JSON(
+POST(
"/partition/2264/groups/order",
data=[5563, 5562, 5561, 5560, 5558, 5557, 5316, 5315],
headers=HEADERS,
)
-POST_JSON(
+POST(
"/formsemestre/1063/partitions/order",
data=[2264, 2263, 2265, 2266, 2267, 2372, 2378],
headers=HEADERS,
diff --git a/tests/api/exemple-api-list-modules.py b/tests/api/exemple-api-list-modules.py
index 2cc146593f53072d365ad3dbcd7fe74264af6a93..ea5996c344f727fce86ba44cc76507f8483a3123 100644
--- a/tests/api/exemple-api-list-modules.py
+++ b/tests/api/exemple-api-list-modules.py
@@ -41,7 +41,7 @@ from setup_test_api import (
CHECK_CERTIFICATE,
get_auth_headers,
GET,
- POST_JSON,
+ POST,
SCODOC_URL,
)
diff --git a/tests/api/make_samples.py b/tests/api/make_samples.py
index 09cc88c594cfe1853898b1611bb52bd7e28fe494..047794c8debf0120c890147a48e257d0887342b9 100644
--- a/tests/api/make_samples.py
+++ b/tests/api/make_samples.py
@@ -10,15 +10,15 @@
Si entry_names est spécifié, la génération est restreinte aux exemples cités.
Exemple:
- python make_samples departements departement-formsemestres
+ python make_samples departements departement_formsemestres
-Doit être exécutée immédiatement apres une initialisation de la base pour test API!
+Doit être exécutée immédiatement apres une initialisation de la base pour test API!
(car dépendant des identifiants générés lors de la création des objets)
Modifer le /opt/scodoc/.env pour pointer sur la base test
SCODOC_DATABASE_URI="postgresql:///SCODOC_TEST_API"
-puis re-créer cette base
+puis re-créer cette base
tools/create_database.sh --drop SCODOC_TEST_API
flask db upgrade
flask sco-db-init --erase
@@ -28,10 +28,10 @@ et lancer le serveur test:
flask run --debug
```
-Cet utilitaire prend en argument le fichier de nom `samples.csv` contenant la description
+Cet utilitaire prend en argument le fichier de nom `samples.csv` contenant la description
des exemples (séparés par une tabulation (\t), une ligne par exemple)
-* Le nom de l'exemple donne le nom du fichier généré (nom_exemple => nom_exemple.json.md).
-Plusieurs lignes peuvent partager le même nom. dans ce cas le fichier contiendra
+* Le nom de l'exemple donne le nom du fichier généré (nom_exemple => nom_exemple.json.md).
+Plusieurs lignes peuvent partager le même nom. dans ce cas le fichier contiendra
chacun des exemples
* l'url utilisée
* la permission nécessaire (par défaut ScoView)
@@ -39,7 +39,7 @@ chacun des exemples
* les arguments éventuel (en cas de POST): une chaîne de caractère selon json
Implémentation:
-Le code complète une structure de données (Samples) qui est un dictionnaire de set
+Le code complète une structure de données (Samples) qui est un dictionnaire de set
(indicé par le nom des exemples).
Chacun des éléments du set est un exemple (Sample)
Quand la structure est complète, on génére tous les fichiers textes
@@ -48,7 +48,7 @@ Quand la structure est complète, on génére tous les fichiers textes
- l'url utilisée
- les arguments éventuels
- le résultat
-Le tout mis en forme au format markdown et rangé dans le répertoire DATA_DIR (/tmp/samples)
+Le tout mis en forme au format markdown et rangé dans le répertoire DATA_DIR (/tmp/samples)
qui est créé ou écrasé si déjà existant.
"""
import os
@@ -71,7 +71,7 @@ from setup_test_api import (
CHECK_CERTIFICATE,
get_auth_headers,
GET,
- POST_JSON,
+ POST,
SCODOC_URL,
)
@@ -98,18 +98,23 @@ class Sample:
elif permission == "UsersAdmin":
HEADERS = get_auth_headers("admin_api", "admin_api")
else:
- raise SampleException(f"Bad permission : {permission}")
+ raise SampleException(f"Bad permission : {permission}, url={self.url}")
if self.method == "GET":
self.result = GET(self.url, HEADERS)
elif self.method == "POST":
if self.content == "":
- self.result = POST_JSON(self.url, headers=HEADERS)
+ self.result = POST(self.url, headers=HEADERS)
else:
HEADERS["Content-Type"] = "application/json ; charset=utf-8"
- self.result = POST_JSON(self.url, json.loads(self.content), HEADERS)
+ try:
+ data = json.loads(self.content)
+ except json.decoder.JSONDecodeError as exc:
+ raise ValueError(
+ f"JSON invalide: {self.content}\nurl={self.url}"
+ ) from exc
+ self.result = POST(self.url, data, HEADERS)
elif self.method[0] != "#":
- error = f'Bad method : "{self.method}"'
- raise SampleException(error)
+ raise SampleException(f'Bad method : "{self.method}", url={self.url}')
self.shorten()
with open("sample_TEST.json.md", "tw", encoding="utf-8") as f:
self.dump(f)
@@ -235,3 +240,5 @@ if not CHECK_CERTIFICATE:
urllib3.disable_warnings()
make_samples(SAMPLES_FILENAME)
+
+print(f"Fichiers samples générés dans {DATA_DIR}")
diff --git a/tests/api/setup_test_api.py b/tests/api/setup_test_api.py
index 01547b2e0dea839745a9f236b4ef31bd74a70668..3d7ca4616799d1afe23f529a54f298402e934681 100644
--- a/tests/api/setup_test_api.py
+++ b/tests/api/setup_test_api.py
@@ -79,6 +79,16 @@ if pytest:
return get_auth_headers(API_USER_ADMIN, API_PASSWORD_ADMIN)
+class _DefaultHeaders:
+ headers = {}
+
+
+def set_headers(headers: dict):
+ """Set default headers"""
+ print(f"set_headers: {headers}")
+ _DefaultHeaders.headers = headers
+
+
def GET(path: str, headers: dict = None, errmsg=None, dept=None, raw=False):
"""Get and optionaly returns as JSON
Special case for non json result (image or pdf):
@@ -91,7 +101,7 @@ def GET(path: str, headers: dict = None, errmsg=None, dept=None, raw=False):
url = API_URL + path
reply = requests.get(
url,
- headers=headers or {},
+ headers=_DefaultHeaders.headers if headers is None else headers,
verify=CHECK_CERTIFICATE,
timeout=SCO_TEST_API_TIMEOUT,
)
@@ -119,7 +129,7 @@ def GET(path: str, headers: dict = None, errmsg=None, dept=None, raw=False):
raise APIError("Unknown returned content {r.headers.get('Content-Type', None} !\n")
-def POST_JSON(
+def POST(
path: str, data: dict = {}, headers: dict = None, errmsg=None, dept=None, raw=False
):
"""Post
@@ -132,7 +142,7 @@ def POST_JSON(
r = requests.post(
url,
json=data,
- headers=headers or {},
+ headers=_DefaultHeaders.headers if headers is None else headers,
verify=CHECK_CERTIFICATE,
timeout=SCO_TEST_API_TIMEOUT,
)
@@ -200,7 +210,7 @@ def check_failure_post(path: str, headers: dict, data: dict, err: str = None):
"""
try:
- data = POST_JSON(path=path, headers=headers, data=data, dept=DEPT_ACRONYM)
+ data = POST(path=path, headers=headers, data=data, dept=DEPT_ACRONYM)
# ^ Renvoie un 404
except APIError as api_err:
if err is not None:
diff --git a/tests/api/test_api_assiduites.py b/tests/api/test_api_assiduites.py
index 88475df4891b2e81f3d11cd729c4f0f6187ef4d1..a95f06cf399ed66e0e506d40cfece4f2e72bb311 100644
--- a/tests/api/test_api_assiduites.py
+++ b/tests/api/test_api_assiduites.py
@@ -10,7 +10,7 @@ from types import NoneType
from tests.api.setup_test_api import (
GET,
- POST_JSON,
+ POST,
DEPT_ACRONYM,
APIError,
api_headers,
@@ -260,7 +260,7 @@ def test_route_create(api_admin_headers):
# Bon fonctionnement
data = create_data("present", "03")
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create", [data], api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
@@ -275,7 +275,7 @@ def test_route_create(api_admin_headers):
check_fields(data, fields=ASSIDUITES_FIELDS)
data2 = create_data("absent", "04", MODULE, "desc")
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create", [data2], api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
@@ -286,7 +286,7 @@ def test_route_create(api_admin_headers):
# Mauvais fonctionnement
check_failure_post(f"/assiduite/{FAUX}/create", api_admin_headers, [data])
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create", [data], api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
@@ -296,7 +296,7 @@ def test_route_create(api_admin_headers):
== "Duplication: la période rentre en conflit avec une plage enregistrée"
)
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create",
[create_data("absent", "05", FAUX)],
api_admin_headers,
@@ -316,7 +316,7 @@ def test_route_create(api_admin_headers):
for d in range(randint(2, 4))
]
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create", data, api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
@@ -334,7 +334,7 @@ def test_route_create(api_admin_headers):
create_data("absent", "01"),
]
- res = POST_JSON(
+ res = POST(
f"/assiduite/{ETUDID}/create", data2, api_admin_headers, dept=DEPT_ACRONYM
)
check_fields(res, BATCH_FIELD)
@@ -359,13 +359,13 @@ def test_route_edit(api_admin_headers):
# Bon fonctionnement
data = {"etat": "retard", "moduleimpl_id": MODULE}
- res = POST_JSON(
+ res = POST(
f"/assiduite/{TO_REMOVE[0]}/edit", data, api_admin_headers, dept=DEPT_ACRONYM
)
assert res == {"OK": True}
data["moduleimpl_id"] = None
- res = POST_JSON(
+ res = POST(
f"/assiduite/{TO_REMOVE[1]}/edit", data, api_admin_headers, dept=DEPT_ACRONYM
)
assert res == {"OK": True}
@@ -389,13 +389,13 @@ def test_route_delete(api_admin_headers):
# Bon fonctionnement
data = TO_REMOVE[0]
- res = POST_JSON("/assiduite/delete", [data], api_admin_headers, dept=DEPT_ACRONYM)
+ res = POST("/assiduite/delete", [data], api_admin_headers, dept=DEPT_ACRONYM)
check_fields(res, BATCH_FIELD)
for dat in res["success"]:
assert dat["message"] == "OK"
# Mauvais fonctionnement
- res = POST_JSON("/assiduite/delete", [data], api_admin_headers, dept=DEPT_ACRONYM)
+ res = POST("/assiduite/delete", [data], api_admin_headers, dept=DEPT_ACRONYM)
check_fields(res, BATCH_FIELD)
assert len(res["errors"]) == 1
@@ -405,7 +405,7 @@ def test_route_delete(api_admin_headers):
data = TO_REMOVE[1:]
- res = POST_JSON("/assiduite/delete", data, api_admin_headers, dept=DEPT_ACRONYM)
+ res = POST("/assiduite/delete", data, api_admin_headers, dept=DEPT_ACRONYM)
check_fields(res, BATCH_FIELD)
for dat in res["success"]:
assert dat["message"] == "OK"
@@ -418,7 +418,7 @@ def test_route_delete(api_admin_headers):
FAUX + 2,
]
- res = POST_JSON("/assiduite/delete", data2, api_admin_headers, dept=DEPT_ACRONYM)
+ res = POST("/assiduite/delete", data2, api_admin_headers, dept=DEPT_ACRONYM)
check_fields(res, BATCH_FIELD)
assert len(res["errors"]) == 3
diff --git a/tests/api/test_api_billets.py b/tests/api/test_api_billets.py
index 389b336ef947ba453e1e3ca197e1e8936ab7b844..a175bdf820348227355b654bb6ca5657a41089fc 100644
--- a/tests/api/test_api_billets.py
+++ b/tests/api/test_api_billets.py
@@ -8,7 +8,7 @@ Utilisation :
import datetime
import requests
-from tests.api.setup_test_api import GET, POST_JSON, api_headers
+from tests.api.setup_test_api import GET, POST, api_headers
ETUDID = 1
@@ -28,7 +28,7 @@ def test_billets(api_headers):
abs_end="2022-08-01",
description="test 1",
)
- billet_r = POST_JSON("/billets_absence/create", billet_d, headers=api_headers)
+ billet_r = POST("/billets_absence/create", billet_d, headers=api_headers)
assert billet_r["etudid"] == billet_d["etudid"]
assert datetime.datetime.fromisoformat(billet_r["abs_begin"]).replace(
tzinfo=None
@@ -43,12 +43,10 @@ def test_billets(api_headers):
abs_end="2022-08-03",
description="test 2",
)
- billet_r = POST_JSON("/billets_absence/create", billet_d2, headers=api_headers)
+ billet_r = POST("/billets_absence/create", billet_d2, headers=api_headers)
billets = GET("/billets_absence/etudiant/1", headers=api_headers)
assert len(billets) == 2
# Suppression
for billet in billets:
- reply = POST_JSON(
- f"/billets_absence/{billet['id']}/delete", headers=api_headers
- )
+ reply = POST(f"/billets_absence/{billet['id']}/delete", headers=api_headers)
assert reply["OK"] == True
diff --git a/tests/api/test_api_departements.py b/tests/api/test_api_departements.py
index ba5f07dd3547a13613b28f2c892e1c621de82245..48e7a62cfcdf7c8d1217fdac4d0cd4c81dedc00f 100644
--- a/tests/api/test_api_departements.py
+++ b/tests/api/test_api_departements.py
@@ -23,7 +23,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
api_headers,
api_admin_headers,
)
@@ -42,7 +42,7 @@ def test_create_dept(api_admin_headers):
/departement/<string:dept_acronym>/edit
/departement/<string:dept_acronym>/delete
"""
- dept = POST_JSON(
+ dept = POST(
"/departement/create",
{"acronym": "XTEST", "visible": True},
headers=api_admin_headers,
@@ -50,14 +50,14 @@ def test_create_dept(api_admin_headers):
dept_r = GET(f"/departement/{dept['acronym']}", headers=api_admin_headers)
assert dept["acronym"] == dept_r["acronym"]
assert dept_r["visible"] is True
- dept_e = POST_JSON(
+ dept_e = POST(
f"/departement/{dept['acronym']}/edit",
{"visible": False},
headers=api_admin_headers,
)
dept_r = GET(f"/departement/{dept['acronym']}", headers=api_admin_headers)
assert dept_r["visible"] is False
- r = POST_JSON(
+ r = POST(
f"/departement/{dept['acronym']}/delete",
headers=api_admin_headers,
)
diff --git a/tests/api/test_api_etudiants.py b/tests/api/test_api_etudiants.py
index 27192e5f8167c204298926b1b315e32b3abbe51f..4558d16be1b87ce405e85723c320a2a5307710ad 100644
--- a/tests/api/test_api_etudiants.py
+++ b/tests/api/test_api_etudiants.py
@@ -30,7 +30,7 @@ from tests.api.setup_test_api import (
CHECK_CERTIFICATE,
DEPT_ACRONYM,
GET,
- POST_JSON,
+ POST,
get_auth_headers,
)
from tests.api.setup_test_api import api_headers # pylint: disable=unused-import
@@ -262,7 +262,7 @@ def test_etudiants_by_name(api_headers):
"dept": DEPT_ACRONYM,
"civilite": "X",
}
- _ = POST_JSON(
+ _ = POST(
"/etudiant/create",
args,
headers=admin_header,
@@ -292,7 +292,7 @@ def test_etudiant_annotations(api_headers):
"dept": DEPT_ACRONYM,
"civilite": "M",
}
- etud = POST_JSON(
+ etud = POST(
"/etudiant/create",
args,
headers=admin_header,
@@ -304,7 +304,7 @@ def test_etudiant_annotations(api_headers):
assert etud["nom"]
assert etud["annotations"] == []
# ajoute annotation
- annotation = POST_JSON(
+ annotation = POST(
f"/etudiant/etudid/{etudid}/annotation",
{"comment": "annotation 1"},
headers=admin_header,
@@ -318,7 +318,7 @@ def test_etudiant_annotations(api_headers):
assert etud["annotations"][0]["comment"] == "annotation 1"
assert etud["annotations"][0]["id"] == annotation_id
# Supprime annotation
- POST_JSON(
+ POST(
f"/etudiant/etudid/{etudid}/annotation/{annotation_id}/delete",
headers=admin_header,
)
@@ -932,7 +932,7 @@ def test_etudiant_bulletin_semestre(api_headers):
### -------- Modifie publication bulletins
admin_header = get_auth_headers(API_USER_ADMIN, API_PASSWORD_ADMIN)
- formsemestre = POST_JSON(
+ formsemestre = POST(
f"/formsemestre/{1}/edit", {"bul_hide_xml": True}, headers=admin_header
)
assert formsemestre["bul_hide_xml"] is True
@@ -943,7 +943,7 @@ def test_etudiant_bulletin_semestre(api_headers):
# /ScoDoc/api/etudiant/nip/12345/formsemestre/123/bulletin/long/pdf/nosi
# TODO voir forme utilisée par ScoDoc en interne:
# formsemestre_bulletinetud?formsemestre_id=1263&etudid=16387
- formsemestre = POST_JSON(
+ formsemestre = POST(
f"/formsemestre/{1}/edit", {"bul_hide_xml": False}, headers=admin_header
)
@@ -1000,7 +1000,7 @@ def test_etudiant_create(api_headers):
}
],
}
- etud = POST_JSON(
+ etud = POST(
"/etudiant/create",
args,
headers=admin_header,
@@ -1023,7 +1023,7 @@ def test_etudiant_create(api_headers):
# assert etud["adresses"][0]["emailperso"] == args["adresses"][0]["emailperso"]
# Edition
- etud = POST_JSON(
+ etud = POST(
f"/etudiant/etudid/{etudid}/edit",
{
"civilite": "F",
@@ -1039,7 +1039,7 @@ def test_etudiant_create(api_headers):
assert len(etud["adresses"]) == 1
# assert etud["adresses"][0]["villedomicile"] == args["adresses"][0]["villedomicile"]
# assert etud["adresses"][0]["emailperso"] == args["adresses"][0]["emailperso"]
- etud = POST_JSON(
+ etud = POST(
f"/etudiant/etudid/{etudid}/edit",
{
"adresses": [
@@ -1051,7 +1051,7 @@ def test_etudiant_create(api_headers):
headers=admin_header,
)
assert etud["adresses"][0]["villedomicile"] == "Barcelona"
- etud = POST_JSON(
+ etud = POST(
f"/etudiant/etudid/{etudid}/edit",
{
"admission": {
diff --git a/tests/api/test_api_evaluations.py b/tests/api/test_api_evaluations.py
index d297c0fb4ca5b3cfce8f7098d6ebed93d7220a3f..231a546cb112b322c560946d98c91cb6bb9d9224 100644
--- a/tests/api/test_api_evaluations.py
+++ b/tests/api/test_api_evaluations.py
@@ -25,7 +25,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
api_admin_headers,
api_headers,
check_failure_post,
@@ -114,7 +114,7 @@ def test_evaluation_create(api_admin_headers):
)
nb_evals = len(evaluations)
#
- e = POST_JSON(
+ e = POST(
f"/moduleimpl/{moduleimpl_id}/evaluation/create",
{"description": "eval test"},
api_admin_headers,
@@ -157,7 +157,7 @@ def test_evaluation_create(api_admin_headers):
"publish_incomplete": True,
"note_max": 100.0,
}
- e = POST_JSON(
+ e = POST(
f"/moduleimpl/{moduleimpl_id}/evaluation/create",
data,
api_admin_headers,
@@ -209,7 +209,7 @@ def test_evaluation_create(api_admin_headers):
ue_ids = [ue["id"] for ue in ues]
poids = {ue_id: float(i) + 0.5 for i, ue_id in enumerate(ue_ids)}
data.update({"description": "eval avec poids", "poids": poids})
- e = POST_JSON(
+ e = POST(
f"/moduleimpl/{moduleimpl_id}/evaluation/create",
data,
api_admin_headers,
@@ -223,7 +223,7 @@ def test_evaluation_create(api_admin_headers):
assert new_nb_evals == nb_evals + 1
nb_evals = new_nb_evals
# Delete
- ans = POST_JSON(
+ ans = POST(
f"/evaluation/{e_ret['id']}/delete",
headers=api_admin_headers,
)
diff --git a/tests/api/test_api_formations.py b/tests/api/test_api_formations.py
index 53daf27cb6a024a961f600a293462a2e484dc391..ae7b1e49db88757485292fe242d67bab70b0744f 100644
--- a/tests/api/test_api_formations.py
+++ b/tests/api/test_api_formations.py
@@ -26,7 +26,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
)
from tests.api.tools_test_api import (
verify_fields,
@@ -338,11 +338,11 @@ def test_api_ue_apo(api_admin_headers):
ue_id = 1
ue = GET(path=f"/formation/ue/{ue_id}", headers=api_admin_headers)
assert ue["id"] == ue_id
- r = POST_JSON(
+ r = POST(
f"/formation/ue/{ue_id}/set_code_apogee/APOUE", {}, api_admin_headers, raw=True
)
assert r.text == "APOUE"
- r = POST_JSON(
+ r = POST(
f"/formation/ue/{ue_id}/set_code_apogee_rcue/APORCUE",
{},
api_admin_headers,
@@ -363,7 +363,7 @@ def test_api_module_apo(api_admin_headers):
module = GET(path=f"/formation/module/{module_id}", headers=api_admin_headers)
assert module["id"] == module_id
assert module["code_apogee"] == ""
- r = POST_JSON(
+ r = POST(
f"/formation/module/{module_id}/set_code_apogee/APOMOD",
{},
api_admin_headers,
@@ -379,7 +379,7 @@ def test_api_module_edit(api_admin_headers):
/formation/module/<int:module_id>/edit
"""
module_id = 1
- module = POST_JSON(
+ module = POST(
f"/formation/module/{module_id}/edit",
{"heures_cours": 16, "semestre_id": 1, "abbrev": "ALLO"},
api_admin_headers,
@@ -390,7 +390,7 @@ def test_api_module_edit(api_admin_headers):
assert module["abbrev"] == "ALLO"
# tente de changer l'UE: ne devrait rien faire:
ue_id = module["ue_id"]
- module = POST_JSON(
+ module = POST(
f"/formation/module/{module_id}/edit",
{"ue_id": 666},
api_admin_headers,
@@ -398,7 +398,7 @@ def test_api_module_edit(api_admin_headers):
assert module["ue_id"] == ue_id
# tente de changer la formation: ne devrait rien faire:
formation_id = module["formation_id"]
- module = POST_JSON(
+ module = POST(
f"/formation/module/{module_id}/edit",
{"formation_id": 666},
api_admin_headers,
@@ -406,7 +406,7 @@ def test_api_module_edit(api_admin_headers):
assert module["formation_id"] == formation_id
# -- assignation de parcours (ce test suppose que les parcours 1, 2, 3 existent)
assert module["parcours"] == []
- module = POST_JSON(
+ module = POST(
f"/formation/module/{module_id}/edit",
{"parcours": [1, 2, 3]},
api_admin_headers,
@@ -419,7 +419,7 @@ def test_api_ue_edit(api_admin_headers):
/formation/ue/<int:ue_id>/edit
"""
ue_id = 1
- ue = POST_JSON(
+ ue = POST(
f"/formation/ue/{ue_id}/edit",
{"titre": "formation test modifiée", "numero": 22},
api_admin_headers,
@@ -430,7 +430,7 @@ def test_api_ue_edit(api_admin_headers):
# tente de changer le niveau de compétence: ne devrait rien faire:
niveau_competence_id = ue["niveau_competence_id"]
- ue = POST_JSON(
+ ue = POST(
f"/formation/ue/{ue_id}/edit",
{"niveau_competence_id": 666},
api_admin_headers,
@@ -438,7 +438,7 @@ def test_api_ue_edit(api_admin_headers):
assert ue["niveau_competence_id"] == niveau_competence_id
# tente de changer la formation: ne devrait rien faire:
formation_id = ue["formation_id"]
- ue = POST_JSON(
+ ue = POST(
f"/formation/ue/{ue_id}/edit",
{"formation_id": 666},
api_admin_headers,
diff --git a/tests/api/test_api_jury.py b/tests/api/test_api_jury.py
index a0bd8a32a831b97fdbc17293549952f632388ddf..d3f00ebe283a251cf07d2eeb56c4b4169d99d377 100644
--- a/tests/api/test_api_jury.py
+++ b/tests/api/test_api_jury.py
@@ -23,7 +23,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
api_headers,
)
@@ -54,7 +54,7 @@ def test_jury_decisions(api_headers):
# ues = export_formation["ue"]
# # Enregistre une validation d'RCUE
# etudid = etudiants[0]["id"]
- # validation = POST_JSON(
+ # validation = POST(
# f"/etudiant/{etudid}/jury/validation_rcue/record",
# data={
# "code": "ADM",
diff --git a/tests/api/test_api_justificatifs.py b/tests/api/test_api_justificatifs.py
index 5ae86528b90eef2ce4c8b33fc85973c97eb30cd9..66344851d9ff15a689aea1c42623d0ba6373f458 100644
--- a/tests/api/test_api_justificatifs.py
+++ b/tests/api/test_api_justificatifs.py
@@ -12,7 +12,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
APIError,
api_headers,
api_admin_headers,
@@ -105,7 +105,7 @@ def check_failure_post(path, headers, data, err=None):
APIError: Une erreur car la requête a fonctionné (mauvais comportement)
"""
try:
- data = POST_JSON(path=path, headers=headers, data=data)
+ data = POST(path=path, headers=headers, data=data)
# ^ Renvoi un 404
except APIError as api_err:
if err is not None:
@@ -204,14 +204,14 @@ def test_route_create(api_admin_headers):
# Bon fonctionnement
data = create_data("valide", "01")
- res = POST_JSON(f"/justificatif/{ETUDID}/create", [data], api_admin_headers)
+ res = POST(f"/justificatif/{ETUDID}/create", [data], api_admin_headers)
check_fields(res, BATCH_FIELD)
assert len(res["success"]) == 1
TO_REMOVE.append(res["success"][0]["message"]["justif_id"])
data2 = create_data("modifie", "02", "raison")
- res = POST_JSON(f"/justificatif/{ETUDID}/create", [data2], api_admin_headers)
+ res = POST(f"/justificatif/{ETUDID}/create", [data2], api_admin_headers)
check_fields(res, BATCH_FIELD)
assert len(res["success"]) == 1
@@ -220,7 +220,7 @@ def test_route_create(api_admin_headers):
# Mauvais fonctionnement
check_failure_post(f"/justificatif/{FAUX}/create", api_admin_headers, [data])
- res = POST_JSON(
+ res = POST(
f"/justificatif/{ETUDID}/create",
[create_data("absent", "03")],
api_admin_headers,
@@ -239,7 +239,7 @@ def test_route_create(api_admin_headers):
for d in range(randint(3, 5))
]
- res = POST_JSON(f"/justificatif/{ETUDID}/create", data, api_admin_headers)
+ res = POST(f"/justificatif/{ETUDID}/create", data, api_admin_headers)
check_fields(res, BATCH_FIELD)
for dat in res["success"]:
check_fields(dat["message"], CREATE_FIELD)
@@ -253,7 +253,7 @@ def test_route_create(api_admin_headers):
create_data("valide", 32),
]
- res = POST_JSON(f"/justificatif/{ETUDID}/create", data2, api_admin_headers)
+ res = POST(f"/justificatif/{ETUDID}/create", data2, api_admin_headers)
check_fields(res, BATCH_FIELD)
assert len(res["errors"]) == 3
@@ -270,11 +270,11 @@ def test_route_edit(api_admin_headers):
# Bon fonctionnement
data = {"etat": "modifie", "raison": "test"}
- res = POST_JSON(f"/justificatif/{TO_REMOVE[0]}/edit", data, api_admin_headers)
+ res = POST(f"/justificatif/{TO_REMOVE[0]}/edit", data, api_admin_headers)
assert isinstance(res, dict) and "couverture" in res.keys()
data["raison"] = None
- res = POST_JSON(f"/justificatif/{TO_REMOVE[1]}/edit", data, api_admin_headers)
+ res = POST(f"/justificatif/{TO_REMOVE[1]}/edit", data, api_admin_headers)
assert isinstance(res, dict) and "couverture" in res.keys()
# Mauvais fonctionnement
@@ -296,13 +296,13 @@ def test_route_delete(api_admin_headers):
# Bon fonctionnement
data = TO_REMOVE[0]
- res = POST_JSON("/justificatif/delete", [data], api_admin_headers)
+ res = POST("/justificatif/delete", [data], api_admin_headers)
check_fields(res, BATCH_FIELD)
for dat in res["success"]:
assert dat["message"] == "OK"
# Mauvais fonctionnement
- res = POST_JSON("/justificatif/delete", [data], api_admin_headers)
+ res = POST("/justificatif/delete", [data], api_admin_headers)
check_fields(res, BATCH_FIELD)
assert len(res["errors"]) == 1
@@ -312,7 +312,7 @@ def test_route_delete(api_admin_headers):
data = TO_REMOVE[1:]
- res = POST_JSON("/justificatif/delete", data, api_admin_headers)
+ res = POST("/justificatif/delete", data, api_admin_headers)
check_fields(res, BATCH_FIELD)
for dat in res["success"]:
assert dat["message"] == "OK"
@@ -325,7 +325,7 @@ def test_route_delete(api_admin_headers):
FAUX + 2,
]
- res = POST_JSON("/justificatif/delete", data2, api_admin_headers)
+ res = POST("/justificatif/delete", data2, api_admin_headers)
check_fields(res, BATCH_FIELD)
assert len(res["errors"]) == 3
@@ -473,15 +473,13 @@ def test_remove_justificatif(api_admin_headers):
filename: str = "tests/api/test_api_justificatif2.txt"
_send_file(2, filename, api_admin_headers)
- res: dict = POST_JSON(
- "/justificatif/1/remove", {"remove": "all"}, api_admin_headers
- )
+ res: dict = POST("/justificatif/1/remove", {"remove": "all"}, api_admin_headers)
assert res == {"response": "removed"}
l = GET("/justificatif/1/list", api_admin_headers)
assert isinstance(l, dict)
assert l["total"] == 0
- res: dict = POST_JSON(
+ res: dict = POST(
"/justificatif/2/remove",
{"remove": "list", "filenames": ["test_api_justificatif2.txt"]},
api_admin_headers,
@@ -491,7 +489,7 @@ def test_remove_justificatif(api_admin_headers):
assert isinstance(l, dict)
assert l["total"] == 1
- res: dict = POST_JSON(
+ res: dict = POST(
"/justificatif/2/remove",
{"remove": "list", "filenames": ["test_api_justificatif.txt"]},
api_admin_headers,
diff --git a/tests/api/test_api_partitions.py b/tests/api/test_api_partitions.py
index e505a31a825fecb417c2d936e52665431513a6e7..90f475eec1b71c2b45b2ba3925b81cafd6061f52 100644
--- a/tests/api/test_api_partitions.py
+++ b/tests/api/test_api_partitions.py
@@ -21,7 +21,7 @@ from tests.api.setup_test_api import (
API_URL,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
api_headers,
)
from tests.api.tools_test_api import (
@@ -73,7 +73,7 @@ def test_formsemestre_partition(api_headers):
"bul_show_rank": True,
"show_in_lists": True,
}
- partition_r = POST_JSON(
+ partition_r = POST(
f"/formsemestre/{formsemestre_id}/partition/create",
partition_d,
headers=headers,
@@ -83,7 +83,7 @@ def test_formsemestre_partition(api_headers):
assert partition_r["groups"] == {}
# --- Création Groupe
group_d = {"group_name": "Aé-&"}
- group_r = POST_JSON(
+ group_r = POST(
f"/partition/{partition_r['id']}/group/create",
group_d,
headers=headers,
@@ -102,14 +102,14 @@ def test_formsemestre_partition(api_headers):
# --- Ajout d'un groupe avec edt_id
group_d = {"group_name": "extra", "edt_id": "GEDT"}
- group_r = POST_JSON(
+ group_r = POST(
f"/partition/{partition_r['id']}/group/create",
group_d,
headers=headers,
)
assert group_r["edt_id"] == "GEDT"
# Edit edt_id
- group_r = POST_JSON(
+ group_r = POST(
f"/group/{group_r['id']}/edit",
{"edt_id": "GEDT2"},
headers=headers,
@@ -121,7 +121,7 @@ def test_formsemestre_partition(api_headers):
assert group["edt_id"] == "GEDT2"
# Change edt_id via route dédiée:
- group_t = POST_JSON(
+ group_t = POST(
f"/group/{group_r['id']}/set_edt_id/GEDT3",
headers=headers,
)
@@ -130,7 +130,7 @@ def test_formsemestre_partition(api_headers):
# Place un étudiant dans le groupe
etud = GET(f"/formsemestre/{formsemestre_id}/etudiants", headers=headers)[0]
- repl = POST_JSON(f"/group/{group['id']}/set_etudiant/{etud['id']}", headers=headers)
+ repl = POST(f"/group/{group['id']}/set_etudiant/{etud['id']}", headers=headers)
assert isinstance(repl, dict)
assert repl["group_id"] == group["id"]
assert repl["etudid"] == etud["id"]
@@ -139,21 +139,17 @@ def test_formsemestre_partition(api_headers):
assert len(etuds) == 1
assert etuds[0]["id"] == etud["id"]
# Retire l'étudiant du groupe
- repl = POST_JSON(
- f"/group/{group['id']}/remove_etudiant/{etud['id']}", headers=headers
- )
+ repl = POST(f"/group/{group['id']}/remove_etudiant/{etud['id']}", headers=headers)
assert len(GET(f"/group/{group['id']}/etudiants", headers=headers)) == 0
# Le retire à nouveau ! (bug #465)
- repl = POST_JSON(
- f"/group/{group['id']}/remove_etudiant/{etud['id']}", headers=headers
- )
+ repl = POST(f"/group/{group['id']}/remove_etudiant/{etud['id']}", headers=headers)
assert repl["group_id"] == group["id"]
# Avec partition (vérifie encodeur JSON)
partitions = GET(f"/formsemestre/{formsemestre_id}/partitions", headers=headers)
assert partitions
# Delete partition
- repl = POST_JSON(f"/partition/{partition_r['id']}/delete", headers=headers)
+ repl = POST(f"/partition/{partition_r['id']}/delete", headers=headers)
assert repl["OK"] is True
diff --git a/tests/api/test_api_users.py b/tests/api/test_api_users.py
index 77856553921654d8f78583909888dfe8d4e66286..b04298cf3cf1f03d61cc35d658668408f94408f8 100644
--- a/tests/api/test_api_users.py
+++ b/tests/api/test_api_users.py
@@ -11,7 +11,7 @@ from tests.api.setup_test_api import (
APIError,
CHECK_CERTIFICATE,
GET,
- POST_JSON,
+ POST,
api_headers,
api_admin_headers,
get_auth_headers,
@@ -76,7 +76,7 @@ def test_edit_users(api_admin_headers):
"""
admin_h = api_admin_headers
nb_users = len(GET("/users/query", headers=admin_h))
- user = POST_JSON(
+ user = POST(
"/user/create",
{"user_name": "test_edit_users", "nom": "Toto"},
headers=admin_h,
@@ -86,7 +86,7 @@ def test_edit_users(api_admin_headers):
assert user["active"] is True
assert (nb_users + 1) == len(GET("/users/query", headers=admin_h))
# Change le dept et rend inactif
- user = POST_JSON(
+ user = POST(
f"/user/{user['id']}/edit",
{"active": False, "dept": "TAPI", "edt_id": "GGG"},
headers=admin_h,
@@ -107,37 +107,37 @@ def test_roles(api_admin_headers):
/user/<int:uid>/edit
"""
admin_h = api_admin_headers
- user = POST_JSON(
+ user = POST(
"/user/create",
{"user_name": "test_roles", "nom": "Role", "prenom": "Test"},
headers=admin_h,
)
uid = user["id"]
- ans = POST_JSON(f"/user/{uid}/role/Secr/add", headers=admin_h)
+ ans = POST(f"/user/{uid}/role/Secr/add", headers=admin_h)
assert ans["user_name"] == "test_roles"
- role = POST_JSON("/role/create/Test_X", headers=admin_h)
+ role = POST("/role/create/Test_X", headers=admin_h)
assert role["role_name"] == "Test_X"
assert role["permissions"] == []
role = GET("/role/Test_X", headers=admin_h)
assert role["role_name"] == "Test_X"
assert role["permissions"] == []
- role = POST_JSON("/role/Test_X/edit", {"role_name": "Test_Y"}, headers=admin_h)
+ role = POST("/role/Test_X/edit", {"role_name": "Test_Y"}, headers=admin_h)
assert role["role_name"] == "Test_Y"
role = GET("/role/Test_Y", headers=admin_h)
assert role["role_name"] == "Test_Y"
- role = POST_JSON(
+ role = POST(
"/role/Test_Y/edit",
{"permissions": ["ScoView", "AbsChange"]},
headers=admin_h,
)
assert set(role["permissions"]) == {"ScoView", "AbsChange"}
- role = POST_JSON("/role/Test_Y/add_permission/AbsAddBillet", headers=admin_h)
+ role = POST("/role/Test_Y/add_permission/AbsAddBillet", headers=admin_h)
assert set(role["permissions"]) == {"ScoView", "AbsChange", "AbsAddBillet"}
role = GET("/role/Test_Y", headers=admin_h)
assert set(role["permissions"]) == {"ScoView", "AbsChange", "AbsAddBillet"}
- role = POST_JSON("/role/Test_Y/remove_permission/AbsChange", headers=admin_h)
+ role = POST("/role/Test_Y/remove_permission/AbsChange", headers=admin_h)
assert set(role["permissions"]) == {"ScoView", "AbsAddBillet"}
- ans = POST_JSON("/role/Test_Y/delete", headers=admin_h)
+ ans = POST("/role/Test_Y/delete", headers=admin_h)
assert ans["OK"] is True
@@ -153,7 +153,7 @@ def test_modif_users_depts(api_admin_headers):
# On va utiliser les 3 1er dept (TAPI, AA, BB)
# On crée un nouvel utilisateur "chef2", admin dans les 2 premiers dept
# puis un utilisateur lambda, dans le dept 2 (AA)
- chef2 = POST_JSON(
+ chef2 = POST(
"/user/create",
{
"user_name": "chef2",
@@ -163,23 +163,23 @@ def test_modif_users_depts(api_admin_headers):
},
headers=admin_h,
)
- role_chef = POST_JSON(
+ role_chef = POST(
"/role/create/chef",
{"permissions": ["ScoView", "UsersAdmin", "UsersView"]},
headers=admin_h,
)
- _ = POST_JSON(
+ _ = POST(
f"/user/{chef2['id']}/role/chef/add/departement/{dept1['acronym']}",
headers=admin_h,
)
- _ = POST_JSON(
+ _ = POST(
f"/user/{chef2['id']}/role/chef/add/departement/{dept2['acronym']}",
headers=admin_h,
)
# Un mot de passe trop simple:
ok = False
try:
- _ = POST_JSON(
+ _ = POST(
f"/user/{chef2['id']}/password",
{"password": "123456"},
headers=admin_h,
@@ -190,13 +190,13 @@ def test_modif_users_depts(api_admin_headers):
assert ok
# Un "vrai" mot de passe:
chef2_password = "17HIOPpYhabb8qw'E:/jd7FFddjd"
- _ = POST_JSON(
+ _ = POST(
f"/user/{chef2['id']}/password",
{"password": chef2_password},
headers=admin_h,
)
# Création user lambda:
- u_lambda = POST_JSON(
+ u_lambda = POST(
"/user/create",
{
"user_name": "lambda",
@@ -210,7 +210,7 @@ def test_modif_users_depts(api_admin_headers):
# Le chef va modifier u_lambda:
chef_h = get_auth_headers(chef2["user_name"], chef2_password)
# on utilise une URL avec département car on n'a pas le droit sur tous:
- u = POST_JSON(
+ u = POST(
f"/user/{u_lambda['id']}/edit",
{"nom": "toto"},
headers=chef_h,
@@ -218,7 +218,7 @@ def test_modif_users_depts(api_admin_headers):
)
assert u["nom"] == "toto"
# Dans l'autre ?
- u = POST_JSON(
+ u = POST(
f"/user/{u_lambda['id']}/edit",
{"nom": "toto"},
headers=chef_h,
@@ -227,7 +227,7 @@ def test_modif_users_depts(api_admin_headers):
# mais pas dans le troisième:
ok = False
try:
- u = POST_JSON(
+ u = POST(
f"/user/{u_lambda['id']}/edit",
{"nom": "toto"},
headers=chef_h,
@@ -240,7 +240,7 @@ def test_modif_users_depts(api_admin_headers):
# Nettoyage:
# on ne peut pas supprimer l'utilisateur lambda, mais on
# le rend inactif et on le retire de son département
- u = POST_JSON(
+ u = POST(
f"/user/{u_lambda['id']}/edit",
{"active": False, "dept": None},
headers=admin_h,
diff --git a/tests/ressources/samples/samples.csv b/tests/ressources/samples/samples.csv
index 3a4eb23ca6ff283c91e76bb0be20245297a7bc1e..fb45d31532c0e54d4b5015e0698c9abdfe8ac710 100644
--- a/tests/ressources/samples/samples.csv
+++ b/tests/ressources/samples/samples.csv
@@ -1,120 +1,90 @@
"entry_name";"url";"permission";"method";"content"
-"assiduite_create";"/assiduite/1/create";"ScoView";"POST";"{""date_debut"": ""2022-10-27T08:00"",""date_fin"": ""2022-10-27T10:00"",""etat"": ""absent""}"
-"assiduite_create";"/assiduite/1/create/batch";"ScoView";"POST";"{""batch"":[{""date_debut"": ""2022-10-27T08:00"",""date_fin"": ""2022-10-27T10:00"",""etat"": ""absent""},{""date_debut"": ""2022-10-27T08:00"",""date_fin"": ""2022-10-27T10:00"",""etat"": ""retard""},{""date_debut"": ""2022-10-27T11:00"",""date_fin"": ""2022-10-27T13:00"",""etat"": ""present""}]}"
-"assiduite_delete";"/assiduite/delete";"ScoView";"POST";"{""assiduite_id"": 1}"
-"assiduite_delete";"/assiduite/delete/batch";"ScoView";"POST";"{""batch"":[2,2,3]}"
-"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""etat"": ""retard"",""moduleimpl_id"":3}"
-"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""etat"":""absent""}"
-"assiduite_edit";"/assiduite/1/edit";"ScoView";"POST";"{""moduleimpl_id"":2}"
"assiduite";"/assiduite/1";"ScoView";"GET";
+"assiduite_justificatifs";"/assiduite/1/justificatifs";"ScoView";"GET";
+"assiduite_justificatifs";"/assiduite/1/justificatifs/long";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count";"ScoView";"GET";
-"assiduites_count";"/assiduites/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
"assiduites_count";"/assiduites/1/count/query?etat=retard";"ScoView";"GET";
-"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count";"ScoView";"GET";
-"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
-"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=retard";"ScoView";"GET";
-"assiduites_formsemestre";"/assiduites/formsemestre/1";"ScoView";"GET";
-"assiduites_formsemestre";"/assiduites/formsemestre/1/query?etat=retard";"ScoView";"GET";
-"assiduites_formsemestre";"/assiduites/formsemestre/1/query?moduleimpl_id=1";"ScoView";"GET";
+"assiduites_count";"/assiduites/1/count/query?split";"ScoView";"GET";
+"assiduites_count";"/assiduites/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
"assiduites";"/assiduites/1";"ScoView";"GET";
"assiduites";"/assiduites/1/query?etat=retard";"ScoView";"GET";
"assiduites";"/assiduites/1/query?moduleimpl_id=1";"ScoView";"GET";
-"departement-create";"/departement/create";"ScoSuperAdmin";"POST";"{""acronym"": ""NEWONE"" , ""visible"": true}"
-"departement-delete";"/departement/NEWONE/delete";"ScoSuperAdmin";"POST";
-"departement-edit";"/departement/NEWONE/edit";"ScoSuperAdmin";"POST";"{""visible"": false}"
-"departement-etudiants";"/departement/id/1/etudiants";"ScoView";"GET";
-"departement-etudiants";"/departement/TAPI/etudiants";"ScoView";"GET";
-"departement-formsemestres_ids";"/departement/id/1/formsemestres_ids";"ScoView";"GET";
-"departement-formsemestres_ids";"/departement/TAPI/formsemestres_ids";"ScoView";"GET";
-"departement-formsemestres-courants";"/departement/id/1/formsemestres_courants";"ScoView";"GET";
-"departement-formsemestres-courants";"/departement/TAPI/formsemestres_courants";"ScoView";"GET";
-"departement-logo";"/departement/id/1/logo/D";"ScoSuperAdmin";"GET";
-"departement-logo";"/departement/TAPI/logo/D";"ScoSuperAdmin";"GET";
-"departement-logos";"/departement/id/1/logos";"ScoSuperAdmin";"GET";
-"departement-logos";"/departement/TAPI/logos";"ScoSuperAdmin";"GET";
-"departement";"/departement/id/1";"ScoView";"GET";
-"departement";"/departement/TAPI";"ScoView";"GET";
-"departements-ids";"/departements_ids";"ScoView";"GET";
-"departements";"/departements";"ScoView";"GET";
-"etudiant_formsemestres";"/etudiant/nip/11/formsemestres";"ScoView";"GET";
-"etudiant-formsemestre-bulletin";"/etudiant/etudid/11/formsemestre/1/bulletin";"ScoView";"GET";
-#"etudiant-formsemestre-bulletin";"/etudiant/ine/INE11/formsemestre/1/bulletin";"ScoView";"GET";
-#"etudiant-formsemestre-bulletin";"/etudiant/nip/11/formsemestre/1/bulletin";"ScoView";"GET";
-#"etudiant-formsemestre-bulletin";"/etudiant/nip/11/formsemestre/1/bulletin/short/pdf";"ScoView";"GET";
-"etudiant-formsemestre-groups";"/etudiant/etudid/11/formsemestre/1/groups";"ScoView";"GET";
-"etudiant-formsemestres";"/etudiant/etudid/11/formsemestres";"ScoView";"GET";
-"etudiant-formsemestres";"/etudiant/ine/INE11/formsemestres";"ScoView";"GET";
-"etudiant";"/etudiant/etudid/11";"ScoView";"GET";
-"etudiant";"/etudiant/ine/INE11";"ScoView";"GET";
-"etudiant";"/etudiant/nip/11";"ScoView";"GET";
-"etudiants-clef";"/etudiants/etudid/11";"ScoView";"GET";
-"etudiants-clef";"/etudiants/ine/INE11";"ScoView";"GET";
-"etudiants-clef";"/etudiants/nip/11";"ScoView";"GET";
-"etudiants-courants";"/etudiants/courants?date_courante=2022-07-20";"ScoView";"GET";
-"etudiants-courants";"/etudiants/courants/long?date_courante=2022-07-20";"ScoView";"GET";
-"evaluation";"/evaluation/1";"ScoView";"GET";
-"evaluation-notes";"/evaluation/1/notes";"ScoView";"GET";
-"formation-export";"/formation/1/export_with_ids";"ScoView";"GET";
-"formation-export";"/formation/1/export";"ScoView";"GET";
-"formation-referentiel_competences";"/formation/1/referentiel_competences";"ScoView";"GET";
-"formation";"/formation/1";"ScoView";"GET";
-"formations_ids";"/formations_ids";"ScoView";"GET";
+"assiduites";"/assiduites/1/query?with_justifs=";"ScoView";"GET";
+"assiduites_evaluations";"/assiduites/1/evaluations";"ScoView";"GET";
+"assiduites_group";"/assiduites/group/query?etudids=1,2,3";"ScoView";"GET";
+"assiduites_formsemestre";"/assiduites/formsemestre/1";"ScoView";"GET";
+"assiduites_formsemestre";"/assiduites/formsemestre/1/query?etat=retard";"ScoView";"GET";
+"assiduites_formsemestre";"/assiduites/formsemestre/1/query?moduleimpl_id=1";"ScoView";"GET";
+"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count";"ScoView";"GET";
+"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=retard";"ScoView";"GET";
+"assiduites_formsemestre_count";"/assiduites/formsemestre/1/count/query?etat=present,retard&metric=compte,heure";"ScoView";"GET";
+"assiduite_create";"/assiduite/1/create";"UsersAdmin";"POST";"[{""date_debut"": ""2023-10-27T08:00"",""date_fin"": ""2023-10-27T10:00"",""etat"": ""absent""}]"
+"assiduite_create";"/assiduite/1/create";"UsersAdmin";"POST";"[{""date_debut"": ""2023-10-27T08:00"",""date_fin"": ""2023-10-27T10:00"",""etat"": ""absent""}]"
+"assiduites_create";"/assiduites/create";"UsersAdmin";"POST";"[{""etudid"":1,""date_debut"": ""2023-10-26T08:00"",""date_fin"": ""2023-10-26T10:00"",""etat"": ""absent""}]"
+"assiduites_create";"/assiduites/create";"UsersAdmin";"POST";"[{""etudid"":-1,""date_debut"": ""2023-10-26T08:00"",""date_fin"": ""2023-10-26T10:00"",""etat"": ""absent""}]"
+"assiduite_delete";"/assiduite/delete";"UsersAdmin";"POST";"[2,2,3]"
+"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""etat"":""absent""}"
+"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""moduleimpl_id"":2}"
+"assiduite_edit";"/assiduite/1/edit";"UsersAdmin";"POST";"{""etat"": ""retard"",""moduleimpl_id"":3}"
+"billets_absence_create";"/billets_absence/create";"UsersAdmin";"POST";"{""etudid"":""1"",""abs_begin"":""2023-10-27T10:00"",""abs_end"":""2023-10-28T10:00"",""description"":""grave malade"",""justified"":""1""}"
+"departements_list";"/departements";"ScoView";"GET";
+"departements_ids";"/departements_ids";"ScoView";"GET";
+"departement_by_acronym";"/departement/TAPI";"ScoView";"GET";
+"departement_get";"/departement/id/1";"ScoView";"GET";
+"departement_create";"/departement/create";"UsersAdmin";"POST";"{""acronym"":""MYDEPT"",""visible"":""1""}"
+"departement_etudiants";"/departement/TAPI/etudiants";"ScoView";"GET";
+"departement_formsemestres_ids";"/departement/TAPI/formsemestres_ids";"ScoView";"GET";
+"departement_formsemestres_ids_by_id";"/departement/id/1/formsemestres_ids";"ScoView";"GET";
+"departement_formsemestres_courants";"/departement/id/1/formsemestres_courants?date_courante=2022-01-01";"ScoView";"GET";
+"etudiants_courants";"/etudiants/courants?date_courante=2022-05-01";"ScoView";"GET";
+"etudiants_courants";"/etudiants/courants/long?date_courante=2022-05-01";"ScoView";"GET";
+"bulletin";"/etudiant/etudid/1/formsemestre/1/bulletin";"ScoView";"GET";
+"etudiant_groups";"/etudiant/etudid/1/formsemestre/1/groups";"ScoView";"GET";
+"etudiant_edit";"/etudiant/ine/INE1/edit";"UsersAdmin";"POST";"{""prenom"":""Nouveau Prénom"", ""adresses"":[{""email"":""nouvelle@adresse.fr""}]}"
+"etudiant_annotation";"/etudiant/etudid/1/annotation";"UsersAdmin";"POST";"{""comment"":""une annotation sur l'étudiant""}"
+"moduleimpl_evaluations";"/moduleimpl/1/evaluations";"ScoView";"GET";
+"evaluation_notes";"/evaluation/2/notes";"ScoView";"GET";
+"evaluation_set_notes";"/evaluation/1/notes/set";"UsersAdmin";"POST";"{""notes"": [[1, 17], [2, ""SUPR""]], ""comment"" : ""sample test""}"
+"evaluation_create";"/moduleimpl/1/evaluation/create";"UsersAdmin";"POST";"{""description"":""Exemple éval.""}"
"formations";"/formations";"ScoView";"GET";
-"formsemestre-bulletins";"/formsemestre/1/bulletins";"ScoView";"GET";
-"formsemestre-decisions_jury";"/formsemestre/1/decisions_jury";"ScoView";"GET";
-"formsemestre-etat_evals";"/formsemestre/1/etat_evals";"ScoView";"GET";
-"formsemestre-etudiants-query";"/formsemestre/1/etudiants/query?etat=D";"ScoView";"GET";
-"formsemestre-etudiants";"/formsemestre/1/etudiants";"ScoView";"GET";
-"formsemestre-etudiants";"/formsemestre/1/etudiants/long";"ScoView";"GET";
-"formsemestre-partition-create";"/formsemestre/1/partition/create";"ScoSuperAdmin";"POST";"{""partition_name"": ""PART""} "
-"formsemestre-partitions-order";"/formsemestre/1/partitions/order";"ScoSuperAdmin";"POST";"[ 1 ]"
-"formsemestre-partitions";"/formsemestre/1/partitions";"ScoView";"GET";
-"formsemestre-programme";"/formsemestre/1/programme";"ScoView";"GET";
-"formsemestre-resultats";"/formsemestre/1/resultats";"ScoView";"GET";
-"formsemestre";"/formsemestre/1";"ScoView";"GET";
-"formsemestres-query";"/formsemestres/query?annee_scolaire=2022&etape_apo=A2";"ScoView";"GET";
-"formsemestres-query";"/formsemestres/query?nip=11";"ScoView";"GET";
-"group-delete";"/group/2/delete";"ScoSuperAdmin";"POST";
-"group-edit";"/group/2/edit";"ScoSuperAdmin";"POST";"{""group_name"": ""NEW_GROUP2""}"
-"group-etudiants-query";"/group/1/etudiants/query?etat=D";"ScoView";"GET";
-"group-etudiants";"/group/1/etudiants";"ScoView";"GET";
-"group-remove_etudiant";"/group/1/remove_etudiant/10";"ScoSuperAdmin";"POST";
-"group-set_etudiant";"/group/1/set_etudiant/10";"ScoSuperAdmin";"POST";
-"logo";"/logo/B";"ScoSuperAdmin";"GET";
-"logos";"/logos";"ScoSuperAdmin";"GET";
-"moduleimpl-evaluations";"/moduleimpl/1/evaluations";"ScoView";"GET";
-"moduleimpl";"/moduleimpl/1";"ScoView";"GET";
-"partition-delete";"/partition/2/delete";"ScoSuperAdmin";"POST";
-"partition-edit";"/partition/1/edit";"ScoSuperAdmin";"POST";"{""partition_name"":""P2BIS"", ""numero"":3,""bul_show_rank"":true,""show_in_lists"":false, ""groups_editable"":true}"
-"partition-group-create";"/partition/1/group/create";"ScoSuperAdmin";"POST";"{""group_name"": ""NEW_GROUP""}"
-"partition-groups-order";"/partition/1/groups/order";"ScoSuperAdmin";"POST";"[ 1 ]"
-"partition-remove_etudiant";"/partition/2/remove_etudiant/10";"ScoSuperAdmin";"POST";
-"partition";"/partition/1";"ScoView";"GET";
-"permissions";"/permissions";"ScoView";"GET";
-"role-add_permission";"/role/customRole/add_permission/UsersView";"ScoSuperAdmin";"POST";
-"role-create";"/role/create/customRole";"ScoSuperAdmin";"POST";"{""permissions"": [""ScoView"", ""UsersView""]}"
-"role-delete";"/role/customRole/delete";"ScoSuperAdmin";"POST";
-"role-edit";"/role/customRole/edit";"ScoSuperAdmin";"POST";"{ ""name"" : ""LaveurDeVitres"", ""permissions"" : [ ""ScoView"" ] }"
-"role-remove_permission";"/role/customRole/remove_permission/UsersView";"ScoSuperAdmin";"POST";
-"role";"/role/Observateur";"ScoView";"GET";
-"roles";"/roles";"ScoView";"GET";
-"test-pdf";"/etudiant/etudid/11/formsemestre/1/bulletin";"ScoView";"GET";
-"test-pdf";"/etudiant/etudid/11/formsemestre/1/bulletin/pdf";"ScoView";"GET";
-"test-pdf";"/etudiant/etudid/11/formsemestre/1/bulletin/short";"ScoView";"GET";
-"test-pdf";"/etudiant/etudid/11/formsemestre/1/bulletin/short/pdf";"ScoView";"GET";
-"test-pdf";"/etudiant/ine/INE11/formsemestre/1/bulletin";"ScoView";"GET";
-"test-pdf";"/etudiant/ine/INE11/formsemestre/1/bulletin/short";"ScoView";"GET";
-"test-pdf";"/etudiant/ine/INE11/formsemestre/1/bulletin/short/pdf";"ScoView";"GET";
-"test-pdf";"/etudiant/nip/11/formsemestre/1/bulletin";"ScoView";"GET";
-"test-pdf";"/etudiant/nip/11/formsemestre/1/bulletin/pdf";"ScoView";"GET";
-"test-pdf";"/etudiant/nip/11/formsemestre/1/bulletin/pdf";"ScoView";"GET";
-"test-pdf";"/etudiant/nip/11/formsemestre/1/bulletin/short";"ScoView";"GET";
-"test-pdf";"/etudiant/nip/11/formsemestre/1/bulletin/short/pdf";"ScoView";"GET";
-"user-create";"/user/create";"ScoSuperAdmin";"POST";"{""user_name"": ""alain"", ""dept"": null, ""nom"": ""alain"", ""prenom"": ""bruno"", ""active"": true }"
-"user-edit";"/user/10/edit";"ScoSuperAdmin";"POST";"{ ""dept"": ""TAPI"", ""nom"": ""alain2"", ""prenom"": ""bruno2"", ""active"": false }"
-"user-password";"/user/3/password";"ScoSuperAdmin";"POST";"{ ""password"": ""rePlaCemeNT456averylongandcomplicated"" }"
-"user-password";"/user/3/password";"ScoSuperAdmin";"POST";"{ ""password"": ""too_simple"" }"
-"user-role-add";"/user/10/role/Observateur/add";"ScoSuperAdmin";"POST";
-"user-role-remove";"/user/10/role/Observateur/remove";"ScoSuperAdmin";"POST";
-"user";"/user/1";"ScoView";"GET";
-"users-query";"/users/query?starts_with=u_";"ScoView";"GET";
+"formations_ids";"/formations_ids";"ScoView";"GET";
+"formation_get";"/formation/1";"ScoView";"GET";
+"formation_export_by_formation_id";"/formation/1/export";"ScoView";"GET";
+"referentiel_competences";"/formation/1/referentiel_competences";"ScoView";"GET";
+"formation_module_get";"/formation/module/1";"ScoView";"GET";
+"formsemestre_get";"/formsemestre/1";"ScoView";"GET";
+"bulletins";"/formsemestre/1/bulletins";"ScoView";"GET";
+"formsemestre_programme";"/formsemestre/1/programme";"ScoView";"GET";
+"formsemestre_etudiants";"/formsemestre/1/etudiants/query";"ScoView";"GET";
+"formsemestre_etat_evaluations";"/formsemestre/1/etat_evals";"ScoView";"GET";
+"formsemestre_resultat";"/formsemestre/1/resultats";"ScoView";"GET";
+"decisions_jury";"/formsemestre/1/decisions_jury";"ScoView";"GET";
+"justificatif";"/justificatif/1";"ScoView";"GET";
+"justificatifs";"/justificatifs/1";"ScoView";"GET";
+"justificatifs";"/justificatifs/1/query?etat=attente";"ScoView";"GET";
+"justificatifs_dept";"/justificatifs/dept/1";"ScoView";"GET";
+"justificatifs_formsemestre";"/justificatifs/formsemestre/1";"ScoView";"GET";
+"justif_edit";"/justificatif/1/edit";"UsersAdmin";"POST";"{""etat"":""valide""}"
+"justif_edit";"/justificatif/1/edit";"UsersAdmin";"POST";"{""raison"":""MEDIC""}"
+"justif_delete";"/justificatif/delete";"UsersAdmin";"POST";"[2, 2, 3]"
+"justif_list";"/justificatif/1/list";"ScoView";"GET";
+"justif_justifies";"/justificatif/1/justifies";"UsersAdmin";"GET";
+"logo_list_globals";"/logos";"UsersAdmin";"GET";
+"logo_get_global";"/logo/B";"UsersAdmin";"GET";
+"departement_logos";"/departement/TAPI/logos";"UsersAdmin";"GET";
+"moduleimpl_inscriptions";"/moduleimpl/1/inscriptions";"ScoView";"GET";
+"moduleimpl_notes";"/moduleimpl/1/notes";"ScoView";"GET";
+"partition_info";"/partition/1";"ScoView";"GET";
+"formsemestre_partitions";"/formsemestre/1/partitions";"ScoView";"GET";
+"group_etudiants";"/group/1/etudiants";"ScoView";"GET";
+"group_create";"/partition/1/group/create";"ScoView";"POST";"{""group_name"" : ""Nouveau Groupe""}"
+"group_edit";"/group/1/edit";"ScoView";"POST";"{""group_name"":""A1""}"
+"group_set_edt_id";"/group/1/set_edt_id/EDT_GR1";"ScoView";"POST";
+"partition_edit";"/partition/1/edit";"ScoView";"POST";"{""bul_show_rank"":1}"
+"user_info";"/user/2";"UsersAdmin";"GET";
+"user_password";"/user/3/password";"UsersAdmin";"POST";"{""password"" : ""rePlaCemeNT456averylongandcomplicated""}"
+"permissions_list";"/permissions";"UsersAdmin";"GET";
+"role_get";"/role/Ens";"UsersAdmin";"GET";
+"roles_list";"/roles";"UsersAdmin";"GET";
+"role_create";"/role/create/customRole";"UsersAdmin";"POST";"{""permissions"": [""ScoView"", ""UsersView""]}"
+"role_delete";"/role/customRole/delete";"UsersAdmin";"POST";
\ 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 adeaa7c3355e79c47e157d25cdc6cf4a0d63244e..f2e7463dff533f7ed780cdb5023e813232727081 100644
--- a/tools/fakedatabase/create_test_api_database.py
+++ b/tools/fakedatabase/create_test_api_database.py
@@ -211,10 +211,17 @@ def create_formsemestre(
)
db.session.add(modimpl)
db.session.commit()
+ # Partition par défaut (requise):
partition_id = sco_groups.partition_create(
formsemestre.id, default=True, redirect=False
)
- group = sco_groups.create_group(partition_id, default=True)
+ sco_groups.create_group(partition_id, default=True)
+ # Ajoute partition normale, TD avec groupes A et B:
+ partition_id = sco_groups.partition_create(
+ formsemestre.id, partition_name="TD", redirect=False
+ )
+ sco_groups.create_group(partition_id, group_name="A")
+ sco_groups.create_group(partition_id, group_name="B")
return formsemestre