Documention future API REST

This commit is contained in:
Emmanuel Viennet 2021-11-19 11:18:02 +01:00
parent 8be16fa32e
commit fe583938e0
2 changed files with 337 additions and 151 deletions

194
.gitignore vendored
View File

@ -1 +1,193 @@
.idea
# ---> Emacs
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/
dist/
# Flycheck
flycheck_*.el
# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# Mac OSX OS generated files
.DS_Store?
Thumbs.db
*.DS_Store
# Other source repository archive directories (protects when importing)
.hg
.svn
CVS
# MkDocs ScoDoc
site/

View File

@ -12,14 +12,14 @@ L'API fournit des données JSON, sauf exception (bulletins).
Les objets ScoDoc manipulables sont identifiés par des id:
* etudid: étudiant
* form_id: un programme de formation (page "programmes");
* formation_id: un programme de formation (page "programmes");
* ue_id: une UE dans un programme;
* matiere_id: une matière dans un programme;
* module_id: un module dans un programme.
* formsmestre_id: un "semestre" de formation.
* formsemestre_id: un "semestre" de formation.
L'URL complète est de la forme: `https://scodoc.example.com/ScoDoc/api/fonction
L'URL complète est de la forme: `https://scodoc.example.com/ScoDoc/api/fonction`.
# Fonctions de l'API ScoDoc 7 portées en ScoDoc 9
@ -37,10 +37,10 @@ Certaines ont plusieurs "routes" (URl), car ScoDoc 7 tolérait divers accès.
- `Absences/XMLgetAbsEtud` (deviendra `api/absences/ etudid>`, en json)
- `Notes/evaluation_listenotes` (non existante en ScoDoc9, trop complexe)
- `Notes/formsemestre_id` (deviendra `api/formsemestre`)
- `Notes/formsemestre_bulletinetud` (deviendra `api/formsemestre_bulletinetud`)
- `Notes/formsemestre_bulletinetud` (deviendra `api/etud/<etudid>/bul/<formsemestre_id>`)
- `Notes/XMLgetFormsemestres` (non existante en ScoDoc9, redondant avec `api/formsemestre` ?)
- `etud_info` ou `XMLgetEtudInfos` ou `Absences/XMLgetEtudInfos` ou `Notes/XMLgetEtudInfos` (deviendra `/api/etud/ etudid>`)
- `groups_view`
- `etud_info` ou `XMLgetEtudInfos` ou `Absences/XMLgetEtudInfos` ou `Notes/XMLgetEtudInfos` (deviendra `/api/etud/<etudid>`)
- `groups_view` (deviendra `groups`)
Les routes ci-dessus s'entendent à partir de l'URL de base de votre ScoDoc, c'est
à dire `https://votre.site.fr/ScoDoc/<dept>/Scolarite/`, et répondent en GET et
@ -49,16 +49,20 @@ en POST.
Note:
- `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API.
# Résumé des fonctions d'API ScoDoc 9 (work in progress)
# Fonctions d'API ScoDoc 9 (work in progress)
Basé sur le ticket [#149](https://scodoc.org/git/viennet/ScoDoc/issues/149)
## Définition des points d'accès à l'API REST (jwt):
**Note: à reformatter: le tableau n'est pas lisible et exploitable**
La documentation ci-dessous concerne la **future** version De ScoDoc.
## Accès à l'API REST
Elle sera accessible à l'adresse: https://scodoc.monsite.tld/ScoDoc/api/fonction
# Codes HTTP
### Authentification
TODO décrire procédure d'authentification et tokens jwt.
### Codes HTTP
Chaque appel à l'API donne lieu à une réponse retournant un code spécifique en fonction du résultat obtenu. L'analyse de ce code vous permet de vous assurer que la requête a été traitée avec succès.
Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succès par nos serveurs.
@ -74,8 +78,6 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
* [503](https://developer.mozilla.org/fr/docs/Web/HTTP/Status/503) : L'API est momentanément indisponible, réessayez dans quelques minutes.
# Description d'accès aux données
## Départements
* **`departement`**
* **Méthode:** GET
@ -134,7 +136,7 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
"date_debut": "2008-09-01"
}
],
"etudid": "EID8768",
"etudid": "8768",
"domicile": "2 Rue Madame",
"villedomicile": "Paris",
"telephonemobile": ""
@ -142,7 +144,7 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
```
* **`etud_bul`**
* **`etud//bul`**
* **Méthode:** GET
* **Paramètres:** `etudid`, `sem_id`
* **Format URL:** `/api/etud/<int:etudid>/bul/<int:sem_id>`
@ -152,7 +154,7 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
* **`etud_photo`**
* **`etud//photo`**
* **Méthode:** GET
* **Paramètres:** `etudid`, `small`
* **Format URL:** `/api/etud/<int:etudid>/photo` **OU** `/api/etud/<int:etudid>/photo/small` (_ajout du paramètre **small** pour la version small_)
@ -160,49 +162,23 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
* **Résultat:** Image en JPEG ou PNG.
## Semestres
* **`sem_info`**
* **Méthode:** GET
* **Paramètres:** `sem_id`
* **Format URL:** `/api/sem_info/<int:sem_id>`
* **Exemple d'utilisation:** `/api/sem_info/12`
* **Résultat:** Une liste avec les informations du semestre correspondant à l'id passé en paramètres.
* **Exemple de résultat:**
```
[
{
"titre": "DUT Génie Electrique et Informatique Industrielle",
"date_debut": "2021-09-01",
"date_fin": "2022-02-02",
"modalite": "FI",
"sem_id_txt": "S3",
"titre_num": "DUT Génie Electrique et Informatique Industrielle semestre 3",
"anneescolaire": "2021 - 2022",
"periode": 1,
"titreannee": "DUT Génie Electrique et Informatique Industrielle semestre 3 FI 2021-2022"
}
]
```
## Programmes de formations
* **`formation`**
* **Méthode:** GET
* **Paramètres:** `form_id` (_optionnel, si absent liste toutes les formations_)
* **Format URL:** `/api/formation` **ou** `/api/formation/<int:form_id>`
* **Exemple d'utilisation:** `/api/formation` **ou** `̀/api/formation/1`
* **Paramètres:** `formation_id` (_optionnel, si absent liste toutes les formations_)
* **Format URL:** `/api/formation` **ou** `/api/formation/<int:formation_id>`
* **Exemple d'utilisation:** `/api/formation` **ou** `/api/formation/1`
* **Résultat:** Liste des formations.
* **Exemple de résultat:** `[formation_1, formation_2, formation_3, ...]`
* TODO: détailler le contenu publié
* **`formation_export`**
* **Méthode:** GET
* **Paramètres:** `form_id`, `export_ids` (_par défaut "faux"_)
* **Format URL:** `/api/formation_export/<int:form_id>`
* **Exemple d'utilisation:** `/api/formation_export/596`
* **Paramètres:** `formation_id`, `export_ids` (_par défaut "faux"_)
* **Format URL:** `/api/formation_export/<int:formation_id>`
* **Exemple d'utilisation:** `/api/formation_export/596` **ou** `/api/formation_export/596?format=xml&export_ids=1`
* **Résultat:** La formation, avec UE, matières, modules (_un arbre_).
* **Exemple de résultat:**
```
@ -214,119 +190,135 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ
"matiere_2": "anglais",
...
],
"modules": "module"
"modules": ...
}
```
## UE
...
... TODO
## Modules de formation
* **`Notes/do_moduleimpl_list`**
* **Paramètres**: `formsemestre_id, moduleimpl_id, module_id]`
* **Résultat:** liste de moduleimpl
* **`Notes/do_moduleimpl_withmodule_list`**
* **Paramètres**: `formsemestre_id, moduleimpl_id, module_id]`
* **Résultat:** liste triée de moduleimpl, avec l'attribut `module`
## Semestres de formation
Les sessions de formation (dénommées "semestres" même si elles durent une année ou un mois) sont représentées par les `formsemestre_id`.
Les sessions de formation (dénommées "semestres" même si elles durent une année ou un mois) sont représentées par les `formsemestre`.
* **`formsemestre_id`**
* **`formsemestre`**
* **Méthode:** GET
* **Paramètres (_tous optionnels_):** `formsemestre_id`, `form_id`, `etape_apo`, `etape_apo2`
* **Format URL:** `/api/formsemestre_id?form_id=1&etape_apo=V1RT`
* **Exemple d'utilisation:** `/api/formsemestre_id?format=xml&etape_apo=V1RT`
* **Résultat:** Liste des semestres correspondant.
* **Exemple de résultat:** `[sem_1, sem_2, sem_3, ...]`
* **Paramètres:** `formsemestre_id` ou `etape_apo`, `format`(json ou xml)
* **Format URL:** `/api/formsemestre/<int:formsemestre_id>`, `/api/formsemestre/apo/<etape_apo>`
* **Exemple d'utilisation:** `/api/formsemestre/12`
* **Résultat:** Informations sur le(s) formsemestre(s).
* **Exemple de résultat:**
```
[
{
"annee_scolaire": "2022 - 2023",
"date_debut": "2022-09-01",
"date_fin": "2023-02-02",
"modalite": "FI",
"periode": 1,
"semestre_idx_txt": "S3",
"semestre_idx" : 3,
"session_id" : "GEII-BUT-FI-S3-2022",
"titre_annee": "BUT Génie Electrique et Informatique Industrielle semestre 3 FI 2021-2022"
"titre_num": "BUT Génie Electrique et Informatique Industrielle semestre 3",
"titre": "BUT Génie Electrique et Informatique Industrielle",
}
]
```
## Note sur les identifiants de sessions
Le `session_id` peut être utilisé pour identifier de façon prévisible et (presque) unique une session dans un établissement, ce qui est utile notamment pour interfacer ScoDoc à d'autres logiciels (eg gestion d'emplois du temps ou de services d'enseignement). Cet identifiant est constitué des informations suivantes:
### Note sur les identifiants de sessions
Le `session_id` peut être utilisé pour identifier de façon prévisible et
(presque) unique une session dans un établissement, ce qui est utile
notamment pour interfacer ScoDoc à d'autres logiciels (par exemple gestion d'emplois
du temps ou de services d'enseignement). Cet identifiant est constitué des
informations suivantes:
* **Département** (RT, GEII, INFO...) (= paramètre `DeptName`, en majuscules)
* **Nom parcours:** DUT, LP, ... (défini au niveau du parcours dans ScoDoc = NAME)
* **Nom parcours:** BUT, LP, ... (défini au niveau du parcours dans ScoDoc = NAME)
* **Modalité:** FI, FC, FA
* **"Spécialité":** S1 (ou S1D pour les sem. décalés), ou le `code_specialite` si pas de semestres. Le code spécialité est un champ (libre) nouveau dans la "formation" (programme pédagogique).
* **Année:** année de début de l'année scolaire correspondante (eg 2014 pour une session appartenant à l'année scolaire 2014-2015, même si elle commence en mars 2015).
* **"Spécialité":** S1 (ou S1D pour les semestres décalés), ou le
`code_specialite` si pas de semestres. Le code spécialité est un champ
(libre) nouveau dans la "formation" (programme pédagogique).
* **Année:** année de début de l'année scolaire correspondante (2014 pour
une session appartenant à l'année scolaire 2014-2015, même si elle
commence en mars 2015).
**Exemple:** `INFO-DUT-FI-S1-2014` équivaut à un semestre S1 d'un DUT informatique de 2014 en formation initiale (FI)
## Modules de formation
Les moduleimpl sont les modules d'un semestre, ou les ressources, ou les SAÉs.
On peut récupérer soit un module par son id, soit la listes des modules d'un semestre.
* **`moduleimpl`**
* **Méthode:** GET
* **Paramètres**: `formsemestre_id` ou `moduleimpl_id`
* **Format URL:** `/api/moduleimpl/<int:moduleimpl_id>`, `/api/<int:moduleimpl_id>/formsemestre/<int:formsemestre_id>`
* **Résultat:** liste de moduleimpl
* **Exemple de résultat:**
TODO
## Groupes et partitions
L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieurs partitions (types de groupes). Chaque partition est constituée d'un nombre quelconque de groupes d'étudiants.
L'ensemble des étudiants d'un semestre peut être réparti selon une ou
plusieurs partitions (types de groupes). Chaque partition est constituée
d'un nombre quelconque de groupes d'étudiants.
* **`formsemestre_id_partition`**
* **`partition`**
* **Méthode: GET**
* **Paramètres:** `formsemestre_id`
* **Format URL:** `/api/formsemestre_id_partition/<int:formsemestre_id>`
* **Exemple d'utilisation:** `/api/formsemestre_id_partition/48`
* **Résultat:** La liste de toutes les partitions selon un `formsemestre_id` donné.
* **Exemple de résultat:** ici au format JSON
* **Format URL:** `/api/partition/<int:formsemestre_id>`
* **Exemple d'utilisation:** `/api/partition/48`
* **Résultat:** La liste de toutes les partitions d'un formsemestre.
* **Exemple de résultat:**
```
[
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"formsemestre_id": "12781",
"partition_id": "23840",
"partition_name": "TD"
"group": [
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"formsemestre_id": "12781",
"partition_id": "23840",
"group_name": "A",
"group_id": "G23841",
"group_id": "23841",
"partition_name": "TD"
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"formsemestre_id": "12781",
"partition_id": "23840",
"group_name": "B",
"group_id": "G23843",
"group_id": "23843",
"partition_name": "TD"
},
],
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P23941",
"formsemestre_id": "12781",
"partition_id": "23941",
"partition_name": "TP"
"group": [
{
"formsemestre_id": "SEM12781",
"partition_id": "P23941",
"group_name": "A1",
"group_id": "G23942",
"partition_name": "TP"
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P23941",
"group_name": "A2",
"group_id": "G23943",
"partition_name": "TP"
...
},
...
],
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P22833",
"formsemestre_id": "12781",
"partition_id": "22833",
"partition_name": null
"group": [
{
"formsemestre_id": "SEM12781",
"partition_id": "P22833",
"formsemestre_id": "12781",
"partition_id": "22833",
"group_name": null,
"group_id": "G22834",
"partition_name": null
@ -337,7 +329,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
```
* **`groups_view`**
* **`groups`**
* **Méthode:** GET
* **Paramètres:** `formsemestre_id` ou `group_ids` (_peut être répété_), `with_codes=0|1`, `all_groups=0|1`, `etat=None|I`
* **Format URL:**
@ -352,7 +344,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
<prenom value="Marc"/>
<etat value="I"/>
<email value="toto@example.com"/>
<etudid value="EID9876"/>
<etudid value="9876"/>
<code_nip value="987654"/>
<code_ine value=""/>
</etud>
@ -362,7 +354,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
<prenom value="NATHALIE"/>
<etat value="I"/>
<email value="xxx@example.com"/>
<etudid value="EID12345"/>
<etudid value="12345"/>
<code_nip value="12345678"/>
<code_ine value=""/>
</etud>
@ -377,10 +369,10 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"prenom":"Dalil",
"nom_disp":"CLINTO",
"email":"xxx@example.com",
"P62029":"A",
"P62032":null,
"P62031":"G1",
"P62030":"A1"
"62029":"A",
"62032":null,
"62031":"G1",
"62030":"A1"
},
{
"etat":"I",
@ -388,10 +380,10 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"prenom":"Georges",
"nom_disp":"BUSH",
"email":"bush@example.com",
"P62029":"A",
"P62032":null,
"P62031":"G1",
"P62030":"A1"
"62029":"A",
"62032":null,
"62031":"G1",
"62030":"A1"
},
...
]
@ -403,22 +395,23 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
* **Format URL:** `/api/set_groups?partition_id=<int:partition_id>&groups=<int:groups>&groups_to_delete=<int:groups_to_delete>&groups_to_create=<int:groups_to_create>`
* **Exemple d'utilisation:** `/api/set_groups?partition_id=65&groups=77&groups_to_delete=8&groups_to_create=4`
* **Résultat:** Set les groups.
TODO: à changer, passer les paramètres dans le corps de la requete
## Bulletins de notes
* **`evaluations`**
* **Méthode:** GET
* **Paramètres:** `module_id`
* **Format URL:** `/api/evaluations/<int:module_id>`
* **Paramètres:** `moduleimpl_id`
* **Format URL:** `/api/evaluations/<int:moduleimpl_id>`
* **Exemple d'utilisation:** `/api/evaluations/54`
* **Résultat:** Liste des evaluations à partir de l'id d'un module.
* **Résultat:** Liste des évaluations à partir de l'id d'un moduleimpl.
* **Exemple de résultat:** `[eval_1, eval_2, eval_3, ...]`
* **`eval_notes`**
* **`evaluation_notes`**
* **Méthode**: GET
* **Paramètres**: `eval_id`
* **Format URL:** `/api/eval_notes/<int:eval_id>`
* **Paramètres**: `evaluation_id`
* **Format URL:** `/api/eval_notes/<int:evaluation_id>`
* **Exemple d'utilisation:** `/api/eval_notes/24`
* **Résultat:** Liste des notes à partir de l'id d'une évaluation donnée.
* **Exemple de résultat:**
@ -434,15 +427,16 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
```
* **`eval_set_notes`**
* **`evaluation_set_notes`**
* **Méthode:** POST
* **Paramètres:** `eval_id`, `etudid`, `note`
* **Format URL:** `/api/eval_set_notes?eval_id=<int:eval_id> etudid=<int etudid>&note=<int:note>`
* **Exemple d'utilisation:** `/api/eval_set_notes?eval_id=6 etudid=456&note=15`
* **Résultat:** Set les notes d'une évaluation pour un étudiant donné.
TODO vérifier et passer les valeurs dans le corps.
* **`Notes/formsemestre_bulletinetud`**
* **`etud//bul`**
* **Méthode:** GET
* **Paramètres:** `formsemestre_id`, `etudid`, `format` (`xml`ou `json`), `version` (`short`, `selectedevals` ou `long`)
* **Format URL:**
@ -463,10 +457,10 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"prenom": "Roberto",
"sexe": "M.",
"code_ine": "",
etudid": "EID9860",
etudid": "9860",
"code_nip": "123456789",
"email": "roberto@santateresa.mx",
"photo_url": "\/ScoDoc\/static\/photos\/F68\/RT_EID29960.h90.jpg"
"photo_url": "\/ScoDoc\/static\/photos\/F68\/RT_29960.h90.jpg"
},
"bonus_sport_culture": {
"value": 0
@ -486,7 +480,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"value": "15.51",
"min": "07.29"
},
etudid": "EID9860",
etudid": "9860",
"decision_ue": [
{
"acronyme": "UE11",
@ -599,7 +593,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27427"
"id": "27427"
},
{
"coefficient": 2,
@ -626,7 +620,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27437"
"id": "27437"
},
{
"coefficient": 1.5,
@ -653,7 +647,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27451"
"id": "27451"
},
{
"coefficient": 2,
@ -680,7 +674,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27431"
"id": "27431"
},
{
"coefficient": 2,
@ -707,7 +701,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27433"
"id": "27433"
},
{
"coefficient": 1.5,
@ -734,7 +728,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27449"
"id": "27449"
},
{
"coefficient": 1.5,
@ -761,7 +755,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27440"
"id": "27440"
},
{
"coefficient": 1.5,
@ -788,14 +782,14 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27453"
"id": "27453"
},
{
"coefficient": 1,
"rang": {
"value": "4 ex"
},
"code": "M1109",
"code": "1109",
"code_apogee": "VRT1109",
"numero": 1109,
"note": {
@ -815,7 +809,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27444"
"id": "27444"
}
],
"effectif": "51",
@ -859,7 +853,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27430"
"id": "27430"
},
{
"coefficient": 2,
@ -886,7 +880,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27439"
"id": "27439"
},
{
"coefficient": 1,
@ -913,7 +907,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27436"
"id": "27436"
},
{
"coefficient": 2,
@ -940,7 +934,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27454"
"id": "27454"
},
{
"coefficient": 2,
@ -967,7 +961,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27432"
"id": "27432"
},
{
"coefficient": 2,
@ -994,7 +988,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27435"
"id": "27435"
},
{
"coefficient": 2,
@ -1021,7 +1015,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27445"
"id": "27445"
},
{
"coefficient": 1,
@ -1048,7 +1042,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"evaluation": [
],
"id": "MIP27434"
"id": "27434"
}
],
"effectif": "51",
@ -1135,7 +1129,7 @@ L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieu
"nbabsnonjust": "7",
"nbjustifs_noabs": "0",
"nomprenom": "Mme Poisson Dodouce",
"etudid": "EID12345"
"etudid": "12345"
},
...
]