infos sur ScoDoc 9

This commit is contained in:
Emmanuel Viennet 2021-09-14 12:31:16 +02:00
parent f9c2ef5956
commit e713143096
7 changed files with 1104 additions and 23 deletions

View File

@ -17,7 +17,7 @@ départements. Le reste des paramétrages (création de comptes, de formations,
d'étudiants, etc) se fait à partir du logiciel (web). d'étudiants, etc) se fait à partir du logiciel (web).
L'administration se fait dans un terminal connecté au serveur (en général via L'administration se fait dans un terminal connecté au serveur (en général via
ssh), en tant qu'utilisateur `scodoc` (et non `root`). ssh), en tant qu'utilisateur `scodoc` (*et non* `root`).
Se connecter et initialiser la session ainsi: Se connecter et initialiser la session ainsi:
@ -29,6 +29,8 @@ Se connecter et initialiser la session ainsi:
source venv/bin/activate source venv/bin/activate
Après quoi, vous pouvez utiliser les commandes décrites ci-dessous. Après quoi, vous pouvez utiliser les commandes décrites ci-dessous.
*Attention: le lancement de chaque commande est assez long (quelques secondes)
car toute l'application scodoc est initialisée à chaque fois.*
## Création d'un département ## Création d'un département
@ -45,8 +47,8 @@ immédiatement après la création.
flask delete-dept DEPT flask delete-dept DEPT
## Création d'un utilisateur ## Création d'un utilisateur
Cette opération s'effectue en général depuyis le logiciel, via un formulaire Cette opération s'effectue en général depuis le logiciel, via un formulaire
ou un import excel. Depuis la consoile, faire: ou un import excel. Pour créer un utilisateur depuis le terminal, lancer:
flask user-create LOGIN ROLE DEPT flask user-create LOGIN ROLE DEPT
@ -72,6 +74,21 @@ console:
`LOGIN` est le pseudo de l'utilisateur. Le mot de passe est demandé `LOGIN` est le pseudo de l'utilisateur. Le mot de passe est demandé
sur la ligne de commande. sur la ligne de commande.
## Création d'un nouveau rôle
flask create-role role_name [permissions...]
Exemple: création d'une rôle "Observateur" ayant juste la persmision de "voir":
flask create-role Observateur ScoView
## Édition d'un rôle (ajout/retrait permissions)
flask edit-role [-a permission] [-r permission] role_name
Ajoute ou retire une permission.
## Migration des données de ScoDoc 7 ## Migration des données de ScoDoc 7
Les données dans ScoDoc 9 ayant un format et une organisation très différents Les données dans ScoDoc 9 ayant un format et une organisation très différents
de ScoDoc 7, une étape de conversion (migration) est nécessaire. Elle est automatique de ScoDoc 7, une étape de conversion (migration) est nécessaire. Elle est automatique
@ -79,7 +96,9 @@ mais prends du temps.
Se reporter à [MigrationScoDoc7a9](MigrationScoDoc7a9.md) Se reporter à [MigrationScoDoc7a9](MigrationScoDoc7a9.md)
Au besoin (cas rare), utiliser les commandes ci-dessous. Ces commandes sont utilisées par le script de migration de ScoDoc 7 à ScoDoc 9.
*Ne pas utiliser sauf si vous savez vraiment ce que vous faites.*
### Comptes utilisateurs ### Comptes utilisateurs
Toujours migrer les comptes utilisateurs avant d'importer les Toujours migrer les comptes utilisateurs avant d'importer les
@ -88,7 +107,6 @@ départements.
flask import-scodoc7-users flask import-scodoc7-users
### Départements ### Départements
Pour migrer un seul département: Pour migrer un seul département:
flask import-scodoc7-dept DEPT DBNAME flask import-scodoc7-dept DEPT DBNAME
@ -97,6 +115,92 @@ Exemple:
flask import-scodoc7-dept InfoComm DBINFOCOMM flask import-scodoc7-dept InfoComm DBINFOCOMM
## Liste des commandes Flask/ScoDoc
```
Commands:
clear-cache Clear ScoDoc cache (currently Redis)
create-dept Create new departement
delete-dept Delete existing departement
edit-role Add [-a] and/or remove [-r] a permission to/from a role
import-scodoc7-dept Import département ScoDoc 7
import-scodoc7-users Import users defined in ScoDoc7 postgresql
sco-db-init Initialize the database.
user-create Create a new user
user-db-clear Erase all users and roles from the database !
user-password Set (or change) user's password
Usage: app sco-db-init [OPTIONS]
Initialize the database. Starts from an existing database and create all the
necessary SQL tables and functions.
Usage: app user-db-clear [OPTIONS]
Erase all users and roles from the database !
Usage: app user-create [OPTIONS] USERNAME ROLE DEPT
Create a new user
Options:
-n, --nom TEXT
-p, --prenom TEXT
Usage: app user-password [OPTIONS] USERNAME
Set (or change) user's password
Options:
--password TEXT
Usage: app edit-role [OPTIONS] ROLENAME
Add [-a] and/or remove [-r] a permission to/from a role. In ScoDoc,
permissions are not associated to users but to roles. Each user has a set of
roles in each departement.
Example: `flask edit-role -a ScoEditApo Ens`
Options:
-a, --add TEXT
-r, --remove TEXT
Usage: app delete-dept DEPT
Delete existing departement
Usage: app create-dept DEPT
Create new departement
Usage: app import-scodoc7-users
Import used defined in ScoDoc7 postgresql database into ScoDoc 9 The old
database SCOUSERS must be alive and readable by the current user. This
script is typically run as unix user "scodoc". The original SCOUSERS
database is left unmodified.
Usage: app import-scodoc7-dept DEPT DEPT_DB_NAME
Import département ScoDoc 7: dept: InfoComm, dept_db_name: SCOINFOCOMM
Usage: app clear-cache
Clear ScoDoc cache This cache (currently Redis) is persistent between
invocation and it may be necessary to clear it during development or tests.
Options:
--help Show this message and exit.
```
## Changement des logos apparaissant sur les documents ## Changement des logos apparaissant sur les documents
@ -112,18 +216,24 @@ dans le répertoire
avec les noms `logo_header.jpg` (habituellement le logo de votre composante) avec les noms `logo_header.jpg` (habituellement le logo de votre composante)
et `logo_footer.jpg` (habituellement le logo de votre université ou école). et `logo_footer.jpg` (habituellement le logo de votre université ou école).
Ensuite, éditez le fichier On peut fournir des logos par département en créant des sous-répertoires
/opt/scodoc-data/config/logos/logo_<dept>/
pour y placer les fichiers images `logo_header.jpg` et `logo_footer.jpg`.
<!-- Ensuite, éditez le fichier
/opt/scodoc-data/config/logos /opt/scodoc-data/config/logos
et changer les valeurs des variables `CONFIG.LOGO_FOOTER_ASPECT` et suivantes et changer les valeurs des variables `CONFIG.LOGO_FOOTER_ASPECT` et suivantes
(ce n'est pas pratique, il faudrait modifier le code ScoDoc pour calculer ces valeurs (ce n'est pas pratique, il faudrait modifier le code ScoDoc pour calculer ces valeurs
à partir des fichiers images). à partir des fichiers images). -->
Enfin, redémarrez ScoDoc après avoir vidé les caches: Enfin, redémarrez ScoDoc après avoir vidé les caches:
flask clear-cache flask clear-cache
systemctl restart scodoc9 sudo systemctl restart scodoc9
# Utilisation via le Web # Utilisation via le Web

