From 0c171ae0729611dd20f20e0025ceee8664ea3d8a Mon Sep 17 00:00:00 2001 From: Hartmann Matthias <49349614+Iziram@users.noreply.github.com> Date: Tue, 14 Feb 2023 16:34:52 +0100 Subject: [PATCH 1/7] =?UTF-8?q?doc=20assiduit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/DonneesModuleAssiduite.md | 170 +++++++++ docs/FichiersJustificatifs.md | 119 ++++++ docs/ScoDoc9API.md | 656 ++++++++++++++++++++++++++------- 3 files changed, 812 insertions(+), 133 deletions(-) create mode 100644 docs/DonneesModuleAssiduite.md create mode 100644 docs/FichiersJustificatifs.md diff --git a/docs/DonneesModuleAssiduite.md b/docs/DonneesModuleAssiduite.md new file mode 100644 index 000000000..357e8f61b --- /dev/null +++ b/docs/DonneesModuleAssiduite.md @@ -0,0 +1,170 @@ + +# Document expérimental sur les données du module Assiduité de ScoDoc + +Dans ce document je (Matthias Hartmann) détaillerais plusieurs méthodes pour enregistrer les données du module Assiduité et les utiliser. Je mettrai à jour ce document et je l'utiliserai lors de l'implémentation du cahier des charges. + +> Pour la suite du document je nomme `plage` l'objet représentant une absence/présence sur une période donnée. + +Dans les diagrammes: + +> - les noms précédés par `?` sont des valeurs optionnelles. +> - les noms précédés par `#` sont des clés externes. +> - les noms précédés par `$` sont des clés primaires. + +___ + +> dev note *(11/10/22)*: Les types des données ne sont pas forcément les bons, je n'ai pas encore regardé comment était organisée la BDD de ScoDoc + +## Représentation d'une assiduité et d'un justificatif + +> voir l'API ScoDoc -> [ScoDoc9 API](ScoDoc9API.md#api-assiduite) + +## Représentation des données (Version 4) + +```mermaid +classDiagram + + class assiduites{ + $assiduiteid : Integer + #etuid : Integer + date_debut : DateTime + date_fin : DateTime, + etat : String + #module?: Integer + + } + class justificatifs{ + $justifid : Integer + #etuid : Integer + date_debut : DateTime + date_fin : DateTime + fichier? : Integer + raison? : String + #etat : Integer DEFAULT=0 + } + class etat_justificatif{ + $etat_id : Integer + desc : String + } + justificatifs --> etat_justificatif +``` + +### Explications de la représentation + +> - Dans cette version, les objets en base de données suivent la représentation fait en json (dans l'API) +> - Le fichier justificatif est toujours stocker sur le serveur et en base il est stocker sous la forme d'un identifiant unique. +> - le champs `etat` de la table `justificatif` est une clé étrangère vers la table `etat_justificatif` qui contient les différents états (attente, validé, modifié, en cours . . . ), Cette table permettra aux utilisateurs d'ajouter eux même des états en fonction de leurs besoins. (deux états seront obligatoires : 0[Non Validé] 1[Validé] mais leurs noms pourront être changés.) + +## Représentation des données (Version 3) + +```mermaid +classDiagram + + class plage{ + plage_id : Integer + date_debut : DateTime + date_fin : DateTime + #etuid : Integer + type : String + ? #module_id : Integer + ? #enseignant_id : Integer + } + class justificatif{ + $#etuid : Integer + $date_debut : DateTime + $date_fin : DateTime + attachement : String + #etat : Integer DEFAULT=0 + } + class etat_justificatif{ + $etat_id : Integer + desc : String + } + justificatif --> etat_justificatif +``` + +### Explications de la représentation + +> - Dans cette représentation, une plage est complètement dissociée d'une formation / département. Elle repose uniquement sur un étudiant en particulier. On peut néanmoins spécifier l'enseignant et le module concerné par l'absence dans le but de produire des statistiques. +> - Du coté des justificatifs, on a désormais un attribut `etat` plutôt qu'un booléen. Cet attribut est une clé étrangère lié à la table `etat_justificatif`. Cela permet alors d'avoir plusieurs états (Validé, Refusé, En Attente, Incomplet...) l'état `0` étant `Pas encore étudié` par exemple. + +### Problèmes de la représentation + +> - On utilise une nouvelle table pour stocker les différents états. A moins que cette table ne puisse être modifiée par les administrateurs de ScoDoc (ajouter des états pour des cas précis par IUT), on créer une table pour enregistrer des données statiques. + +### Améliorations potentielles + +> - A la place d'une table dans la BDD, on pourrait directement hard coder les états de justificatifs. Les états seront plus simple à accéder mais on perd l'aspect modification au cas par cas. + +## Représentation des données (Version 2) + +```mermaid +classDiagram + class plage{ + id_plage : Integer + date_debut : DateTime + date_fin : DateTime + #id_dept : Integer + #formsemestre_id : Integer + #etuid : Integer + type : String + ? #id_module : Integer + ? #id_enseignant : Integer + } + class justificatif{ + $#etuid : Integer + $date_debut : DateTime + $date_fin : DateTime + attachement : String + valide : bool DEFAULT=False + } +``` + +### Problèmes liés à la représentation + +> - L'export de la base de donnée avec les justificatif devient plus complexe (car on doit aller chercher les fichiers du dossier justificatifs) +> - Même problème que la version 1 pour les requêtes + +## Représentation des données ( Version 1) + +```mermaid +classDiagram + class plage{ + id_plage : Integer + date_debut : DateTime + date_fin : DateTime + #id_dept : Integer + #formsemestre_id : Integer + #etuid : Integer + type : String + ? #id_module : Integer + ? #id_enseignant : Integer + } + class justificatif{ + #$id_plage : Integer + attachement : Blob + valide : bool DEFAULT=False + } + +``` + +### Problèmes liés à la représentation + +> - Quasiment l'ensemble des données sont stockées dans un même tuple\ +> __Conséquence__ : chaque requête utilisant les données sera longue et lourde pour le gestionnaire de BDD +> - Le stockage sour la forme de blob est très lourd pour la bdd ( cf : [Benchmark des différentes méthode de stockage de fichier binaire sur progresql](https://www.cybertec-postgresql.com/en/binary-data-performance-in-postgresql/) ) +> - Un justificatif doit être donné pour chaque absence (par exemple un arrêt maladie de plusieurs jours est présent dans la base autant de fois que l'étudiant a été absence à un cours ) + +### Avantages liés à la représentation + +> - Peu ou pas de jointure à faire +> - Ensemble des données facilement accessibles +> - Une absence (`plage: type=absence`) est justifiée si un justificatif (`justificatifs : idPlage={idAbsence}`) est présent dans la base. Une absence peut être justifiée(par un étudiant par exemple) mais pas forcément validé par le corps enseignant / administratif. (`justificatifs : valide=Faux`) +> - l'objet justificatif permet de stocker un fichier / un texte servant de justification (`justificatifs : attachement={Blob}`). L'utilisation d'un __Blob__ permet de stocker virtuellement n'import quel type de fichier dans la bdd. + +### Améliorations potentielles + +> - Stocker les fichiers justificatifs dans un dossier sur le serveur plutôt que dans la base de donnée. On aurait alors une sauvegarde uniquement d'une chaîne de caractères (le chemin du fichier / la justification textuelle) au lieu de __Blob__ prenant beaucoup de place et étant lourds à traiter.\ +> __Le problème est qu'on perd la facilité d'accès et les vérifications opérées automatiquement par le gestionnaire de base de donnée.__ +> - Définir une durée de validité pour chaque justificatif au lieu de lier le justificatif à une plage. (et donc lier un justificatif à un étudiant)\ +> __Le problème est qu'on perd de la simplicité de selection (utilisation de l'id de la plage dans un cas et utilisation de 2 *datetime* dans un autre) Mais au moins on a pas besoin d'entrer plusieurs fois un même justificatif.__ diff --git a/docs/FichiersJustificatifs.md b/docs/FichiersJustificatifs.md new file mode 100644 index 000000000..3fd7623a8 --- /dev/null +++ b/docs/FichiersJustificatifs.md @@ -0,0 +1,119 @@ + +# Gestions des fichiers justificatifs pour le module Assiduité + +Le fonctionnement de l'importation / lecture des fichiers justificatifs est légèrement plus complexe que l'utilisation de l'API seule. Voici les différentes informations à savoir pour correctement utiliser les fichiers justificatifs. + +Afin de bien comprendre les différentes informations, merci de lire d'abord la documentation de l'API Assiduité : [Documentation Assiduité](ScoDoc9API.md#api-assiduite) + +## Importer un fichier + +L'importation d'un fichier pour un justificatif se fait en deux temps : + +* Créer un nouvel objet justificatif à l'aide de l'API +* Envoyer le fichier sur le serveur ScoDoc + +### Envoyer le fichier sur le serveur ScoDoc + +Dans un premier temps il faut créer un objet justificatif à l'aide de l'API. + +Dans un second temps il faut envoyer le fichier sur le serveur à l'aide d'une requête `POST`. + +#### Exemple en Python + +##### Script d'envoi du justificatif + +> `token` est le même token que pour le reste de l'API + +```py + data = { + "etat": "attente", + "date_debut": "2022-10-27T08:00", + "date_fin": "2022-10-27T12:00", + } + # la route de l'api est : /justificatif//create + r = requests.post(API_URL + "/justificatif/123/create", json=data, headers=token) + print(r.json) +``` + +##### Réponse + +```json +{ + "justif_id" : 424242 +} +``` + +##### Script d'envoi du fichier + +> `token` est le même token que pour le reste de l'API + +```py +with open('exemple.txt', 'rb') as f: + # la route pour importer est : api/justificatif//import + r = requests.post(API_URL + "/justificatif/424242/import", files={"exemple.txt": f}, headers=token) + print(r.json) +``` + +##### Réponse + +```json +{ + "filename" : "exemple.txt" +} +``` + +Veillez à bien noter le nom de fichier renvoyé car c'est le nom coté "server", il sera à utiliser lors que vous souhaitez récupérer le fichier +ou lorsque vous voudrez le supprimer + +## Télécharger un fichier + +Pour télécharger un fichier de justificatif rien de plus simple + +### Une simple requête POST + +* **Méthode:** POST +* **Permission: `ScoView`** +* **Paramètres:** + * `justif_id` + * `filename` +* **Routes:** `/justificatif//export/` +* **Exemple d'utilisation:** `/api/justificatif/424242/export/exemple.txt` +* **Résultat:** télécharge directement le fichier + +## Supprimer un fichier + +Pour supprimer un fichier il suffit d'envoyer une requête post sur le justificatif, avec un json correct + +### Script de suppression du fichier + +> `token` est le même token que pour le reste de l'API + +```py +# la route pour supprimer est : api/justificatif//remove + +d = { + + "remove": "list", + "filenames": [ + "exemple.txt" + ] +} + +# ou + +d = { + + "remove": "al", +} + +r = requests.post(API_URL + "/justificatif/424242/remove", data=d, headers=token) +print(r.json) +``` + +#### Réponse + +```json +{ + "response" : "removed" +} +``` diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index c7519e7bd..93d0f0c3d 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -1,8 +1,9 @@ + +## API pour ScoDoc 9 -## 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. +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 @@ -28,7 +29,7 @@ L'URL complète est de la forme: ## Configuration de ScoDoc pour utiliser l'API -Il est nécessaire de disposer d'un compte utilisateur avec les droits adéquats. +Il est nécessaire de disposer d'un compte utilisateur avec les droits adéquats. Les droits à accorder dépendent des fonctionnalités nécessaires. la permission `ScoView` est généralement suffisante car elle permet toutes les consultations. Cependant si, par l'API, on veut effectuer des opérations de modification ou encore consulter les comptes utilisateurs, d'autres droits (`ScoChangeGroups`, `ScoUsersView`, `ScoSuperAdmin`, ...) peuvent être requis. @@ -63,7 +64,7 @@ flask user-password lecteur_api ... ``` -Si vous êtes intéressé par le développement, voir +Si vous êtes intéressé par le développement, voir * [la section sur les tests unitaires de l'API](TestsScoDoc.md#tests-de-lapi-scodoc9); * [la documentation interne](Internals.md#vues-de-lapi-et-permissions). @@ -123,7 +124,7 @@ Date: Thu, 05 May 2022 05:21:33 GMT ## Fonctions d'API ScoDoc 9 -La documentation ci-dessous concerne la nouvelle API, disponible à partir de la +La documentation ci-dessous concerne la nouvelle API, disponible à partir de la version de ScoDoc 9.3.25. ### Accès à l'API REST @@ -140,7 +141,7 @@ vous sera attribué un jeton (token jwt *généré automatiquement*) vous permet d'utiliser l'api suivant les droits correspondant à votre session. Pour obtenir le jeton, il faut un compte sur ScoDoc (`user_name`et `password`). -Les autorisations et rôles sont gérés exactement comme pour l'application. +Les autorisations et rôles sont gérés exactement comme pour l'application. Exemple avec `curl` (un outil en ligne de commande présent sur la plupart des systèmes, voir plus haut pour la même chose avec la commande `http`): @@ -167,7 +168,7 @@ Chaque appel à l'API donne lieu à une réponse retournant un code spécifique 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 +Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succès par le serveur ScoDoc. * [200](https://developer.mozilla.org/fr/docs/Web/HTTP/Status/200) : OK. @@ -222,75 +223,90 @@ Ce tableau est trié selon le type des informations renvoyées: * suivi de `:` puis d'un nom en majuscule indique une requête (POST) qui modifie les données de ScoDoc. -| Retour | Remarque | Méthode | Navigation | Permission | -|:------------------------|:----------------------------------------|---------|---------------------------------------------------------------------------|---------------------| -| departement**`*`** | tous les depts | GET | [departements](#departements) | | -| departement**`#`** | tous les ids des depts | GET | [departements-ids](#departements-ids) | ScoView | -| departement | recherche par id | GET | [departement](#departement) | ScoView | -| departement | recherche par acronyme | GET | [departement](#departement) | ScoView | -| departement:CREATE | création d'un département | POST | [departement-create](#departement-create) | ScoSuperAdmin | -| departement:EDIT | modification d'un département | POST | [departement-edit](#departement-edit) | ScoSuperAdmin | -| departementDELETE | suppression d'un département | POST | [departement-delete](#departement-delete) | ScoSuperAdmin | -| formation**`*`** | toutes les formations accessibles | GET | [formations](#formations) | ScoView | -| formation**`#`** | ids des formations accessibles | GET | [formations-ids](#formations-ids) | ScoView | -| formation | une formation | GET | [formation](#formation) | ScoView | -| export | | GET | [formation-export](#formation-export) | ScoView | -| export**`+`** | | GET | [formation-export_with_ids](#formation-export_with_ids) | ScoView | -| referentiel_competences | | GET | [formation-referenciel_competences](#formation-referenciel_competences) | ScoView | -| formsemestre**`#`** | | GET | [departement-formsemestres_ids](#departement-formsemestres_ids) | ScoView | -| formsemestre**`*`** | | GET | [departement-formsemestres_courants](#departement-formsemestres_courants) | ScoView | -| formsemestre**`*`** | | GET | [formsemestre-query](#formsemestre-query) | ScoView | -| formsemestre**`*`** | | GET | [etudiant-formsemestres](#etudiant-formsemestres) | ScoView | -| formsemestre | | GET | [formsemestre](#formsemestre) | ScoView | -| moduleimpl | | GET | [moduleimpl](#moduleimpl) | ScoView | -| partition**`*`** | | GET | [formsemestre-partitions](#formsemestre-partitions) | ScoView | -| partition | | GET | [partition](#partition) | ScoView | -| partition:CREATE | | POST | [formsemestre-partition-create](#formsemestre-partition-create) | ScoEtudChangeGroups | -| partition:EDIT | | POST | [partition-edit](#partition-edit) | ScoEtudChangeGroups | -| partition:ACTION | | POST | [formsemestre-partitions-order](#formsemestre-partitions-order) | ScoEtudChangeGroups | -| partition:DELETE | | POST | [partition-delete](#partition-delete) | ScoEtudChangeGroups | -| partition:ACTION | | POST | [partition-remove_etudiant](#partition-remove_etudiant) | ScoEtudChangeGroups | -| group:CREATE | | POST | [partition-group-create](#partition-group-create) | ScoEtudChangeGroups | -| group:EDIT | | POST | [group-edit](#group-edit) | ScoEtudChangeGroups | -| group:ACTION | | POST | [partition-groups-order](#partition-groups-order) | ScoEtudChangeGroups | -| group:DELETE | | POST | [group-delete](#group-delete) | ScoEtudChangeGroups | -| group* | | GET | [etudiant-formsemestre-groups](#etudiant-formsemestre-groups) | ScoView | -| group:ACTION | | POST | [group-set_etudiant](#group-set_etudiant) | ScoEtudChangeGroups | -| group:ACTION | | POST | [group-remove_etudiant](#group-remove_etudiant) | ScoEtudChangeGroups | -| etudiant**`*`** | recherche par etudid, nip ou ine | GET | [etudiants-clef](#etudiants-clef) | ScoView | -| etudiant**`*`** | les étudiants actuels | GET | [etudiants-courant](#etudiants-courant) | ScoView | -| etudiant**`*`** | | GET | [departement-etudiants](#departement-etudiants) | ScoView | -| etudiant**`*`** | | GET | [formsemestre-etudiants](#formsemestre-etudiants) | ScoView | -| etudiant**`*`** | | GET | [formsemestre-etudiants-query](#formsemestre-etudiants-query) | ScoView | -| etudiant**`*`** | | GET | [group-etudiants-query](#group-etudiants) | ScoView | -| etudiant**`*`** | | GET | [group-etudiants-query](#group-etudiants-query) | -| etudiant | | GET | [etudiant](#etudiant) | ScoView | -| bulletin**`*`** | | GET | [formsemestre-bulletin](#formsemestre-bulletin) | ScoView | -| bulletin | | GET | [etudiant-formsemestre-bulletin](#etudiant-formsemestre-bulletin) | ScoView | -| programme | | GET | [formsemestre-programme](#formsemestre-programme) | ScoView | -| | | GET | [formsemestre-etat_evals](#formsemestre-etat_evals) | ScoView | -| | | GET | [formsemestre-resultats](#formsemestre-resultats) | ScoView | -| jury | | GET | [formsemestre-decisions_jury](#formsemestre-decisions_jury) | ScoView | -| note* | | GET | [evaluation-notes](#evaluation-notes) | ScoView | -| logo**`*`** | | GET | [logos](#logos) | ScoSuperAdmin | -| logo**`*`** | | GET | [departement-logos](#departement-logos) | ScoSuperAdmin | -| logo | | GET | [logo](#logo) | ScoSuperAdmin | -| logo | | GET | [departement-logo](#departement-logo) | ScoSuperAdmin | -| user | | GET | [user](#user) | ScoUsView | -| user**`*`** | | GET | [users-query](#users-query) | ScoUsView | -| user:CREATE | | POST | [user-create](#user-create) | ScoUserAdmin | -| user:EDIT | | POST | [user-edit](#user-edit) | ScoUserAdmin | -| user:PASSWORD | change le mot de passe d'un utilisateur | POST | [user-password](#user-password) | ScoUserAdmin | -| user:ACTION | | POST | [user-role-add](#user-role-add) | ScoUserAdmin | -| user:ACTION | | POST | [user-role-remove](#user-role-remove) | ScoUserAdmin | -| permission**`*`** | | GET | [permissions](#permissions) | ScoUsView | -| role**`*`** | | GET | [roles](#roles) | ScoUsView | -| role**`*`** | | GET | [role](#role) | ScoUsView | -| role:ACTION | | POST | [role-add_permission](#role-add_permission) | ScoUserAdmin | -| role:ACTION | | POST | [role-remove_permission](#role-remove_permission) | ScoUserAdmin | -| role:CREATE | | POST | [role-create](#role-create) | ScoUserAdmin | -| role:EDIT | | POST | [role-edit](#role-edit) | ScoUserAdmin | -| role:DELETE | | POST | [role-delete](#role-delete) | ScoUserAdmin | +| Retour | Remarque | Méthode | Navigation | Permission | +| :---------------------- | :----------------------------------------------------- | ------- | ------------------------------------------------------------------------- | ------------------- | +| assiduite | une assiduité | GET | [assiduité](#assiduite) | ScoView | +| assiduite**`*`** | liste d'assiduités d'un étudiant | GET | [assiduités](#assiduites) | ScoView | +| assiduite**`*`** | liste d'assiduités d'un formsemestre | GET | [assiduités-formsemestre](#assiduites-formsemestre) | ScoView | +| assiduite**`#`** | liste d'id d'assiduités justifiées par un justificatif | GET | [justificatif-justifies](#justificatif-justifies) | ScoView | +| assiduite:CREATE | création d'assiduité | POST | [assiduite-create](#assiduite-create) | ScoAssiduiteChange | +| assiduite:EDIT | édition d'assiduité | POST | [assiduite-edit](#assiduite-edit) | ScoAssiduiteChange | +| assiduite:DELETE | suppression d'assiduité | POST | [assiduite-delete](#assiduite-delete) | ScoAssiduiteChange | +| justificatif | un justificatif | GET | [justificatif](#justificatif) | ScoView | +| justificatif**`*`** | liste de justificatif d'un étudiant | GET | [justificatifs](#justificatifs) | ScoView | +| justificatif:CREATE | création de justificatif | POST | [justificatif-create](#justificatif-create) | ScoJustifChange | +| justificatif:EDIT | édition de justificatif | POST | [justificatif-edit](#justificatif-edit) | ScoJustifChange | +| justificatif:DELETE | suppression de justificatif | POST | [justificatif-delete](#justificatif-delete) | ScoJustifChange | +| justificatif:IMPORT | importation de fichier justificatif | POST | [justificatif-import](#justificatif-import) | ScoJustifChange | +| justificatif:EXPORT | exportation de fichier justificatif | POST | [justificatif-export](#justificatif-export) | ScoJustifChange | +| justificatif:REMOVE | suppression de fichier justificatif | POST | [justificatif-remove](#justificatif-remove) | ScoJustifChange | +| departement**`*`** | tous les depts | GET | [departements](#departements) | | +| departement**`#`** | tous les ids des depts | GET | [departements-ids](#departements-ids) | ScoView | +| departement | recherche par id | GET | [departement](#departement) | ScoView | +| departement | recherche par acronyme | GET | [departement](#departement) | ScoView | +| departement:CREATE | création d'un département | POST | [departement-create](#departement-create) | ScoSuperAdmin | +| departement:EDIT | modification d'un département | POST | [departement-edit](#departement-edit) | ScoSuperAdmin | +| departementDELETE | suppression d'un département | POST | [departement-delete](#departement-delete) | ScoSuperAdmin | +| formation**`*`** | toutes les formations accessibles | GET | [formations](#formations) | ScoView | +| formation**`#`** | ids des formations accessibles | GET | [formations-ids](#formations-ids) | ScoView | +| formation | une formation | GET | [formation](#formation) | ScoView | +| export | | GET | [formation-export](#formation-export) | ScoView | +| export**`+`** | | GET | [formation-export_with_ids](#formation-export_with_ids) | ScoView | +| referentiel_competences | | GET | [formation-referenciel_competences](#formation-referenciel_competences) | ScoView | +| formsemestre**`#`** | | GET | [departement-formsemestres_ids](#departement-formsemestres_ids) | ScoView | +| formsemestre**`*`** | | GET | [departement-formsemestres_courants](#departement-formsemestres_courants) | ScoView | +| formsemestre**`*`** | | GET | [formsemestre-query](#formsemestre-query) | ScoView | +| formsemestre**`*`** | | GET | [etudiant-formsemestres](#etudiant-formsemestres) | ScoView | +| formsemestre | | GET | [formsemestre](#formsemestre) | ScoView | +| moduleimpl | | GET | [moduleimpl](#moduleimpl) | ScoView | +| partition**`*`** | | GET | [formsemestre-partitions](#formsemestre-partitions) | ScoView | +| partition | | GET | [partition](#partition) | ScoView | +| partition:CREATE | | POST | [formsemestre-partition-create](#formsemestre-partition-create) | ScoEtudChangeGroups | +| partition:EDIT | | POST | [partition-edit](#partition-edit) | ScoEtudChangeGroups | +| partition:ACTION | | POST | [formsemestre-partitions-order](#formsemestre-partitions-order) | ScoEtudChangeGroups | +| partition:DELETE | | POST | [partition-delete](#partition-delete) | ScoEtudChangeGroups | +| partition:ACTION | | POST | [partition-remove_etudiant](#partition-remove_etudiant) | ScoEtudChangeGroups | +| group:CREATE | | POST | [partition-group-create](#partition-group-create) | ScoEtudChangeGroups | +| group:EDIT | | POST | [group-edit](#group-edit) | ScoEtudChangeGroups | +| group:ACTION | | POST | [partition-groups-order](#partition-groups-order) | ScoEtudChangeGroups | +| group:DELETE | | POST | [group-delete](#group-delete) | ScoEtudChangeGroups | +| group* | | GET | [etudiant-formsemestre-groups](#etudiant-formsemestre-groups) | ScoView | +| group:ACTION | | POST | [group-set_etudiant](#group-set_etudiant) | ScoEtudChangeGroups | +| group:ACTION | | POST | [group-remove_etudiant](#group-remove_etudiant) | ScoEtudChangeGroups | +| etudiant**`*`** | recherche par etudid, nip ou ine | GET | [etudiants-clef](#etudiants-clef) | ScoView | +| etudiant**`*`** | les étudiants actuels | GET | [etudiants-courant](#etudiants-courant) | ScoView | +| etudiant**`*`** | | GET | [departement-etudiants](#departement-etudiants) | ScoView | +| etudiant**`*`** | | GET | [formsemestre-etudiants](#formsemestre-etudiants) | ScoView | +| etudiant**`*`** | | GET | [formsemestre-etudiants-query](#formsemestre-etudiants-query) | ScoView | +| etudiant**`*`** | | GET | [group-etudiants-query](#group-etudiants) | ScoView | +| etudiant**`*`** | | GET | [group-etudiants-query](#group-etudiants-query) | | +| etudiant | | GET | [etudiant](#etudiant) | ScoView | +| bulletin**`*`** | | GET | [formsemestre-bulletin](#formsemestre-bulletin) | ScoView | +| bulletin | | GET | [etudiant-formsemestre-bulletin](#etudiant-formsemestre-bulletin) | ScoView | +| programme | | GET | [formsemestre-programme](#formsemestre-programme) | ScoView | +| | | GET | [formsemestre-etat_evals](#formsemestre-etat_evals) | ScoView | +| | | GET | [formsemestre-resultats](#formsemestre-resultats) | ScoView | +| jury | | GET | [formsemestre-decisions_jury](#formsemestre-decisions_jury) | ScoView | +| note* | | GET | [evaluation-notes](#evaluation-notes) | ScoView | +| logo**`*`** | | GET | [logos](#logos) | ScoSuperAdmin | +| logo**`*`** | | GET | [departement-logos](#departement-logos) | ScoSuperAdmin | +| logo | | GET | [logo](#logo) | ScoSuperAdmin | +| logo | | GET | [departement-logo](#departement-logo) | ScoSuperAdmin | +| user | | GET | [user](#user) | ScoUsView | +| user**`*`** | | GET | [users-query](#users-query) | ScoUsView | +| user:CREATE | | POST | [user-create](#user-create) | ScoUserAdmin | +| user:EDIT | | POST | [user-edit](#user-edit) | ScoUserAdmin | +| user:PASSWORD | change le mot de passe d'un utilisateur | POST | [user-password](#user-password) | ScoUserAdmin | +| user:ACTION | | POST | [user-role-add](#user-role-add) | ScoUserAdmin | +| user:ACTION | | POST | [user-role-remove](#user-role-remove) | ScoUserAdmin | +| permission**`*`** | | GET | [permissions](#permissions) | ScoUsView | +| role**`*`** | | GET | [roles](#roles) | ScoUsView | +| role**`*`** | | GET | [role](#role) | ScoUsView | +| role:ACTION | | POST | [role-add_permission](#role-add_permission) | ScoUserAdmin | +| role:ACTION | | POST | [role-remove_permission](#role-remove_permission) | ScoUserAdmin | +| role:CREATE | | POST | [role-create](#role-create) | ScoUserAdmin | +| role:EDIT | | POST | [role-edit](#role-edit) | ScoUserAdmin | +| role:DELETE | | POST | [role-delete](#role-delete) | ScoUserAdmin | #### Note sur les exemples d'utilisation @@ -300,18 +316,17 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post- * les listes de plus de 2 éléments sont tronquées à 2 éléments, la fin de la liste étant représentée par la notation en json '...' * les dates (au format ISO) sont systématiquement remplacées par une date fixe (la date de modification d'un mot de passe peut évidement être différente de sa date de création) - -### **API Départements** +### **API Départements** #### Structure Département | attribut | type | commentaire | |:-----------------|:--------|:---------------------------------------| -| _id_ | int | identifiant unique | -| _acronym_ | string | acronyme du département (fixe et unique) | -| _descripton_ | string | | -| _visible_ | bool | affiché ou non dans la page d'accueil | -| _date_creation_ | string | date ISO | +| *id* | int | identifiant unique | +| *acronym* | string | acronyme du département (fixe et unique) | +| *descripton* | string | | +| *visible* | bool | affiché ou non dans la page d'accueil | +| *date_creation* | string | date ISO | #### **departements** @@ -383,7 +398,7 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post- * **Routes:** `/departement//delete` * **Exemple d'utilisation:** `/departement/delete/EARTH` * **Résultat:** supprime définitivement un département. *Toutes les données sont effacées* - (étudiants, formations, ...). + (étudiants, formations, ...). * **Exemple de résultat:** [departements-delete.json](samples/sample_departement-delete.json.md) ### **API Etudiant** @@ -392,29 +407,29 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post- | attribut | type | commentaire | |:-----------------|:--------------------|:---------------------------------| -| _id_ | int | id unique | -| _code_nip_ | string | non unique! | -| _code_ine_ | string | non unique! | -| _dept_id_ | | | -| _civilite_ | string | "M", "F" ou "X" | -| _nom_ | string | en majuscule | -| _nom_usuel_ | string | null si absent | -| _prenom_ | string | | -| _sort_key_ | [ string, string ] | nom-prenom pour trier | -| | | **Format long** | -| _date_naissance_ | string | date ISO | -| _email_ | string | | -| _emailperso_ | string | | -| _admission_ | admission | | -| _adresses_ | adresse* | | -| _boursier_ | | | -| _dept_acronym_ | string | | -| _dept_id_ | string | département du lieu de naissance | -| _lieu_naissance_ | string | lieu de naissance (ville) | -| _nationalite_ | string | | -| _photo_filename_ | string | | -| _scodoc7_id_ | string | de la forme 'EID9999' | -| _statut_ | string | 'I', 'D' ou 'X' | +| *id* | int | id unique | +| *code_nip* | string | non unique! | +| *code_ine* | string | non unique! | +| *dept_id* | | | +| *civilite* | string | "M", "F" ou "X" | +| *nom* | string | en majuscule | +| *nom_usuel* | string | null si absent | +| *prenom* | string | | +| *sort_key* | [ string, string ] | nom-prenom pour trier | +| | | **Format long** | +| *date_naissance* | string | date ISO | +| *email* | string | | +| *emailperso* | string | | +| *admission* | admission | | +| *adresses* | adresse* | | +| *boursier* | | | +| *dept_acronym* | string | | +| *dept_id* | string | département du lieu de naissance | +| *lieu_naissance* | string | lieu de naissance (ville) | +| *nationalite* | string | | +| *photo_filename* | string | | +| *scodoc7_id* | string | de la forme 'EID9999' | +| *statut* | string | 'I', 'D' ou 'X' | #### **`etudiants`** (supprimé) @@ -495,10 +510,10 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post- * **Permission: `ScoView`** * **Paramètres:** `group_id` * **Query string:** `etat` ('I', 'D' ou 'DEF') -* **Routes:** +* **Routes:** * `/group//etudiants` * `/group//etudiants/query` -* **Exemple d'utilisation:** +* **Exemple d'utilisation:** * `/ScoDoc/api/group/1/etudiants` * `/ScoDoc/api/group/1/etudiants/query?etat=I` * **Résultat:** Etudiants d'un groupe spécifié par son id. Liste @@ -531,20 +546,21 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post- | attribut | type | commentaire | |:----------------------------|:------------|:--------------------------------------------------| -| _dept_id_ | int | _redondant avec departement.id ?_ | -| _acronyme_ | string | | -| _titre_ | string | _URL encoded ?_ | -| _version_ | int | | -| _type_parcours_ | int | | -| _referentiel_competence_id_ | int | null si pas de référentiel associé | -| _id_ | int | id unique de formation | -| _titre_officiel_ | string | | -| _formation_code_ | string | défini la compatibilité avec d'autres formations | -| _code_specialité_ | string | | -| _departement_ | Département | _pour `/formations` mais pas pour `/formation` ?_ | -| _formation_id_ | | _redondant avec id ?_ | +| *dept_id* | int | *redondant avec departement.id ?* | +| *acronyme* | string | | +| *titre* | string | *URL encoded ?* | +| *version* | int | | +| *type_parcours* | int | | +| *referentiel_competence_id* | int | null si pas de référentiel associé | +| *id* | int | id unique de formation | +| *titre_officiel* | string | | +| *formation_code* | string | défini la compatibilité avec d'autres formations | +| *code_specialité* | string | | +| *departement* | Département | _pour `/formations` mais pas pour `/formation` ?_ | +| *formation_id* | | *redondant avec id ?* | #### **`formations`** + * **Méthode:** GET * **Permission: `ScoView`** * **Routes:** `/formations` @@ -812,7 +828,7 @@ responsable et ses enseignants). La liste des moduleimpl d'un formsemestre peut | _**computation_expr**_ | string | unused | | _**module_id**_ | int | id du module | | _**formsemestre_id**_ | int | id du formsemestre | -| _**moduleimpl_id**_ | int | _**redondance id_? | +| _**moduleimpl_id**_ | int | ***redondance id*? | | _**ens**_ | User# | liste des ids des enseignants du moduleimpl | | _**module**_ | Module | | @@ -1048,7 +1064,7 @@ d'un autre). * **Permission: `ScoUsersView`** * **Routes:** - * `/users/query?departement=dept_acronym&active=1&starts_with=` + * `/users/query?departement=dept_acronym&active=1&starts_with=` * **Résultat:** Liste d'utilisateurs, filtrés par département, statut, début de nom (paramètres tous optionnels). Seuls les utilisateurs que l'on a la @@ -1088,6 +1104,7 @@ d'un autre). L'opération peut être rejetée si le mot de passe ne satisfait pas les conditions requises (trop simple par exemple), avec le retour suivant: > ```json +> { "error": "Bad Request", "status": 400, @@ -1124,7 +1141,7 @@ d'un autre). logiciel. Voir [ConfigPermissions](ConfigPermissions.md). * **Exemple de résultat:** [permissions.json](samples/sample_permissions.json.md) -### ** API Bulletin, Évaluations, Notes** +### **API Bulletin, Évaluations, Notes** #### **formsemestre-bulletins** @@ -1141,7 +1158,6 @@ indiquer les matières. Par défaut (version `long`), il est structuré en `UEs version est `short_mat`ou `long_mat`, il sera structuré en `UEs / matieres / modules`. - #### **etudiant-formsemestre-bulletin** Récapitulatif par étudiant (état, groupe(s), moyennes d'UEs et de modules @@ -1167,14 +1183,13 @@ mais pas JSON compliant à cause des `NaN`. Pour les formations classiques (toutes sauf BUT), les bulletins JSON peut ou non indiquer les matières. Par défaut (version `long`), il est structuré en - `UEs / modules`. + `UEs / modules`. Si la version est `short_mat`ou `long_mat`, il sera structuré en `UEs / matieres / modules`. Les notes moyennes de matières ne sont calculées que si l'option "*Afficher les matières sur les bulletins*" est activée pour le formsemestre considéré (sinon, la note vaut toujours "*nd*"). ` - * **Exemple de résultat:** [etudiant-formsemestre-bulletin.json](samples/sample_etudiant-formsemestre-bulletin.json.md) #### **formsemestre-programme** @@ -1186,7 +1201,7 @@ mais pas JSON compliant à cause des `NaN`. * **Exemple d'utilisation:** `/ScoDoc/api/formsemestre/1/programme` * **Résultat:** Retourne la structure d'un formsemestre sous 5 entrées d'un dictionnaire: - * **`ues`**: liste des UEs, + * **`ues`**: liste des UEs, * **`ressources`**: liste des ressources (BUT), * **`saes`**: liste des saes (BUT), * **`modules`**: liste des modules classiques (DUT ou sport/culture) @@ -1318,14 +1333,389 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `/departement/id//logo/` * **Exemple d'utilisation:** - * `/ScoDoc/api/departement/MMI/logo/header` - * `/ScoDoc/api/departement/id/3/logo/header` + * `/ScoDoc/api/departement/MMI/logo/header` + * `/ScoDoc/api/departement/id/3/logo/header` * **Résultat :** l'image (format png ou jpg) * **Exemple de résultat:** [departement-logo.json](samples/sample_departement-logo.json.md) +### **API Assiduités** + +#### Structure Assiduité + +| attribut | type | commentaire | +| :-------------- | :------------- | :--------------------------------------------------------------- | +| *assiduite_id* | int | identifiant unique | +| *etudid* | int | identifiant unique de l'étudiant concerné par l'assiduité | +| *moduleimpl_id* | int ou null | identifiant unique du module concerné par l'assiduité si indiqué | +| *date_debut* | string | date ISO du début de la période d'assiduité | +| *date_fin* | string | date ISO de la fin de la période d'assiduité | +| *etat* | string | état de l'assiduité (present, absent, retard) | +| *desc* | string ou null | description de l'assiduité | +| *entry_date* | string | la date d'entrée de l'assiduité | + +> Rappel du format de date ISO : yyyy-mm-jjTHH:MM:SS +> Vous pouvez aussi spécifier le temps UTC en ajoutant '+HH:MM' à la fin + +#### **assiduite** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `assiduite_id` +* **Routes:** `/assiduite/` +* **Exemple d'utilisation:** `/api/assiduite/1` +* **Résultat:** Retourne un objet assiduité ou une erreur si l'id n'est pas connu +* **Exemple de résultat:** [assiduite.json](samples/sample_assiduite.json.md) + +#### **assiduites[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `etudid` +* **Query string:** + * `etat` ('present','retard','absent) + * `moduleimpl_id` (X : id du moduleimpl concerné) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) + * `formsemestre_id` (X : id du formsemestre) +* **Routes:** + * `/assiduites/` + * `/assiduites//query?` +* **Exemple d'utilisation:** + * `/api/assiduites/1` + * `/api/assiduites/1/query?etat=retard` + * `/api/assiduites/1/query?moduleimpl_id=1` +* **Résultat:** Liste de toutes les objets assiduité qui correspondent aux critères sélectionnés +* **Exemple de résultat:** [assiduites.json](samples/sample_assiduites.json.md) + +#### **assiduites-count[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `etudid` +* **Query string:** + * `etat` ('present','retard','absent) + * `moduleimpl_id` (X : id du moduleimpl concerné) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) + * `formsemestre_id` (X : id du formsemestre) + * `metric` ('compte', 'demi', 'journee', 'heure') +* **Routes:** + * `/assiduites//count` + * `/assiduites//count/query?` +* **Exemple d'utilisation:** + * `/api/assiduites/1` + * `/api/assiduites/1/count/query?etat=retard` + * `/api/assiduites/1/count/query?moduleimpl_id=1` + * `/api/assiduites/1/count/query?etat=present,retard&metric=compte,heure` +* **Résultat:** les métriques obtenu à partir des assiduitées correspondant aux critères sélectionnés +* **Exemple de résultat:** [assiduites.json](samples/sample_assiduites.json.md) + +#### **assiduites-formsemestre[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `etudid` +* **Query string:** + * `etat` ('present','retard','absent) + * `moduleimpl_id` (X : id du moduleimpl concerné) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) +* **Routes:** + * `/assiduites/formsemestre/` + * `/assiduites/formsemestre//query?` +* **Exemple d'utilisation:** + * `/api/assiduites/formsemestre/1` + * `/api/assiduites/formsemestre/1/query?etat=retard` + * `/api/assiduites/formsemestre/1/query?moduleimpl=1` +* **Résultat:** Liste de toutes les objets assiduité des étudiants du formsemestre qui correspondent aux critères sélectionnés +* **Exemple de résultat:** [assiduites_formsemestre.json](samples/sample_assiduites_formsemestre.json.md) + +#### **assiduites-formsemestre-count[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `etudid` +* **Query string:** + * `etat` ('present','retard','absent) + * `moduleimpl_id` (X : id du moduleimpl concerné) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) +* **Routes:** + * `/assiduites/formsemestre//count` + * `/assiduites/formsemestre//count/query?` +* **Exemple d'utilisation:** + * `/api/assiduites/formsemestre/1/count` + * `/api/assiduites/formsemestre/1/count/query?etat=retard` + * `/api/assiduites/formsemestre/1/count/query?moduleimpl=1&metric=demi,journee` +* **Résultat:** les métriques obtenu à partir des assiduitées de tous les étudiants du formsemestre correspondant aux critères sélectionnés +* **Exemple de résultat:** [assiduites_formsemestre.json](samples/sample_assiduites_formsemestre.json.md) + +#### **assiduite-create** + +* **Méthode:** POST +* **Permission: `ScoAssiduiteChange`** +* **Paramètres:** `etudid` +* **Data:** + +```json +[ + { + "date_debut": , + "date_fin": , + "etat": , + "moduleimpl_id"?: + }, + ... +] +``` + +* **Routes:** + * `/assiduite//create` +* **Exemple d'utilisation:** `/api/assiduite/1/create` + +> `[{date_debut: "2022-10-27T08:00",date_fin: "2022-10-27T10:00",etat: "absent"}]` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. +* **Exemple de résultat:** [assiduite_create.json](samples/sample_assiduite_create.json.md) + +#### **assiduite-edit** + +* **Méthode:** POST +* **Permission: `ScoAssiduiteChange`** +* **Paramètres:** `assiduite_id` +* **Data:** + +```json +{ + "etat": , + "moduleimpl_id": +} +``` + +* **Routes:** `/assiduite//edit` +* **Exemple d'utilisation:** `/api/assiduite/1/edit` + +> `{etat: "absent"}` + +* **Résultat:** Modifie l'assiduité désignée. Renvoie une erreur si la modification rend incompatible la plage de l'assiduité par rapport aux autres assiduités du même étudiant +* **Exemple de résultat:** [assiduite_edit.json](samples/sample_assiduite_edit.json.md) + +#### **assiduite-delete** + +* **Méthode:** POST +* **Permission: `ScoAssiduiteChange`** +* **Data:** + +```json +[ + , + ... +] +``` + +* **Routes:** + * `/assiduite/delete` +* **Exemple d'utilisation:** `/api/assiduite/delete` + +> `[2,3,5,7]` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. +* **Exemple de résultat:** [assiduite_delete.json](samples/sample_assiduite_delete.json.md) + +#### Structure Justificatif + +| attribut | type | commentaire | +| :----------- | :------------- | :------------------------------------------------------------ | +| *justif_id* | int | identifiant unique | +| *etudid* | int | identifiant unique de l'étudiant concerné par le justificatif | +| *date_debut* | string | date ISO du début de la période du justificatif | +| *date_fin* | string | date ISO de la fin de la période du justificatif | +| *etat* | string | état du justificatif ( attente, valide, non_valide, modifie) | +| *raison* | string ou null | explication du justificatif si présente | +| *fichier* | string | identifiant de l'archivage des fichiers | +| *entry_date* | string | date ISO de l'entrée du justificatif | + +#### **justificatif** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `justif_id` +* **Routes:** `/justificatif/` +* **Exemple d'utilisation:** `/api/justificatif/1` +* **Résultat:** Retourne un objet justificatif ou une erreur si l'id n'est pas connu +* **Exemple de résultat:** [justificatif.json](samples/sample_justificatif.json.md) + +#### **justificatifs[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `etudid` +* **Query string:** + * `etat` ( attente, valide, non_valide, modifie) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) +* **Routes:** + * `/justificatifs/` + * `/justificatifs//query?etat=VALIDE` +* **Exemple d'utilisation:** + * `/api/justificatifs/1` + * `/api/justificatifs/1/query?etat=modifie` + * `/api/justificatifs/1/query?date_debut=2022-10-27T08:00` +* **Résultat:** Liste de toutes les objets justificatifs qui correspondent aux critères sélectionnés +* **Exemple de résultat:** [justificatifs.json](samples/sample_justificatifs.json.md) + +#### **justificatif-create** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** `etudid` +* **Data:** + +```json +[ + { + "etat": , + "date_debut": , + "date_fin": , + "raison"?: , + }, + ... +] +``` + +> Un fichier justificatif peut être importé dans scodoc après avoir créer l'objet justificatif voir [importer un justificatif](FichiersJustificatifs.md#importer-un-fichier) + +* **Routes:** `/justificatif//create` +* **Exemple d'utilisation:** `/api/justificatif/1/create` + +```json +[ + { + "etat": "attente", + "date_debut": "2022-10-27T08:00", + "date_fin": "2022-10-27T12:00", + "raison": "Opération médicale", + } +] +``` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. +* **Exemple de résultat:** [justificatif-create.json](samples/sample_justificatif-create.json.md) + +#### **justificatif-edit** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** `justif_id` +* **Data:** + +```json +{ + "etat": , + "raison": , + "date_debut": , + "date_fin": , +} +``` + +* **Routes:** `/justificatif//edit` +* **Exemple d'utilisation:** `/api/justificatif/1/edit` + +> `{etat: "valide"}` + +* **Résultat:** Modifie le justificatif désignée. +* **Exemple de résultat:** [justificatif-edit.json](samples/sample_justificatif-edit.json.md) + +#### **justificatif-delete** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** `etudid` +* **Data:** + +```json +[ + , + ... +] +``` + +* **Routes:** `/justificatif/delete` +* **Exemple d'utilisation:** `/api/justificatif/delete` + +```json +[ + 2,3,5,7 +] +``` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. +* **Exemple de résultat:** [justificatif-delete.json](samples/sample_justificatif-delete.json.md) + +#### **justificatif-import** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** `justif_id` + +> Procédure d'importation de fichier : [importer un justificatif](FichiersJustificatifs.md#importer-un-fichier) + +* **Routes:** `/justificatif//import` + +* **Résultat:** Le nom du fichier archivé (nom coté serveur) +* **Exemple de résultat:** [justificatif-import.json](samples/sample_justificatif-import.json.md) + +#### **justificatif-export** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** + * `justif_id` + * `filename` + +> Procédure de téléchargement de fichier : [télécharger un justificatif](FichiersJustificatifs.md#télécharger-un-fichier) + +* **Routes:** `/justificatif//export/` + +* **Résultat:** le fichier (téléchargement direct / renvoie octets) +* **Exemple de résultat:** [justificatif-export.json](samples/sample_justificatif-export.json.md) + +#### **justificatif-remove** + +* **Méthode:** POST +* **Permission: `ScoJustifChange`** +* **Paramètres:** `justif_id` + +> Procédure de suppression de fichier : [supprimer un justificatif](FichiersJustificatifs.md#supprimer-un-fichier) + +* **Routes:** `/justificatif//remove` + +* **Résultat:** `{response:"removed"}` ou une erreur +* **Exemple de résultat:** [justificatif-remove.json](samples/sample_justificatif-remove.json.md) + +#### **justificatif-list** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `justif_id` +* **Routes:** `/justificatif//list` +* **Exemple d'utilisation:** `/api/justificatif/1/list` +* **Résultat:** Retourne la liste des fichiers archivés une erreur si l'id n'est pas connu +* **Exemple de résultat:** [justificatif-list.json](samples/sample_justificatif-list.json.md) + +#### **justificatif-justifies** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Paramètres:** `justif_id` +* **Routes:** `/justificatif//justifies` +* **Exemple d'utilisation:** `/api/justificatif/1/justifies` +* **Résultat:** Retourne la liste des assiduite_id qui sont justifiés par le justificatif ou une erreur si l'id n'est pas connu +* **Exemple de résultat:** [justificatif-justifies.json](samples/sample_justificatif-justifies.json.md) + --------------------------------------------------------------------------------------------------------------------- - + ### En savoir plus Voir exemples d'utilisation de l'API en Python, dans `tests/api/`. @@ -1355,6 +1745,6 @@ Les routes ci-dessus s'entendent à partir de l'URL de base de votre ScoDoc, c'e à dire `https://votre.site.fr/ScoDoc//Scolarite/`, et répondent en GET et en POST. -Note: +Note: - - `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API. +* `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API. From 447d6549287cca2d5e433a9182c4275412511b00 Mon Sep 17 00:00:00 2001 From: Hartmann Matthias <49349614+Iziram@users.noreply.github.com> Date: Wed, 15 Feb 2023 10:30:37 +0100 Subject: [PATCH 2/7] =?UTF-8?q?samples=20assiduit=C3=A9s=20justificatifs?= =?UTF-8?q?=20:=20d=C3=A9but?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ScoDoc9API.md | 23 ++++--- docs/samples/sample_assiduite.json.md | 16 +++++ docs/samples/sample_assiduite_create.json.md | 18 +++++ docs/samples/sample_assiduite_delete.json.md | 23 +++++++ docs/samples/sample_assiduite_edit.json.md | 35 ++++++++++ docs/samples/sample_assiduites.json.md | 63 ++++++++++++++++++ docs/samples/sample_assiduites_count.json.md | 30 +++++++++ .../sample_assiduites_formsemestre.json.md | 23 +++++++ ...mple_assiduites_formsemestre_count.json.md | 30 +++++++++ docs/samples/sample_justificatif.json.md | 16 +++++ .../sample_justificatif_create.json.md | 18 +++++ .../sample_justificatif_delete.json.md | 23 +++++++ docs/samples/sample_justificatif_edit.json.md | 24 +++++++ docs/samples/sample_justificatifs.json.md | 26 ++++++++ docs/samples/samples.tar | Bin 0 -> 20480 bytes 15 files changed, 357 insertions(+), 11 deletions(-) create mode 100644 docs/samples/sample_assiduite.json.md create mode 100644 docs/samples/sample_assiduite_create.json.md create mode 100644 docs/samples/sample_assiduite_delete.json.md create mode 100644 docs/samples/sample_assiduite_edit.json.md create mode 100644 docs/samples/sample_assiduites.json.md create mode 100644 docs/samples/sample_assiduites_count.json.md create mode 100644 docs/samples/sample_assiduites_formsemestre.json.md create mode 100644 docs/samples/sample_assiduites_formsemestre_count.json.md create mode 100644 docs/samples/sample_justificatif.json.md create mode 100644 docs/samples/sample_justificatif_create.json.md create mode 100644 docs/samples/sample_justificatif_delete.json.md create mode 100644 docs/samples/sample_justificatif_edit.json.md create mode 100644 docs/samples/sample_justificatifs.json.md create mode 100644 docs/samples/samples.tar diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index 93d0f0c3d..7c23dff3e 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -1409,7 +1409,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `/api/assiduites/1/count/query?moduleimpl_id=1` * `/api/assiduites/1/count/query?etat=present,retard&metric=compte,heure` * **Résultat:** les métriques obtenu à partir des assiduitées correspondant aux critères sélectionnés -* **Exemple de résultat:** [assiduites.json](samples/sample_assiduites.json.md) +* **Exemple de résultat:** [assiduites-count.json](samples/sample_assiduites_count.json.md) #### **assiduites-formsemestre[-query]** @@ -1449,7 +1449,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `/api/assiduites/formsemestre/1/count/query?etat=retard` * `/api/assiduites/formsemestre/1/count/query?moduleimpl=1&metric=demi,journee` * **Résultat:** les métriques obtenu à partir des assiduitées de tous les étudiants du formsemestre correspondant aux critères sélectionnés -* **Exemple de résultat:** [assiduites_formsemestre.json](samples/sample_assiduites_formsemestre.json.md) +* **Exemple de résultat:** [assiduites_formsemestre-count.json](samples/sample_assiduites_formsemestre_count.json.md) #### **assiduite-create** @@ -1489,7 +1489,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. ```json { "etat": , - "moduleimpl_id": + "moduleimpl_id": , + "desc" : } ``` @@ -1601,7 +1602,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. ``` * **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. -* **Exemple de résultat:** [justificatif-create.json](samples/sample_justificatif-create.json.md) +* **Exemple de résultat:** [justificatif-create.json](samples/sample_justificatif_create.json.md) #### **justificatif-edit** @@ -1625,7 +1626,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. > `{etat: "valide"}` * **Résultat:** Modifie le justificatif désignée. -* **Exemple de résultat:** [justificatif-edit.json](samples/sample_justificatif-edit.json.md) +* **Exemple de résultat:** [justificatif-edit.json](samples/sample_justificatif_edit.json.md) #### **justificatif-delete** @@ -1651,7 +1652,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. ``` * **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. -* **Exemple de résultat:** [justificatif-delete.json](samples/sample_justificatif-delete.json.md) +* **Exemple de résultat:** [justificatif-delete.json](samples/sample_justificatif_delete.json.md) #### **justificatif-import** @@ -1664,7 +1665,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Routes:** `/justificatif//import` * **Résultat:** Le nom du fichier archivé (nom coté serveur) -* **Exemple de résultat:** [justificatif-import.json](samples/sample_justificatif-import.json.md) +* **Exemple de résultat:** [justificatif-import.json](samples/sample_justificatif_import.json.md) #### **justificatif-export** @@ -1679,7 +1680,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Routes:** `/justificatif//export/` * **Résultat:** le fichier (téléchargement direct / renvoie octets) -* **Exemple de résultat:** [justificatif-export.json](samples/sample_justificatif-export.json.md) +* **Exemple de résultat:** [justificatif-export.json](samples/sample_justificatif_export.json.md) #### **justificatif-remove** @@ -1692,7 +1693,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Routes:** `/justificatif//remove` * **Résultat:** `{response:"removed"}` ou une erreur -* **Exemple de résultat:** [justificatif-remove.json](samples/sample_justificatif-remove.json.md) +* **Exemple de résultat:** [justificatif-remove.json](samples/sample_justificatif_remove.json.md) #### **justificatif-list** @@ -1702,7 +1703,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Routes:** `/justificatif//list` * **Exemple d'utilisation:** `/api/justificatif/1/list` * **Résultat:** Retourne la liste des fichiers archivés une erreur si l'id n'est pas connu -* **Exemple de résultat:** [justificatif-list.json](samples/sample_justificatif-list.json.md) +* **Exemple de résultat:** [justificatif-list.json](samples/sample_justificatif_list.json.md) #### **justificatif-justifies** @@ -1712,7 +1713,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Routes:** `/justificatif//justifies` * **Exemple d'utilisation:** `/api/justificatif/1/justifies` * **Résultat:** Retourne la liste des assiduite_id qui sont justifiés par le justificatif ou une erreur si l'id n'est pas connu -* **Exemple de résultat:** [justificatif-justifies.json](samples/sample_justificatif-justifies.json.md) +* **Exemple de résultat:** [justificatif-justifies.json](samples/sample_justificatif_justifies.json.md) --------------------------------------------------------------------------------------------------------------------- diff --git a/docs/samples/sample_assiduite.json.md b/docs/samples/sample_assiduite.json.md new file mode 100644 index 000000000..3fcb2ae37 --- /dev/null +++ b/docs/samples/sample_assiduite.json.md @@ -0,0 +1,16 @@ +### assiduite + +#### GET /assiduite/1 +```json +{ + "assiduite_id": 1, + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "desc": null, + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "PRESENT", + "etudid": 1, + "moduleimpl_id": 8 +} +``` + diff --git a/docs/samples/sample_assiduite_create.json.md b/docs/samples/sample_assiduite_create.json.md new file mode 100644 index 000000000..a7b1f5787 --- /dev/null +++ b/docs/samples/sample_assiduite_create.json.md @@ -0,0 +1,18 @@ +### assiduite_create + +#### POST /assiduite/1/create +> `Content-Type: application/json` +> +> `[{"date_debut": "2022-10-27T08:00","date_fin": "2022-10-27T10:00","etat": "absent"}]` + +```json +{ + "errors": {}, + "success": { + "0": { + "assiduite_id": 60 + } + } +} +``` + diff --git a/docs/samples/sample_assiduite_delete.json.md b/docs/samples/sample_assiduite_delete.json.md new file mode 100644 index 000000000..48738dafd --- /dev/null +++ b/docs/samples/sample_assiduite_delete.json.md @@ -0,0 +1,23 @@ +### assiduite_delete + +#### POST /assiduite/delete +> `Content-Type: application/json` +> +> `[2,2,3]` + +```json +{ + "errors": { + "1": "Assiduite non existante" + }, + "success": { + "0": { + "OK": true + }, + "2": { + "OK": true + } + } +} +``` + diff --git a/docs/samples/sample_assiduite_edit.json.md b/docs/samples/sample_assiduite_edit.json.md new file mode 100644 index 000000000..a7b9162c4 --- /dev/null +++ b/docs/samples/sample_assiduite_edit.json.md @@ -0,0 +1,35 @@ +### assiduite_edit + +#### POST /assiduite/1/edit +> `Content-Type: application/json` +> +> `{"etat": "retard","moduleimpl_id":3}` + +```json +{ + "OK": true +} +``` + +#### POST /assiduite/1/edit +> `Content-Type: application/json` +> +> `{"etat":"absent"}` + +```json +{ + "OK": true +} +``` + +#### POST /assiduite/1/edit +> `Content-Type: application/json` +> +> `{"moduleimpl_id":2}` + +```json +{ + "OK": true +} +``` + diff --git a/docs/samples/sample_assiduites.json.md b/docs/samples/sample_assiduites.json.md new file mode 100644 index 000000000..552887d97 --- /dev/null +++ b/docs/samples/sample_assiduites.json.md @@ -0,0 +1,63 @@ +### assiduites + +#### GET /assiduites/1 +```json +[ + { + "assiduite_id": 1, + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "desc": null, + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "PRESENT", + "etudid": 1, + "moduleimpl_id": 8 + }, + { + "assiduite_id": 2, + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "desc": null, + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "RETARD", + "etudid": 1, + "moduleimpl_id": 13 + }, + "..." +] +``` + +#### GET /assiduites/1/query?etat=retard +```json +[ + { + "assiduite_id": 2, + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "desc": null, + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "RETARD", + "etudid": 1, + "moduleimpl_id": 13 + }, + { + "assiduite_id": 3, + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "desc": null, + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "RETARD", + "etudid": 1, + "moduleimpl_id": 14 + }, + "..." +] +``` + +#### GET /assiduites/1/query?moduleimpl_id=1 +```json +[ + "..." +] +``` + diff --git a/docs/samples/sample_assiduites_count.json.md b/docs/samples/sample_assiduites_count.json.md new file mode 100644 index 000000000..bd95f2b74 --- /dev/null +++ b/docs/samples/sample_assiduites_count.json.md @@ -0,0 +1,30 @@ +### assiduites_count + +#### GET /assiduites/1/count +```json +{ + "compte": 4, + "demi": 3, + "heure": 6.0, + "journee": 4 +} +``` + +#### GET /assiduites/1/count/query?etat=present,retard&metric=compte,heure +```json +{ + "compte": 4, + "heure": 6.0 +} +``` + +#### GET /assiduites/1/count/query?etat=retard +```json +{ + "compte": 3, + "demi": 3, + "heure": 6.0, + "journee": 3 +} +``` + diff --git a/docs/samples/sample_assiduites_formsemestre.json.md b/docs/samples/sample_assiduites_formsemestre.json.md new file mode 100644 index 000000000..dfa44f55b --- /dev/null +++ b/docs/samples/sample_assiduites_formsemestre.json.md @@ -0,0 +1,23 @@ +### assiduites_formsemestre + +#### GET /assiduites/formsemestre/1 +```json +[ + "..." +] +``` + +#### GET /assiduites/formsemestre/1/query?etat=retard +```json +[ + "..." +] +``` + +#### GET /assiduites/formsemestre/1/query?moduleimpl_id=1 +```json +[ + "..." +] +``` + diff --git a/docs/samples/sample_assiduites_formsemestre_count.json.md b/docs/samples/sample_assiduites_formsemestre_count.json.md new file mode 100644 index 000000000..14dde74c4 --- /dev/null +++ b/docs/samples/sample_assiduites_formsemestre_count.json.md @@ -0,0 +1,30 @@ +### assiduites_formsemestre_count + +#### GET /assiduites/formsemestre/1/count +```json +{ + "compte": 0, + "demi": 0, + "heure": 0.0, + "journee": 0 +} +``` + +#### GET /assiduites/formsemestre/1/count/query?etat=present,retard&metric=compte,heure +```json +{ + "compte": 0, + "heure": 0.0 +} +``` + +#### GET /assiduites/formsemestre/1/count/query?etat=retard +```json +{ + "compte": 0, + "demi": 0, + "heure": 0.0, + "journee": 0 +} +``` + diff --git a/docs/samples/sample_justificatif.json.md b/docs/samples/sample_justificatif.json.md new file mode 100644 index 000000000..452926c50 --- /dev/null +++ b/docs/samples/sample_justificatif.json.md @@ -0,0 +1,16 @@ +### justificatif + +#### GET /justificatif/1 +```json +{ + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "VALIDE", + "etudid": 1, + "fichier": null, + "justif_id": 1, + "raison": "raison" +} +``` + diff --git a/docs/samples/sample_justificatif_create.json.md b/docs/samples/sample_justificatif_create.json.md new file mode 100644 index 000000000..80853445a --- /dev/null +++ b/docs/samples/sample_justificatif_create.json.md @@ -0,0 +1,18 @@ +### justificatif_create + +#### POST /justificatif/1/create +> `Content-Type: application/json` +> +> `[{"date_debut": "2022-10-27T08:00","date_fin": "2022-10-27T10:00","etat": "attente"}]` + +```json +{ + "errors": {}, + "success": { + "0": { + "justif_id": 12 + } + } +} +``` + diff --git a/docs/samples/sample_justificatif_delete.json.md b/docs/samples/sample_justificatif_delete.json.md new file mode 100644 index 000000000..52bff41ed --- /dev/null +++ b/docs/samples/sample_justificatif_delete.json.md @@ -0,0 +1,23 @@ +### justificatif_delete + +#### POST /justificatif/delete +> `Content-Type: application/json` +> +> `[2,2,3]` + +```json +{ + "errors": { + "1": "Justificatif non existant" + }, + "success": { + "0": { + "OK": true + }, + "2": { + "OK": true + } + } +} +``` + diff --git a/docs/samples/sample_justificatif_edit.json.md b/docs/samples/sample_justificatif_edit.json.md new file mode 100644 index 000000000..5946ad10d --- /dev/null +++ b/docs/samples/sample_justificatif_edit.json.md @@ -0,0 +1,24 @@ +### justificatif_edit + +#### POST /justificatif/1/edit +> `Content-Type: application/json` +> +> `{"etat":"valide"}` + +```json +{ + "OK": true +} +``` + +#### POST /justificatif/1/edit +> `Content-Type: application/json` +> +> `{"raison":"MEDIC"}` + +```json +{ + "OK": true +} +``` + diff --git a/docs/samples/sample_justificatifs.json.md b/docs/samples/sample_justificatifs.json.md new file mode 100644 index 000000000..3873f60ee --- /dev/null +++ b/docs/samples/sample_justificatifs.json.md @@ -0,0 +1,26 @@ +### justificatifs + +#### GET /justificatifs/1 +```json +[ + { + "date_debut": "2022-08-20T12:00:00.000000+02:00", + "date_fin": "2022-08-20T12:00:00.000000+02:00", + "entry_date": "2022-08-20T12:00:00.000000+02:00", + "etat": "VALIDE", + "etudid": 1, + "fichier": null, + "justif_id": 1, + "raison": "raison" + }, + "..." +] +``` + +#### GET /justificatifs/1/query?etat=attente +```json +[ + "..." +] +``` + diff --git a/docs/samples/samples.tar b/docs/samples/samples.tar new file mode 100644 index 0000000000000000000000000000000000000000..49426883d9784e07d8c7bc5652fdc35488b79eaf GIT binary patch literal 20480 zcmeHO+iu%95cRXZLQsHxS;rkQA#a5xF=)n_vF)1lW%7=qdEqqm?`8;{(XYG>ifH z1FZ=x{-ssGFw6lobW4W_niJBF{GNb;3i_D5X^c3G>_Alqq2s&0Q{TF&zP{%VU2}19 zp^Cy+6jFMjet7?JrjGNoMIp3(|zP zdU(-XvYF;C{v1czwW=Y2&?N+y$eMwxYXG!i(%{is3)K)L)i|kidX?_255`?krn0dHuqdoYl6Ib%f4-uEuBnJ zerORMw75{@zl)dn)chx$7x_`}l5N+S=YJyn8vdu1?b(lpXsGWbY|b|gQvTm& zR!Cj@YZd?R5#3DmjFymbPjbKiiwqeBG0rDR)dQnGDrJb7|M!w&_r@ImQ|kXQ z<^6uq;TGIxm>T8^S07wmA~1u9`10guL^lEezXJNK6?+x^|2BPa=n(t8j+e`H6mm8Q zp67H0)Q@1tj27c$8tTLS^yBp1EL#$eVwW8VvNsb*tX`eZxj^K9ICuPb-LD5gg}&?j zZ$cpY|0aae|L@M~_B}cNr^2sP10g;C)2$(D1IJ%&810OV(Rk$%7V7Ea7aRwamF5Vf zB~N}FtT8P!G9ocE&+DCh!tsAG4xWFfWWCu0n8pEyiBIv%3P*wG+$2jFvY8r}S6I)! zvnR9G&XB#a+a3TtTS9w@_1m({|3^Pqg?NR-C?L_mK9oTt|1H7)N6>)s{NJyjYep0J zUlx9iGAK4|)C?K%Q(|O~854AFBuBhtN! zck{oW(?Apd4S;z2kH|fNF75wbg6!CM2mf0!KR1RCELNtCMk7u6L`z$BFOpVZ%0UBi z9{Ua4waSjbok_P6|NEglhfV|kk!cA0hZBPw31s}AL-9BdJpXGrEAr>{8cnN?1+Wl% zr+C0?&;4QoNk1_zz)CyC29loX0M`X{OVeV*Pi{0*YwX5$-t+D0#mm z2M8iYXsX?QiX5OS{`Z{%)X0BRi2p$g88ZIQ6ZJ?>CH_~W0CD_3eiqQ51zW@=0?9m} z{x?At|NBk>YUDpE-Tzt8koLcSX_rSV@xPP;#Ie6?7LfMUUV1Ju-1}wT95{Didn8X- zyVm}h-o1U(YVtBd=Ur04|K1~jP5hq#osa*+i6!sL?V`-S$jP650;{qW!0zu(?XYjbgo6+jdJEg<^;Ca~oB|40(&hZXrB)+qpzj+1ME2X;m-ga}U`weF-7Sj;j@ z`s4IMT2m3zuhI{!b%l;# Date: Fri, 31 Mar 2023 09:33:40 +0200 Subject: [PATCH 3/7] =?UTF-8?q?Documentation=20des=20nouvelles=20routes=20?= =?UTF-8?q?API=20Assiduit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Route assiduites-group (On donne une liste d'etudid et cela renvoie un objet avec comme clé les étudid et comme valeur la liste des assiduités) - Route assiduites-create (On créer des assiduités pour des étudiants différents) - Route assiduites-edit (On donne une liste d'assiduité à modifier) --- docs/ScoDoc9API.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index 7c23dff3e..77eaf119e 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -1451,6 +1451,60 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Résultat:** les métriques obtenu à partir des assiduitées de tous les étudiants du formsemestre correspondant aux critères sélectionnés * **Exemple de résultat:** [assiduites_formsemestre-count.json](samples/sample_assiduites_formsemestre_count.json.md) +#### **assiduites-group[-query]** + +* **Méthode:** GET +* **Permission: `ScoView`** +* **Query string:** + * `etudids` **Obligatoire** (liste des etudids sous la forme `x,y,z,...`) + * `etat` ('present','retard','absent) + * `moduleimpl_id` (X : id du moduleimpl concerné) + * `date_debut` (X : date format iso) + * `date_fin` (X : date format iso) +* **Routes:** + * `/assiduites/group/query?group=` +* **Exemple d'utilisation:** + * `/assiduites/group/query?group=1,2,3` + * `/assiduites/group/query?group=1,2,3&etat=retard` + * `/assiduites/group/query?group=1,2,3&moduleimpl=1` +* **Résultat:** + ```json + { + etudid1 : [{assiduité...}], + etudid2 : [{assiduité...}], + etudid3 : [{assiduité...}], + } + ``` + +#### **assiduites-create** + +* **Méthode:** POST +* **Permission: `ScoAssiduiteChange`** +* **Data:** + +```json +[ + { + "date_debut": , + "date_fin": , + "etat": , + "etudid": + "moduleimpl_id"?: + "desc"?: + }, + ... +] +``` + +* **Routes:** + * `/assiduites/create` +* **Exemple d'utilisation:** `/api/assiduites/create` + +> `[{date_debut: "2022-10-27T08:00",date_fin: "2022-10-27T10:00",etat: "absent",etudid:1}]` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. + + #### **assiduite-create** * **Méthode:** POST @@ -1465,6 +1519,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. "date_fin": , "etat": , "moduleimpl_id"?: + "desc"?: }, ... ] @@ -1502,6 +1557,32 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * **Résultat:** Modifie l'assiduité désignée. Renvoie une erreur si la modification rend incompatible la plage de l'assiduité par rapport aux autres assiduités du même étudiant * **Exemple de résultat:** [assiduite_edit.json](samples/sample_assiduite_edit.json.md) +#### **assiduites-edit** + +* **Méthode:** POST +* **Permission: `ScoAssiduiteChange`** +* **Data:** + +```json +[ + { + "etudid": + "etat"?: , + "moduleimpl_id"?: + "desc"?: + }, + ... +] +``` + +* **Routes:** + * `/assiduites/edit` +* **Exemple d'utilisation:** `/api/assiduites/edit` + +> `[{etat: "absent",assiduite_id:1},{etat: "retard",moduleimpl_id:12,assiduite_id:2}]` + +* **Résultat:** Retourne un objet en deux partie (errors et success) contenant le retour de chaque objet donné dans la requête post. + #### **assiduite-delete** * **Méthode:** POST From 27a43efb5a56ca5f543ede3118ef7cd468a31fa8 Mon Sep 17 00:00:00 2001 From: Iziram Date: Mon, 5 Jun 2023 17:20:20 +0200 Subject: [PATCH 4/7] =?UTF-8?q?D=C3=A9but=20Documentation=20Utilisateur=20?= =?UTF-8?q?Module=20Assiduit=C3=A9=20+=20ajout=20perma=20links)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ModuleAssiduites.md | 50 ++++++++++++++++++++++++ docs/screens/config_assiduites_dept.png | Bin 0 -> 103671 bytes docs/screens/config_assiduites_gen.png | Bin 0 -> 104275 bytes mkdocs.yml | 2 + 4 files changed, 52 insertions(+) create mode 100644 docs/ModuleAssiduites.md create mode 100644 docs/screens/config_assiduites_dept.png create mode 100644 docs/screens/config_assiduites_gen.png diff --git a/docs/ModuleAssiduites.md b/docs/ModuleAssiduites.md new file mode 100644 index 000000000..280b01980 --- /dev/null +++ b/docs/ModuleAssiduites.md @@ -0,0 +1,50 @@ +## Module "Assiduités" + +Ce module de ScoDoc a pour but de remplacer le module d'Absences présent dans Scodoc. +En plus de moderniser l'ancien module, le module assiduités met à disposition une api complète. + +Ce projet a été développé en 2022-2023, par Matthias Hartmann, apprenti de l'IUT de +Lannion financé par l'Association ScoDoc. + +[Vidéo de présentation du module d'assiduités ](#) + +## Fonctionnalités + +Le module, intégrée à ScoDoc, fournit pour l'instant: + +- Gestion des absences/présences/retard +- Précision des saisies (périodes déterminées par une heure de début et une heure de fin au lieu de demi-journées) +- Gestion et sauvegarde de justificatifs numériques. +- API complète + +## Guide d'utilisation + +- [Personnalisation du module](#personnalisation-du-module) + +### Personnalisation du module + +Le module possède deux types de configuration, une générale et une par département/semestre. + +**La configuration générale permet de configurer la ligne temporelle visible sur certaines pages de saisie d'assiduités.** + +![Configuration de l'assiduité : Général](screens/config_assiduites_gen.png) + +- `Début de la journée` : l'heure de début de la ligne temporelle (par défaut : 8h00) +- `L'heure de midi` : l'heure pivot qui sépare la matinée de l'après-midi (par défaut : 13h00) +- `Fin de la journée` : l'heure de fin de la ligne temporelle (par défaut : 18h00) +- `Granularité` : La granularité de la ligne temporelle. (par défaut : 15 min) + +**La configuration par département/semestre permet de configurer certaines actions liés à l'assiduité** + +![Configuration de l'assiduité : département](screens/config_assiduites_dept.png) + +- `Forcer la déclaration du module` : Forcer les utilisateurs de ScoDoc à renseigner le module à chaque saisie d'assiduités. +- `Forcer l'appel des présents` : Force les utilisateurs à noter les présences/absences/retard lors d'une saisie. +- `Durée par défaut d'un créneau` : Détermine la durée classique d'un cours. (Ce sera la période préenregistrée sur la ligne temporelle) +- `Définir l'état par défaut` : Défini l'état par défaut qui sera appliqué aux étudiants avant validation d'une saisie d'assiduité. +- `Jours non travaillés` : Défini les jours sur lesquels la saisie d'assiduités ne sera pas possible. +- `Métrique de l'assiduité` : Défini l'unité de l'assiduité qui sera utilisé par les autres modules de ScoDoc. + - `1/2 J.` : Demi-Journée + - `J.` : Journées + - `H.` : Heures + diff --git a/docs/screens/config_assiduites_dept.png b/docs/screens/config_assiduites_dept.png new file mode 100644 index 0000000000000000000000000000000000000000..dde58f86e9efbb0c7a07a77a5d51ec1b3722f6e1 GIT binary patch literal 103671 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ν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

