Compare commits

...

18 Commits

Author SHA1 Message Date
Jean-Marie Place e190e64e91 Ajout Bonus Sport-culture WIP 2023-07-29 08:11:11 +02:00
Emmanuel Viennet beca815be2 Détails sur upgrade (clé gpg) 2023-07-28 09:55:18 +02:00
Emmanuel Viennet 9b290fe0fa Change version dans doc dev 2023-07-25 08:53:38 +02:00
Emmanuel Viennet 2082ae84ca détailssur upgrade 2023-07-24 22:40:03 +02:00
Emmanuel Viennet bcf99e292d add a link 2023-07-24 21:56:58 +02:00
Emmanuel Viennet 23a2609833 docs install ScoDOc 9.6 / Debian 12 2023-07-24 21:56:44 +02:00
Emmanuel Viennet 8ce4ca0f28 Ajout doc assiduités (Matthias) + corrections + liens avec upgrade 2023-07-20 10:41:49 +03:00
Emmanuel Viennet cf57787c45 compléments sur upgrade deb 12 2023-07-20 09:41:09 +03:00
Emmanuel Viennet d5ff90dc7f Instructions pour mise à jour vers ScoDoc 9.6 / Debian 12 2023-07-18 16:19:13 +03:00
Emmanuel Viennet 055a85e274 Explications sur référentiel de compétences et versions 2023-07-17 16:07:44 +03:00
Matthias HARTMANN 007987db88 Assiduites : Correction doc api 2023-07-11 21:36:36 +02:00
Matthias HARTMANN 70424eba78 Assiduites :Migrations 2023-07-10 18:17:34 +02:00
Matthias HARTMANN ad48bd04b6 Documentation page de saisie (journalière et différée) 2023-06-07 09:33:02 +02:00
Matthias HARTMANN c009fc95b2 Merge branch 'master' of https://scodoc.org/git/viennet/DocScoDoc 2023-06-07 09:31:25 +02:00
Matthias HARTMANN 27a43efb5a Début Documentation Utilisateur Module Assiduité + ajout perma links) 2023-06-05 17:20:20 +02:00
Matthias HARTMANN 563edf93c1 Documentation des nouvelles routes API Assiduité
- 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)
2023-03-31 09:33:40 +02:00
Hartmann Matthias 447d654928 samples assiduités justificatifs : début 2023-02-15 10:30:37 +01:00
Hartmann Matthias 0c171ae072 doc assiduité 2023-02-14 16:34:52 +01:00
41 changed files with 2346 additions and 87 deletions

261
docs/Assiduites.md Normal file
View File