View File

@ -17,7 +17,7 @@ Informations pour les développeurs souhaitant étendre ou modifier ScoDoc.
## Développer sur ScoDoc ## Développer sur ScoDoc
Quelques conseils, indications et mémos pour les développeurs sur ScoDoc version 7.x et 8. Quelques conseils, indications et mémos pour les développeurs sur ScoDoc version 9.
### Installation d'un serveur de développement ### Installation d'un serveur de développement
[Quelques conseils mouvants pour configurer votre serveur de développement](ConseilServeurDev.md) [Quelques conseils mouvants pour configurer votre serveur de développement](ConseilServeurDev.md)
@ -26,7 +26,8 @@ Quelques conseils, indications et mémos pour les développeurs sur ScoDoc versi
L'ancienneté de la base de code a rendu le style un peu incohérent, mais cela L'ancienneté de la base de code a rendu le style un peu incohérent, mais cela
s'améliore avec ScoDoc 9 (respect PEP 8). s'améliore avec ScoDoc 9 (respect PEP 8).
Le code doit être formatté avec [`black`](https://black.readthedocs.io/) avant tout commit (configurez votre éditeur pour appeler `black` à l'enregistrement). Le code doit être formatté avec [`black`](https://black.readthedocs.io/) avant
tout commit (configurez votre éditeur pour appeler `black` à l'enregistrement).
#### Documentation #### Documentation
On adoptera le style "Google": <https://google.github.io/styleguide/pyguide.html#383-functions-and-methods> On adoptera le style "Google": <https://google.github.io/styleguide/pyguide.html#383-functions-and-methods>
@ -57,7 +58,8 @@ Exemple:
Le dépot est <https://scodoc.org/git/viennet/ScoDoc> Le dépot est <https://scodoc.org/git/viennet/ScoDoc>
La branche `master` est celle de ScoDoc 9 (pas encore en production). La branche `Scodoc7` est l'ancienne (actuelle jusqu'à septembre 2021) en production. La branche `master` est celle de ScoDoc 9 (pas encore en production). La branche
`Scodoc7` est l'ancienne (actuelle jusqu'à septembre 2021) en production.
Ci-dessous quelques pense-bête qui peuvent servir. Ci-dessous quelques pense-bête qui peuvent servir.
#### Hot fixes (internes) #### Hot fixes (internes)

View File

@ -127,6 +127,15 @@ ou le créer contenant juste cette ligne:
- Installer le logiciel: - Installer le logiciel:
apt-get update apt-get update
apt-get install nginx
S'assurer que le logiciel `nginx`s'est bien installé. En cas de problème se
référer à sa doc (par exemple, si
[votre serveur ne supporte pas
IPv6](https://techglimpse.com/nginx-error-address-family-solution/)).
Ensuite:
apt-get install scodoc9 apt-get install scodoc9
Notez que l'installation du paquet `scodoc9` va créer automatiquement un Notez que l'installation du paquet `scodoc9` va créer automatiquement un

View File

@ -24,13 +24,13 @@ Dans ce cas, la migration va se faire en suivant les étapes:
Installer le nouveau serveur avec Debian 11 et ScoDoc 9. Installer le nouveau serveur avec Debian 11 et ScoDoc 9.
Voir https://scodoc.org/GuideInstallDebian11 Voir [GuideInstallDebian11](GuideInstallDebian11.md).
Vérifier que tout fonctionne avant d'aller plus loin. Vérifier que tout fonctionne avant d'aller plus loin.
### Étape 2: Sauvegarder les données du serveur ScoDoc 7 ### Étape 2: Sauvegarder les données du serveur ScoDoc 7
Se connecter en tant que `root`sur l'ancien serveur ScoDoc 7. Ouvrir un terminal en tant que `root`sur l'ancien serveur ScoDoc 7.
cd /opt/scodoc/Products/ScoDoc/config cd /opt/scodoc/Products/ScoDoc/config
# Mise à jour indispensable pour avoir le script de migration # Mise à jour indispensable pour avoir le script de migration
@ -176,8 +176,8 @@ ou accentués dans les logins.
### 5. Vérifier que tout fonctionne ### 5. Vérifier que tout fonctionne
Vos départements et utiisateurs devraient être accessibles. Vos départements et utilisateurs devraient être accessibles.
L'utilisateur àdmin`créé à l'installation de ScoDoc 9 doit avoir accès à tout. L'utilisateur `admin` créé à l'installation de ScoDoc 9 doit avoir accès à tout.
Vérifiez que les semestres, étudiants, photos, archives et comptes utilisateurs Vérifiez que les semestres, étudiants, photos, archives et comptes utilisateurs
sont bien là. sont bien là.

View File

@ -1,23 +1,37 @@
## Préférences ## Préférences
Les préférences sont des paramètres stockés dans la base de données d'un département. Les préférences s'appliquent à tout un département (tous les semestres), ou bien à un semestre particulier. Chaque département a son propre jeu de préférences (c'est parfois regrettable, car certaines préférences concernent tout l'établissement). Les préférences sont des paramètres stockés dans la base de données d'un
département. Les préférences s'appliquent à tout un département (tous les
semestres), ou bien à un semestre particulier. Chaque département a son propre
jeu de préférences (c'est parfois regrettable, car certaines préférences
concernent tout l'établissement).
Si un semestre ne défini pas de valeur pour un paramètre (eg marge, police, paramétrage du bulletin de notes...), ScoDoc utilisera les préférences globales pour le département. Si un semestre ne défini pas de valeur pour un paramètre (eg marge, police,
paramétrage du bulletin de notes...), ScoDoc utilisera les préférences globales
pour le département.
Donc: Donc:
* Pour affecter tous les semestres sauf ceux qui ont dit autrement: suivre le lien "Paramétrage" dans la marge gauche (visible uniquement si vous en avez la permission). * Pour affecter tous les semestres sauf ceux qui ont dit autrement: suivre le
lien "Paramétrage" dans la marge gauche (visible uniquement si vous en avez
la permission).
* Pour affecter seulement un semestre: menu "Semestre", "Réglages bulletins" ou "Préférences du semestre". * Pour affecter seulement un semestre: menu "Semestre", "Réglages bulletins" ou
"Préférences du semestre".
On accède aux préférences via le lien "Paramétrage", qui est présent dans la marge gauche seulement si l'on a le droit de modifier les préférences (la permission `Sco Change Preferences`, normalement associée au rôle `Admin` possédé par chef du département, voir [ConfigPermissions](ConfigPermissions.md)). On accède aux préférences via le lien "Paramétrage", qui est présent dans la
marge gauche seulement si l'on a le droit de modifier les préférences (la
permission `Sco Change Preferences`, normalement associée au rôle `Admin`
possédé par chef du département, voir
[ConfigPermissions](ConfigPermissions.md)).
On distingue plusieurs groupes de préférences: On distingue plusieurs groupes de préférences:
* Générales: nom de l'Université, du directeur, etc... * Générales: nom de l'Université, du directeur, etc...
* Absences: alarmes si beaucoup d'absences, statut des samedis... (voir détails sur [GestionAbsences](GestionAbsences.md)) * Absences: alarmes si beaucoup d'absences, statut des samedis... (voir détails
sur [GestionAbsences](GestionAbsences.md))
* Liaison avec le portail: URL du portail, code du département, ... * Liaison avec le portail: URL du portail, code du département, ...
@ -28,5 +42,6 @@ On distingue plusieurs groupes de préférences:
Voir la liste des préférences sur la page [NomsPreferences](NomsPreferences.md). Voir la liste des préférences sur la page [NomsPreferences](NomsPreferences.md).
Note: les préférences et leurs valeurs par défaut sont définies dans le fichier `sco_preferences.py`. Note pour les développeurs: les préférences et leurs valeurs par défaut sont
définies dans le fichier `sco_preferences.py`.

945
docs/ScoDoc9API.md Normal file
View File

@ -0,0 +1,945 @@
# API pour ScoDoc 9
L'API ScoDoc permet à des applications tierces d'interroger ScoDoc. Elle offre un accès aux informations aux formats XML et JSON.
La version ScoDoc 9 a introduit une nouvelle API avec un nouveau mécanisme d'authentification.
**Les clients de l'ancienne API ScoDoc 7 doivent être adaptés pour fonctionner avec ScoDoc 9.**
Cette API est encore incomplète: n'hésitez pas à demander de nouveaux accès en écrivant à la liste de diffusion.
L'API fournit des données JSON, sauf exception (bulletins).
Les objets ScoDoc manipulables sont identifiés par des id:
* etudid: étudiant
* 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.
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
Afin de garantir l'interopérabilité avec les clients ScoDoc 7 (ENT, etc), les
fonctions suivantes sont disponibles avec le mécanisme d'authentification
basique de ScoDoc 7. Elles sont considérées comme *obsolètes* ("deprecated") et
disparaitront en juillet 2022.
Certaines ont plusieurs "routes" (URl), car ScoDoc 7 tolérait divers accès.
- `Absences/XMLgetBilletsEtud`
- `Absences/listeBillets`
- `Absences/XMLgetAbsEtud`
- `Notes/formsemestre_list`
- `Notes/formsemestre_bulletinetud`
- `Notes/XMLgetFormsemestres`
- `etud_info` ou `XMLgetEtudInfos` ou `Absences/XMLgetEtudInfos` ou `Notes/XMLgetEtudInfos`
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
en POST.
# XXX à rédiger XXX Fonctions d'accès aux données
## Départements
* **`list_depts`**
* Paramètres: `viewable` (optionnel, si faux liste aussi les départements non accessible à l'utilisateur courant), `format` (json, xml)
* Résultat: liste des id de départements.
## Programmes de formations
* **`formation_list`**
* Paramètres: `formation_id` (optionnel, si absent liste toutes les formations)
* Résultat: liste de formations.
* **`formation_export`**
* Paramètres: `formation_id`, `export_ids` (défaut "faux")
* Résultat: la formation, avec UE, matières, modules (un arbre).
## 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`.
* **`formsemestre_list`**
* Paramètres (tous optionnels): `formsemestre_id`, `formation_id`, `etape_apo`, `etape_apo2`
* Résultat: liste des semestres correspondant.
* Exemple: `formsemestre_list?format=xml&etape_apo=V1RT`
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:
* Département (RT, GEII, INFO...) (= paramètre `DeptName`, en majuscules)
* Nom parcours: DUT, 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).
Exemple: `INFO-DUT-FI-S1-2014` : semestre S1 d'un DUT informatique de 2014 en formation initiale (FI)
## 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.
* **`formsemestre_partition_list`**
* Paramètres: `formsemestre_id`
* Résultat:
* Exemple: ici au format JSON
```
[
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"partition_name": "TD"
"group": [
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"group_name": "A",
"group_id": "G23841",
"partition_name": "TD"
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P23840",
"group_name": "B",
"group_id": "G23843",
"partition_name": "TD"
},
],
},
{
"formsemestre_id": "SEM12781",
"partition_id": "P23941",
"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",
"partition_name": null
"group": [
{
"formsemestre_id": "SEM12781",
"partition_id": "P22833",
"group_name": null,
"group_id": "G22834",
"partition_name": null
}
],
}
]
```
* **`groups_view`**
* Paramètres: `formsemestre_id `ou `group_ids` (peut être répété), `with_codes=0|1`, `all_groups=0|1`, `etat=None|I`
* Résultat: liste des étudiants dans un groupe.
* Exemple: ici au format XML avec `with_codes=1`:
```
<group_list origin="" caption="soit 21 étudiants inscrits et 2 démissionaires." id="gt_711068">
<etud>
<nom value="TOTO"/>
<prenom value="Marc"/>
<etat value="I"/>
<email value="toto@example.com"/>
<etudid value="EID9876"/>
<code_nip value="987654"/>
<code_ine value=""/>
</etud>
<etud>
<nom value="ALVIS SAMOS"/>
<prenom value="NATHALIE"/>
<etat value="I"/>
<email value="xxx@example.com"/>
<etudid value="EID12345"/>
<code_nip value="12345678"/>
<code_ine value=""/>
</etud>
</group_list>
```
Et un autre exemple en format JSON:
```
[
{
"etat":"I",
"emailperso":null,
"prenom":"Dalil",
"nom_disp":"CLINTO",
"email":"xxx@example.com",
"P62029":"A",
"P62032":null,
"P62031":"G1",
"P62030":"A1"
},
{
"etat":"I",
"emailperso":null,
"prenom":"Georges",
"nom_disp":"BUSH",
"email":"bush@example.com",
"P62029":"A",
"P62032":null,
"P62031":"G1",
"P62030":"A1"
},
...
]
```
## Etudiants
* **`etud_info`**
* Paramètres: `etudid` ou `code_nip` ou `code_ine`
* Résultat: informations sur cette étudiant et les semestres dans lesquels il est (ou a été) inscrit.
* Exemple: `etud_info?format=json&etudid=12345`
```
{
"nom": "Mutis",
"sexe": "M.",
"email": "alvaro.mutis@example.com",
"prenom": "ALVARO",
"nomprenom": "M. Alvaro MUTIS",
"insemestre": [
{
"etat": "I",
"formsemestre_id": "SEM12781",
"date_fin": "2010-07-30",
"date_debut": "2010-01-25"
},
{
"etat": "I",
"formsemestre_id": "SEM8396",
"date_fin": "2009-01-16",
"date_debut": "2008-09-01"
}
],
"code_ine": "",
"etudid": "EID8768",
"code_nip": "10991002",
"photo_url": "/ScoDoc/static/photos/F13/RT_EID8768.h90.jpg",
"domicile": "2 Rue Madame",
"villedomicile": "Paris",
"telephonemobile": ""
"fax": "",
"annee_bac": "2010",
"bac": "S",
"specialite": "SCIENTIFIQUE",
"nomlycee": "",
"villelycee": "",
"codelycee": "0950650R",
"codepostallycee": "",
}
```
## Bulletins de notes
* **`Notes/formsemestre_bulletinetud`**
* Paramètres: `formsemestre_id`, `etudid`, `format` (`xml`ou `json`), `version` (`short`, `selectedevals`ou `long`)
* Résultat: bulletin de notes
* Exemple: ici au format JSON, pour une version courte (`version=short`)
```
{
"rang": {
"ninscrits": 52,
"value": "1"
},
"etape_apo2": "",
"etape_apo3": "",
"etape_apo4": "",
"etudiant": {
"nom": "BOLANO",
"prenom": "Roberto",
"sexe": "M.",
"code_ine": "",
"etudid": "EID9860",
"code_nip": "123456789",
"email": "roberto@santateresa.mx",
"photo_url": "\/ScoDoc\/static\/photos\/F68\/RT_EID29960.h90.jpg"
},
"bonus_sport_culture": {
"value": 0
},
"absences": {
"nbabsjust": 0,
"nbabs": 1
},
"decision": {
"etat": "I",
"code": "ADM",
"compense_formsemestre_id" : "SEM12345" /* si ce semestre en compense un autre */
},
"note": {
"max": "15.51",
"moy": "10.80",
"value": "15.51",
"min": "07.29"
},
"etudid": "EID9860",
"decision_ue": [
{
"acronyme": "UE11",
"code": "ADM",
"ects": "16.0",
"titre": "D\u00e9couverte m\u00e9tiers",
"numero": "11",
"ue_id": "UE21456"
},
{
"acronyme": "UE12",
"code": "ADM",
"ects": "14.0",
"titre": "Mise \u00e0 niveau des comp\u00e9tences transversales et scientifiques",
"numero": "12",
"ue_id": "UE21478"
}
],
"ue_capitalisee": [
],
"publie": 1,
"autorisation_inscription": [
{
"semestre_id": 2
}
],
"appreciation": [
],
"note_max": {
"value": 20
},
"date": "2014-07-12T17:38:47.693262",
"rang_group": [
{
"ninscrits": 26,
"value": "1",
"group_type": "TD",
"group_name": "B"
},
{
"ninscrits": 13,
"value": "1",
"group_type": "TP",
"group_name": "B1"
},
{
"ninscrits": 4,
"value": "1",
"group_type": "G",
"group_name": "G4"
},
{
"ninscrits": "",
"value": "",
"group_type": "tutorat",
"group_name": ""
},
{
"ninscrits": "",
"value": "",
"group_type": "App",
"group_name": ""
},
{
"ninscrits": "",
"value": "",
"group_type": "sport",
"group_name": ""
}
],
"formsemestre_id": "SEM12345",
"etape_apo": "V1RT",
"ue": [
{
"acronyme": "UE11",
"rang": "1",
"code_apogee": "VRTU11",
"ects": "16",
"numero": "11",
"note": {
"max": "16.17",
"value": "16.17",
"min": "06.56"
},
"module": [
{
"coefficient": 3,
"rang": {
"value": "1"
},
"code": "M1101",
"code_apogee": "VRT1101",
"numero": 1101,
"note": {
"moy": "08.94",
"nb_notes": 51,
"nb_missing": 0,
"max": "19.18",
"min": "03.70",
"nb_valid_evals": 3,
"value": "19.18"
},
"abbrev": "R\u00e9seaux d&apos;entreprises",
"effectif": {
"value": 51
},
"titre": "Initiation aux r\u00e9seaux d&apos;entreprises",
"evaluation": [
],
"id": "MIP27427"
},
{
"coefficient": 2,
"rang": {
"value": "2"
},
"code": "M1102",
"code_apogee": "VRT1102",
"numero": 1102,
"note": {
"moy": "12.58",
"nb_notes": 50,
"nb_missing": 1,
"max": "16.79",
"min": "02.50",
"nb_valid_evals": 2,
"value": "16.50"
},
"abbrev": "Initiation \u00e0 la t\u00e9l\u00e9phonie",
"effectif": {
"value": 51
},
"titre": "Initiation \u00e0 la t\u00e9l\u00e9phonie d&apos;entreprise",
"evaluation": [
],
"id": "MIP27437"
},
{
"coefficient": 1.5,
"rang": {
"value": "1"
},
"code": "M1103",
"code_apogee": "VRT1103",
"numero": 1103,
"note": {
"moy": "08.26",
"nb_notes": 51,
"nb_missing": 0,
"max": "13.41",
"min": "00.94",
"nb_valid_evals": 2,
"value": "13.41"
},
"abbrev": "Architecture des \u00e9quipements informatiques",
"effectif": {
"value": 51
},
"titre": "Architecture des \u00e9quipements informatiques",
"evaluation": [
],
"id": "MIP27451"
},
{
"coefficient": 2,
"rang": {
"value": "1"
},
"code": "M1104",
"code_apogee": "VRT1104",
"numero": 1104,
"note": {
"moy": "10.77",
"nb_notes": 51,
"nb_missing": 0,
"max": "17.90",
"min": "04.63",
"nb_valid_evals": 3,
"value": "17.90"
},
"abbrev": "Principe et architecture des r\u00e9seaux",
"effectif": {
"value": 51
},
"titre": "Principe et architecture des r\u00e9seaux",
"evaluation": [
],
"id": "MIP27431"
},
{
"coefficient": 2,
"rang": {
"value": "1"
},
"code": "M1105",
"code_apogee": "VRT1105",
"numero": 1105,
"note": {
"moy": "11.00",
"nb_notes": 51,
"nb_missing": 0,
"max": "17.83",
"min": "04.98",
"nb_valid_evals": 2,
"value": "17.83"
},
"abbrev": "Bases des syst\u00e8mes d&apos;exploitation",
"effectif": {
"value": 51
},
"titre": "Bases des syst\u00e8mes d&apos;exploitation",
"evaluation": [
],
"id": "MIP27433"
},
{
"coefficient": 1.5,
"rang": {
"value": "6"
},
"code": "M1106",
"code_apogee": "VRT1106",
"numero": 1106,
"note": {
"moy": "13.05",
"nb_notes": 51,
"nb_missing": 0,
"max": "17.79",
"min": "07.08",
"nb_valid_evals": 1,
"value": "16.25"
},
"abbrev": "Initiation au d\u00e9veloppement Web",
"effectif": {
"value": 51
},
"titre": "Initiation au d\u00e9veloppement Web",
"evaluation": [
],
"id": "MIP27449"
},
{
"coefficient": 1.5,
"rang": {
"value": "9"
},
"code": "M1107",
"code_apogee": "VRT1107",
"numero": 1107,
"note": {
"moy": "09.36",
"nb_notes": 51,
"nb_missing": 0,
"max": "14.21",
"min": "04.17",
"nb_valid_evals": 3,
"value": "11.66"
},
"abbrev": "Initiation \u00e0 la mesure du signal",
"effectif": {
"value": 51
},
"titre": "Initiation \u00e0 la mesure du signal",
"evaluation": [
],
"id": "MIP27440"
},
{
"coefficient": 1.5,
"rang": {
"value": "7"
},
"code": "M1108",
"code_apogee": "VRT1108",
"numero": 1108,
"note": {
"moy": "10.49",
"nb_notes": 51,
"nb_missing": 0,
"max": "16.31",
"min": "05.39",
"nb_valid_evals": 4,
"value": "13.22"
},
"abbrev": "Acquisition et codage de l&apos;information",
"effectif": {
"value": 51
},
"titre": "Acquisition et codage de l&apos;information",
"evaluation": [
],
"id": "MIP27453"
},
{
"coefficient": 1,
"rang": {
"value": "4 ex"
},
"code": "M1109",
"code_apogee": "VRT1109",
"numero": 1109,
"note": {
"moy": "12.46",
"nb_notes": 51,
"nb_missing": 0,
"max": "16.00",
"min": "09.00",
"nb_valid_evals": 1,
"value": "15.00"
},
"abbrev": "PT : Recherche documentaire",
"effectif": {
"value": 51
},
"titre": "PT : Recherche documentaire",
"evaluation": [
],
"id": "MIP27444"
}
],
"effectif": "51",
"titre": "D\u00e9couverte m\u00e9tiers",
"id": "UE21456"
},
{
"acronyme": "UE12",
"rang": "5",
"code_apogee": "VRTU12",
"ects": "14",
"numero": "12",
"note": {
"max": "15.20",
"value": "14.63",
"min": "07.94"
},
"module": [
{
"coefficient": 2,
"rang": {
"value": "3 ex"
},
"code": "M1201",
"code_apogee": "VRT1201",
"numero": 10,
"note": {
"moy": "13.02",
"nb_notes": 51,
"nb_missing": 0,
"max": "16.00",
"min": "10.00",
"nb_valid_evals": 1,
"value": "14.00"
},
"abbrev": "Anglais",
"effectif": {
"value": 51
},
"titre": "Anglais g\u00e9n\u00e9ral de communication et initiation au vocabulaire technique",
"evaluation": [
],
"id": "MIP27430"
},
{
"coefficient": 2,
"rang": {
"value": "16 ex"
},
"code": "M1202",
"code_apogee": "VRT1202",
"numero": 20,
"note": {
"moy": "12.74",
"nb_notes": 51,
"nb_missing": 0,
"max": "17.75",
"min": "04.00",
"nb_valid_evals": 2,
"value": "14.00"
},
"abbrev": "Expression",
"effectif": {
"value": 51
},
"titre": "EC: \u00c9l\u00e9ments fondamentaux de la communication",
"evaluation": [
],
"id": "MIP27439"
},
{
"coefficient": 1,
"rang": {
"value": "1 ex"
},
"code": "M1203",
"code_apogee": "VRT1203",
"numero": 30,
"note": {
"moy": "NA",
"nb_notes": 0,
"nb_missing": 51,
"max": "-",
"min": "-",
"nb_valid_evals": 0,
"value": "-"
},
"abbrev": "PPP: Connaitre son champ d&apos;activit\u00e9",
"effectif": {
"value": 51
},
"titre": "PPP: Connaitre son champ d&apos;activit\u00e9",
"evaluation": [
],
"id": "MIP27436"
},
{
"coefficient": 2,
"rang": {
"value": "6"
},
"code": "M1204",
"code_apogee": "VRT1204",
"numero": 40,
"note": {
"moy": "10.66",
"nb_notes": 51,
"nb_missing": 0,
"max": "16.35",
"min": "05.73",
"nb_valid_evals": 8,
"value": "14.09"
},
"abbrev": "Mise \u00e0 niveau en num\u00e9ration et calculs",
"effectif": {
"value": 51
},
"titre": "Mise \u00e0 niveau en num\u00e9ration et calculs",
"evaluation": [
],
"id": "MIP27454"
},
{
"coefficient": 2,
"rang": {
"value": "23"
},
"code": "M1205",
"code_apogee": "VRT1205",
"numero": 50,
"note": {
"moy": "10.37",
"nb_notes": 51,
"nb_missing": 0,
"max": "18.69",
"min": "05.01",
"nb_valid_evals": 5,
"value": "10.58"
},
"abbrev": "Connaissances et Outils pour le signal",
"effectif": {
"value": 51
},
"titre": "Harmonisation des connaissances et des outils pour le signal",
"evaluation": [
],
"id": "MIP27432"
},
{
"coefficient": 2,
"rang": {
"value": "3 ex"
},
"code": "M1206",
"code_apogee": "VRT1206",
"numero": 60,
"note": {
"moy": "11.22",
"nb_notes": 51,
"nb_missing": 0,
"max": "16.76",
"min": "03.91",
"nb_valid_evals": 6,
"value": "15.12"
},
"abbrev": "Circuits \u00e9lectroniques : mise \u00e0 niveau",
"effectif": {
"value": 51
},
"titre": "Circuits \u00e9lectroniques : mise \u00e0 niveau",
"evaluation": [
],
"id": "MIP27435"
},
{
"coefficient": 2,
"rang": {
"value": "1 ex"
},
"code": "M1207",
"code_apogee": "VRT1207",
"numero": 70,
"note": {
"moy": "08.39",
"nb_notes": 51,
"nb_missing": 0,
"max": "20.00",
"min": "00.00",
"nb_valid_evals": 1,
"value": "20.00"
},
"abbrev": "Programmation 1",
"effectif": {
"value": 51
},
"titre": "Bases de la programmation",
"evaluation": [
],
"id": "MIP27445"
},
{
"coefficient": 1,
"rang": {
"value": "1 ex"
},
"code": "M1208",
"code_apogee": "VRT1208",
"numero": 80,
"note": {
"moy": "NA",
"nb_notes": 0,
"nb_missing": 51,
"max": "-",
"min": "-",
"nb_valid_evals": 0,
"value": "-"
},
"abbrev": "M\u00e9thodologie Universitaire 1",
"effectif": {
"value": 51
},
"titre": "Adaptation et m\u00e9thodologie pour la r\u00e9ussite Universitaire",
"evaluation": [
],
"id": "MIP27434"
}
],
"effectif": "51",
"titre": "Mise \u00e0 niveau des comp\u00e9tences transversales et scientifiques",
"id": "UE21478"
},
{
"acronyme": "UE 1S",
"rang": "1 ex",
"code_apogee": "",
"ects": "0",
"numero": "13",
"note": {
"max": "00.00",
"value": "00.00",
"min": "00.00"
},
"module": [
],
"effectif": "51",
"titre": "Sport &amp;amp; Culture",
"id": "UE23716"
}
],
"situation": "Inscrit le 02\/09\/2015. D\u00e9cision jury: Valid\u00e9. UE acquises: UE11, UE12. Autoris\u00e9 \u00e0 s&apos;inscrire en S2."
}
```
## Absences
* **`Absences/ListeAbsEtud`**
* Paramètres: `etudid, absjust_only, format`. `absjust_only` spécifie si on veut les absences justifiées ou non.
* Résultat: liste d'absences. Exemple:
```{jour: "2021-02-10", ampm: "0", description: "M2202", }```
(`ampm` vaut 1 le matin et 0 l'après-midi).
* **`Absences/doSignaleAbsence`**
* Paramètres: ```datedebut, datefin, moduleimpl_id=None, demijournee=2, estjust=False,description, etudid```
* Résultat: *html*
* Remarques: dates au format `dd/mm/yyyy`. Date de fin non incluse. `demijournee`: 2 si journée complète, 1 matin, 0 après-midi.
* **`Absences/doAnnuleAbsence`**
* Paramètres: ```datedebut, datefin, demijournee, etudid```
* Résultat: *html*
* **`Absences/doAnnuleJustif`**
* Paramètres: ```context, datedebut0, datefin0, demijournee```
* Résultat: *html*
* **`Absences/EtatAbsencesGr`**
* Liste les absences d'un ou plusieurs groupes entre deux dates.
* Paramètres: ```group_ids, debut, fin, with_boursier=True, format=html```
* Résultat: liste des absences. Si `format="json"`, cela donne par exemple:
```[ {
boursier: "N",
nbabs: "9",
nbabsjust: "2",
nbabsnonjust: "7",
nbjustifs_noabs: "0",
nomprenom: "Mme Poisson Dodouce",
etudid: "EID12345"
},
...
]```
* Remarque: on peut spécifier plusieurs groupes.
## Modules
* **`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`
## En savoir plus
Voir l'exemple complet d'utilisation de l'API JSON en Python, dans `misc/example-api-1.py`

View File

@ -1,5 +1,5 @@
# API pour ScoDoc # API pour ScoDoc 7
L'API ScoDoc permet à des applications tierces d'interroger ScoDoc. Elle offre un accès aux informations aux formats XML et JSON. L'API ScoDoc permet à des applications tierces d'interroger ScoDoc. Elle offre un accès aux informations aux formats XML et JSON.
Cette API est encore incomplète: n'hésitez pas à demander de nouveaux accès en écrivant à la liste de diffusion. Cette API est encore incomplète: n'hésitez pas à demander de nouveaux accès en écrivant à la liste de diffusion.