kRTU)r7N*E58}P|G9niPyyjF@Wi*(EW#F`PC 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 XBMR-h1vFl`0(@+398PjhT!{Y*j2uKI literal 0 HcmV?d00001 diff --git a/docs/screens/config_assiduites_gen.png b/docs/screens/config_assiduites_gen.png new file mode 100644 index 0000000000000000000000000000000000000000..87b45d8fb9161e94d8ecd6235a9f3984bc759685 GIT binary patch literal 104275 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 Date: Wed, 7 Jun 2023 09:32:26 +0200 Subject: [PATCH 5/7] =?UTF-8?q?Documentation=20page=20de=20saisie=20(journ?= =?UTF-8?q?ali=C3=A8re=20et=20diff=C3=A9r=C3=A9e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Assiduites.md | 171 +++++++++++++++++++++++++++++++++++++++ docs/ModuleAssiduites.md | 50 ------------ 2 files changed, 171 insertions(+), 50 deletions(-) create mode 100644 docs/Assiduites.md delete mode 100644 docs/ModuleAssiduites.md diff --git a/docs/Assiduites.md b/docs/Assiduites.md new file mode 100644 index 000000000..a21bfc432 --- /dev/null +++ b/docs/Assiduites.md @@ -0,0 +1,171 @@ +## Module "Assiduités" + +Ce module de ScoDoc a pour but de remplacer le module d'Absences présent dans Scodoc. +En plus de moderniser l'ancien module, le module assiduités met à disposition une api complète. + +Ce projet a été développé en 2022-2023, par Matthias Hartmann, apprenti de l'IUT de +Lannion financé par l'Association ScoDoc. + +[Vidéo de présentation du module d'assiduités ](#) + +## Fonctionnalités + +Le module, intégrée à ScoDoc, fournit pour l'instant: + +- Gestion des absences/présences/retard +- Précision des saisies (périodes déterminées par une heure de début et une heure de fin au lieu de demi-journées) +- Gestion et sauvegarde de justificatifs numériques. +- API complète + +## Guide d'utilisation + +- [Personnalisation du module](#personnalisation-du-module) +- [Saisie des Assiduités](#saisie-des-assiduités) + +### Personnalisation du module + +Le module possède deux types de configuration, une générale et une par département/semestre. + +**La configuration générale permet de configurer la ligne temporelle visible sur certaines pages de saisie d'assiduités.** + +![Configuration de l'assiduité : Général](screens/config_assiduites_gen.png) + +Route : `/ScoDoc/config_assiduites` + +- `Début de la journée` : l'heure de début de la ligne temporelle (par défaut : 8h00) +- `L'heure de midi` : l'heure pivot qui sépare la matinée de l'après-midi (par défaut : 13h00) +- `Fin de la journée` : l'heure de fin de la ligne temporelle (par défaut : 18h00) +- `Granularité` : La granularité de la ligne temporelle. (par défaut : 15 min) + +**La configuration par département/semestre permet de configurer certaines actions liés à l'assiduité** + +![Configuration de l'assiduité : département](screens/config_assiduites_dept.png) + +Route : `/ScoDoc//Scolarite/edit_preferences` + +- `Forcer la déclaration du module` : Forcer les utilisateurs de ScoDoc à renseigner le module à chaque saisie d'assiduités. +- `Forcer l'appel des présents` : Force les utilisateurs à noter les présences/absences/retard lors d'une saisie. +- `Durée par défaut d'un créneau` : Détermine la durée classique d'un cours. (Ce sera la période préenregistrée sur la ligne temporelle) +- `Définir l'état par défaut` : Défini l'état par défaut qui sera appliqué aux étudiants avant validation d'une saisie d'assiduité. +- `Jours non travaillés` : Défini les jours sur lesquels la saisie d'assiduités ne sera pas possible. +- `Métrique de l'assiduité` : Défini l'unité de l'assiduité qui sera utilisé par les autres modules de ScoDoc. + - `1/2 J.` : Demi-Journée + - `J.` : Journées + - `H.` : Heures + +### Saisie des Assiduités + +La saisie se fait soit sur un groupe soit sur un étudiant. Dans tous les cas il y a deux façons de saisir l'assiduité. +Une saisie `Journalière` et une saisie `Différée`. + +**Saisie d'un groupe** + +Tout comme l'ancien module, pour saisir l'assiduité d'un groupe il faut se rendre sur la page un semestre du département concerné. + +![Page du semestre concerné](#) + +Au bas de cette page vous retrouverez la liste des groupes du semestre. Si vous avez la permission de modifier l'assiduité, vous observerez 3 boutons supplémentaires sur chaque groupe vous permettant de voir ou saisir l'assiduité du groupe. + +#### Saisie Journalière + +La première chose à faire lorsque vous êtes arrivés sur la page "Saisie Journalière" c'est de compléter les informations de la séance : + +![Capture des sélecteurs](#) + + +- Le ou les groupes sélectionnés (dans la plupart des cas, le groupe est déjà présélectionné) +- Le module concerné (par défaut il n'est pas obligatoire de sélectionner un module, cependant une configuration permet de forcer la sélection) +- La date de la saisie. Attention, seule les dates comprises dans le semestre sont valides. (Un message d'erreur vous le signalera si la date n'est pas valide) + +Lorsque vous êtes sûr de vous, appuyer sur le bouton `Valider`. +**Attention : La validation est définitive, si vous avez fait une erreur il faudra recharger la page** + +Après la validation, les champs précédents seront grisés. + +Explication de l'interface + +![Capture de l'interface](#) + + +1. La ligne temporelle (Timeline) sert à désigner la période de l'assiduité qui sera saisie. + + Il est possible de la déplacer en maintenant le clique gauche dessus puis en bougeant la souris. + + Si la période n'est pas de la bonne taille, il est possible de l'agrandir ou de la réduire en plaçant sa souris à l'extrémité droite. + + Votre curseur devrait changer, à partir de ce moment là vous pouvez cliquer puis bouger l'extrémité pour modifier la taille de la période. + + Si la période bouge toujours alors que vous avez lâché le clique gauche, cliquer à nouveau. + +2. Les boutons d'actions de masse `Mettre tout le monde : `. Ces boutons définirons le même état pour chaque étudiant sur la période sélectionnée. + + En cliquant sur un bouton d'état, l'état sera mis pour chaque étudiant, pour modifier cet état il faut appuyer sur un autre bouton d'état. + + Si vous souhaitez retirer les assiduités, il faut cliquer sur le bouton d'état ayant le même état que les étudiants. + +3. Les lignes étudiants sont des lignes montrant les informations d'assiduité de chaque étudiant. Chaque ligne est composée de 3 parties : + + 1. Le nom, le prénom et une photo de l'étudiant afin de le reconnaître facilement + + 2. Une petite ligne temporelle montrant l'assiduité de l'étudiant sur la journée. + + Le carré au début de la ligne montre la dernière assiduité du jour précédent. + + En passant votre souris au dessus des couleurs, vous aurez accès à plus d'informations sur l'assiduité de l'étudiant. + + Cliquer sur une assiduité positionnera la ligne temporelle globale sur la période de l'assiduité. + + La période globale est représentée par un encadré bleu sur la ligne temporelle. + + Les assiduités justifiées et validés sont représentés par leur couleur respective + un hachage bleu + + Les assiduités justifiées mais non validées sont représentés par leur couleur respective + un hachage rouge. + + 3. Les boutons d'assiduités individuels. Ces boutons permettent de déterminer l'état de l'étudiant. + + Ils fonctionnent de la même façon que les boutons `mettre tout le monde :`. + + Si la ligne de l'étudiant est rouge, cela signifie que la période sélectionnée rentre en conflit avec les assiduités de l'étudiant. Cliquer sur une bouton d'assiduité ne modifiera pas l'état de l'étudiant mais ouvrira un menu de résolution de conflit. + + ![Résolution de conflit](#) + +Les assiduités de la page sont enregistrées en temps réel. Lorsque la saisie est terminée vous pouvez fermer la page. + +#### Saisie différée + +La page saisie différée à pour but de faciliter la saisie d'assiduités avec plusieurs périodes. + +![Page différée](#) + +La page est composée d'un tableau et d'un bouton valider. **Cette page ne sauvegarde pas automatiquement les modifications** + +Explication du tableau : + +- La colonne `Noms` : Vous y retrouverez tous les étudiants du groupe sélectionné. En cliquant sur le titre de la colonne vous pourrez changer l'ordre des étudiants (croissant ou décroissant) +- Les colonnes `Assiduités` : Lorsque vous arrivez sur la page, une seule colonne d'assiduité est présente. + + Si vous avez besoins d'autres colonnes, appuyer sur le bouton `+`. + + Si vous souhaitez supprimer une colonne appuyer sur la `croix X` de la colonne. + + Il vous faudra remplir la colonne afin de pouvoir saisir l'assiduité des étudiants : + + 1. La date de début : Sur la première colonne, la date par défaut sera la date du jour, sur les nouvelles colonnes, la date par défaut sera la date de fin de la colonne précédente. + 2. La date de fin : La date de fin n'est pas renseignée par défaut, cependant la première fois que vous changer la date de début de la colonne, la date de fin sera automatiquement mise à jour de façon à prendre la taille d'un créneau classique (configuration du semestre/département). + 3. Le module concerné par l'assiduité. Ce sélecteur n'est pas obligatoire par défaut (configuration du semestre/département). + 4. `Sélectionner une assiduité` permet de mettre tous les étudiants à un certain état. Ce sélecteur n'est pas obligatoire. + +- Chaque ligne du tableau correspond à un étudiant. Vous pouvez alors sélectionner l'état de l'assiduité de chaque étudiant pour chaque colonne. + +Après avoir rempli le tableau il faudra valider en cliquant sur `valider les assiduités`. + +Après validation, toutes les colonnes seront désactivées, si besoins vous pouvez les réactiver en cliquant sur `Activer` pour chaque colonne. + +Il est possible que des erreurs apparaissent. Les erreurs sont gérées par colonnes puis par étudiant. Cela signifie qu'une erreur de colonne (ex: une mauvaise date) désactivera complètement la colonne alors qu'une erreur d'étudiant (ex: l'étudiant possède déjà une assiduité sur cette période) désactivera uniquement l'envoie de l'assiduité le concernant. + +Vous pouvez obtenir plus d'informations sur l'erreur en plaçant votre souris au dessus du `ℹ️`. + +Il est possible de forcer la mise à jour des assiduités : **Attention, cela ne fonctionnera que pour les assiduités ayant exactement la même période** +(Cela a été mis en place pour facilement corriger les oubli de module) + +Chaque colonne possède un numéro distinctif qui est visible en laissant la souris au dessus de l'entête de la colonne. Ce numéro est utilisé dans les messages d'erreurs. \ No newline at end of file diff --git a/docs/ModuleAssiduites.md b/docs/ModuleAssiduites.md deleted file mode 100644 index 280b01980..000000000 --- a/docs/ModuleAssiduites.md +++ /dev/null @@ -1,50 +0,0 @@ -## Module "Assiduités" - -Ce module de ScoDoc a pour but de remplacer le module d'Absences présent dans Scodoc. -En plus de moderniser l'ancien module, le module assiduités met à disposition une api complète. - -Ce projet a été développé en 2022-2023, par Matthias Hartmann, apprenti de l'IUT de -Lannion financé par l'Association ScoDoc. - -[Vidéo de présentation du module d'assiduités ](#) - -## Fonctionnalités - -Le module, intégrée à ScoDoc, fournit pour l'instant: - -- Gestion des absences/présences/retard -- Précision des saisies (périodes déterminées par une heure de début et une heure de fin au lieu de demi-journées) -- Gestion et sauvegarde de justificatifs numériques. -- API complète - -## Guide d'utilisation - -- [Personnalisation du module](#personnalisation-du-module) - -### Personnalisation du module - -Le module possède deux types de configuration, une générale et une par département/semestre. - -**La configuration générale permet de configurer la ligne temporelle visible sur certaines pages de saisie d'assiduités.** - -![Configuration de l'assiduité : Général](screens/config_assiduites_gen.png) - -- `Début de la journée` : l'heure de début de la ligne temporelle (par défaut : 8h00) -- `L'heure de midi` : l'heure pivot qui sépare la matinée de l'après-midi (par défaut : 13h00) -- `Fin de la journée` : l'heure de fin de la ligne temporelle (par défaut : 18h00) -- `Granularité` : La granularité de la ligne temporelle. (par défaut : 15 min) - -**La configuration par département/semestre permet de configurer certaines actions liés à l'assiduité** - -![Configuration de l'assiduité : département](screens/config_assiduites_dept.png) - -- `Forcer la déclaration du module` : Forcer les utilisateurs de ScoDoc à renseigner le module à chaque saisie d'assiduités. -- `Forcer l'appel des présents` : Force les utilisateurs à noter les présences/absences/retard lors d'une saisie. -- `Durée par défaut d'un créneau` : Détermine la durée classique d'un cours. (Ce sera la période préenregistrée sur la ligne temporelle) -- `Définir l'état par défaut` : Défini l'état par défaut qui sera appliqué aux étudiants avant validation d'une saisie d'assiduité. -- `Jours non travaillés` : Défini les jours sur lesquels la saisie d'assiduités ne sera pas possible. -- `Métrique de l'assiduité` : Défini l'unité de l'assiduité qui sera utilisé par les autres modules de ScoDoc. - - `1/2 J.` : Demi-Journée - - `J.` : Journées - - `H.` : Heures - From 70424eba78321f60f76b5024215873a2199118a0 Mon Sep 17 00:00:00 2001 From: Iziram Date: Mon, 10 Jul 2023 18:17:34 +0200 Subject: [PATCH 6/7] Assiduites :Migrations --- docs/Assiduites.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/docs/Assiduites.md b/docs/Assiduites.md index a21bfc432..eb7febc20 100644 --- a/docs/Assiduites.md +++ b/docs/Assiduites.md @@ -19,9 +19,74 @@ Le module, intégrée à ScoDoc, fournit pour l'instant: ## Guide d'utilisation +- [Migration de l'ancien module](#migration-de-lancien-module) - [Personnalisation du module](#personnalisation-du-module) - [Saisie des Assiduités](#saisie-des-assiduités) +### Migration de l'ancien module + +Afin de favoriser la transition de l'ancien module au nouveau, un script de migration a été développé. + +#### Script de Migration + +Le script se nomme `migrate-abs-to-assiduites` et ne peut se lancer qu'en ligne de commande. + +Par défaut, la migration s'opérera sur l'ensemble des départements en utilisant les préférences de ScoDoc. + +Néanmoins le script possède 4 options pour modifier son comportement : +- `-d, --dept` + Permet de restreindre la migration à un département à l'aide de son acronyme. + Utilisation : `flask migrate-abs-to-assiduites -d ` +- `-m, --morning` + Permet de définir l'heure de début des cours. + Utilisation : `flask migrate-abs-to-assiduites -m ` + exemple : `hh:mm` -> `08:30` +- `-n, --noon` + Permet de définir l'heure de fin du matin (= l'heure de début de l'après-midi). + Utilisation : `flask migrate-abs-to-assiduites -n ` + exemple : `hh:mm` -> `13:30` +- `-e, --evening` + Permet de définir l'heure de fin des cours. + Utilisation : `flask migrate-abs-to-assiduites -e ` + exemple : `hh:mm` -> `18:30` + + +Les options peuvent s’enchaîner : `flask migrate-abs-to-assiduites -d TEST -m 10:30 -n 14:50 -e 19:45` + +Lors du lancement du script, une barre de progression apparaîtra. Celle si vous indique l'avancée de la transformation des absences en assiduités. + +Une fois arrivée à 100%, Un processus de validation et de justification des assiduités se lancera. Celui-ci peut (suivant les configurations) prendre un certain temps. Veuillez ne pas le stopper en cours de route. + +Lorsque la migration sera finie, un fichier log de la migration sera généré pour chaque département. Vous recevrez aussi des statistiques sur le nombre de justificatif et d'assiduités générés. + + +#### Script de Suppression + +En cas de problème, ou si vous souhaitez purger la base de donnée, un script de suppression des assiduités et des justificatifs est disponible. + +Le script se nomme `downgrade-assiduites-module`. + +Si vous lancer le script sans aucune option, il ne se passera rien. + +Voici les options : + +- `-d, --dept` + Permet de restreindre la suppression à un département à l'aide de son acronyme. + Utilisation : `flask downgrade-assiduites-module -d ` +- `-a, --assiduites` + Provoque la suppression de toutes les assiduités + Utilisation : `flask downgrade-assiduites-module -a` +- `-j, --justificatifs` + Provoque la suppression de tous les justificatifs + Utilisation : `flask downgrade-assiduites-module -j` + +Quelques exemples : +- Pour tout supprimer : `flask downgrade-assiduites-module -a -j` +- Pour supprimer un département : `flask downgrade-assiduites-module -d DEPT -a -j` +- Pour supprimer l'assiduité d'un département : `flask downgrade-assiduites-module -d DEPT -a` +- Pour supprimer les justificatifs d'un département : `flask downgrade-assiduites-module -d DEPT -j` + + ### Personnalisation du module Le module possède deux types de configuration, une générale et une par département/semestre. From 007987db8805daac5a992542c2c2ab100b201253 Mon Sep 17 00:00:00 2001 From: Iziram Date: Tue, 11 Jul 2023 21:36:36 +0200 Subject: [PATCH 7/7] Assiduites : Correction doc api --- docs/ScoDoc9API.md | 51 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index 281a8307c..b5cec1596 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -1437,6 +1437,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. | *date_fin* | string | date ISO de la fin de la période d'assiduité | | *etat* | string | état de l'assiduité (present, absent, retard) | | *desc* | string ou null | description de l'assiduité | +| *user_id* | int ou null | utilisateur ayant créé l'assiduité | +| *est_just* | boolean | l'assiduité est-elle justifiée | | *entry_date* | string | la date d'entrée de l'assiduité | > Rappel du format de date ISO : yyyy-mm-jjTHH:MM:SS @@ -1463,6 +1465,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `date_debut` (X : date format iso) * `date_fin` (X : date format iso) * `formsemestre_id` (X : id du formsemestre) + * `est_just` (v,t,f,vrai,faux,true,false) + * `user_id` (X : id de l'utilisateur) * **Routes:** * `/assiduites/` * `/assiduites//query?` @@ -1484,6 +1488,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `date_debut` (X : date format iso) * `date_fin` (X : date format iso) * `formsemestre_id` (X : id du formsemestre) + * `est_just` (v,t,f,vrai,faux,true,false) + * `user_id` (X : id de l'utilisateur) * `metric` ('compte', 'demi', 'journee', 'heure') * **Routes:** * `/assiduites//count` @@ -1506,6 +1512,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `moduleimpl_id` (X : id du moduleimpl concerné) * `date_debut` (X : date format iso) * `date_fin` (X : date format iso) + * `est_just` (v,t,f,vrai,faux,true,false) + * `user_id` (X : id de l'utilisateur) * **Routes:** * `/assiduites/formsemestre/` * `/assiduites/formsemestre//query?` @@ -1526,6 +1534,8 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `moduleimpl_id` (X : id du moduleimpl concerné) * `date_debut` (X : date format iso) * `date_fin` (X : date format iso) + * `est_just` (v,t,f,vrai,faux,true,false) + * `user_id` (X : id de l'utilisateur) * **Routes:** * `/assiduites/formsemestre//count` * `/assiduites/formsemestre//count/query?` @@ -1546,12 +1556,14 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. * `moduleimpl_id` (X : id du moduleimpl concerné) * `date_debut` (X : date format iso) * `date_fin` (X : date format iso) + * `est_just` (v,t,f,vrai,faux,true,false) + * `user_id` (X : id de l'utilisateur) * **Routes:** - * `/assiduites/group/query?group=` + * `/assiduites/group/query?etudids=` * **Exemple d'utilisation:** - * `/assiduites/group/query?group=1,2,3` - * `/assiduites/group/query?group=1,2,3&etat=retard` - * `/assiduites/group/query?group=1,2,3&moduleimpl=1` + * `/assiduites/group/query?etudids=1,2,3` + * `/assiduites/group/query?etudids=1,2,3&etat=retard` + * `/assiduites/group/query?etudids=1,2,3&moduleimpl=1` * **Résultat:** ```json { @@ -1569,13 +1581,14 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. ```json [ - { + { + "etudid":, + "date_debut": , "date_fin": , "etat": , - "etudid": - "moduleimpl_id"?: - "desc"?: + "moduleimpl_id"?: , + "desc"?:, }, ... ] @@ -1603,7 +1616,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. "date_debut": , "date_fin": , "etat": , - "moduleimpl_id"?: + "moduleimpl_id"?: , "desc"?: }, ... @@ -1630,7 +1643,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. { "etat": , "moduleimpl_id": , - "desc" : + "desc" : , } ``` @@ -1864,11 +1877,25 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`. #### **justificatif-list** * **Méthode:** GET -* **Permission: `ScoView`** +* **Permission: `ScoView` / `ScoJustifView`** + * Si `ScoView` : retourne uniquement les fichiers fourni par le même utilisateur + * Si `ScoJustifView` : retourne tous les fichiers * **Paramètres:** `justif_id` * **Routes:** `/justificatif//list` * **Exemple d'utilisation:** `/api/justificatif/1/list` -* **Résultat:** Retourne la liste des fichiers archivés une erreur si l'id n'est pas connu +* **Résultat:** + ```json + { + "filenames" : [ + , + ... + ], + + "total": + } + ``` + * Le total indique le nombre total de fichiers (visibles ou non) + * **Exemple de résultat:** [justificatif-list.json](samples/sample_justificatif_list.json.md) #### **justificatif-justifies**