@ -0,0 +1,261 @@
# Module "Assiduités"
Ce module de ScoDoc remplace l'ancien module de suivi des absences de 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.
**Ce module est disponible à partir de ScoDoc version 9.6**.
[Vidéo de présentation du module d'assiduités ](#) TODO EV à publier sur la chaîne YT
## Fonctionnalités
Le module fournit:
- Gestion des absences/présences/retards
- 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 (documents)
- Une [API complète](ScoDoc9API.md#api-assiduites)
## Guide d'utilisation
- [Module "Assiduités"](#module-assiduités)
- [Fonctionnalités](#fonctionnalités)
- [Guide d'utilisation](#guide-dutilisation)
- [Migration de l'ancien module](#migration-de-lancien-module)
- [Personnalisation du module](#personnalisation-du-module)
- [Saisie des Assiduités](#saisie-des-assiduités)
- [Saisie d'un groupe](#saisie-dun-groupe)
- [Saisie Journalière](#saisie-journalière)
- [Saisie différée](#saisie-différée)
### Migration de l'ancien module
Afin de favoriser la transition de l'ancien module au nouveau, un script de
migration a été développé: à l'installation de ScoDoc 9.6, les anciennes
données d'absences et justificatifs sont traduites pour ce module.
Voir détails dans [la documentation d'installation](UpgradeToDeb12Sco96.md) et
sur la [documentation des commandes de migration des absences](AssiduitesMigration.md).
### 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/<Dept>/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
Comme dans l'ancien système, 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 clic 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 clic 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 un 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 a 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** (ceci
permet de corriger facilement les saisies où l'on aurait oublié d'indiquer le
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.
!!! note "Voir aussi"
- [Migration des absences vers les assiduités](AssiduitesMigration.md)
- [API](ScoDoc9API.md) : API pour interfaçage avec d'autres applications
- [API et fichiers justificatifs](FichiersJustificatifs)
- [FAQ](FAQ.md)
- [Contacts](Contact.md)

View File

@ -0,0 +1,86 @@
# Migration des absences de ScoDoc 9.5 vers les assiduités 9.6
Lors du passage de ScoDoc 9.5 à 9.6, les anciennes données d'absences et
justificatifs sont traduites pour [le module assiduités](Assiduites.md).
## Script de Migration
Le script se nomme `migrate-abs-to-assiduites` et ne peut se lancer qu'en ligne
de commande:
```bash
su scodoc # au besoin
cd /opt/scodoc
source venv/bin/activate
flask migrate-abs-to-assiduites --help
```
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 <ACRONYME>`
- `-m, --morning`
Permet de définir l'heure de début des cours.
Utilisation : `flask migrate-abs-to-assiduites -m <hh:mm>`
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 <hh:mm>`
exemple : `hh:mm` -> `13:30`
- `-e, --evening`
Permet de définir l'heure de fin des cours.
Utilisation : `flask migrate-abs-to-assiduites -e <hh:mm>`
exemple : `hh:mm` -> `18:30`
Les options peuvent senchaî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 <ACRONYME>`
- `-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`
!!! note "Voir aussi"
- [Le module assiduités](Assiduites.md)
- [Mise à jour vers ScoDoc 9.6 / Debian 12](UpgradeToDeb12Sco96.md)
- [FAQ](FAQ.md)
- [Contacts](Contact.md)

View File

@ -200,6 +200,7 @@ Dans chaque module, on peut régler les inscriptions:
- [Le BUT: détails et calculs](BUT.md)
- [Guide du responsable de formation](GuideAdminFormation/md)
- [Programmes de formation](Formations.md)
- [Référentiel de compétence du BUT](BUTReferentielCompetences.md)
- [Guide utilisateur](GuideUtilisateur.md)
- [Tutoriels vidéo](https://www.youtube.com/channel/UCb0JYCBRi0CsE4XFp4ByhXg)
- [Gestion des UE Bonus](https://www.youtube.com/watch?v=SVbjuDpq-lI)

View File

@ -0,0 +1,70 @@
# Le référentiel de compétence du BUT
Chaque spécialité de BUT est définie par un référentiel de compétence et un
référentiel de formation. Ces documents sont publiés ici:
[https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm](https://www.enseignementsup-recherche.gouv.fr/fr/bo/21/Special4/ESRS2114777A.htm)
Le référentiel de compétence définit notamment les compétences et leurs niveaux
pour chaque parcours de la spécialité. Ce document publié par le ministère ne
peut pas être modifié par les universités: les adaptations portent uniquement
sur les modalités de formation (adaptations locales du référentiel de formation,
validées par le CFVU de chaque établissement).
ScoDoc propose de charger les référentiels de compétences, qui ont été publiés
en format XML par l'application Orébut de l'ADIUT.
Une fois chargées, ces données ne sont pas modifiables.
## Formation et référentiel de compétences
Rappel: dans ScoDoc, on appelle *formation* le programme pédagogique, qui
définit l'ensemble des UEs, ressources, SAÉs et leurs coefficients respectifs.
Voir détails [sur la page Formation](Formations.md).
Un formation de type BUT *doit* être associée à un référentiel de compétence.
Sans cela, ScoDoc ne sait pas quels UEs et RCUEs doivent être validés. Voir
détail de la configuration sur la page
[Modélisation BUT: exemple de la spécialité Informatique](BUTExempleInfo.md).
## Changement de versions du référentiel de compétences
Il peut arriver que le référentiel de compétences d'une spécialité soit mis à
jour: ainsi, en 2023 de nouvelles versions ont été publiées pour de nombreuses
spécialités, corrigeant certains détails (intitulés de parcours, ...).
Les étudiants ayant commencé dans un référentiel devraient en principe continuer
jusqu'au diplôme avec ce même référentiel.
Exemple de situation en Septembre 2023:
- S1 : formation v2, référentiel 2023
- S3 : formation v1, référentiel 2021
- S5 : formation v1, référentiel 2021
Ici "formation v2" aura été créé comme une nouvelle version de la formation v1,
puis associée au nouveau référentiel.
Si toutefois le S3 était associé à la v2, avec le nouveau référentiel, ScoDoc
considérait que les RCUEs du BUT1 ne sont pas valides pour la nouvelle version:
en effet, RCUEs et compétences sont liés à un référentiel donné.
Dans ce cas, il faudrait procéder, pour chaque étudiant, à la validation
manuelle de ses RCUEs du nouveau référentiel comme des validation de RCUEs
"antérieurs". C'est heureusement facile à faire sur la page de suivi de
l'acquisition des niveaux de compétences:
<img src="/screens/but-validation-rcues.png" width="50%">
!!! note "Voir aussi"
- [Le BUT: détails et calculs](BUT.md)
- [Guide du responsable de formation](GuideAdminFormation/md)
- [Programmes de formation](Formations.md)
- [Guide utilisateur](GuideUtilisateur.md)
- [Tutoriels vidéo](https://www.youtube.com/channel/UCb0JYCBRi0CsE4XFp4ByhXg)
- [Gestion des UE Bonus](https://www.youtube.com/watch?v=SVbjuDpq-lI)
- [Mise en place des parcours BUT](https://www.youtube.com/watch?v=OnuOXJo-3ro)
- [Saisie des codes Apogée](https://www.youtube.com/watch?v=MW0nNhbBjDM)
- [Du DUT au BUT: comment transformer un programme](https://www.youtube.com/watch?v=9HizGTvYgck)
- [FAQ](FAQ.md)
- [Contacts](Contact.md)

164
docs/BonusMalus.md Normal file
View File

@ -0,0 +1,164 @@
# Bonus/Malus
Scodoc permet l'application de modificateurs de type bonus/malus sur les moyennes générales (formation non BUT) et/ou d'UE.
Il existe deux mécanismes complémentaires pour cela:
1. Le bonus sport/culture permet de calculer un modificateur sur la moyenne générale (formations non BUT) ou sur chacune des UE (BUT).
La valeur du bonus est calulée à partir d'un note sur 20 et au moyen d'une formula propre à chaque IUT.
2. Les modules de type Malus peuvent être créés pour tout ou partie des UE. La valeur du modificateur est spécifiée dans la (ou les) évaluation(s) déclarées dans ce module.
On inscrira donc directement dans cette évaluation la valeur du malus (entre 0 et 20) ou du bonus (entre -20 et 0) souhaitée pour ce module.
Le comparatif de ces deux mécanismes est détaillé dans le tableau ci-dessous:
| Critère | Bonus Sport/culture | Module de Malus |
|:-----------------------------------|:---------------------------------|:-------------------------------------------|
| Structure | UE Spécifique | Module spécifique |
| Valeur du modificateur | Calculé à partir d'une note | Saisie directe |
| Application sur toutes les UE | Automatique (avec seule UE) | Autant de modules que d'UE modifiées |
| Application sur une seule UE | Impossible | Un module par UE modifiée | |
| Modification | Bonus seulement | Malus ou Bonus |
| Affichage | Affichage du bonus et du détail | Affichage du bonus/malus seulement |
| Cumul de plusieurs modificateurs | Impossible | Déclarer une évaluation par type de modif. |
## Mise en œuvre du bonus Sport/Culture
L'étape [Intégration de la formule](#integration-de-la-formule) est à réalisé une fois pour toutes et pour tous les départements
L'étape [Ajout d'UE et de module Sport/Culture](#ajout-due-et-de-module-sportculture) doit être faite lors de la conception ou lors d'une modification de programme, mais n'a pas a être réitérée lors de la création d'une nouvelle version d'un programe avec UE sport.
L'étape [Application de l'UE Sport/Culture à un semestre](#application-de-lue-sportculture-a-un-semestre) doit être faite à la création d'un semestre mais n'a pas à être réitérée lors du clonage d'un semestre
### Intégration de la formule
Il faut tout d'abord régler ScoDoc pour utiliser la formule propre à votre établissement.
Pour cela ml'administrateur du site (lui seul y est autorisé) doit aller sur la page de configuration de Scodoc (bandeau en haut de la page d'accueil)
![configuration](screens/BonusMalus_01.png)
puis section '`Calcul des "bonus" définis par l'établissement`' et sélectionner l'établissement dans le dans le menu déroulant.
![choix-bonus-sport](screens/BonusMalus_02.png)
Si l'établissement n'apparaît pas:
1. L'item '`Bonus "Direct"`' permet de saisir directement la valeur du modificateur (après un calcul préalable hors scodoc)
2. Vous pouvez demander la création de la formule spécifique à votre établissement sur le serveur discord en précisant:
* Le nom de votre établissement,
* l'extrait du règlement intérieur qui décrit cette bonification, (celui ci apparaîtra dans l'encadré explicatif)
* Quelques cas d'usages (pour les tests)
### Ajout d'UE et de module Sport/Culture
L'opération suivante consiste à ajouter dans le programme l'UE Sport/Culture dans le semestre visé. Une méthode parmi d'autre est:
1. Entrer dans le semestre,
2. activer le menu `SEMESTRE > Voir la formation...` (ceci permet d'aller dans LE programme associé au semestre),
3. ajouter une UE,
Donner un titre (en y incluant le semestre visé - toutes les UE d'une formation doivent avoir leur propre nom et il y aura aussi probablement des UE sport pour les autres semestres)
Idem pour l'acronyme
Choisissez le Type `Sport/Culture (points bonus)`
Indiquez 0 ECTS (obligatoire bien que cette valeur n'ait pas d'importance)
![ajout-UE-sport](screens/BonusMalus_03.png)
4. ajouter un module à l'UE sport et l'attacher à l'UE Sport du semestre
Attention ! ce module est un module standard (pas un module de malus, ni une ressource, ni une SAÉ)
![module-sport](screens/BonusMalus_04.png)
### Application de l'UE Sport/Culture à un semestre
La procédécure d'inclusion du bonus sport dans un semestre selon que le programme a été modifié avant ou après la création de ce semestre.
De plus le résultat de toutes les opérations décrites hormis la finalisation des inscriptions est conservé lors du clonage d'un semestre.
#### Stratégies d'inscription
Dans tous les cas de figure, l'objetif est d'intégrer le module sport au semestre et d'y inscrire au moins les étudiants qui en bénéficient.
On a deux stratégies possibles:
1. Inscription de tous les étudiants du semestres et attribuer la note `EXC`aux étudiants non concernés. à éviter car ces notes `EXC` apparaissent sur le bulletin. (inscription générale)
2. N'inscrire que les étudiants concernés.(inscription sélective)
**Note**: si le bonus peut découler de plusieurs activités (par exemple sport et LV2) on peut tout de même être amené à placer des `EXC`
#### Si le semestre avait déjà été créé
C'est en général le cas (On reçoit les notes de sport et on réalise que le bonus n'avait pas été prévu, donc on actualise)
1. Entrer dans le semestre,
2. activer le menu `SEMESTRE > Modifier le semestre`
![modifier-le-semestre](screens/BonusMalus_05.png)
3. Le module sport apparaît mais n'est pas activé
![activation-module-sport](screens/BonusMalus_06.png)
4. Activer le module et y affecter les étudiants selon la stratégie choisie (inscription générale: tous, inscription sélective: aucun)
4.Valider les modifications opérées
#### Mise en place d'un nouveau semestre après modification du programme
Dans ce cas de figure, le semestre est créé par défaut avec le module sport et l'ensemble des étudiants inscrits.
#### Finaliser l'inscription des étudiants concernés (si inscription sélective):
**Note**: cette finalisation peut être faite juste avant la saisie des notes de sport.
1. Se placer dans le module sport
![sélection-module-sport](screens/BonusMalus_07.png)
2. Affiner les inscriptions en cliquant sur le lien de modification:
![inscriptions-module-sport](screens/BonusMalus_08.png)
#### Saisie des notes
* Créer si besoin une évaluation dans le module sport
* Saisir les notes des étudiants.
Sauf application du `Bonus "direct"` (cf. [Intégration de la formule](#integration-de-la-formule)), il s'agira d'un note traditionnelle (sur 20).
##### Remarques
* Le `Bonus "direct"` autorise des bonus de 0 à 20 mais plafonne les notes d'UE à 20
* On peut avoir plusieurs évaluations dans le module sport.
Dans ce cas ScoDoc calcul la note de module comme habituellement (y compris en prenant en compte les éventuels coefficients),
puis calcul la valeur du bonus à partir de cette note de module. On ne peut donc pas 'cumuler' un bonus sport et un bonus LV2 par exemple.
* On peut avoir plusieurs modules attachées à l'UE sport.
Dns ce cas, ScoDoc calcule le bonus qui produirait chacun de ces modules et les additionne. Dans ce cas, les bonus sont cumulables. Les notes d'UE restent plafonnées à 20.
**Exemple**:
On a déclaré dans une UE sport 2 modules:
* `Sport` alimenté par 2 évaluations (Sport et Autre),
* `LV2` alimenté par une seule évaluation
Un étudiant participe aux deux activités et obtient les notes suivantes:
![notes-sport-exemple](screens/BonusMalus_09.png)
Le calcul effectué par ScoDoc est le suivant:
* Calcul de la moyenne du module `Sport` ( 13.00 (coef. 1) et 10.00 (coef. 2)): résultat : 11.00 soit un bonus de 1 pt x 5% (calcul Villetaneuse) = 0.05 pts
* Calcul de la moyenne `LV2`: 15.00 (une seule note) soit un bonus de 5 pts x 5% = 0.25 pts
* Le bonus total sera donc de 0.30 pts
* L'UE1 qui est de base à 19.80 sera donc amenée à 20 (plafond) grâce au bonus de 0.30
![notes-sport-exemple-UE1](screens/BonusMalus_10.png)
Les autres UE bénficient du bonus de 0.30 pts
### Affichages UE Sport/Culture
## Mise en œuvre de modules de malus
### Application d'un module Malus à un semestre
### Affichage Malus/Bonus
### Implémentation dans un semestre

View File

@ -0,0 +1,170 @@
<!-- markdownlint-disable MD024 -->
# 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.__

View File

@ -0,0 +1,119 @@
<!-- markdownlint-disable MD024 -->
# 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/<etudid:int>/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/<justif_id:int>/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/<justif_id:int>/export/<filename>`
* **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/<justif_id:int>/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"
}
```

View File

@ -195,7 +195,7 @@ l'étape précédente.
Cette façon de procéder permet de limiter le nombre de nouvelles versions de
formations créée.
<img src="/screens/formsemestre_associate_new_version.png" width="50%">
<img src="/screens/formsemestre_associate_new_version.png" width="100%">
## Changement de la formation d'un semestre
@ -211,6 +211,7 @@ C'est possible, à condition que les deux formations soient vraiment identiques
- [Guide du responsable de formation](GuideAdminFormation.md)
- [Guide utilisateur](GuideUtilisateur.md)
- Pour le BUT: [le référentiel de compétence](BUTReferentielCompetences.md)
- [Tutoriels vidéo](https://www.youtube.com/channel/UCb0JYCBRi0CsE4XFp4ByhXg)
- [Gestion des UE Bonus](https://www.youtube.com/watch?v=SVbjuDpq-lI)
- [Mise en place des parcours BUT](https://www.youtube.com/watch?v=OnuOXJo-3ro)

View File

@ -119,7 +119,7 @@ Soit vous prenez les versions les plus à jour disponibles. Une façon rapide de
faire ceci est:
```bash
cut -d= -f 1 requirements-3.9.txt | xargs pip install
cut -d= -f 1 requirements-3.11.txt | xargs pip install
```
à adapter selon vos objectifs.
@ -127,7 +127,7 @@ faire ceci est:
Pour régénérer le fichier indiquant la liste des paquets:
```bash
pip freeze > requirements-3.9.txt
pip freeze > requirements-3.11.txt
```
Note: la mise à jour par `apt` recrée le virtualenv à chaque fois.

View File

@ -11,7 +11,7 @@ donc installer et configurer ScoDoc avec des connaissances réduites sur le
système Linux.
Cette documentation est prévue pour installer ScoDoc version 9 sur un système
[Debian](http://www.debian.org) 11 (Bullseye, stable) s'exécutant sur une
[Debian](http://www.debian.org) 11 (Bullseye, oldstable) s'exécutant sur une
machine intel-like **64bits** (architecture **AMD64** sur Intel/AMD, ou
**aarch64** sur Apple ARM). Debian s'installe facilement en cinq minutes, sur
une machine normale ou un serveur virtualisé. Il est **vivement déconseillé** de
@ -109,7 +109,7 @@ Checklist minimale de votre système Linux Debian:
reboot. L'utilisation d'un serveur de temps (ntp) est recommandée (
`apt-get install ntp`), et éventuellement `dpkg-reconfigure tzdata`).
1. Si vous avez installé à partir d'un support (DVD, clé USB...), pensez à le
retirer des sources Debian afin de ne pas bloquer les mise à jour (commenter
retirer des sources Debian afin de ne pas bloquer les mises à jour (commenter
la ligne `deb cdrom:` dans le fichier `/etc/apt/sources.list`)
1. Cette liste est incomplète... et n'oubliez pas: avant de passer en
production, mettez en place des sauvegardes sérieuses !
@ -228,8 +228,8 @@ Remarque: *Si ce n'est pas déjà le cas, vous avez intérêt à ouvrir une sess
`ssh` (ou `putty`) depuis une machine normale, afin de pouvoir copier/coller
facilement les commandes et éditer les fichiers de configuration.*
- Ajouter le dépot scodoc: copier ce fichier <a href="/attachments/scodoc.list"
download>scodoc.list</a> dans `/etc/apt/sources.list.d/`
- Ajouter le dépôt scodoc: copier ce fichier <a href="/attachments/scodoc.list"
download>scodoc-bullseye.list</a> dans `/etc/apt/sources.list.d/`
ou le créer contenant juste cette ligne:
```text

View File

@ -0,0 +1,342 @@
# Installation de ScoDoc 9.6+ sur Debian 12 (Bookworm)
Ce document décrit la procédure d'installation et de configuration de ScoDoc
version 9.6 et suivantes.
Si vous mettez à jour une installation ScoDoc 9 existante (9.5 sous Debian 11
Bullseye), suivez la
[procédure de migration décrite sur cette page](UpgradeToDeb12Sco96.md).
La procédure décrite ici doit être effectué sur la machine serveur fraiche avec
un accès administrateur (root). **Ne pas l'utiliser pour migrer une installation existante**.
ScoDoc est livré avec des scripts d'installation qui configurer presque
automatiquement votre serveur (serveur web, base de données, etc): vous pouvez
donc installer et configurer ScoDoc avec des connaissances réduites sur le
système Linux.
Cette documentation est prévue pour installer ScoDoc version 9 sur un système
[Debian](http://www.debian.org) 12 (Bullseye, stable) s'exécutant sur une
machine intel-like **64bits** (architecture **AMD64** sur Intel/AMD, ou
**aarch64** sur Apple ARM). Debian s'installe facilement en cinq minutes, sur
une machine normale ou un serveur virtualisé. Il est **vivement déconseillé** de
tenter l'installation sur une autre version de Linux.
Merci de signaler tout problème [sur le Discord](https://discord.gg/ybw6ugtFsZ).
- Note: l'image du CD d'installation de Debian (amd64) peut se trouver ici:
[https://www.debian.org/CD/netinst/](https://www.debian.org/CD/netinst/),
choisir la version "petits CD" pour **amd64**
(*Il est indispensable d'utiliser une version 64 bits !*)
🚸 **Important:**
La procédure d'installation décrite ci-dessous suppose que ScoDoc va s'exécuter
sur un serveur dédié. Pour faire des tests, utilisez un serveur virtuel (comme
VirtualBox ou VMWare, ou UTM sur Mac). L'installation de ScoDoc va en effet
modifier de nombreux paramètres de votre système Linux (serveur web, firewall,
serveur SQL, messagerie, ...).
## 1) Préalable: configurer un serveur linux
Le serveur devrait être accessible depuis Internet.
### Configuration matérielle
- taille disque: prévoir au moins 24Go sur la partition où sera scodoc (en
général `/`).
- mémoire: prévoir au moins 8Go de RAM, et plutôt 12 ou 16.
### Informations sur les flux réseau
Le serveur est fréquemment installé sur un réseau protégé ou sur un VPN.
- le trafic entrant est sur le port 443 (le trafic http/80 est redirigé
vers le https).
- le serveur doit pouvoir envoyer du mail (serveur Postfix en local, à
configurer pour utiliser un relais smtp ou envoyer directement, selon votre
politique. Au besoin, pour le reconfigurer, lancer `dpkg-reconfigure postfix`);
- Les serveurs de mise à jour de Debian doivent être accessibles (en http,
voir `/etc/apt/sources.list`);
- Les serveurs `scodoc.org` et `scodoc.iutv.univ-paris13.fr` **doivent**
être accessibles (80 et 443).
### Installation Linux Debian
Nous recommandons d'effectuer une installation standard de Debian par le réseau
(netinst), et d'utiliser l'installation en mode texte, très simple et rapide.
Durant l'installation de Debian, lorsqu'il demande "logiciels à installer", tout
décocher sauf "Serveur SSH" et "Utilitaires standard du système". Le script
d'installation de ScoDoc se chargera ensuite d'installer tous les éléments
nécessaires (serveur web, messagerie, etc.).
🚸 *Veiller à sélectionner une locale `UTF-8` par défaut.*
![InstallDebian6-1.png](screens/InstallDebian6-1.png)
### Points à vérifier avant d'installer ScoDoc
Checklist minimale de votre système Linux Debian:
1. Connexion à Internet: le réseau doit être accessible. En effet, le script
d'installation va installer des paquetages du système Debian puis
télécharger la dernière mise à jour du logiciel ScoDoc (à partir du serveur
scodoc.org).
1. Vérifiez la connectivité, par exemple:
```bash
ping www.univ-paris13.fr
(quitter avec ctrl-c)
cd /tmp
wget --no-check-certificate https://scodoc.org
# doit créer un fichier index.html contenant du code HTML...
```
3. Nom DNS: le serveur doit avoir un nom ("serveur.exemple.fr") connu dans le
DNS (local ou public). Pour des tests, vous pouvez vous passer de DNS, mais
dans ce cas le nom de votre serveur sera son adresse IP (eg `192.168.0.10`) et
il ne sera peut être pas accessible de l'extérieur.
4. Mail: vérifiez que le serveur peut envoyer des e-mail: `mail
votre@adresse.fr`, puis entrer un message terminé par `ctrl-d`: si vous ne
recevez pas le message après quelques minutes, vérifiez votre configuration
(et le log `/var/log/mail.log`). Un serveur ScoDoc qui n'envoie pas de mail
ne peut pas vérifier ceux des utilisateurs, qui à leur tour ne pourront pas
changer leurs mots de passe (bien d'autres fonctions dépendent des mails).
Au besoin, revoir la configuration avec `dpkg-reconfigure postfix` (voir
aussi [envoi des courriers électroniques](ProblemesMail.md)).
1. Vérifiez que votre serveur est accessible depuis une autre machine de votre
réseau (voire d'Internet): par exemple `ping serveur.exemple.fr`.
1. Date et heure: vérifier que les dates et heure sont correctes, même après
reboot. L'utilisation d'un serveur de temps (ntp) est recommandée (
`apt-get install ntp`), et éventuellement `dpkg-reconfigure tzdata`).
1. Si vous avez installé à partir d'un support (DVD, clé USB...), pensez à le
retirer des sources Debian afin de ne pas bloquer les mises à jour (commenter
la ligne `deb cdrom:` dans le fichier `/etc/apt/sources.list`)
1. Cette liste est incomplète... et n'oubliez pas: avant de passer en
production, mettez en place des sauvegardes sérieuses !
#### Configuration si utilisation d'un proxy
Si votre accès à Internet passe par un proxy, l'indiquer au moment de
l'installation Debian.
Vérifiez aussi que ces variables sont bien définies dans `/etc/environment` (si
l'installeur Linux Debian ne les a pas déjà indiquées là, les ajouter ou créer
ce fichier):
```bash
# /etc/environment
export HTTP_PROXY=http://proxy.univ-xxx.fr:1234
export HTTPS_PROXY=http://proxy.univ-xxx.fr:1234
# Versions en minuscules utilisées par wget
export http_proxy="${HTTP_PROXY}"
export https_proxy="${HTTPS_PROXY}"
```
Ensuite, après installation du paquet scodoc9 (voir plus bas), il faudra
indiquer votre proxy: pour cela, éditer le fichier
```
/opt/scodoc/.env
```
et ajouter les variables d'environnement nécessaires. Typiquement, il s'agit de :
```bash
HTTP_PROXY=http://proxy.univ-xxx.fr:1234
HTTPS_PROXY=http://proxy.univ-xxx.fr:1234
```
Après modification de ces fichiers (qui *doivent* être lisible par l'utilisateur `scodoc`),
redémarrer le service:
```bash
sudo systemctl restart scodoc9
```
Dans les cas compliqués, il est possible qu'il vous faille configurer d'autres
éléments, voir par exemple
[ce post sur Stack Overflow](https://stackoverflow.com/questions/9445489/performing-http-requests-with-curl-using-proxy).
#### Note sur l'install dans un container LXC
Il y a deux possibilités :
**Option 1**, si vous installez dans un container LXC privilégié via le compte
root et/ou sudo, attention: la config par défaut de Redis (un gestionnaire de
cache utilisé par ScoDoc) n'est pas compatible, en raison d'un problème de
système de fichier en lecture seule. Installer redis avant ScoDoc, comme suit:
```bash
apt-get install redis
```
Puis créer un dossier `/etc/systemd/system/redis.service.d` contenant le fichier
`redis.conf` avec les lignes suivantes :
```text
[Service]
PrivateTmp=no
ProtectSystem=false
PrivateDevices=false
ProtectHome=no
ProtectControlGroups=no
ProtectKernelTunables=no
ProtectKernelModules=no
ReadWritePaths=
ReadOnlyDirectories=
```
Ensuite
```bash
systemctl daemon-reload
systemctl start redis
```
... et poursuivez l'installation comme ci-dessous.
**Option 2**, si vous installez dans un container LXC non-privilégié via un
compte utilisateur normal, vous pouvez activer l'option « nesting »
(imbriqué) de LXC pour permettre à Redis de fonctionner normalement.
🚸 Attention ! N'activez pas le *nesting* sur un conteneur privilégié. Cela
provoquerait une faille de sécurité.
Si vous avez construit votre conteneur manuellement avec `lxc-create`, modifiez
le fichier `/var/lib/lxc/${nomDuConteneur}/config` et ajoutez les lignes
ci-dessous :
```text
lxc.apparmor.allow_nesting = 1
lxc.apparmor.profile = generated
```
Si vous utilisez un conteneur LXC sur l'hyperviseur Proxmox, modifiez le
fichier `/etc/pve/lxc/${CTID}.conf` et ajoutez la ligne suivante :
```text
features: nesting=1
```
... et poursuivez l'installation comme ci-dessous.
## 2) Installation de ScoDoc sur Debian
### 2.1) Charger le logiciel
🚸 Les commandes ci-dessous sont à exécuter dans un terminal ouvert en tant que
**root** sur le serveur. Vous pouvez utiliser `su` (ou `sudo su`) pour devenir
**root**).
Remarque: *Si ce n'est pas déjà le cas, vous avez intérêt à ouvrir une session
`ssh` (ou `putty`) depuis une machine normale, afin de pouvoir copier/coller
facilement les commandes et éditer les fichiers de configuration.*
- Ajouter le dépot scodoc: copier ce fichier <a href="/attachments/scodoc.list"
download>scodoc.list</a> dans `/etc/apt/sources.list.d/`
ou bien le créer afin qu'il contienne juste cette ligne:
```text
# contenu du fichier /etc/apt/sources.list.d/scodoc.list
deb http://scodoc.org/deb/bookworm bookworm main
```
- Installer la clé: en `root` sur le serveur, lancer
```bash
apt-get -y install gnupg
wget -O - https://scodoc.org/misc/scodoc-repo.gpg.key | apt-key add -
```
- Installer le logiciel:
```bash
apt-get update
apt-get install nginx
```
S'assurer que le logiciel `nginx` s'est bien installé. En cas de problème se
référer à sa doc (par exemple, si
[votre serveur ne supporte pas
IPv6](https://techglimpse.com/nginx-error-address-family-solution/)).
Ensuite:
```bash
apt-get install scodoc9
```
Notez que l'installation du paquet `scodoc9` va créer automatiquement un
utilisateur `scodoc` qui sera utilisé par le serveur.
- Attribuer un mot de passe à l'utilisateur `scodoc`:
```bash
passwd scodoc
```
### 2.2) Configuration des logiciels et des données
Lancer le script suivant en tant que `root` sur votre serveur nouvellement installé:
```bash
/opt/scodoc/tools/configure-scodoc9.sh
```
Vous devrez répondre à quelques questions et saisir le mot de passe que vous
attribuerez à l'utilisateur `admin`.
(note: pour en savoir plus sur ce script, [voir l'explication](GuideInstallDebian11Advanced.md))
### 3) **Lancer ScoDoc**
```bash
sudo su # se connecter en root
systemctl restart nginx
systemctl restart scodoc9
```
✨ et voila !
Visiter `https://monscodoc.mondomaine.fr/` pour achever la configuration et
utiliser le logiciel: voir la page [GuideConfig](GuideConfig.md).
## Importation des données ScoDoc 7
Si vous aviez une installation très ancienne avec ScoDoc 7, vous pouvez migrer
toutes vos données (comptes utilisateurs, étudiants, formations, notes, photos
et fichiers divers) depuis une l'ancien serveur ScoDoc 7, ou même en place.
Voir [la procédure de migration](MigrationScoDoc7a9.md).
## En cas de problème
Ne pas hésiter à nous contacter (voir [contacts](Contact.md)).
- Problèmes d'envoi de courrier électronique (mail): voir [ProblemesMail](ProblemesMail.md)
Nota: sur certains réseaux, l'autoconfiguration IPv6 pose problème (par exemple:
bloquage des envois de mails). Au besoin, il est possible de désactiver IPv6
(voir par exemple [ici](https://wiki.debian-fr.xyz/D%C3%A9sactiver_l%27IPv6)).
## Ensuite...
- Mettez en place des [sauvegardes](SauvegardesBases.md)
- Si vous le souhaitez, vous pouvez mettre en place un anti-virus pour
surveiller les fichiers uploadés par les utilisateurs. Les fichiers sont
conservés dans `/opt/scodoc-data`: le plus simple est de faire surveiller tout
ce répertoire sauf `/opt/scodoc-data/logs`.
- Abonnez-vous au moins à la liste d'annonces ou rejoignez le Discord: voir [contacts](Contact.md)
!!! note "Voir aussi"
- [Guide configuration](GuideConfig.md)
- [Guide administrateur ScoDoc](GuideAdminSys.md)
- [FAQ](FAQ.md)
- [Contacts](Contact.md)

View File

@ -1,3 +1,4 @@
<!-- markdownlint-disable MD041 MD040 MD033 MD051 -->
# API pour ScoDoc 9
L'API ScoDoc permet à des applications tierces d'interroger ScoDoc. Elle offre
@ -18,13 +19,13 @@ L'API fournit des données JSON, sauf exception (bulletins PDF par exemple).
Les objets ScoDoc manipulables sont identifiés par des id numériques.
- etudid: étudiant
- formation_id: un programme de formation (page "programmes");
- ue_id: une UE dans un programme;
- matiere_id: une matière dans un programme;
- module_id: un module dans un programme;
- moduleimpl_id: un module réalisé dans un semestre;
- formsemestre_id: un "semestre" de formation.
- `etudid` : étudiant
- `formation_id` : un programme de formation (page "programmes");
- `ue_id` : une UE dans un programme;
- `matiere_id` : une matière dans un programme;
- `module_id` : un module dans un programme;
- `moduleimpl_id` : un module réalisé dans un semestre;
- `formsemestre_id` : un "semestre" de formation.
(pour plus de précisions, voir le [guide développeurs](GuideDeveloppeurs.md))
@ -77,7 +78,7 @@ flask user-password lecteur_api
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 développeurs](GuideDeveloppeurs.md)] et sur les [vues de l'API](DevInternals.md#vues-de-lapi-et-permissions).
- [la documentation développeurs](GuideDeveloppeurs.md) et sur les [vues de l'API](DevInternals.md#vues-de-lapi-et-permissions).
!!! note
@ -145,7 +146,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
@ -159,12 +160,12 @@ donnée ci-dessous dans [Référence](#reference).
#### Authentification
Lors de votre authentification (*connexion avec login et mdp*) à Scodoc, il
Lors de votre authentification (*connexion avec login et mot de passe*) à Scodoc, il
vous sera attribué un jeton (token jwt *généré automatiquement*) vous permettant
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`):
@ -191,7 +192,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.
@ -206,8 +207,8 @@ par le serveur ScoDoc.
## Règles générales
* une route s'écrit comme une suite de noms et d'identifiants;
* les noms token, departement, formation, formsemestre, groupe, etudiant,
bulletin, absence, logo, programme, évaluation, resultat, decision désignent
* les noms token, département, formation, formsemestre, groupe, etudiant,
bulletin, absence, logo, programme, évaluation, résultat, décision désignent
des types d'objets;
* les noms (verbes ou groupes verbaux): set_etudiant, remove_etudiant, query,
create, delete, edit, order sont des actions;
@ -248,7 +249,22 @@ Ce tableau est trié selon le type des informations renvoyées:
| Retour | Remarque | Méthode | Navigation | Permission |
|:------------------------|:----------------------------------------|---------|---------------------------------------------------------------------------|---------------------|
| departement**`*`** | tous les depts | GET | [departements](#departements) | |
| 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 |
@ -322,12 +338,11 @@ Ce tableau est trié selon le type des informations renvoyées:
Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post-traitements non réalisés par l'API. Il n'est par exemple pas garanti que les clés des objets json sont triées:
* les clés sont triées
* 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)
- les clés sont triées
- 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
@ -342,76 +357,76 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post-
#### **departements**
* **Méthode:** GET
* **Routes:** `/departements`
* **Exemple d'utilisation:** `/api/departements`
* **Résultat:** Liste de tous les départements (visibles ou non).
* **Exemple de résultat:** [departements.json](samples/sample_departements.json.md)
- **Méthode:** GET
- **Routes:** `/departements`
- **Exemple d'utilisation:** `/api/departements`
- **Résultat:** Liste de tous les départements (visibles ou non).
- **Exemple de résultat:** [departements.json](samples/sample_departements.json.md)
#### **departements-ids**
* **Méthode:** GET
* **Permission: `ScoView`**
* **Routes:** `/departements_ids`
* **Résultat:** Liste des id départements (visibles ou non).
* **Exemple de résultat:**
* **Exemple de résultat:** [departements-ids.json](samples/sample_departements-ids.json.md)
- **Méthode:** GET
- **Permission: `ScoView`**
- **Routes:** `/departements_ids`
- **Résultat:** Liste des id départements (visibles ou non).
- **Exemple de résultat:**
- **Exemple de résultat:** [departements-ids.json](samples/sample_departements-ids.json.md)
#### **departement**
* **Méthode:** GET
* **Permission: `ScoView`**
* **Routes:**
* `/departement/id/<int:dept_id>`
* `/departement/<string:dept>`
* **Résultat:** Un département
* **Exemple de résultat:** [departement.json](samples/sample_departement.json.md)
- **Méthode:** GET
- **Permission: `ScoView`**
- **Routes:**
- `/departement/id/<int:dept_id>`
- `/departement/<string:dept>`
- **Résultat:** Un département
- **Exemple de résultat:** [departement.json](samples/sample_departement.json.md)
#### **`departement-create`**
* **Méthode: POST**
* **Permission: `ScoSuperAdmin`**
* **Paramètres:** aucun
* **Data:** `{ "acronym": str, "visible":bool }`
* **Routes:** `/departement/create`
* **Exemple d'utilisation:** `/departement/create`
- **Méthode: POST**
- **Permission: `ScoSuperAdmin`**
- **Paramètres:** aucun
- **Data:** `{ "acronym": str, "visible":bool }`
- **Routes:** `/departement/create`
- **Exemple d'utilisation:** `/departement/create`
>`{ "acronym": "QLIO", "visible": true }`
* **Résultat:** Crée un nouveau département. L'acronyme du département (RT,
- **Résultat:** Crée un nouveau département. L'acronyme du département (RT,
GEII, ...) doit être unique (il est d'usage de le mettre en majuscules, mais
ce n'est pas obligatoire). Le paramètre optionnel `visible`indique si le
département est affiché sur la page d'accueil de ScoDoc. Notez qu'un
département "invisible" peut quand même être utilisé si l'on connait son
adresse (URL). Renvoie le département créé.
* **Exemple de résultat:** [departements-create.json](samples/sample_departement-create.json.md)
- **Exemple de résultat:** [departements-create.json](samples/sample_departement-create.json.md)
#### **`departement-edit`**
* **Méthode: POST**
* **Permission: `ScoSuperAdmin`**
* **Paramètres:** `dept_acronym`
* **Data:** `{ "visible":bool }`
* **Routes:** `/departement/<string:dept_acronym>/edit`
* **Exemple d'utilisation:** `/departement/edit`
- **Méthode: POST**
- **Permission: `ScoSuperAdmin`**
- **Paramètres:** `dept_acronym`
- **Data:** `{ "visible":bool }`
- **Routes:** `/departement/<string:dept_acronym>/edit`
- **Exemple d'utilisation:** `/departement/edit`
>`{ "visible": false }`
* **Résultat:** Modifie un département. Seul le champs `visible` peut être
- **Résultat:** Modifie un département. Seul le champs `visible` peut être
modifié. L'acronyme ne peut pas être changé car il peut être mentionné dans de
nombreux objets et documents, y compris à l'extérieur de ScoDoc.
* **Exemple de résultat:** [departements-edit.json](samples/sample_departement-edit.json.md)
- **Exemple de résultat:** [departements-edit.json](samples/sample_departement-edit.json.md)
#### **`departement-delete`**
* **Méthode: POST**
* **Permission: `ScoSuperAdmin`**
* **Paramètres:** `dept_acronym`
* **Routes:** `/departement/<string:dept_acronym>/delete`
* **Exemple d'utilisation:** `/departement/delete/EARTH`
* **Résultat:** supprime définitivement un département. *Toutes les données sont effacées*
(étudiants, formations, ...).
* **Exemple de résultat:** [departements-delete.json](samples/sample_departement-delete.json.md)
- **Méthode: POST**
- **Permission: `ScoSuperAdmin`**
- **Paramètres:** `dept_acronym`
- **Routes:** `/departement/<string:dept_acronym>/delete`
- **Exemple d'utilisation:** `/departement/delete/EARTH`
- **Résultat:** supprime définitivement un département. *Toutes les données sont effacées*
(étudiants, formations, ...).
- **Exemple de résultat:** [departements-delete.json](samples/sample_departement-delete.json.md)
### **API Etudiant**
@ -547,10 +562,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/<int:group_id>/etudiants`
* `/group/<int:group_id>/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
@ -597,6 +612,7 @@ Pour uniformiser les résultats des exemples, ceux sont soumis à quelques post-
| _version_ | int | |
#### **`formations`**
* **Méthode:** GET
* **Permission: `ScoView`**
* **Routes:** `/formations`
@ -1101,7 +1117,7 @@ d'un autre).
* **Permission: `ScoUsersView`**
* **Routes:**
* `/users/query?departement=dept_acronym&active=1&starts_with=<str:nom>`
* `/users/query?departement=dept_acronym&active=1&starts_with=<str:nom>`
* **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
@ -1141,6 +1157,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,
@ -1177,7 +1194,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**
Attention, les bulletins ne sont publiés sur l'API que si l'option "*publier le
bulletin sur le portail étudiant*" est cochée dans le semestre concerné.
@ -1197,10 +1214,9 @@ 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
Récapitulatif par étudiant (état, groupe(s), moyennes d'UEs et de modules)
pour un formsemestre spécifié par son id.
Par défaut les valeurs numériques sont formatées en chaînes. Si format=raw, valeurs numériques
mais pas JSON compliant à cause des `NaN`.
@ -1225,7 +1241,7 @@ 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
@ -1250,9 +1266,9 @@ 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,
* **`ressources`**: liste des ressources (BUT),
* **`saes`**: liste des saes (BUT),
* **`ues`**: liste des UEs
* **`ressources`**: liste des ressources (BUT)
* **`saes`**: liste des SAÉs (BUT)
* **`modules`**: liste des modules classiques (DUT ou sport/culture)
* **`malus`**: listes des modules de type bonus/malus.
@ -1268,7 +1284,7 @@ mais pas JSON compliant à cause des `NaN`.
* **Exemple d'utilisation:** `/api/formsemestre/1/resultats`
* **Résultat:** [formsemestre-resultats.json](samples/sample_formsemestre-resultats.json.md)
Récapitulatif par étudiant (état, groupe(s), moyennes d'UEs et de modules
Récapitulatif par étudiant (état, groupe(s), moyennes d'UEs et de modules)
pour un formsemestre spécifié par son id.
Par défaut les valeurs numériques sont formatées en chaînes. Si format=raw,
valeurs numériques mais pas JSON compliant à cause des `NaN`.
@ -1377,7 +1393,7 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`.
* **Paramètres :** Aucun
* **Route:** `/logo/<string:nom>`
* **Exemple d'utilisation :** `/ScoDoc/api/logo/header`
* **Résultat :** l'image (format png ou jpg. le format retourné dépend du format sous lequel l'image a été initialement enregistrée)
* **Résultat :** l'image (format png ou jpg; le format retourné dépend du format sous lequel l'image a été initialement enregistrée)
* **Exemple de résultat:** [logo.json](samples/sample_logo.json.md)
#### **`departement-logos`**
@ -1408,14 +1424,504 @@ valeurs numériques mais pas JSON compliant à cause des `NaN`.
* `/departement/id/<int:departement_id>/logo/<string:nom>`
* **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**
Cette API est disponible à partir de ScoDoc 9.6 et remplace les absences.
<!-- TODO: faire les samples -->
#### 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é (présent, 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
> 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/<int:assiduite_id>`
* **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)
* `est_just` (v,t,f,vrai,faux,true,false)
* `user_id` (X : id de l'utilisateur)
* **Routes:**
* `/assiduites/<int:etudid>`
* `/assiduites/<int:etudid>/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)
* `est_just` (v,t,f,vrai,faux,true,false)
* `user_id` (X : id de l'utilisateur)
* `metric` ('compte', 'demi', 'journee', 'heure')
* **Routes:**
* `/assiduites/<int:etudid>/count`
* `/assiduites/<int:etudid>/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-count.json](samples/sample_assiduites_count.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)
* `est_just` (v,t,f,vrai,faux,true,false)
* `user_id` (X : id de l'utilisateur)
* **Routes:**
* `/assiduites/formsemestre/<int:formsemestre_id>`
* `/assiduites/formsemestre/<int:formsemestre_id>/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)
* `est_just` (v,t,f,vrai,faux,true,false)
* `user_id` (X : id de l'utilisateur)
* **Routes:**
* `/assiduites/formsemestre/<int:formsemestre_id>/count`
* `/assiduites/formsemestre/<int:formsemestre_id>/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és 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)
* `est_just` (v,t,f,vrai,faux,true,false)
* `user_id` (X : id de l'utilisateur)
* **Routes:**
* `/assiduites/group/query?etudids=`
* **Exemple d'utilisation:**
* `/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
{
etudid1 : [{assiduité...}],
etudid2 : [{assiduité...}],
etudid3 : [{assiduité...}],
}
```
#### **assiduites-create**
* **Méthode:** POST
* **Permission: `ScoAssiduiteChange`**
* **Data:**
```json
[
{
"etudid":<int>,
"date_debut": <string>,
"date_fin": <string>,
"etat": <string>,
"moduleimpl_id"?: <int>,
"desc"?:<string>,
},
...
]
```
* **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 parties (errors et success) contenant le retour de chaque objet donné dans la requête POST.
#### **assiduite-create**
* **Méthode:** POST
* **Permission: `ScoAssiduiteChange`**
* **Paramètres:** `etudid`
* **Data:**
```json
[
{
"date_debut": <string>,
"date_fin": <string>,
"etat": <string>,
"moduleimpl_id"?: <int>,
"desc"?:<string>
},
...
]
```
* **Routes:**
* `/assiduite/<int:etudid>/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 parties (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": <string>,
"moduleimpl_id": <int>,
"desc" : <string>,
}
```
* **Routes:** `/assiduite/<int:assiduite_id>/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)
#### **assiduites-edit**
* **Méthode:** POST
* **Permission: `ScoAssiduiteChange`**
* **Data:**
```json
[
{
"etudid":<int>
"etat"?: <string>,
"moduleimpl_id"?: <int>
"desc"?:<string>
},
...
]
```
* **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 parties (errors et success) contenant le retour de chaque objet donné dans la requête POST.
#### **assiduite-delete**
* **Méthode:** POST
* **Permission: `ScoAssiduiteChange`**
* **Data:**
```json
[
<int:assiduite_id>,
...
]
```
* **Routes:**
* `/assiduite/delete`
* **Exemple d'utilisation:** `/api/assiduite/delete`
> `[2,3,5,7]`
* **Résultat:** Retourne un objet en deux parties (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/<int:justif_id>`
* **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/<int:etudid>`
* `/justificatifs/<int:etudid>/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": <string>,
"date_debut": <string>,
"date_fin": <string>,
"raison"?: <string>,
},
...
]
```
> 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/<int:etudid>/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 parties (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": <string>,
"raison": <string>,
"date_debut": <string>,
"date_fin": <string>,
}
```
* **Routes:** `/justificatif/<int:justif_id>/edit`
* **Exemple d'utilisation:** `/api/justificatif/1/edit`
> `{etat: "valide"}`
* **Résultat:** Modifie le justificatif désigné.
* **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
[
<int:justif_id>,
...
]
```
* **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/<int:justif_id>/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/<int:justif_id>/export/<str:filename>`
* **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/<int:justif_id>/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` / `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/<int:justif_id>/list`
* **Exemple d'utilisation:** `/api/justificatif/1/list`
* **Résultat:**
```json
{
"filenames" : [
<str>,
...
],
"total": <int>
}
```
* 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**
* **Méthode:** GET
* **Permission: `ScoView`**
* **Paramètres:** `justif_id`
* **Routes:** `/justificatif/<int:justif_id>/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/`.
@ -1445,7 +1951,7 @@ Les routes ci-dessus s'entendent à partir de l'URL de base de votre ScoDoc, c'e
à dire `https://votre.site.fr/ScoDoc/<dept>/Scolarite/`, et répondent en GET et
en POST.
Note:
Note:
- `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API.

192
docs/UpgradeToDeb12Sco96.md Normal file
View File

@ -0,0 +1,192 @@
# Procédure pour la mise à jour vers Debian 12 et ScoDoc 9.6
Cette page documente la mise à jour d'un serveur ScoDoc 9.4 ou 9.5 tournant sous
Linux Debian 11 vers la version suivante: ScoDoc 9.6 sous Debian 12.
On commence par mettre à jour normalement le système Debian, puis on change la
version de la base de données postgresql puis on met à jour ScoDoc.
Si vous souhaitez installer ScoDoc 9.6 sans partir d'un serveur 9.5,
[voir la page d'installation](GuideInstallDebian12.md)
Tout compris, la mise à jour d'un serveur typique prend environ 20 à 30 minutes
et ne demande aucune compétence particulière, autre que de suivre
scrupuleusement les instructions ci-dessous, sans oublier d'étape.
## Upgrade Debian 11 vers Debian 12
La documentation officielle est là:
[DebianUpgrade](https://wiki.debian.org/DebianUpgrade). Elle couvre tous les
cas, mais en général notre serveur ScoDoc est plus simple: résumé ci-dessous
### Sauvegarder
Avant tout, sauvegarder vos données et l'ensemble de votre serveur. Vérifiez que
vous avez assez d'espace disque disponible (par exemple avec la commande `df -h`).
Prévenez les utilisateurs et arrêtez le service: `systemctl stop scodoc9`
### Mettre à jour Debian
Dans la suite, on suppose que vous avez un shell root. Sinon, utilisez `sudo`.
#### Vérifier qu'on est à jour
```bash
apt-get update
apt-get upgrade
apt-get full-upgrade
```
#### Modifier les sources de mise à jour
Si vous savez le faire, éditer le fichier `/etc/apt/sources.list` (par exemple
avec la commande `nano /etc/apt/sources.list`) et remplacer le mot `bullseye`par
`bookworm`.
Sinon, il peut être plus simple de reprendre ce contenu:
```txt
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main
deb-src http://security.debian.org/debian-security bookworm-security main
deb http://deb.debian.org/debian/ bookworm-updates main
deb-src http://deb.debian.org/debian/ bookworm-updates main
```
#### Mettre à jour
```bash
/bin/rm /etc/apt/sources.list.d/scodoc.list
apt-get clean
apt-get update
```
Les deux commandes suivantes sont longues, surtout ne pas les interrompre.
Répondre "oui" (ou la réponse par défaut) aux diverses question, ou dire que
vous conservez les versions locales modifiées de vos fichiers de configuration
(lorsqu'un texte long s'affiche, taper 'q' puis "entrée"...).
```bash
apt-get upgrade
#
# Puis:
apt-get full-upgrade
```
Un petit nettoyage:
```bash
apt-get autoremove
```
Et un redémarrage
```bash
shutdown -r now
```
Après reconnexion, vous avez un serveur Debian 12. Reste à s'occuper de la base
de données et de ScoDoc. D'abord, s'assurer que le service n'a pas redémarré:
```bash
systemctl stop scodoc9
```
## En cas de problème avec proxmox
Pour l'instant on ne nous a pas signalé de problèmes, mais au cas où ce lien
peut servir: [Debian 12 et proxmox](https://www.abyssproject.net/2023/07/retex-sur-mes-upgrades-vers-debian-12-et-proxmox-ve-8)
## Upgrade Postgresql
Debian 12 est livré avec Postgresql 15, tandis que l'installation précédente
tournait sous Postgresql 13. Il est donc nécessaire de migrer les données en
base vers la nouvelle version.
Procédure inspirée de
[ce tuto en français](https://wiki.fiat-tux.fr/books/administration-syst%C3%A8mes/page/migration-d%E2%80%99une-version-majeure-de-postgresql-%C3%A0-une-autre)
Toujours dans un shell root, copier/coller les commandes suivantes:
```bash
service postgresql stop
pg_dropcluster --stop 15 main
pg_upgradecluster -m upgrade 13 main
systemctl start postgresql
su -c "/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages" postgres
pg_dropcluster 13 main --stop
apt-get autoremove --purge postgresql-13 postgresql-client-13
```
## Passage de ScoDoc 9.5 (ou 9.4) à 9.6
### Modification des sources de paquets Debian
- Supprimer l'ancien fichier:
```bash
/bin/rm -f /etc/apt/sources.list.d/scodoc*
```
- Ajouter le dépot scodoc: copier ce fichier <a href="/attachments/scodoc.list"
download>scodoc.list</a> dans `/etc/apt/sources.list.d/`
ou bien l'éditer pour qu'il contienne juste cette ligne:
```text
# contenu du fichier /etc/apt/sources.list.d/scodoc.list
deb http://scodoc.org/deb/bookworm bookworm main
```
### Installation de la clé
L'ancienne clé crypto qui authentifie scodoc est toujours valide, mais il faut
l'installer différemment. Comme root, lancer:
```bash
apt-key export BBDA4CF7 | gpg --dearmour -o /etc/apt/trusted.gpg.d/scodoc.gpg
```
### Mise à jour du paquet scodoc9
```bash
apt update && apt upgrade
```
devrait installer `scodoc9.6.x` (cette première install est un peu longue, il
faut en effet charger et configurer de nombreux modules python).
### Migration des absences vers les assiduités
Le nouveau module de gestion des assiduité (absences/présences/justificatifs)
permet d'importer les anciennes "absences" (et justificatifs). Pour cela, lancer
les commandes suivantes:
```bash
systemctl stop scodoc9 # le service DOIT etre stoppé !
su scodoc
#
cd /opt/scodoc
source venv/bin/activate
flask migrate-abs-to-assiduites
```
Pour plus de détails et paramétrages (plages horaires, ...), voir
[la documentation sur la migration des absences](AssiduitesMigration.md).
Le traitement est assez long et peut prendre plusieurs minutes,
suivant le nombre d'absences et la vitesse de votre serveur.
### Démarrage du service
Comme d'habitude, en tant que `root`: (faire `exit`si vous êtes resté dans le
shell scodoc précédent):
```bash
systemctl start scodoc9
```

View File

@ -0,0 +1,2 @@
# ScoDoc repository
deb http://scodoc.org/repo bullseye main

View File

@ -1,2 +1,2 @@
# ScoDoc repository
deb http://scodoc.org/repo bullseye main
# ScoDoc repository for Debian 12 bookworm
deb http://scodoc.org/deb/bookworm bookworm main

View File

@ -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
}
```

View File

@ -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
}
}
}
```

View File

@ -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
}
}
}
```

View File

@ -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
}
```

View File

@ -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
[
"..."
]
```

View File

@ -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
}
```

View File

@ -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
[
"..."
]
```

View File

@ -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
}
```

View File

@ -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"
}
```

View File

@ -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
}
}
}
```

View File

@ -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
}
}
}
```

View File

@ -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
}
```

View File

@ -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
[
"..."
]
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB