From 6266e9f7891f29da79ee2e8184bfe91d29436a8a Mon Sep 17 00:00:00 2001 From: viennet Date: Sat, 8 Jan 2022 00:58:33 +0100 Subject: [PATCH 01/24] WIP API --- docs/GuideDeveloppeurs.md | 30 ++++++++++++++++++++++++++++++ docs/ScoDoc9API.md | 14 ++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/docs/GuideDeveloppeurs.md b/docs/GuideDeveloppeurs.md index 6be84be..282cedc 100644 --- a/docs/GuideDeveloppeurs.md +++ b/docs/GuideDeveloppeurs.md @@ -388,6 +388,36 @@ Au besoin, mémo: - `flask clear-cache` efface le cache Redis. +## Re-création du virtualenv + +ScoDoc est livré avec un "virtualenv", qui contient tous les modules python +nécessaires. Il se trouve sous `/opt:scodoc/venv`. +Si vous souhaitez repartir de zéro, tester de nouvelles versions de certaines +bibliothèques, ou autres expériences de ce genre, vous pouvez le récréer ainsi: +```bash + # en tant qu'utilisateur scodoc + cd /opt/scodoc + /bin/rm -rf venv # ou mv ... + python3 -m venv venv + source venv/bin/activate + pip install wheel +``` +Puis soit vous installez les versions "officielles" (testées) +``` + pip install -r requirements-3.9.txt +``` +Soit vous prenez les version les plus à jour disponibles. Une façon rapide de +faire ceci est: +```bash + cut -d= -f 1 requirements-3.9.txt | xargs pip install +``` +à adapter selon vos objectifs. +Pour régénérer le fichier indiquant la liste des paquets: +```bash + pip freeze > requirements-3.9.txt +``` + +Note: la mise à jour par `apt` recrée le virtualenv à chaque fois. ## Roadmap Sujets **prioritaires** en 2021: diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index 892cba5..df61bee 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -117,15 +117,16 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ * **Exemple de résultat:** `[id_1, id_2, id_3, ...]` - * **`liste_etudiants`** + * **`etudiants`** XXX à revoir * **Méthode:** GET * **Paramètres:** `dept`, `semestre` - * **Routes:** `/api/departements//etudiants/liste/` (_`semestre` étant un paramètre optionnel_) + * **Routes:** `/api/departements//etudiants/liste/` * **Exemple d'utilisation:** `/api/departements/MMI/etudiants/liste` - * **Résultat:** liste des étudiants d'un département - semestre actuel par défaut. + * **Résultat:** liste des étudiants d'un département - semestre actuel par + défaut. XXX à préciser - * **`liste_semestres_actifs`** + * **`liste_semestres_actifs`** XXX à revoir * **Méthode:** GET * **Paramètres:** `dept` * **Routes:** `/api/departements//semestres_actifs` @@ -133,13 +134,14 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ * **Résultat:** Liste des semestres actifs d'un département donné. (_réponse sous format json_) - * **`referenciel_competences`** + * **`referentiel_competences`** *XXX pourquoi le dept est dans la route ?* * **Méthode:** GET - * **Paramètres:** `dept`, `formation` (_`formation` étant un id de formation, un programme pédagogique_) + * **Paramètres:** `dept`, `formation_id` (_`formation_id` étant un id de formation, un programme pédagogique_) * **Routes:** `/api/departements//formations//referentiel_competences` * **Exemple d'utilisation:** `/api/departements/MMI/formations/12/referentiel_competences` * **Résultat:** Le référentiel de compétences d'une formation donnée. (_pas toujours présent_) + * XXX obtenir la liste des référentiels ## Etudiants * **`etud_dept`** From 7ae86ace1b1ed71d185e959ad5902dab3f481801 Mon Sep 17 00:00:00 2001 From: viennet Date: Sat, 8 Jan 2022 14:33:21 +0100 Subject: [PATCH 02/24] WIP API --- docs/ScoDoc9API.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index df61bee..644e5c4 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -134,12 +134,11 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ * **Résultat:** Liste des semestres actifs d'un département donné. (_réponse sous format json_) - * **`referentiel_competences`** *XXX pourquoi le dept est dans la route ?* + * **`referentiel_competences`** * **Méthode:** GET - * **Paramètres:** `dept`, `formation_id` (_`formation_id` étant un id de formation, un programme pédagogique_) - * **Routes:** `/api/departements//formations//referentiel_competences` - * **Exemple d'utilisation:** `/api/departements/MMI/formations/12/referentiel_competences` - * **Résultat:** Le référentiel de compétences d'une formation donnée. (_pas toujours présent_) + * **Paramètres:** `id`, id du référentiel + * **Routes:** `/api/referentiel_competences/` + * **Résultat:** Le référentiel de compétences d'une formation donnée (json). (_pas toujours présent_) * XXX obtenir la liste des référentiels From a512de5047bbced294c68a80f70ce0890c31394b Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 1 Feb 2022 07:10:16 +0100 Subject: [PATCH 03/24] instructions restauration sauvegarde --- docs/SauvegardesBases.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/SauvegardesBases.md b/docs/SauvegardesBases.md index 883ba68..4b8af2c 100644 --- a/docs/SauvegardesBases.md +++ b/docs/SauvegardesBases.md @@ -55,10 +55,17 @@ et ajouter: ## En cas de problème: restaurer la base à partir d'une sauvegarde -/!\ Attention, certaines informations sont stockées dans des fichiers et non dans la base de données: configuration du logiciel, photos des étudiants. Ce paragraphe ne traite que de la restauration à de la base de données. + Attention, certaines informations sont stockées dans des fichiers +et non dans la base de données: configuration du logiciel, photos des étudiants. +Ce paragraphe ne traite que de la restauration de la base de données. + +Rappel: en ScoDoc 9, il n'y a qu'une seule base de donnée SQL, nommée par défaut +`SCODOC`. Cette base contient les données des départements et la définition des +comptes utilisateurs. 1. Choisir la sauvegarde à utiliser, en fonction de la date à partir de - laquelle on a fait une erreur (eg suppression non intentionnelle d'un + laquelle on a fait une erreur (par ex. suppression non intentionnelle d'un semestre...). Le fichier se trouve sous `/var/lib/postgresql/SCODOC-BACKUPS`où `XXX` est concerné. Utiliser par exemple `ls -lrt` pour visualiser les sauvegardes triées par date. @@ -76,24 +83,18 @@ et ajouter: ``` # en tant que root... systemctl stop scodoc9 # arret du serveur -su postgres -dropdb SCODOC # <<< votre base production -pg_restore -C -d scodoc /tmp/XXX # (nom de la BDD en majuscule) +su - scodoc +dropdb SCODOC # <<< votre base production +createdb -E UTF-8 SCODOC +pg_restore -d SCODOC /tmp/SCODOC_pgdump.gz # (nom du fichier dump) +source venv/bin/activate +flask db upgrade # nécessaire seulement si sauvegarde ancienne +flask clear-cache + exit # retour a l'utilisateur root systemctl start scodoc9 # relance ScoDoc ``` -Attention: s'il y a eu des mise à jour du logiciel entre temps, il peut arriver -que la base sauvegardée nécessite une migration. Arrêtez le service scodoc9, -puis, en tant qu'utilisateur `scodoc`, lancer les commandes suivantes: - - cd /opt/scodoc - source venv/bin/activate - flask db upgrade - -puis relancer le service (`systemctl start scodoc9` comme root). - - ## Déplacement de toute une installation Les scripts ci-dessus ne se chargent que de la base de données SQL. From 79128cef472f012eda33bc18ee4b205a9e04a364 Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 1 Feb 2022 07:10:59 +0100 Subject: [PATCH 04/24] note sur BUT --- docs/CalculNotes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/CalculNotes.md b/docs/CalculNotes.md index 2feea24..3967b21 100644 --- a/docs/CalculNotes.md +++ b/docs/CalculNotes.md @@ -3,6 +3,8 @@ *Tout ce que vous avez toujours voulu savoir sur le calcul des moyennes...* +**Attention :** Les informations ci-dessous s'appliquent aux formations traditionnelles. +Pour les formations par compétences, voir [la page dédiée au BUT](BUT.md). ### En résumé: From 0a6a096172e0dff8be2f740dba256b0913b4c776 Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 1 Feb 2022 07:50:34 +0100 Subject: [PATCH 05/24] active extension footnotes --- docs/ModulesMalus.md | 3 ++- mkdocs.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/ModulesMalus.md b/docs/ModulesMalus.md index 25f0fe4..4c6e544 100644 --- a/docs/ModulesMalus.md +++ b/docs/ModulesMalus.md @@ -2,7 +2,7 @@ # Notes de malus Il est fréquent d'introduire des pénalités ou *malus* sur les moyennes calculées à partir des notes. Par exemple, dans certains établissements, l'absence de l'étudiant à des activités obligatoires peut entrainer des points de pénalités. Inversement, certaines activités facultatives pourraient donner lieu à des bonifications. -Pour gérer cela ScoDoc propose de déclarer des modules de *malus*: les notes de malus sont directement *soustraites* à la moyenne générale. Contrairement aux notes ordinaires dans ScoDoc, les notes de malus sont toujours comprises entre -20 et +20. Une note de malus de 1 va diminuer la moyenne de l'UE de 1. Une note négative augmenterait cette moyenne. Les moyennes d'UE sont toujours comprises entre 0 et 20: si l'application du malus donne une note supérieure à 20 (ou inférieure à zéro), elle est ramenée à 20 (ou à zéro). +Pour gérer cela ScoDoc[^1] propose de déclarer des modules de *malus*: les notes de malus sont directement *soustraites* à la moyenne générale. Contrairement aux notes ordinaires dans ScoDoc, les notes de malus sont toujours comprises entre -20 et +20. Une note de malus de 1 va diminuer la moyenne de l'UE de 1. Une note négative augmenterait cette moyenne. Les moyennes d'UE sont toujours comprises entre 0 et 20: si l'application du malus donne une note supérieure à 20 (ou inférieure à zéro), elle est ramenée à 20 (ou à zéro). Lors de la création d'un module dans un programme pédagogique, on peut spécifier son type. Il est aussi possible de créer directement un module malus par UE du programme, via le lien "Ajouter des modules de malus dans chaque UE" en bas du programme. @@ -10,3 +10,4 @@ Une fois le module créé (et ajouté à un semestre), on peut y déclarer une Ces notes sont toujours *à prise en compte immédiate*, il n'est donc pas nécessaire de saisir des notes de malus pour tous les étudiants. +[^1]: pas encore disponible pour le BUT. diff --git a/mkdocs.yml b/mkdocs.yml index 74e7dd1..b682a4b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,3 +46,4 @@ extra_javascript: markdown_extensions: - pymdownx.arithmatex: generic: true + - footnotes From 022e4b8b500d363d142583bc9934879a4bd609d7 Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 1 Feb 2022 11:39:04 +0100 Subject: [PATCH 06/24] bonus dispos --- docs/ModulesMalus.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/ModulesMalus.md b/docs/ModulesMalus.md index 4c6e544..8278983 100644 --- a/docs/ModulesMalus.md +++ b/docs/ModulesMalus.md @@ -2,12 +2,10 @@ # Notes de malus Il est fréquent d'introduire des pénalités ou *malus* sur les moyennes calculées à partir des notes. Par exemple, dans certains établissements, l'absence de l'étudiant à des activités obligatoires peut entrainer des points de pénalités. Inversement, certaines activités facultatives pourraient donner lieu à des bonifications. -Pour gérer cela ScoDoc[^1] propose de déclarer des modules de *malus*: les notes de malus sont directement *soustraites* à la moyenne générale. Contrairement aux notes ordinaires dans ScoDoc, les notes de malus sont toujours comprises entre -20 et +20. Une note de malus de 1 va diminuer la moyenne de l'UE de 1. Une note négative augmenterait cette moyenne. Les moyennes d'UE sont toujours comprises entre 0 et 20: si l'application du malus donne une note supérieure à 20 (ou inférieure à zéro), elle est ramenée à 20 (ou à zéro). +Pour gérer cela ScoDoc propose de déclarer des modules de *malus*: les notes de malus sont directement *soustraites* à la moyenne générale. Contrairement aux notes ordinaires dans ScoDoc, les notes de malus sont toujours comprises entre -20 et +20. Une note de malus de 1 va diminuer la moyenne de l'UE de 1. Une note négative augmenterait cette moyenne. Les moyennes d'UE sont toujours comprises entre 0 et 20: si l'application du malus donne une note supérieure à 20 (ou inférieure à zéro), elle est ramenée à 20 (ou à zéro). Lors de la création d'un module dans un programme pédagogique, on peut spécifier son type. Il est aussi possible de créer directement un module malus par UE du programme, via le lien "Ajouter des modules de malus dans chaque UE" en bas du programme. Une fois le module créé (et ajouté à un semestre), on peut y déclarer une évaluation et saisir les notes de bonus/malus. Ces notes sont toujours *à prise en compte immédiate*, il n'est donc pas nécessaire de saisir des notes de malus pour tous les étudiants. - -[^1]: pas encore disponible pour le BUT. From de5071495c77c5a77d39356a1956b2ed4e29b943 Mon Sep 17 00:00:00 2001 From: Jean-Marie Place Date: Thu, 24 Jun 2021 20:02:00 +0200 Subject: [PATCH 07/24] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'docs/ScoDocA?= =?UTF-8?q?pogee.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ScoDocApogee.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ScoDocApogee.md b/docs/ScoDocApogee.md index 94405f7..4577642 100644 --- a/docs/ScoDocApogee.md +++ b/docs/ScoDocApogee.md @@ -27,6 +27,8 @@ Les codes Apogée des éléments constitutifs (UE et modules de ScoDoc) doivent ![SaisieCodeApoModule.png](screens/SaisieCodeApoModule.png) +De plus, il est possible d'associer plusieurs code Apogée à une UE. Ce peut être nécessaire quand les code des UE ne sont pas les même selon l'étape (par exemple la même UE étiquetée différement pour les formations initiales et les formations continues). Dans ce cas on saisi la liste des codes Apogée séparés par une virgule. + Par ailleurs, chaque semestre est associé à une étape Apogée (VET), et, en option, à un code d'élément annuel et un code d'élément semestre. Pour le deuxième semestre 5S2) du DUT R&T Villetaneuse, cela donne: * Code étape (VET): `V1RT` (l'étape est annuelle) From c39e4e067e82e39ee381350821d1fb7bfac29e19 Mon Sep 17 00:00:00 2001 From: Jean-Marie PLACE Date: Wed, 2 Feb 2022 07:41:02 +0100 Subject: [PATCH 08/24] =?UTF-8?q?compl=C3=A9ment=20sur=20doc=20AdminUsers.?= =?UTF-8?q?md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/AdminUsers.md | 189 ++++++++++++++++++++++++++++++++++++---- docs/ScoDocApogee.md | 2 - docs/fig/GrapheUser.odg | Bin 0 -> 21696 bytes docs/fig/GrapheUser.png | Bin 0 -> 130093 bytes 4 files changed, 172 insertions(+), 19 deletions(-) create mode 100644 docs/fig/GrapheUser.odg create mode 100644 docs/fig/GrapheUser.png diff --git a/docs/AdminUsers.md b/docs/AdminUsers.md index ebc727b..b47d407 100644 --- a/docs/AdminUsers.md +++ b/docs/AdminUsers.md @@ -7,25 +7,180 @@ une base de données SQL. /!\ Il est prévu de développer un connecteur vers LDAP, mais ce n'est pas encore disponible (avis aux volontaires, voir https://www-lipn.univ-paris13.fr/projects/scodoc/ticket/140) -### Base de données utilisateurs -Il est conseillé de placer la table utilisateurs dans une base de données séparées de celle -des notes, afin de pouvoir la partager entre plusieurs UFRs ou départements sans compromettre -la sécurité des données. Dans l'installation standard ([GuideInstallDebianDix](GuideInstallDebianDix.md)), il s'agit de la base -**SCOUSERS**. +### Principes généraux -La table **sco_users** contient: +Depuis ScoDoc 9.0, la liste des utilisateurs est enregistrée dans la base de données unique SCODOC (en production) (voir la partie implémentation pour plus de détails) + +Les entités gérées par scodoc sont : +- Les utilisateurs ; +- les rôles ; +- en liaison avec les départements. + +#### L'entité utilisateur +- possède les propriétés habituelles (nom, prénom, user_name, email) +- peut être associé à un département ou pas (cas d'un administrateur gérant plusieurs départements) +- assure un ou plusieurs rôles + +#### L'entité rôle +Un rôle est le regroupement d'un certain nombre de privilèges. +C'est généralement la combinaison d'un département et d'un type d'utilisation. +Actuellement au nombre de quatre (susceptible d'être étendu) : +- Administrateur +- Secrétariat +- Enseignant +- Observateur +Le type d'utilisation donne certains privilèges (par exemple la faculté de saisir des notes, de justifier des absences, de modifier la définition des programmes, ...) + +_Exemple:_ + +L'utilisateur 'Dupont' est responsable scodoc pour son département 'RT' mais intervient également en enseignement au département GEII. +On pourra lui attribuer les rôles `AdminRT` et `EnsGEII`, ce qui lui permettra : + +- de gérer les utilisateurs du (seul) département RT : +Privilèges associés : `Gérer les utlisateurs (Sco Users Manage)`, `Changer les formations (Sco Change Formation)`, ... +- d'accéder aux vues enseignant pour le département GEII : +Privilèges associés : `Voir les parties pour les enseignants (Sco View Ens)`, `Saisir des absences (Sco Change Absences)`, ... + +Pour une description plus fine des privilèges, voir [ConfigPermissions](ConfigPermissions.md) + +### Opérations et cycle de vie des utilisateurs + +Un compte utilisateur peut être modifié par 3 types d'utilisateurs : + +- L'utilisateur lui-même ; +- un administrateur du département de rattachement de l'utilisateur ; +- le super administrateur. + +Les opérations existantes sont : + +- La création ; +- la demande de renouvellement de mot de passe; +- la désactivation. + +Notes: + +- La suppression d'un utilisateur est impossible (nécessité de garder la trace des anciens historiques) +- Le mécanisme de changement de mot de passe de scodoc 7 (par envoi d'un nouveau mot de passe par mail) a été remplacé par +l'ajout de la mention suivante dans le formulaire de connexion : + +` En cas d'oubli de votre mot de passe cliquez ici pour le réinitialiser. ` + +#### Création d'un utilisateur (par formulaire) + +La création d'un utilisateur peut être faite par un administrateur ou super administrateur. Le lien +`Ajouter un utlisateur`permettant cela se trouve dans la page de gestion des utilisateurs +(accessible par le menu latéral) + +**Le mot de passe** peut être + +- saisie par le créateur de l'utilisateur (il appartient alors au créateur de communiquer ce mot de passe à l'utilisateur final) +- initialisé à une valeur non communiquée, à charge pour l'utilisateur final de finaliser la création +du mot de passe avant d'utiliser son accès (il y est invité par un email qui lui est envoyé) + +**Les options de création (mail)** permettent également de choisir parmi les 3 scenarii suivants : + +- Un message d'accueil l'invitant à initialiser son mot de passe ; +- un message de bienvenue simple ; +- aucun message. + +Une case à cocher `envoyer un mail d'accueil à l'utlisateur` permete de choisir la troisième option (si décochée), +sinon la case suivante `indiquer par mail de changer le mot de passe initial` permet de choisir entre l'option 1 et l'option 2. + +Dans tous les cas les mails seront envoyés avec l'adresse de réponse précidée par la valeur de la variable d'environnement +`SCODOC_MAIL_FROM` (par défaut `no-reply@{serveur_mail}`) + +**Le département d'appartenance** peut être choisi si le créateur est administrateur pour plusieurs départements. Il aura alors le loisir +de sélectionner l'un des départements qu'il administre (liste déroulante). + +#### Création en masse (fichier xlsx) + +Le super-administrateur (et lui seulement) peut également créer des comptes en masse par téléversement d'un fichier au format .xlsx +par le biais du lien `importer des utilisateurs` de la même page de gestion des utilisateurs. + +La page affichée lui permet d'importer un modèle qu'il doit compléter et re-soumettre à scodoc +selon le même schéma que la saisie de note par fichier excel. + +Les colonnes à remplir sont les suivantes : + +- user_name: le nom de connexion de l'utilisateur; (obligatoire, unique dans scodoc) +- nom: le nom de l'utilisateur ; (obligatoire) +- prenom: le prénom de l'utilisateur ; (obligatoire) +- email: l'email de l'utilisateur ; (obligatoire, unique dans scodoc) +- roles: le ou les rôles attribués à l'utilisateur séparés par des virgules (exemple `Admin_RT, Ens_GEII`) +- dept: le département de rattachement de l'utilisateur (acronyme, en lettres capitales). + +_Note_: + +- Tous les utilisateurs sont créés ou aucun +- Un mail est envoyé à chaque utilisateur nouvellement créé. + +#### Changement du mot de passe + +Deux circonstances sont envisagées + +##### Oubli de mot de passe + +Lorsqu'un utilisateur a perdu son mot de passe, il a maintenant la possibilité de retrouver son accès +sans intervention d'un administrateur. Il lui suffit de demander la réinitialisation par le lien situé +sur la page de connexion. Après renseignement de son email (qui est maintenant identifiant dans scodoc), +un mail lui est envoyé. ce mail contient un lien comportant un jeton à durée limitée. Ce lien renvoie +vers la page permettant de redéfinir le mot de passe de l'utilisateur. + +##### Edition du profil + +Si l'utilisateur peut se connecter, il peut éditer son profil (et par là, modifier son email et/ou son mot de passe). +La barre latérale de l'écran principal de scodoc affiche dans le coin supérieur gauche la version courante de scodoc +ainsi que l'identification de l'utlisateur actuel. Un clic sur le nom permet à l'utilsateur +d'éditer son profil. + +#### Activation/désactivation + +Une fois créé, le compte utilisateur conserve son existence. Il peut cependant être rendu inactif: + +- soit à l'expiration de la date de validité spécifiée à la création ou lors d'un modification +- soit directement par un administrateur. + +Quelquesoit la procédure, le compte existe encore et conserve son email (il n'est donc pas possible de créer +un nouveau compte associé au même email). Il est simplement impossible de se connecter ou de modifier +le profil de ce compte par l'utlisateur lui-même. + +### Implémentation (pour les développeurs) + +Le graphe d'état ci-dessous explilcite les différents états que peux prendre un compte utilisateur +en fonction des opérations qu'il subit. + +On notera: + +1. Que la création (1) peut le placer initialement dans deux états différents selon le mode de création choisi. +2. Que l'on peut demander le renouvellement du mot de passe plusieurs fois même sans avoir complété la procédure +3. Que les états `créé`et `créé + ticket`permettent la connexion (sous réserve de la connaisssance du mot de passe). + + + + +**SCODOC**. + +La table **user** contient: + +| **Colonne** | **Type** | Contenu | Modifié par | +|-------------------|-----------------------------|--------------------------------------------------------------|----------------| +| id | integer | identifiant interne unique | 1 | +| user_name | character varying(64) | nom de login | 1 | +| email | character varying(120) | adresse mail (unique dans la base) | 1, 6 | +|nom | character varying(64) | | 1, 6 | +|prenom | character varying(64) | | 1, 6 | +|dept | character varying(32) | département de rattachement (identifiant numérique) | 1, 6 | +|active | boolean | | 1, 7, 9 | +|password_hash | character varying(128) | hash password | 1, 6 | +|password_scodoc7 | character varying(42) | deprecated (utilisé lors de la migration scodoc7 > scodoc9) | 1, 2, 4, 5, 6 | +|last_seen | timestamp without time zone | date de dernière connexion | 1, A | +|date_modif_passwd | timestamp without time zone | | 1, 2, 4, 5, 6 | +|date_created | timestamp without time zone | | 1 | +|date_expiration | timestamp without time zone | | 1 | +|passwd_temp | boolean | deprecated | | +|token | text | dernier token émis (changement de mot de passe) | 1a, 3 | +|token_expiration | timestamp without time zone | date d'expiration du dernier token émis | 1a, 3 | - **Colonne** | **Type** || Contenu - ---------- | ----- | ----- - user_id | text | identifiant interne unique - user_name | text | nom de login - passwd | text | hash password - roles | text | liste des noms de rôles, séparés par des virgules -date_modif_passwd | date | - nom | text | - prenom | text | - email | text | adresse mail - dept | text | département de rattachement (exemple "RT") /!\ encodage `utf-8`, sauf si vous avez modifié l'installation. diff --git a/docs/ScoDocApogee.md b/docs/ScoDocApogee.md index 4577642..94405f7 100644 --- a/docs/ScoDocApogee.md +++ b/docs/ScoDocApogee.md @@ -27,8 +27,6 @@ Les codes Apogée des éléments constitutifs (UE et modules de ScoDoc) doivent ![SaisieCodeApoModule.png](screens/SaisieCodeApoModule.png) -De plus, il est possible d'associer plusieurs code Apogée à une UE. Ce peut être nécessaire quand les code des UE ne sont pas les même selon l'étape (par exemple la même UE étiquetée différement pour les formations initiales et les formations continues). Dans ce cas on saisi la liste des codes Apogée séparés par une virgule. - Par ailleurs, chaque semestre est associé à une étape Apogée (VET), et, en option, à un code d'élément annuel et un code d'élément semestre. Pour le deuxième semestre 5S2) du DUT R&T Villetaneuse, cela donne: * Code étape (VET): `V1RT` (l'étape est annuelle) diff --git a/docs/fig/GrapheUser.odg b/docs/fig/GrapheUser.odg new file mode 100644 index 0000000000000000000000000000000000000000..8bf9a57c3df43fcfdb04a1fdc9a16c44bfcd8a5e GIT binary patch literal 21696 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

U{}fUCCc)> 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 G@BRbN9C(rd literal 0 HcmV?d00001 diff --git a/docs/fig/GrapheUser.png b/docs/fig/GrapheUser.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c2d81f686210c192522c7297a566d1062b266f GIT binary patch literal 130093 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 Date: Wed, 2 Feb 2022 08:27:06 +0100 Subject: [PATCH 09/24] petites corrections --- docs/AdminUsers.md | 154 ++++++++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 64 deletions(-) diff --git a/docs/AdminUsers.md b/docs/AdminUsers.md index b47d407..f20099f 100644 --- a/docs/AdminUsers.md +++ b/docs/AdminUsers.md @@ -3,13 +3,11 @@ ScoDoc gère sa liste d'utilisateurs (enseignants, secrétaires) dans une base de données SQL. - -/!\ Il est prévu de développer un connecteur vers LDAP, mais ce n'est pas encore disponible (avis aux volontaires, voir https://www-lipn.univ-paris13.fr/projects/scodoc/ticket/140) - - ### Principes généraux -Depuis ScoDoc 9.0, la liste des utilisateurs est enregistrée dans la base de données unique SCODOC (en production) (voir la partie implémentation pour plus de détails) +Depuis ScoDoc 9.0, la liste des utilisateurs est enregistrée dans la base de +données unique SCODOC (en production) (voir la partie implémentation pour plus +de détails). Les entités gérées par scodoc sont : - Les utilisateurs ; @@ -17,31 +15,40 @@ Les entités gérées par scodoc sont : - en liaison avec les départements. #### L'entité utilisateur -- possède les propriétés habituelles (nom, prénom, user_name, email) -- peut être associé à un département ou pas (cas d'un administrateur gérant plusieurs départements) -- assure un ou plusieurs rôles +- possède les propriétés habituelles (nom, prénom, user_name, email); +- peut être associé à un département ou pas (cas d'un administrateur gérant + plusieurs départements); +- assure un ou plusieurs rôles. #### L'entité rôle Un rôle est le regroupement d'un certain nombre de privilèges. C'est généralement la combinaison d'un département et d'un type d'utilisation. -Actuellement au nombre de quatre (susceptible d'être étendu) : +Actuellement au nombre de quatre (d'autres sont prévus, notamment pour le module +relations entreprises) : - Administrateur - Secrétariat - Enseignant - Observateur -Le type d'utilisation donne certains privilèges (par exemple la faculté de saisir des notes, de justifier des absences, de modifier la définition des programmes, ...) + +par ailleurs, le contexte d'utilisation donne certains privilèges (par exemple +la faculté de saisir des notes, de justifier des absences, de modifier la +définition des programmes, ...). _Exemple:_ -L'utilisateur 'Dupont' est responsable scodoc pour son département 'RT' mais intervient également en enseignement au département GEII. +L'utilisateur 'Dupont' est responsable ScoDoc pour son département *RT* mais +intervient également en enseignement au département *GEII*. On pourra lui attribuer les rôles `AdminRT` et `EnsGEII`, ce qui lui permettra : - de gérer les utilisateurs du (seul) département RT : -Privilèges associés : `Gérer les utlisateurs (Sco Users Manage)`, `Changer les formations (Sco Change Formation)`, ... +Privilèges associés : `Gérer les utlisateurs (Sco Users Manage)`, `Changer les +formations (Sco Change Formation)`, ... - d'accéder aux vues enseignant pour le département GEII : -Privilèges associés : `Voir les parties pour les enseignants (Sco View Ens)`, `Saisir des absences (Sco Change Absences)`, ... +Privilèges associés : `Voir les parties pour les enseignants (Sco View Ens)`, +`Saisir des absences (Sco Change Absences)`, ... -Pour une description plus fine des privilèges, voir [ConfigPermissions](ConfigPermissions.md) +Pour une description plus fine des privilèges, voir +[ConfigPermissions](ConfigPermissions.md) ### Opérations et cycle de vie des utilisateurs @@ -57,81 +64,94 @@ Les opérations existantes sont : - la demande de renouvellement de mot de passe; - la désactivation. -Notes: +#### Notes: -- La suppression d'un utilisateur est impossible (nécessité de garder la trace des anciens historiques) -- Le mécanisme de changement de mot de passe de scodoc 7 (par envoi d'un nouveau mot de passe par mail) a été remplacé par -l'ajout de la mention suivante dans le formulaire de connexion : +- La suppression d'un utilisateur est impossible (nécessité de garder la trace + des anciens historiques), mais on peut le rendre inactif (il n'apparait alors + pas dans la liste).) +- Le mécanisme de changement de mot de passe de ScoDoc 7 (par envoi d'un nouveau + mot de passe par mail) a été remplacé par l'ajout de la mention suivante dans + le formulaire de connexion : + ` En cas d'oubli de votre mot de passe cliquez ici pour le réinitialiser. ` #### Création d'un utilisateur (par formulaire) -La création d'un utilisateur peut être faite par un administrateur ou super administrateur. Le lien -`Ajouter un utlisateur`permettant cela se trouve dans la page de gestion des utilisateurs -(accessible par le menu latéral) +La création d'un utilisateur peut être faite par un administrateur ou super +administrateur. Le lien `Ajouter un utlisateur` permettant cela se trouve dans +la page de gestion des utilisateurs (accessible par le menu latéral) **Le mot de passe** peut être -- saisie par le créateur de l'utilisateur (il appartient alors au créateur de communiquer ce mot de passe à l'utilisateur final) -- initialisé à une valeur non communiquée, à charge pour l'utilisateur final de finaliser la création -du mot de passe avant d'utiliser son accès (il y est invité par un email qui lui est envoyé) +- saisi par le créateur de l'utilisateur (il appartient alors au créateur de + communiquer ce mot de passe à l'utilisateur final); +- ou initialisé à une valeur non communiquée, à charge pour l'utilisateur final + de finaliser la création du mot de passe avant d'utiliser son accès (il y est + invité par un email qui lui est envoyé). -**Les options de création (mail)** permettent également de choisir parmi les 3 scenarii suivants : +**Les options de création (mail)** permettent également de choisir parmi les 3 +scenarii suivants : -- Un message d'accueil l'invitant à initialiser son mot de passe ; -- un message de bienvenue simple ; -- aucun message. +1. un message d'accueil l'invitant à initialiser son mot de passe ; +2. un message de bienvenue simple ; +3. aucun message. -Une case à cocher `envoyer un mail d'accueil à l'utlisateur` permete de choisir la troisième option (si décochée), -sinon la case suivante `indiquer par mail de changer le mot de passe initial` permet de choisir entre l'option 1 et l'option 2. +Une case à cocher `envoyer un mail d'accueil à l'utlisateur` permet de choisir +la troisième option (si décochée), sinon la case suivante `indiquer par mail de +changer le mot de passe initial` permet de choisir entre l'option 1 et l'option +2. -Dans tous les cas les mails seront envoyés avec l'adresse de réponse précidée par la valeur de la variable d'environnement -`SCODOC_MAIL_FROM` (par défaut `no-reply@{serveur_mail}`) +Dans tous les cas les mails seront envoyés avec l'adresse de réponse présidée +par la valeur de la variable d'environnement `SCODOC_MAIL_FROM` (par défaut `no-reply@{serveur_mail}`). -**Le département d'appartenance** peut être choisi si le créateur est administrateur pour plusieurs départements. Il aura alors le loisir +**Le département d'appartenance** peut être choisi si le créateur est +administrateur pour plusieurs départements. Il aura alors le loisir de sélectionner l'un des départements qu'il administre (liste déroulante). #### Création en masse (fichier xlsx) -Le super-administrateur (et lui seulement) peut également créer des comptes en masse par téléversement d'un fichier au format .xlsx -par le biais du lien `importer des utilisateurs` de la même page de gestion des utilisateurs. +Le super-administrateur (et lui seulement) peut également créer des comptes en +masse par téléversement d'un fichier au format `.xlsx` par le biais du lien +`importer des utilisateurs` de la même page de gestion des utilisateurs. -La page affichée lui permet d'importer un modèle qu'il doit compléter et re-soumettre à scodoc -selon le même schéma que la saisie de note par fichier excel. +La page affichée lui permet d'importer un modèle qu'il doit compléter et re-soumettre à ScoDoc +selon le même schéma que la saisie de note par fichier Excel. Les colonnes à remplir sont les suivantes : -- user_name: le nom de connexion de l'utilisateur; (obligatoire, unique dans scodoc) -- nom: le nom de l'utilisateur ; (obligatoire) -- prenom: le prénom de l'utilisateur ; (obligatoire) -- email: l'email de l'utilisateur ; (obligatoire, unique dans scodoc) -- roles: le ou les rôles attribués à l'utilisateur séparés par des virgules (exemple `Admin_RT, Ens_GEII`) -- dept: le département de rattachement de l'utilisateur (acronyme, en lettres capitales). +- `user_name`: le nom de connexion de l'utilisateur; (obligatoire, unique dans scodoc) +- `nom`: le nom de l'utilisateur ; (obligatoire) +- `prenom`: le prénom de l'utilisateur ; (obligatoire) +- `email`: l'email de l'utilisateur ; (obligatoire, unique dans scodoc) +- `roles`: le ou les rôles attribués à l'utilisateur séparés par des virgules (exemple `Admin_RT, Ens_GEII`) +- `dept`: le département de rattachement de l'utilisateur (acronyme, en lettres capitales). _Note_: -- Tous les utilisateurs sont créés ou aucun +- Tous les utilisateurs sont créés ou bien aucun. - Un mail est envoyé à chaque utilisateur nouvellement créé. #### Changement du mot de passe -Deux circonstances sont envisagées +Deux circonstances sont envisagées. ##### Oubli de mot de passe -Lorsqu'un utilisateur a perdu son mot de passe, il a maintenant la possibilité de retrouver son accès -sans intervention d'un administrateur. Il lui suffit de demander la réinitialisation par le lien situé -sur la page de connexion. Après renseignement de son email (qui est maintenant identifiant dans scodoc), -un mail lui est envoyé. ce mail contient un lien comportant un jeton à durée limitée. Ce lien renvoie -vers la page permettant de redéfinir le mot de passe de l'utilisateur. +Lorsqu'un utilisateur a perdu son mot de passe, il a la possibilité de retrouver +son accès sans intervention d'un administrateur. Il lui suffit de demander la +réinitialisation par le lien situé sur la page de connexion. Après renseignement +de son email (qui est maintenant identifiant dans scodoc), un mail lui est +envoyé. ce mail contient un lien comportant un jeton à durée limitée. Ce lien +renvoie vers la page permettant de redéfinir le mot de passe de l'utilisateur. ##### Edition du profil -Si l'utilisateur peut se connecter, il peut éditer son profil (et par là, modifier son email et/ou son mot de passe). -La barre latérale de l'écran principal de scodoc affiche dans le coin supérieur gauche la version courante de scodoc -ainsi que l'identification de l'utlisateur actuel. Un clic sur le nom permet à l'utilsateur -d'éditer son profil. +Si l'utilisateur peut se connecter, il peut éditer son profil (et par là, +modifier son email et/ou son mot de passe). La barre latérale de l'écran +principal de scodoc affiche dans le coin supérieur gauche la version courante de +scodoc ainsi que l'identification de l'utilisateur actuel. Un clic sur le nom +permet à l'utilsateur d'éditer son profil. #### Activation/désactivation @@ -140,20 +160,24 @@ Une fois créé, le compte utilisateur conserve son existence. Il peut cependant - soit à l'expiration de la date de validité spécifiée à la création ou lors d'un modification - soit directement par un administrateur. -Quelquesoit la procédure, le compte existe encore et conserve son email (il n'est donc pas possible de créer -un nouveau compte associé au même email). Il est simplement impossible de se connecter ou de modifier -le profil de ce compte par l'utlisateur lui-même. +Quelle que soit la procédure, le compte existe encore et conserve son email (il +n'est donc pas possible de créer un nouveau compte associé au même email). Il +est simplement impossible de se connecter ou de modifier le profil de ce compte +par l'utilisateur lui-même. ### Implémentation (pour les développeurs) -Le graphe d'état ci-dessous explilcite les différents états que peux prendre un compte utilisateur -en fonction des opérations qu'il subit. +Le graphe d'état ci-dessous explicite les différents états que peux prendre un +compte utilisateur en fonction des opérations qu'il subit. On notera: -1. Que la création (1) peut le placer initialement dans deux états différents selon le mode de création choisi. -2. Que l'on peut demander le renouvellement du mot de passe plusieurs fois même sans avoir complété la procédure -3. Que les états `créé`et `créé + ticket`permettent la connexion (sous réserve de la connaisssance du mot de passe). +1. Que la création (1) peut le placer initialement dans deux états différents + selon le mode de création choisi. +2. Que l'on peut demander le renouvellement du mot de passe plusieurs fois même + sans avoir complété la procédure. +3. Que les états `créé`et `créé + ticket`permettent la connexion (sous réserve + de la connaissance du mot de passe). @@ -183,7 +207,9 @@ La table **user** contient: -/!\ encodage `utf-8`, sauf si vous avez modifié l'installation. + encodage `utf-8`, sauf si vous avez modifié l'installation. -Pour la signification des rôles et l'utilisation du département, voir [ConfigPermissions](ConfigPermissions.md). +Pour la signification des rôles et l'utilisation du département, voir +[ConfigPermissions](ConfigPermissions.md). From 9208bac8c9574bf11824b900e27be35e54532392 Mon Sep 17 00:00:00 2001 From: viennet Date: Sat, 12 Feb 2022 12:02:21 +0100 Subject: [PATCH 10/24] Note sur les caches --- docs/Internals.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/Internals.md b/docs/Internals.md index 9888e8e..15516c7 100644 --- a/docs/Internals.md +++ b/docs/Internals.md @@ -25,8 +25,7 @@ l'ORM SQLAlchemy (recommandé pour tout nouveau code). Les modèles correspondant sont déclarés dans `/opt/scodoc/app/models/`. -Principales classes (le nom de certaines classes Python est donné en -`CaractèresCommeCa`). +Principales classes (les noms des classes Python sont en `CamelCase`). - Étudiants (classe `Identite`): nom, codes INE/NIP, etc - Formations: programmes pédagogiques, contenant @@ -72,4 +71,20 @@ def un_exemple(): formation=formation, ... # etc ) -``` \ No newline at end of file +``` + +# Caches + +Il est bon de savoir que les requêtes SQL de SQLAlchemy ne sont pas cachées: ni +la requête elle même (construction du SQL à partir des appels à l'ORM), ni son +résultat. + +Le module `sco_cache.py` offre la possibilité de cacher des objets python +identifiés par un id unique dans le cache Redis. Ce cache est persistant, il +faut donc invalider les objets quand on écrit des données susceptibles de les +modifier, et penser à le vider quand on modifie le code. +Par exemple: +``` + git pull + flask clear-cache +``` From c56bf80abf6f24df509e158d85255d0f802abdca Mon Sep 17 00:00:00 2001 From: Jean-Marie PLACE Date: Sun, 13 Feb 2022 14:56:40 +0100 Subject: [PATCH 11/24] mention du reglage de SCODOC_MAIL_FROM par le .env --- docs/AdminUsers.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/AdminUsers.md b/docs/AdminUsers.md index f20099f..a639c9f 100644 --- a/docs/AdminUsers.md +++ b/docs/AdminUsers.md @@ -102,8 +102,12 @@ la troisième option (si décochée), sinon la case suivante `indiquer par mail changer le mot de passe initial` permet de choisir entre l'option 1 et l'option 2. -Dans tous les cas les mails seront envoyés avec l'adresse de réponse présidée -par la valeur de la variable d'environnement `SCODOC_MAIL_FROM` (par défaut `no-reply@{serveur_mail}`). +Dans tous les cas les mails seront envoyés avec l'adresse de réponse précidée par la valeur de la variable d'environnement +`SCODOC_MAIL_FROM` (par défaut `no-reply@{serveur_mail}`). Cette variable peut être initialisée dans le fichier .env par exemple avec la ligne: + +```bash +SCODOC_MAIL_FROM=no-reply@univ-exemple.fr +``` **Le département d'appartenance** peut être choisi si le créateur est administrateur pour plusieurs départements. Il aura alors le loisir From 348d8419513e247bf68376c6f849b14203594966 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 13 Feb 2022 15:16:39 +0100 Subject: [PATCH 12/24] =?UTF-8?q?Mise=20=C3=A0=20jour=20liste=20commandes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/GuideConfig.md | 64 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/docs/GuideConfig.md b/docs/GuideConfig.md index 7eee76d..42fb369 100644 --- a/docs/GuideConfig.md +++ b/docs/GuideConfig.md @@ -131,12 +131,17 @@ Exemple: ## Liste des commandes Flask/ScoDoc ``` +Usage: app [OPTIONS] COMMAND [ARGS]... + +Options: + --help Show this message and exit. + Commands: clear-cache Clear ScoDoc cache This cache (currently... create-dept Create new departement create-role Create a new role - delete-role Delete a role delete-dept Delete existing departement + delete-role Delete a role dumphelp edit-role Add [-a] and/or remove [-r] a permission... import-scodoc7-dept Import département ScoDoc 7: dept:... @@ -151,7 +156,8 @@ Commands: scodoc-database print the database connexion string user-create Create a new user user-db-clear Erase all users and roles from the... - user-password Set (or change) user's password + user-delete Try to delete this user. + user-password Set (or change) user’s password user-role Add or remove a role to the given user... Usage: app sco-db-init [OPTIONS] @@ -161,14 +167,12 @@ Usage: app sco-db-init [OPTIONS] Options: --erase / --no-erase - --help Show this message and exit. Usage: app user-db-clear [OPTIONS] Erase all users and roles from the database ! -Options: - --help Show this message and exit. + Usage: app user-create [OPTIONS] USERNAME ROLE DEPT @@ -177,22 +181,23 @@ Usage: app user-create [OPTIONS] USERNAME ROLE DEPT Options: -n, --nom TEXT -p, --prenom TEXT - --help Show this message and exit. + +Usage: app user-delete [OPTIONS] USERNAME + + Try to delete this user. Fails if it’s associated to some scodoc objects. + Usage: app user-password [OPTIONS] USERNAME - Set (or change) user's password + Set (or change) user’s password Options: --password TEXT - --help Show this message and exit. Usage: app create-role [OPTIONS] ROLENAME [PERMISSIONS]... Create a new role -Options: - --help Show this message and exit. Usage: app edit-role [OPTIONS] ROLENAME @@ -205,7 +210,13 @@ Usage: app edit-role [OPTIONS] ROLENAME Options: -a, --add TEXT -r, --remove TEXT - --help Show this message and exit. + +Usage: app delete-role [OPTIONS] ROLENAME + + Delete a role + +Options: + --help Show this message and exit. Usage: app user-role [OPTIONS] USERNAME @@ -222,22 +233,20 @@ Usage: app delete-dept [OPTIONS] DEPT Delete existing departement Options: + --yes --help Show this message and exit. Usage: app create-dept [OPTIONS] DEPT Create new departement -Options: - --help Show this message and exit. Usage: app list-depts [OPTIONS] [DEPTS]... If dept exists, print it, else nothing. Called without arguments, list all depts along with their ids. -Options: - --help Show this message and exit. + Usage: app scodoc-database [OPTIONS] @@ -246,7 +255,7 @@ Usage: app scodoc-database [OPTIONS] Options: -n, --name show database name instead of connexion string (required for dropdb/createdb commands) - --help Show this message and exit. + Usage: app import-scodoc7-users [OPTIONS] @@ -255,54 +264,43 @@ Usage: app import-scodoc7-users [OPTIONS] script is typically run as unix user "scodoc". The original SCOUSERS database is left unmodified. -Options: - --help Show this message and exit. Usage: app import-scodoc7-dept [OPTIONS] DEPT DEPT_DB_NAME Import département ScoDoc 7: dept: InfoComm, dept_db_name: SCOINFOCOMM -Options: - --help Show this message and exit. Usage: app migrate-scodoc7-dept-archives [OPTIONS] [DEPT] Post-migration: renomme les archives en fonction des id de ScoDoc 9 -Options: - --help Show this message and exit. Usage: app migrate-scodoc7-dept-logos [OPTIONS] [DEPT] Post-migration: renomme les logos en fonction des id / dept de ScoDoc 9 -Options: - --help Show this message and exit. Usage: app localize-logo [OPTIONS] LOGO DEPT Make local to a dept a global logo (both logo and dept names are mandatory) -Options: - --help Show this message and exit. Usage: app photos-import-files [OPTIONS] FORMSEMESTRE_ID XLSFILE ZIPFILE -Options: - --help Show this message and exit. + Import des photos d’étudiants à partir d’une liste excel et d’un zip avec les images. Usage: app clear-cache [OPTIONS] Clear ScoDoc cache This cache (currently Redis) is persistent between - invocation and it may be necessary to clear it during development or tests. + invocation and it may be necessary to clear it during upgrades, development + or tests. Options: - --help Show this message and exit. + --sanitize / --no-sanitize Usage: app dumphelp [OPTIONS] -Options: - --help Show this message and exit. + Génère la page d’aide complète pour la doc. Usage: app profile [OPTIONS] @@ -316,6 +314,8 @@ Options: --help Show this message and exit. ``` +(*la liste ci-dessus est générée à l'aide de la commande* `flask dumphelp`). + ## Changement des logos apparaissant sur les documents *Note: après migration, vos logos de ScoDoc 7 sont installés dans ScoDoc 9*. From 46dccc6ba02cd0c19c875ce8debdee9d36f5ef9d Mon Sep 17 00:00:00 2001 From: Jean-Marie PLACE Date: Sat, 26 Feb 2022 14:34:52 +0100 Subject: [PATCH 13/24] mise a jour doc fond de page --- docs/GestionLogos.md | 29 +++++++++++++++++++++++++++++ docs/GuideAdminSys.md | 1 + docs/ParametrageBulletins.md | 4 +++- docs/ParametragePV.md | 14 +++++++++++++- 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 docs/GestionLogos.md diff --git a/docs/GestionLogos.md b/docs/GestionLogos.md new file mode 100644 index 0000000..5461c51 --- /dev/null +++ b/docs/GestionLogos.md @@ -0,0 +1,29 @@ + +# Gestions des logos et fonds de documents + +Les images (logos et fonds de document) sont enregistrées dans le répertoire `/opt/scodoc-data/config/logos` et ses sous-répertoires. + +Normalement, l'administrateur n'a pas besoin d'intervenir dans ces répertoires, la totalité des opérations nécessaires +pouvant être réalisées par le menu de configuration des logos. + +Les images ajoutées par les utilisateurs ont toutes un nom de la forme `logo_.png` ou `logo_.jpg` +(`` représente le nom d'usage du logo : header, footer, signature, ... au choix de l'utilsateur) +Les sous-répertoires ont des noms de la forme `logos_` où `` est l'identifant numérique du département +(la commande `flask list-depts` donne la correspondance cf. [Administration en ligne de commande](GuideConfig.md)). + +Les fonds de page se distinguent uniquement des logos par leur nom (`` peut être soit `jpg`ou `png`) : + +| Document | nom | fichier | +|----------------------------------|-------------------------|--------------------------------| +| pv de jury | pvjury_background | `logo_pvjury_background.` | +| bulletin de note | letter_background | `logo_letter_background.` | +| lettre individuelle de décision | letter_background | `logo_letter_background.` | + +## héritage scodoc7 + +Les serveurs scodoc7 utilisaient pour les fonds de page, des fichiers de nom `letter_background.` et `pvjury_background.`. +Lors de la migration depuis scodoc7, ces fichiers ont placés dans le même répertoire que les images scodoc9. +Pour assurer la compatibilité ascendante, +leur présence est exceptionnellement prise en compte. Bien evidement, si un fichier scodoc9 (donc avec le préfixe `logo_`) est présent, +il est prioritaire sur le fond de page "historique" + diff --git a/docs/GuideAdminSys.md b/docs/GuideAdminSys.md index 4d42fdc..882997f 100644 --- a/docs/GuideAdminSys.md +++ b/docs/GuideAdminSys.md @@ -29,6 +29,7 @@ référer à [GuideInstallDebianDix](GuideInstallDebianDix.md) ou ## Autres problèmes * [Problèmes configuration des envois mail](ProblemesMail.md) + * [Gestion des logos et fonds de documents](GestionLogos.md) * [ProblemesEtBugs](ProblemesEtBugs.md) en cas d'ennuis. ## Utilisation avancée diff --git a/docs/ParametrageBulletins.md b/docs/ParametrageBulletins.md index 2c1f514..90099ed 100644 --- a/docs/ParametrageBulletins.md +++ b/docs/ParametrageBulletins.md @@ -31,7 +31,6 @@ Toutes les préférences pour le semestre considéré (ou définies globalement) Voir la liste complète sur [NomsPreferences](NomsPreferences.md). - ### Informations sur le semestre Variable | Valeur ---------|------- @@ -134,6 +133,9 @@ Notez qu'il est possible de ne préciser que l'une des deux dimensions hauteur o Dans ce cas, la dimension manquante est déduite du ratio (rapport hauteur/largeur) de l'image originale. Voir un exemple d'utilisation plus bas. +### Fond de page. +Les modalités d'utilisation des fonds de pages sont similaires pour les PV, les lettres individuelles de décision et les bulletins. +Celles-ci sont décrites ici: [Paramètrage des PV. Images de fond de page](/ParametragePV) ## Exemples ### Exemple 1: Bulletins par défaut diff --git a/docs/ParametragePV.md b/docs/ParametragePV.md index 6b53191..9a6ace8 100644 --- a/docs/ParametragePV.md +++ b/docs/ParametragePV.md @@ -10,6 +10,18 @@ Le PV de jury est en format paysage et liste les résultats des étudiants chois ## Image de fond de page (logos, tête, pied) L'exemple ci-dessus utilise une image de fond qui contient l'en-tête et le pied de page, avec des logos. Il faut fournir à ScoDoc une image de fond. Le plus simple est généralement de la composer dans un logiciel de traitement de texte, et de l'enregistrer en image: exporter en PDF puis convertir le PDF en image PNG ou JPEG de bonne résolution (300dpi , par exemple avec un logiciel comme Aperçu sur Mac. +L'image obtenue peut ensuite être téléversée sur le serveur de la même façon que pour un simple logo +(voir la section [paramètrage des bulletins, section Logos](ParametrageBulletins.md) +avec le nom "`pvjury_background`" ou "`letter_background`" selon le type de document visé. + +Il ne reste plus qu'à activer l'option correspondante soit globalement dans le paramètrage du département, soit (pour les bulletins) dans par le menu réglage bulletin du semestre (qui a précédence): +- Mettre l'image de fond sur les PV de jury (paysage) +- Mettre l'image de fond sur les bulletins +- Mettre l'image de fond sur les lettres individuelles de décision + +Note pour les serveurs migrés depuis scodoc7: +Les anciennes configurations ayant suivi la migration depuis scodoc7 sont encore fonctionnelles. + L'image doit ensuite être enregistrée sur le serveur à un emplacement spécifique (seul l'administrateur du serveur peut faire cela): - Pour les PV de jury (A4 paysage), sous le chemin `/opt/scodoc/var/scodoc/config/logos/pvjury_background.png` @@ -33,7 +45,7 @@ Les paragraphes de texte utilisent un balisage identique à celui des bulletins ScoDoc génère un docuement PDF contenant les letters de tous les étudiants du semestre ou d'un groupe. -Le principe est le même, mais on fournit une trame de fond au format portrait, come indiqué plus haut. Le texte de la lettre est configurable dans les préférences. +Le principe est le même, mais on fournit une trame de fond au format portrait, comme indiqué plus haut. Le texte de la lettre est configurable dans les préférences. From df44c23d7812abf7f65ab31ed03c6674cb051b41 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 27 Feb 2022 09:19:20 +0100 Subject: [PATCH 14/24] =?UTF-8?q?Mise=20=C3=A0=20jour=20doc=20logos,=20doc?= =?UTF-8?q?uments,=20PV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/FAQ.md | 16 ++---- docs/GestionJury.md | 5 +- docs/GestionLogos.md | 47 +++++++++++++----- docs/GuideConfig.md | 30 ++++-------- docs/GuideConfig7.md | 94 ------------------------------------ docs/ParametrageBulletins.md | 17 ++++--- docs/ParametragePV.md | 36 ++++++++------ 7 files changed, 80 insertions(+), 165 deletions(-) delete mode 100644 docs/GuideConfig7.md diff --git a/docs/FAQ.md b/docs/FAQ.md index 4f14ef8..a6b34c0 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -110,19 +110,9 @@ garantie. Mais nous faisons de notre mieux: ## Configuration ### Comment changer les logos sur les documents PDF (PV...) - -Il faut (pour l'instant) être administrateur sur le serveur ScoDoc, et passer -par l'onglet "configuration" accessible aux admins sur la page d'accueil. - -Les logos sont stockés dans le répertoire `/opt/scodoc-data/config/logos/` et -doivent être des images JPEG (extension `.jpg`). Il faut aussi indiquer les -tailles des images dans le fichier de configuration `config/scodoc_config.py`, -variable `CONFIG.LOGO_FOOTER_HEIGHT` etc. - - * Sur les PV, `logo_header.jpg` est affiché en haut, et `logo_header.jpg` en bas de la page. - * Sur les bulletins de notes, c'est configurable (et on peut utiliser d'autres - logos), voir [ParametrageBulletins](ParametrageBulletins.md) - +Il faut avoir un compte (web) administrateur sur ScoDoc, et passer +par l'onglet "configuration" accessible sur la page d'accueil. +Voir [la page sur la gestion des logos et images ](GestionLogos.md). ### Administration diff --git a/docs/GestionJury.md b/docs/GestionJury.md index ab14f4e..0fd3e99 100644 --- a/docs/GestionJury.md +++ b/docs/GestionJury.md @@ -115,9 +115,8 @@ pour un semestre de formation. Il s'agit d'un document PDF en format paysage, à imprimer sur papier ordinaire A4. -Les logos (IUT en haut, université en pied de page) ne sont actuellement pas -paramétrables par l'utilisateur (il faut installer les images dans le sous-répertoire -`logos` du logiciel). +Les logos (IUT en haut, université en pied de page) sont +paramétrables par l'utilisateur: voir [configuration des logos](GestionLogos.md). ### Lettres d'avis individuelles diff --git a/docs/GestionLogos.md b/docs/GestionLogos.md index 5461c51..f806d81 100644 --- a/docs/GestionLogos.md +++ b/docs/GestionLogos.md @@ -1,29 +1,50 @@ # Gestions des logos et fonds de documents +Images (logos ou autre) à afficher sur des documents PDF générés par ScoDoc: + + * Sur les PV, `logo_header.jpg` est affiché en haut, et `logo_header.jpg` en bas de la page. + * Sur les bulletins de notes, c'est configurable (et on peut utiliser d'autres + logos), voir [ParametrageBulletins](ParametrageBulletins.md) + * Fonds de page: charger une image nommée `pvjury_background` pour les PV de + jury (en format paysage) ou `letter_background`pour les bulletins et lettres + de jury (en format portrait). Voir [paramétrage des PV](ParametragePV.md). + + +## Informations techniques pour les développeurs et administrateurs curieux. + +Normalement, l'administrateur n'a pas besoin d'intervenir dans les répertoires +mentionnés ci-dessous (sauf pour veiller à ce que `/opt/scodoc-data` soit bien +sauvegardé ou transféré lors des migrations). + +La totalité des opérations nécessaires à l'utilisation de ScoDoc peuvent être +réalisées par le menu de configuration des logos. + +### Fichiers et répertoires associés aux logos + Les images (logos et fonds de document) sont enregistrées dans le répertoire `/opt/scodoc-data/config/logos` et ses sous-répertoires. -Normalement, l'administrateur n'a pas besoin d'intervenir dans ces répertoires, la totalité des opérations nécessaires -pouvant être réalisées par le menu de configuration des logos. - Les images ajoutées par les utilisateurs ont toutes un nom de la forme `logo_.png` ou `logo_.jpg` -(`` représente le nom d'usage du logo : header, footer, signature, ... au choix de l'utilsateur) -Les sous-répertoires ont des noms de la forme `logos_` où `` est l'identifant numérique du département +(`` représente le nom d'usage du logo : *header*, *footer*, signature, ... au choix de l'utilisateur) +Les sous-répertoires ont des noms de la forme `logos_` où `` est +l'identifiant numérique du département (la commande `flask list-depts` donne la correspondance cf. [Administration en ligne de commande](GuideConfig.md)). -Les fonds de page se distinguent uniquement des logos par leur nom (`` peut être soit `jpg`ou `png`) : +Les **fonds de page** se distinguent uniquement des logos par leur nom (`` peut être soit `jpg`ou `png`) : | Document | nom | fichier | |----------------------------------|-------------------------|--------------------------------| -| pv de jury | pvjury_background | `logo_pvjury_background.` | +| PV de jury | pvjury_background | `logo_pvjury_background.` | | bulletin de note | letter_background | `logo_letter_background.` | | lettre individuelle de décision | letter_background | `logo_letter_background.` | -## héritage scodoc7 +### Note: héritage scodoc7 -Les serveurs scodoc7 utilisaient pour les fonds de page, des fichiers de nom `letter_background.` et `pvjury_background.`. -Lors de la migration depuis scodoc7, ces fichiers ont placés dans le même répertoire que les images scodoc9. -Pour assurer la compatibilité ascendante, -leur présence est exceptionnellement prise en compte. Bien evidement, si un fichier scodoc9 (donc avec le préfixe `logo_`) est présent, -il est prioritaire sur le fond de page "historique" +Les serveurs ScoDoc 7 utilisaient pour les fonds de page, des fichiers de nom +`letter_background.` et `pvjury_background.`. Lors de la migration +depuis ScoDoc 7, ces fichiers ont placés dans le même répertoire que les images +scodoc9. Pour assurer la compatibilité ascendante, leur présence est +exceptionnellement prise en compte. Bien évidemment, si un fichier scodoc9 (donc +avec le préfixe `logo_`) est présent, il est prioritaire sur le fond de page +"historique". diff --git a/docs/GuideConfig.md b/docs/GuideConfig.md index 42fb369..0e4e46e 100644 --- a/docs/GuideConfig.md +++ b/docs/GuideConfig.md @@ -2,8 +2,7 @@ # Prise en main et paramétrage de ScoDoc 9 /!\ Cette -page concerne la version ScoDoc 9, distribuée à partir de septembre 2021. Pour l'ancienne -version, voir [cette page](GuideConfig7.md). +page concerne la version ScoDoc 9, distribuée à partir de septembre 2021. Ce document suppose que le logiciel a été installé suivant la procédure décrite dans [GuideInstallDebian11](GuideInstallDebian11.md). @@ -48,7 +47,7 @@ immédiatement après la création. ## Création d'un utilisateur Cette opération s'effectue en général depuis le logiciel, via un formulaire -ou un import excel. Pour créer un utilisateur depuis le terminal, lancer: +ou un import Excel. Pour créer un utilisateur depuis le terminal, lancer: flask user-create LOGIN ROLE DEPT @@ -78,7 +77,7 @@ sur la ligne de commande. flask create-role role_name [permissions...] -Exemple: création d'une rôle "Observateur" ayant juste la persmision de "voir": +Exemple: création d'une rôle "Observateur" ayant juste la permission de "voir": flask create-role Observateur ScoView @@ -322,29 +321,18 @@ Options: Les documents PDF (PV de jurys...) incluent les logos de l'établissement. Par défaut, ceux de l'IUT de Villetaneuse et de l'Université Paris 13 sont -distribués. Pour les changer, placer vos logos (fichiers images JPEG ou PNG) -dans le répertoire +distribués. [Pour les changer, voir la FAQ](/FAQ/#comment-changer-les-logos-sur-les-documents-pdf-pv) + +Si vous êtes administrateur système, vous pouvez aussi placer vos images (fichiers JPEG ou PNG) +dans le répertoire /opt/scodoc-data/config/logos -avec les noms `logo_header.jpg` (habituellement le logo de votre composante) -et `logo_footer.jpg` (habituellement le logo de votre université ou école). - -On peut fournir des logos par département en créant des sous-répertoires +On peut fournir des images (logos, fond de pages) par département en créant des sous-répertoires /opt/scodoc-data/config/logos/logo_/ -pour y placer les fichiers images `logo_header.jpg` et `logo_footer.jpg`. - - - -Enfin, redémarrez ScoDoc après avoir vidé les caches: +Après quoi, redémarrez ScoDoc après avoir vidé les caches: flask clear-cache sudo systemctl restart scodoc9 diff --git a/docs/GuideConfig7.md b/docs/GuideConfig7.md deleted file mode 100644 index fadde4d..0000000 --- a/docs/GuideConfig7.md +++ /dev/null @@ -1,94 +0,0 @@ - -# Prise en main et paramétrage de ScoDoc 7 - -/!\ Cette page -concerne la version ScoDoc 7, et ne s'applique pas à la version ScoDoc 9 distribuée à partir de septembre 2021. -Pour ScoDoc 9, voir [cette page](GuideConfig.md). - -Ce document suppose que le ScoDOc 7 a été installé suivant la procédure décrite dans [GuideInstallDebianDix](GuideInstallDebianDix.md). - - - -## Procédure à suivre pour créer un département et son utilisateur administrateur - * Connectez-vous au site: `https://votre.site.fr/` - - -Vous allez voir la page d'accueil de ScoDoc (il est possible que votre -navigateur vous demande d'accepter un certificat). - -Il n'y a pas de "département défini": c'est normal, lors de l'installation nous -avons créé des bases de données, mais pas les interfaces web. - - * Suivez le lien *Identifiez vous comme administrateur*. L'utilisateur *admin* - est administrateur et a tous les droits sur !ScoDoc. C'est le seul à pouvoir - créer un nouveau département. - -Le logiciel va vous demander de changer immédiatement le mot de passe administrateur. -Entrez l'identifiant et le mot de passe définis pendant l'installation. - -Après vous être identifié sur la page d'accueil ScoDoc, vous avez maintenant un -lien 'Administration de ScoDoc' qui vous permet d'ajouter un département, puis des utilisateurs. - - * Ajouter un département (donnez le nom du département créé pendant l'installation) - - * Ajouter un administrateur pour votre département: lien "Utilisateurs" (marge - de gauche), puis suivre "ajouter un utilisateur". Donner à ce nouvel - utilisateur les rôles `Admin`, `Ens` et `Secr` afin qu'il puisse effectuer - toutes les opérations. - -Quittez votre navigateur et reconnectez vous à ScoDoc avec votre nouvel utilisateur. - -Vous pouvez si nécessaire créer plusieurs administrateurs par département (il -est préférable que chaque compte ne soit utilisé que par une seule personne, -pour éviter de divulguer les mots de passe et mieux suivre les opérations). - - Surtout, évitez de travailler comme "admin": cet utilisateur doit -être réservé à la création de départements. Prenez le temps de créer un -utilisateur "chef de département !". - - - -## Changement des logos apparaissant sur les documents -Les documents PDF (PV de jurys...) incluent les logos de l'établissement. Par -défaut, ceux de l'IUT de Villetaneuse et de l'Université Paris 13 sont -distribués (ce n'est pas bien, ils ne sont sans doute pas sous licence libre !). -Pour les changer, placer vos logos (fichiers images JPEG ou PNG) dans le -répertoire -``` -/opt/scodoc-data/config/logos -``` -(en ScoDoc 7, c'était `/opt/scodoc/var/scodoc/config/logos`) - -avec les noms `logo_header.jpg` (habituellement le logo de votre composante, -mais faites comme vous voulez) et `logo_footer.jpg` (habituellement le logo de -votre Université ou école). - -Ensuite, éditez le fichier -``` -/opt/scodoc-data/config/scodoc_local.py -``` -(le créer s'il n'existe pas). -Ce fichier doit contenir un dictionnaire sous la forme suivante: -``` -CONFIG = { - # Taille du l'image logo: largeur/hauteur - # W/H - CONFIG.LOGO_FOOTER_ASPECT = 326 / 96.0 - # Taille dans le document en millimetres - CONFIG.LOGO_FOOTER_HEIGHT = 10 - # Proportions logo (donné ici pour IUTV) - CONFIG.LOGO_HEADER_ASPECT = 549 / 346.0 - # Taille verticale dans le document en millimetres - CONFIG.LOGO_HEADER_HEIGHT = 28 - ... autres variables de configuration locale -} -``` - -Adaptez les valeurs des variables `LOGO_FOOTER_ASPECT` et suivantes à votre cas -(ce n'est pas pratique, il faudrait modifier le code ScoDoc pour calculer ces -valeurs à partir des fichiers images). - - -Enfin, redémarrez ScoDoc (`/etc/init.d/scodoc start`). - diff --git a/docs/ParametrageBulletins.md b/docs/ParametrageBulletins.md index 90099ed..c9f10e1 100644 --- a/docs/ParametrageBulletins.md +++ b/docs/ParametrageBulletins.md @@ -60,7 +60,7 @@ descr_demission || "Démission le 01/02/2000" ou vide si pas de démissio decision_jury || "Validé", "Ajourné", ... (code semestre descr_decision_jury| "Décision jury: Validé" (une phrase decisions_ue || noms (acronymes) des UE validées, séparées par des virgules. -descr_decisions_ue|| " UE acquises: UE1, UE2", ou vide si pas de dec. ou paramètrage +descr_decisions_ue|| " UE acquises: UE1, UE2", ou vide si pas de dec. ou paramétrage mention| Mention, calculée d'après la moyenne générale | **Absences:** | @@ -95,16 +95,19 @@ Le balisage XML est celui de [ReportLab](http://www.reportlab.com/) (intra-parag ### Logos Une balise supplémentaire est interprétée par ScoDoc pour insérer des logos (images). -Les logos sont des images au format JPEG (extension `.jpg` ou `.jpeg`) ou PNG (expension `.png`), téléversés sur le serveur scodoc et intégrables dans les documents html ou pdf. +Les logos sont des images au format JPEG (extension `.jpg` ou `.jpeg`) ou PNG +(extension `.png`), téléversés sur le serveur scodoc et intégrables dans les +documents PDF. [Plus d'information sur la gestion des logos ici](GestionLogos.md). Principes généraux : * Un logo est désigné par un identifiant (nom) et peut être défini soit globalement, soit pour un département; -* le nom d'un logo est exclusiement composé de caractères alphanumériques ou du caractère '`-`'; +* le nom d'un logo est exclusivement composé de caractères alphanumériques ou du caractère '`-`'; -* les logos définis globalement sont accessibles pour tous les départements. Toutefois, si un logo de même nom est également présent dans un département, -, c'est le logo du département qui sera utilisé en lieu et place de logo global; +* les logos définis globalement sont accessibles pour tous les départements. +Toutefois, si un logo de même nom est également présent dans un département, +c'est le logo du département qui sera utilisé en lieu et place de logo global; * les logos de nom '`header`' et '`footer`' définis globalement ne peuvent être supprimés (mais peuvent être redéfinis). @@ -115,7 +118,7 @@ Ce formulaire comporte une section pour les définitions globales plus une secti Une section présente la liste des logos avec leurs propriétés (la dimension est donnée à titre indicatif quand elle est disponible). -Pour chaque logo, les actions diponibles sont : +Pour chaque logo, les actions disponibles sont : * Le remplacement de l'image existante par un nouveau fichier ; @@ -135,7 +138,7 @@ Voir un exemple d'utilisation plus bas. ### Fond de page. Les modalités d'utilisation des fonds de pages sont similaires pour les PV, les lettres individuelles de décision et les bulletins. -Celles-ci sont décrites ici: [Paramètrage des PV. Images de fond de page](/ParametragePV) +Celles-ci sont décrites ici: [Paramétrage des PV. Images de fond de page](ParametragePV.md) ## Exemples ### Exemple 1: Bulletins par défaut diff --git a/docs/ParametragePV.md b/docs/ParametragePV.md index 9a6ace8..d4beba5 100644 --- a/docs/ParametragePV.md +++ b/docs/ParametragePV.md @@ -11,25 +11,31 @@ Le PV de jury est en format paysage et liste les résultats des étudiants chois L'exemple ci-dessus utilise une image de fond qui contient l'en-tête et le pied de page, avec des logos. Il faut fournir à ScoDoc une image de fond. Le plus simple est généralement de la composer dans un logiciel de traitement de texte, et de l'enregistrer en image: exporter en PDF puis convertir le PDF en image PNG ou JPEG de bonne résolution (300dpi , par exemple avec un logiciel comme Aperçu sur Mac. L'image obtenue peut ensuite être téléversée sur le serveur de la même façon que pour un simple logo -(voir la section [paramètrage des bulletins, section Logos](ParametrageBulletins.md) +(voir la section [paramétrage des bulletins, section Logos](ParametrageBulletins.md) avec le nom "`pvjury_background`" ou "`letter_background`" selon le type de document visé. -Il ne reste plus qu'à activer l'option correspondante soit globalement dans le paramètrage du département, soit (pour les bulletins) dans par le menu réglage bulletin du semestre (qui a précédence): -- Mettre l'image de fond sur les PV de jury (paysage) -- Mettre l'image de fond sur les bulletins -- Mettre l'image de fond sur les lettres individuelles de décision +Il ne reste plus qu'à activer l'option correspondante soit globalement dans le +paramétrage du département, soit (pour les bulletins) dans par le menu réglage +bulletin du semestre (qui a priorité): -Note pour les serveurs migrés depuis scodoc7: -Les anciennes configurations ayant suivi la migration depuis scodoc7 sont encore fonctionnelles. + - Mettre l'image de fond sur les PV de jury (paysage) + - Mettre l'image de fond sur les bulletins + - Mettre l'image de fond sur les lettres individuelles de décision -L'image doit ensuite être enregistrée sur le serveur à un emplacement spécifique (seul l'administrateur du serveur peut faire cela): +**Note** : pour les serveurs migrés depuis ScoDoc 7, les anciennes +configurations sont normalement reprises automatiquement. - - Pour les PV de jury (A4 paysage), sous le chemin `/opt/scodoc/var/scodoc/config/logos/pvjury_background.png` - - Pour les lettres individuelles (format A4 portrait), sous `/opt/scodoc/var/scodoc/config/logos/letter_background.png` +L'image doit ensuite être enregistrée sur le serveur à un emplacement spécifique +(seul l'administrateur du serveur peut faire cela): [voir la page sur la +configuration les images](GestionLogos.md). -Ne pas oublier d'activer l'option *"Mettre l'image de fond sur les PV de jury"* dans les [paramètres du département](PreferencesScoDoc.md). +Ne pas oublier d'activer l'option *"Mettre l'image de fond sur les PV de jury"* +dans les [paramètres du département](PreferencesScoDoc.md). -**Note :** on peut aussi ajouter les logos séparément, mais il est plus commode de fournir une trame de fond complète. Voir [ici](GuideConfig/#changement-des-logos-apparaissant-sur-les-documents) si besoin. +**Note :** on peut aussi ajouter les logos séparément, mais il est souvent plus +commode de fournir une trame de fond complète. Voir +[ici](GuideConfig/#changement-des-logos-apparaissant-sur-les-documents) si +besoin. ## PV de Jury: textes, marges et autres paramètres @@ -43,9 +49,11 @@ Les paragraphes de texte utilisent un balisage identique à celui des bulletins ## Lettres individuelles -ScoDoc génère un docuement PDF contenant les letters de tous les étudiants du semestre ou d'un groupe. +ScoDoc génère un document PDF contenant les lettres de tous les étudiants du semestre ou d'un groupe. -Le principe est le même, mais on fournit une trame de fond au format portrait, comme indiqué plus haut. Le texte de la lettre est configurable dans les préférences. +Le principe est le même, mais on fournit une trame de fond au format portrait, +comme indiqué plus haut. Le texte de la lettre est configurable dans les +préférences. From 2e75f814c60bf65dd23984350939abf470567070 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 27 Feb 2022 09:28:16 +0100 Subject: [PATCH 15/24] Petites corrections --- docs/ApiGenerationBulletinsPdf.md | 2 +- docs/FAQ.md | 16 +++++++++------- docs/GestionLogos.md | 3 +++ tools/publish | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/ApiGenerationBulletinsPdf.md b/docs/ApiGenerationBulletinsPdf.md index 278cdc6..02e9cc8 100644 --- a/docs/ApiGenerationBulletinsPdf.md +++ b/docs/ApiGenerationBulletinsPdf.md @@ -38,7 +38,7 @@ class [BulletinGeneratorExample](BulletinGeneratorExample.md)(sco_bulletins_stan """Un exemple simple de bulletin de notes en version PDF seulement. Part du bulletin standard et redéfini la partie centrale. """ - description = 'exemple (ne pas utiliser)' # la description doit être courte: elle apparait dans le menu de paramètrage + description = 'exemple (ne pas utiliser)' # la description doit être courte: elle apparait dans le menu de paramétrage supported_formats = [ 'pdf' ] # indique que ce générateur ne peut produire que du PDF (la version web sera donc celle standard de [ScoDoc](ScoDoc.md)) # En général, on veut définir un format de table spécial, sans changer le reste (titre, pied de page). diff --git a/docs/FAQ.md b/docs/FAQ.md index a6b34c0..462b9b8 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -100,13 +100,13 @@ garantie. Mais nous faisons de notre mieux: - si vous êtes utilisateurs, écrire à [notes@listes.univ-paris13.fr](mailto:notes@listes.univ-paris13.fr). + ou joindre le canal Discord Assistance. + - si vous êtes informaticien et voulez évoquer un problème technique (développement, installation), écrire à [scodoc-devel@listes.univ-paris13.fr](mailto:scodoc-devel@listes.univ-paris13.fr). - - ## Configuration ### Comment changer les logos sur les documents PDF (PV...) @@ -119,18 +119,20 @@ Voir [la page sur la gestion des logos et images ](GestionLogos.md). ### Quel système d'exploitation ? ScoDoc est accessible depuis n'importe quel navigateur Web (Firefox, Chrome, ...). -Le serveur ScoDoc fonctionne sous linux. Il n'est testé qu'avec Debian (stable). -Le script d'installation ( [GuideInstallDebian11](GuideInstallDebian11.md) ) +Le serveur ScoDoc fonctionne sous Linux. Il n'est testé qu'avec Debian (stable). +Le script d'installation ([GuideInstallDebian11](GuideInstallDebian11.md)) assure l'installation de tout les éléments nécessaires au bon fonctionnement de -ScoDoc. Une distribution sous forme de container Docker est envisagée. - +ScoDoc. ### Quand et comment mettre à jour le logiciel ? +Les mises à jour sont normalement automatiquement appliquées chaque nuit, +assurant la sécurité et l'actualisation de ScoDoc. + Des améliorations et corrections sont fréquemment introduites. Les plus importantes sont annoncées sur la liste de diffusion "[scodoc-annonces](https://listes.univ-paris13.fr/mailman/listinfo/scodoc-annonces)". -Les mises à jour sont normalement automatiquement appliquées chaque semaine. + Voir aussi la page [MisesAJour](MisesAJour.md). diff --git a/docs/GestionLogos.md b/docs/GestionLogos.md index f806d81..d203d0a 100644 --- a/docs/GestionLogos.md +++ b/docs/GestionLogos.md @@ -10,6 +10,9 @@ Images (logos ou autre) à afficher sur des documents PDF générés par ScoDoc: jury (en format paysage) ou `letter_background`pour les bulletins et lettres de jury (en format portrait). Voir [paramétrage des PV](ParametragePV.md). +Ces images peuvent être chargées ou modifiées par l'administrateur via le menu +"*configuration*" sur la page d'accueil de ScoDoc. + ## Informations techniques pour les développeurs et administrateurs curieux. diff --git a/tools/publish b/tools/publish index 51b519b..cfc909b 100755 --- a/tools/publish +++ b/tools/publish @@ -31,4 +31,4 @@ EOF (cd site && ln -s img/favicon.ico .) # --- Publish -rsync -vaze ssh site scodoc.org:/var/www/html +rsync -vaze ssh --delete site scodoc.org:/var/www/html From 60be4b7ad37afb17e0da2267288de8fa490c0500 Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 1 Mar 2022 23:29:22 +0100 Subject: [PATCH 16/24] =?UTF-8?q?ajout=20cl=C3=A9=20publique=20repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/misc/scodoc-repo.gpg.key | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/misc/scodoc-repo.gpg.key diff --git a/docs/misc/scodoc-repo.gpg.key b/docs/misc/scodoc-repo.gpg.key new file mode 100644 index 0000000..c611aa1 --- /dev/null +++ b/docs/misc/scodoc-repo.gpg.key @@ -0,0 +1,51 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGEkuIUBEAClK699yEifRP0TOVpslbEguSt59VMtTg8AYroPX5lalyB/ccdo +Z3hhFuzwTIQ/V7NG8P9OzFud/rKCH6gJLwlXum3a4/pHyg3Qj2naZsIRKEsy7SWp +YUmFS5MKWAynPVbUK1CuIdw1aU9/ENTL98FMBfDKA2l2vkFdDvYGDtZhJ243d1pW +7wq0nDuDCeNSh7QHS+sI9hNQ3loeIxGzvZD/89wTDJp5ihdcaw1tvU4EaCEqgAu2 +hZ3luGsxsFcTqlbk0U26rWZlfDNhtHSmwtPobsHLD5p6OhjFgOhOiOJUe0Hp9VjQ +0Dkt6fyIxfU2UPZMEHhCByFsgHx2gfAZbi1orH6rmR0byVAJVbF58GEUXnuxNayq +sR1Bi+elWIoGxjs98Un4ho+LqBhZr0nSEqovYDMp9AgX8Rx+oAn8CB6EkDUHI8b6 +BOrZFyGUt9UUQiIk7KkAH0VqdNxFtfqrwE1c1sc9RkEJcjxkLNaFPPyJKmpgtJfe +H4m2pX7EZH8NkvYhIMMRxSm5Jja6is2nJS+BLrLGiAjjYvGCqYq6Eurmjc+h6KKW +nLORHJCVkXwOYjJtX81fwos5cAcOmKz/QwoZPWU3QWvGq/KoAiTnFoQMwoagnVOA +55XhTLa1+V/3KpyrQupee4Uctj4doLeipZRuRXPcM/6A3z/XOMrucD6oUwARAQAB +tCdFbW1hbnVlbCBWaWVubmV0IDxlbW1hbnVlbEB2aWVubmV0Lm5ldD6JAjgEEwEI +ACIFAmEkuIUCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDm3l8G72kz3 +Y2wP/R3lu/wYsIiO17ISbQfJyBSOArs/Rkbl+Y01p35Hb1HvQ4rmJHkPt/+NuIZk +iu0mR5B9f/3RRFZYvqraVWSXtbuputIXaClRiMRsk/xYfa+u5E+vFTcG/uM7yifF +rNT7zdr/064MDXewhAN6YZsaCJHOHL+Ga+vtc3NwDHdqPDAon4P6j4eDlZQ4heZ2 +7DTXDiVsyqbf1UTSgDSmGyfNI6kCHh9LTYxnT3k3G5sKrGwqtfYOij3o35M3CvB4 +e3YP2UFjCf33ymRgzJz/INiLMeJAMtGb1f0F0LeLNaeCrmUSS2/BZTNVE6h2CcR4 +hGvWQKZSedvVaP2oZ34WxlcxDkwi84bVMX5W4lKxu26D2KjbPJhrgoVf7pt1yNKd +FeqsmP7r9uE5W/C/WdDxb6vvW4GN6gK8SzBz/iIAW3JPfxL4EUuRT8XMgkaaojZd +yWaxk9N2t08joWUnK7eI2LPX9zYNO2EZbPmXOoQyUH7O7KMMAvEQkWvIUtO3GERG +FeLktW6yI9UZ8tQ2H8IgPU0k+YoABJBnRy4PbfnzCTlza+E93VyyFgk5ZltdYHTP +jfSVx2GrWVGrURGMKrOIeDCgSDhrQzow3uj7AUtqLOP5zJM2nL131dJ4lNkeh7VL +banmZvZofhJFK0gAzhuJd0JTul3vesoVS8/frm9OfwI+kIRruQINBGEkuIUBEACz +USdULoaXJXB1LKsLM+6lXzywHWzgmA3B2aiikAsooedc1n7y/xR20FFpHkieDQbK +xUNPSF75dxrfLMMuG4QQYo+r1G3ujHgBrw6IfytP8h0fmPhIaZOYzlEKWF47eeOZ +18FBAMGRX+hA72cv/mARDlmPVh7K4Rdl9FAIANBuEftU70i0eNPKj+CBJ8/qE4JV +iCEvG3hfrmCI+Oe8dlJliKBVVW5L0oMLF777GLvHUuFdKG51TNRIeRcrz7F8/Aax +9CuY3SY5jezVGeDxH/ZiVZua5Y8b9kh8qDuQuAdGj7q9uQU6vNJ9BhfGD2ZUUX1V +/KmMBkv3nDg5Bkk9Puf+E2jc09mQkcOhuo3hSYmD1AWH/JFs+W6fYKVEMPinLGUC +v4l225Jdtu9Ah8N+SxsRrkg/tDuvXM1eka/Xyy/ppXmst8zodPLSDv3uGUvd4rmk +GKs047CZbfbiqd7OrqIHkdxGX50MzPoJ46eq5tKKwyZ24WgXW0MJ/2ML6iGVGsr5 +0QK8JMMYpTYuDMgvfuo8P7LSqxVZ1wdyltCyDDqiE6TBPkvjTIE89f4BpAj54H4l ++h26tFisVR+Qmu1CAVvqFR1N7UD6s17K2GYcyQauDJpViMVRTla+I5aB6c3rJdZ4 +MYLNxzbinD48nxlU6CiBrCQ3rU7HHGHUCsoGA4UK0QARAQABiQIfBBgBCAAJBQJh +JLiFAhsMAAoJEDm3l8G72kz38lAP/3GEKlJs1HYvMQ/UrZrORS+ykuEVaSmVQBVD +zONYzlgxgyYEFpdIf90+QEORk32KySV+2MnSnL5jeaAbFlBS8KQ2u7ldlA68esuo +T4HdNTLOa+XCDTF8AJzr7tmulPiU5k2EhUfYGdU5vOufF1wUc5vqqSWaoy+EXSc/ +kymLObC7R/Bgr6rXEaXwIpxZQTmodUmQgHaVDL3PPABhEs8QD/pm3OM2Qk26+4+/ +ICc+O0qmM59wbH73cmWP1CGKRrqp6l++oDG3I+LnxioGJ+uqcxH4FdSy3fqh30q3 +RTFgknBRZKDmGOjvNiOrExXhM9MornNQ8bJQZGehuVi8iWmq1bgcJbFaFiCzYyL3 +1dvhuMA4ql65KrgcCciJE3jCo0Lq5xXCEm/zhA/WNnYLOwBM+2au3QmyFlRjSJIf +9KFkpUG0psS6NI9DvnyaZrrvhz6sdspap7SY93Vllweg7yRYlI+vsTaxDjqs+WlN ++LSHZnC57Gssl9jwq6WBm7VlAoJZ2sipTqrwlYbD4VdcaMd9C8pLCsVa5etJKwlr +Pdg5l37Os2zgsP00NieX1P4HHmGzV1j1TsYrzaiCJ5g35h/lIqQV7z6ndvPX2TD2 +eokuBieXFuxRPlscA+Diudyvl6jJ1ATJI48GUpcUg2sC7iM91IsG4tC9GGOrmAqV +LwbpXjdu +=MuGd +-----END PGP PUBLIC KEY BLOCK----- From fb063d7754a6cd74cb56c3f69e5f9774ec5d977e Mon Sep 17 00:00:00 2001 From: viennet Date: Sat, 2 Apr 2022 08:23:13 +0200 Subject: [PATCH 17/24] =?UTF-8?q?MAJ=20conseils=20dev.=20Suppression=20de?= =?UTF-8?q?=20qq=20docs=20obsol=C3=A8tes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ConseilServeurDev.md | 55 ++++++++--- docs/GuideAdminSys.md | 4 - docs/GuideDeveloppeurs.md | 23 +++-- docs/GuideInstallDeb5.md | 4 - docs/GuideInstallDebian11.md | 18 +++- docs/GuideInstallDebianDix.md | 162 --------------------------------- docs/GuideInstallDebianNeuf.md | 8 -- docs/MigrationDonneesScoDoc.md | 2 +- docs/MisesAJour.md | 137 ---------------------------- docs/index.md | 13 ++- 10 files changed, 86 insertions(+), 340 deletions(-) delete mode 100644 docs/GuideInstallDeb5.md delete mode 100644 docs/GuideInstallDebianDix.md delete mode 100644 docs/GuideInstallDebianNeuf.md diff --git a/docs/ConseilServeurDev.md b/docs/ConseilServeurDev.md index 8814ae9..da05a00 100644 --- a/docs/ConseilServeurDev.md +++ b/docs/ConseilServeurDev.md @@ -7,13 +7,38 @@ Quelques indications pour développer avec ScoDoc 7.x, à adapter à vos goûts Il est confortable de développer dans une VM (un container Docker ferait aussi bien l'affaire). -## Conseils pour VirtualBox -[VirtualBox](https://www.virtualbox.org/) est facile à installer sur Mac, Linux ou Windows. Créer une VM avec Debian 10, et suivre la [procédure habituelle d'installation de ScoDoc](GuideInstallDebian11.md). XXX +## Conseils pour la machine virtuelle -En général, vous préférez développer sur la machine hôte pour disposer de votre éditeur préféré. Mais vous exécutez ScoDoc dans la VM. +[VirtualBox](https://www.virtualbox.org/) est facile à installer sur Linux ou +Windows. Créer une VM avec Debian 10, et suivre la [procédure habituelle +d'installation de ScoDoc](GuideInstallDebian11.md). -### Configuration réseau - La VM a besoin d'accéder à Internet pour l'installation, et aussi pour les mises à jour et peut-être certains tests que vous voudrez lancer. L'accès à la VM depuis l'hôte doit être possible via un réseau privé interne (car vous ne serez pas toujours conencté à Internet, et ne souhaitez pas que l'on accède à votre serveur de test de l'extérieur). +Sur les Macs anciens (processeurs Intel), VirtualBox fonctionne bien. Sur les +modèles "M1" (Apple Silicon), je conseille d'utiliser +[UTM](https://mac.getutm.app/) qui est facile à installer et très performant. On +installe alors une VM avec la distribution Linux Debian pour l'architecture +`arm64` (nous ne produisons pas de paquets Debian `arm64` pour ScoDoc 9, mais +l'installation est simple, ne pas hésiter à demander sur le Discord). + +En général, vous préférez développer sur la machine hôte pour disposer de votre +éditeur préféré, mais exécutez ScoDoc dans la VM. + +### Éditeur de texte / IDE +Si vous êtes expérimenté, vous avez vos outils préférés. Mais si vous débutez, +surtout pour un environnement de développement distant (le code développé tourne +dans une machine virtuelle ou réelle séparée de votre machine de burea), nous +vous conseillons **VS Code** avec le module +[*Remote-SSH*](https://code.visualstudio.com/docs/remote/ssh). Ceci vous évite +de fastidieuses configurations de partage de fichiers entre les machine, il +suffit d'une connexion SSH fonctionnelle. + +### Configuration réseau de VirtualBox + +La VM a besoin d'accéder à Internet pour l'installation, et aussi pour les mises +à jour et peut-être certains tests que vous voudrez lancer. L'accès à la VM +depuis l'hôte doit être possible via un réseau privé interne (car vous ne serez +pas toujours conencté à Internet, et ne souhaitez pas que l'on accède à votre +serveur de test de l'extérieur). Modifier la config réseau via l'UI graphique de VirtualBox, la VM étant éteinte. @@ -33,7 +58,8 @@ Dans le Debian, j'utilise `/etc/network/interfaces` (le `enp0s3` désigne chez moi l'`Adapter 1`, mais c'est susceptible de changer. Normalement, l'installeur créé ce fichier ) -Pour lancer l'interface externe , quand on a besoin d'accéder à Internet depuis la VM (en fait assez rarement): +Pour lancer l'interface externe , quand on a besoin d'accéder à Internet depuis +la VM (en fait assez rarement): dhclient enp0s8 @@ -46,13 +72,20 @@ Modifier le `/etc/hosts` (ou équivalent) de l'hôte, et y ajouter l'IP de votre ### Partage de fichiers -Pour éditer votre code au chaud sur votre hôte, il y a plein de solutions. L'une consiste à laisser le code dans la VM, mais de monter un répertoire (par exemple `/opt`) sur l'hôte, par exemple via `sshfs`. +Pour éditer votre code au chaud sur votre hôte, il y a plein de solutions. +La plus simple, déjà mentionnée, consiste à passer par une connexion SSH (VS +Code propose un module dédié très simple et performant, mais tout montage de +type `sshfs`peut aussi faire l'affaire). -Une autre solution (que j'utilise sur mon MacBook), est de laisser le source (clone git) sur l'hôte, et de partager ce répertoire avec la VM. -Dans VirtualBox / config. VM / Dossiers partagés, ajouter un partage. Par exemple, vous mettez vos sources sur l'hôte dans `~/src`, et dans la VM sur `/src`. -Dans ScoDoc, `/opt/scodoc/Products/ScoDoc` est alors un lien symbolique vers votre `src/ScoDoc`. +Une autre solution est de laisser le source (clone git) sur l'hôte, et de +partager ce répertoire avec la VM. Dans VirtualBox / config. VM / Dossiers +partagés, ajouter un partage. Par exemple, vous mettez vos sources sur l'hôte +dans `~/src`, et dans la VM sur `/src`. +Dans ScoDoc, `/opt/scodoc/Products/ScoDoc` est alors un lien symbolique vers +votre `src/ScoDoc`. +#### Détails sur les partages avec VirtualBox Pour pouvoir utiliser des liens symboliques dans le partage: VBoxManage setextradata "Debian11" VBoxInternal2/SharedFoldersEnableSymlinksCreate/src 1 @@ -75,7 +108,7 @@ Il arrive (?) que Virtual Box change les droits unix sur les fichiers partagés. git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply -# Interaction avec ScoDoc 7 +# Interaction avec ScoDoc 7 (ancien ScoDoc, avant l'été 2021) ScoDoc 7 utilise Zope, et ce n'est pas un environnement commode pour débugguer. diff --git a/docs/GuideAdminSys.md b/docs/GuideAdminSys.md index 882997f..9f5e7fd 100644 --- a/docs/GuideAdminSys.md +++ b/docs/GuideAdminSys.md @@ -11,10 +11,6 @@ Utilisez un **serveur virtuel** ou un container Docker si vous n'avez pas de mac * Migration d'un serveur ScoDoc 7 vers la nouvelle version Scodoc 9: [MigrationScoDoc7a9](MigrationScoDoc7a9.md) -(Les personnes ayant besoin d'installer l'ancienne version ScoDoc 7 peuvent se -référer à [GuideInstallDebianDix](GuideInstallDebianDix.md) ou -[GuideInstallDebianNeuf](GuideInstallDebianNeuf.md).) - ## Mises à jour et sauvegardes * [Mettre à jour du logiciel (nouvelles versions)](MisesAJour.md) diff --git a/docs/GuideDeveloppeurs.md b/docs/GuideDeveloppeurs.md index 282cedc..7145b00 100644 --- a/docs/GuideDeveloppeurs.md +++ b/docs/GuideDeveloppeurs.md @@ -20,17 +20,17 @@ Informations pour les développeurs souhaitant étendre ou modifier ScoDoc. Quelques conseils, indications et mémos pour les développeurs sur ScoDoc version 9. ### Installation d'un serveur de développement -[Quelques conseils mouvants pour configurer votre serveur de développement](ConseilServeurDev.md) +[Quelques conseils pour configurer votre serveur de développement](ConseilServeurDev.md) ### Style et formatage du code L'ancienneté de la base de code a rendu le style un peu incohérent, mais cela -s'est amélioré avec ScoDoc 9 (respect PEP 8). +s'est nettement amélioré avec ScoDoc 9 (respect PEP 8). -Le code doit être formatté avec [`black`](https://black.readthedocs.io/) avant +Le code DOIT être formatté avec [`black`](https://black.readthedocs.io/) avant tout commit (configurez votre éditeur pour appeler `black` à l'enregistrement). #### Documentation -On adoptera le style "Google": +On pourra adopter le style "Google": Exemple: """Description résumée de la fonction @@ -58,14 +58,16 @@ Exemple: Le dépôt est -La branche `master` est celle de ScoDoc 9. La branche `Scodoc7` est l'ancienne -(jusqu'à septembre 2021) version en production. +La branche `master` est celle de ScoDoc 9, d'où sont issues les paquets +distribués (*releases*). Les développements ont lieu sur d'autres branches +(`api`, `dev92`, `entreprises`, ...) avant d'être intégrés après tests. +La branche `Scodoc7` était l'ancienne (jusqu'à septembre 2021) version de ScoDoc. Ci-dessous quelques pense-bête qui peuvent servir. #### Hot fixes (internes) Pour les développeurs internes (écriture sur le dépôt master), un exemple -basique: +basique illustrant le cycle de développement: # Créer une branche # si besoin (travail en cours), utiliser git stash avant @@ -82,10 +84,13 @@ basique: # éventuellement: git stash pop +Dans la plupart des cas, on travaillera sur son propre dépot (clone du dépt +origine), et on proposera une *pull request* (PR, *demande d'ajout* en français). + #### Mettre à jour votre branche -Vous travaillez dans votre branche `ma_branche`. Pour lui appliquer les mises à -jour de `master` (remote): +Quand vous travaillez dans votre branche `ma_branche`, pour lui appliquer les +mises à jour de `master` (remote), faire: ```bash git pull origin master ``` diff --git a/docs/GuideInstallDeb5.md b/docs/GuideInstallDeb5.md deleted file mode 100644 index b4e00c2..0000000 --- a/docs/GuideInstallDeb5.md +++ /dev/null @@ -1,4 +0,0 @@ - -/!\ '''Attention: document obsolète pour une version ancienne de Debian. Voir [GuideInstallDebianDix](GuideInstallDebianDix.md) pour l'installation normale de !ScoDoc ! - - diff --git a/docs/GuideInstallDebian11.md b/docs/GuideInstallDebian11.md index 5d5cdf2..c286817 100644 --- a/docs/GuideInstallDebian11.md +++ b/docs/GuideInstallDebian11.md @@ -110,10 +110,26 @@ Checklist minimale de votre système Linux Debian: #### Configuration si utilisation d'un proxy Si votre accès à Internet passe par un proxy, l'indiquer au moment de - l'installation Debian. Il est possible qu'il vous faille configurer d'autres + l'installation Debian. + + Ensuite, dans ScoDoc, indiquer votre proxy: pour cela, éditer le fichier + ```/opt/scodoc/.env``` +et ajouter les variables d'environnement nécessaires. Typiquement, il s'agit de : +``` + HTTP_PROXY=http://proxy.univ-xxx.fr:1234 + HTTPS_PROXY=http://proxy.univ-xxx.fr:1234 +``` +Après modification de ce fichier (qui _doit_ être lisible par l'utilisateur `scodoc`), +redémarrer le service: +``` + sudo systemctl restart scodoc +``` + + 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 diff --git a/docs/GuideInstallDebianDix.md b/docs/GuideInstallDebianDix.md deleted file mode 100644 index f41e041..0000000 --- a/docs/GuideInstallDebianDix.md +++ /dev/null @@ -1,162 +0,0 @@ - -# Installation de ScoDoc sur Debian 10 (Buster) -Ce document décrit la procédure d'installation et de configuration de ScoDoc. -Cette procédure doit être effectué sur la machine serveur avec un accès administrateur (root). - -*Si vous avez déjà une installation ScoDoc version 7 (en Debian 7, 8 ou 9), voir aussi [MigrationDonneesScoDoc](MigrationDonneesScoDoc.md)* - -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 sur un système [Debian](http://www.debian.org) 10 (Buster) s'exécutant sur une machine intel-like **64bits** (architecture **AMD64**). Debian s'installe facilement en une quinzaine de minutes, sur une machine normale ou un serveur virtualisé. Il est **très déconseillé** de tenter l'installation sur une autre version, à moins de disposer de temps et de bonnes connaissances sur Linux et les paquetages Python. - -Merci de me signaler tout problème (emmanuel.viennet@gmail.com) - - -- Note 1: l'image du CD d'installation de Debian (amd64) peut se trouver ici: [https://www.debian.org/distrib/netinst](https://www.debian.org/distrib/netinst.md), choisir une version "petits CD" pour **amd64** (*Il est indispensable d'utiliser une version 64 bits ! *) - -- Note 2: si quelqu'un produit, teste et documente une image Docker, merci de la partager (écrire à scodoc-devel). - - -/!\ 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). L'installation ci-dessous va en effet modifier de nombreux paramètres de votre système linux (serveur web, firewall, serveur SQL, messagerie, ...). - - -## Préalable: configurer un serveur linux -Le serveur devrait être accessible depuis Internet. Seul le port 443 (https) est utilisé par ScoDoc. Il est recommandé que le serveur puisse envoyer du mail (smtp). - -Nous recommandons d'effectuer une installation standard de Debian par le réseau (netinst). -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.). - -![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 Subversion). - 1. Vérifiez la connectivité, par exemple: -``` -ping www.univ-paris13.fr -(quitter avec ctrl-c) -cd /tmp -wget --no-check-certificate https://www-lipn.univ-paris13.fr/projects/scodoc -# doit créer un fichier nomme "scodoc" 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. - 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 (`aptitude install ntp`), et éventuellement `dpkg-reconfigure tzdata`). - 1. Cette liste est très 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 serveur doit passer par un proxy pour accéder à Internet: - 1. Configurer wget: placer ceci dans `/root/.bashrc` (par exemple) -``` -export http_proxy=http://my-proxy-server.com:my-proxy-port/ -export https_proxy=$http_proxy -``` - - 2. Configurer le client svn - dans `/root/.subversion/servers` dé-commenter et compléter les lignes: -``` -[global] -http-proxy-host = my-proxy-server -http-proxy-port = my-proxy-port -``` -(attention bien enlever l'espace du début de ligne). - - -## Installation de ScoDoc - 1. Récupérer et ouvrir le logiciel (en tant que root): -``` - sudo su # si necessaire pour passer root - cd /opt - wget http://www-l2ti.univ-paris13.fr/~viennet/ScoDoc/builds/scodoc-1851.tgz - tar xfz scodoc-1851.tgz -``` -Cette archive contient ScoDoc, Zope et quelques outils tiers. -/!\ vous pouvez installer ailleurs que dans /opt, mais il faudra alors éditer plusieurs scripts (non recommandé). - - -/!\ 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**). - - 1. **Mettre à jour les sources**. Va télécharger les sources à jour, et le script d'installation: -``` - cd /opt/scodoc/Products/ScoDoc - apt install subversion - svn up -``` - - - - 3. **Configurer le logiciel**. Attention: durant cette étape, de nombreux paquets et fichiers de configuration de votre système linux vont être modifiés. Si vous préférez effectuer vous même l'installation (vous êtes développeur ou avez des besoins particuliers), lisez et adaptez le script. - -/!\ je répète, le script `install_debian10.sh` va reconfigurer beaucoup de choses sur votre serveur. Il suppose que la machine vient d'être installée et en gros qu'elle va servir principalement pour ScoDoc. - -Toujours en tant qu'utilisateur root: -``` - cd /opt/scodoc/Products/ScoDoc/config - ./install_debian10.sh -``` -Répondez oui (Y) à toutes les questions, sauf, si vous avez une bonne raison de faire autrement. -En cas d'échec, ce script peut être relancé (il écrasera l'ancienne configuration). - -Dans cette étape, sont installés et configurés automatiquement: - - * serveur web Apache (et https) - * parefeu réseau (optionnel, basé sur `ufw`) - * messagerie pour envois messages (postfix) (optionnel mais très vivement recommandé) - * installation de divers logiciels utilisés par ScoDoc (par apt-get) - * script de lancement automatique de ScoDoc (service systemd). - -(dans certains cas, l'installateur vous posera des questions sur votre configuration). - - - 4. **Initialiser la base de données utilisateurs** (qui sera commune à tous les départements). -En tant que root: -``` - cd /opt/scodoc/Products/ScoDoc/config - ./create_user_db.sh -``` - - 5. **Mettre à jour le logiciel** (c'est absolument nécessaire, la version préinstallée étant incomplète): -En tant que root, -``` - cd /opt/scodoc/Products/ScoDoc/config - ./upgrade.sh -``` -La première fois, il faudra accepter un certificat cryptographique, répondre "p (accept (p)ermanently)". - -/!\ Si un message d'erreur apparaît à la fin de la mise à jour, relancer `./upgrade.sh`. - - -Si vous migrez les données d'une installation existante, vous pouvez arrêter ici et appliquer la procédure [MigrationDonneesScoDoc](MigrationDonneesScoDoc.md) - - 6. **Initialiser la base de données pour un département** (vous pourrez à tout moment utiliser la même commande pour ajouter d'autres départements): -``` - ./create_dept.sh -n DEPT -``` -Il faut alors saisir le nom abrégé du département: ce nom doit être un mot, sans ponctuation (GEII, RT, Info, ...). Il apparaîtra dans l'URL du site correspondant. - - 7. **Lancer ScoDoc**: -``` - systemctl restart scodoc -``` -et voila ! - -Visiter `https://votre.site.fr/` pour achever la configuration et utiliser le logiciel: voir la page [GuideConfig](GuideConfig.md) - - - -## En cas de problème -Ne pas hésiter à me contacter ou à écrire sur la liste notes (voir [Listes de diffusion](ListesDeDiffusion.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... - * Appliquez fréquemment les [mises à jour](MisesAJour.md) - - * Mettez en place des [sauvegardes](SauvegardesBases.md) - - * Abonnez vous au moins à la liste d'annonces: voir [Listes de diffusion](ListesDeDiffusion.md) diff --git a/docs/GuideInstallDebianNeuf.md b/docs/GuideInstallDebianNeuf.md deleted file mode 100644 index ddc88c9..0000000 --- a/docs/GuideInstallDebianNeuf.md +++ /dev/null @@ -1,8 +0,0 @@ -# Guide d'installation sur Debian 9 - -Version ancienne de Debian, nous recommandons d'utiliser la nouvelle version. -Voir [installation sur Debian 10](GuideInstallDebianDix.md). - -Si besoin, se reporter à [l'ancienne documentation pour Debian 9](https://trac.lipn.univ-paris13.fr/projects/scodoc/wiki/GuideInstallDebianNeuf). - - diff --git a/docs/MigrationDonneesScoDoc.md b/docs/MigrationDonneesScoDoc.md index da5a94f..d22e727 100644 --- a/docs/MigrationDonneesScoDoc.md +++ b/docs/MigrationDonneesScoDoc.md @@ -25,7 +25,7 @@ Le principe est donc: ## Marche à suivre détaillée ### Installation de Debian et ScoDoc - Voir les instructions ici: [GuideInstallDebianDix](GuideInstallDebianDix.md) (ou si votre système est encore en Debian 9: [GuideInstallDebianNeuf](GuideInstallDebianNeuf.md) : mais ce n'est pas conseillé) + Voir les instructions ici: [GuideInstallDebian11](GuideInstallDebian11.md). diff --git a/docs/MisesAJour.md b/docs/MisesAJour.md index 8781dfd..d404bfb 100644 --- a/docs/MisesAJour.md +++ b/docs/MisesAJour.md @@ -9,140 +9,3 @@ lancer une à tout moment avec la commande apt update && apt-get upgrade - -# Mises à jour de ScoDoc 7 -**Les instructions ci-dessous concernent ScoDoc 7 uniquement.** - -Le système Linux doit être correctement maintenu (en particulier, les mises à -jour de sécurité de Debian doivent être appliquées quotidiennement). - -ScoDoc est actuellement prévu pour fonctionner avec Linux Debian 10. - - * Les (rares) mises à jour majeures du logiciel ScoDoc sont annoncées sur la - liste - [scodoc-annonces](https://listes.univ-paris13.fr/mailman/listinfo/scodoc-annonces). - - * Les (fréquentes) mises à jour mineures (corrections de bugs, améliorations) - sont annoncées sur la liste - [scodoc-devel](https://listes.univ-paris13.fr/mailman/listinfo/scodoc-devel). - - -*Une mise à jour hebdomadaire (au moins) est recommandée* - -Pour appliquer une mise à jour de ScoDoc, se connecter en tant que `root` sur le -serveur, puis faire: - - cd /opt/scodoc/Products/ScoDoc/config - ./upgrade.sh - -La première fois, il faudra accepter un certificat cryptographique, répondre "p -(accept (p)ermanently)". - - Si un message d'erreur apparaît à la fin de la mise à jour, -relancer `./upgrade.sh`. - - La mise à jour entraine une déconnexion des utilisateurs (mais pas -de pertes de données !). - -Note: cette procédure ne change pas de version majeure de ScoDoc, ni du système -Linux. Pour cela, voir [MigrationDonneesScoDoc](MigrationDonneesScoDoc.md)) ou -plus bas sur cette page. - -## Note concernant les anciens systèmes (Debian 9) - -En Debian version 9 (et version antérieures), ScoDoc n'utilisait pas `systemd` -et n'était pas automatiquement relancé lors de mises à jour de certains -logiciels, comme la base de données `postgresql`. Sur ces systèmes, il est -conseillé de mettre à jour Debian avec le script -`/opt/scodoc/Products/ScoDoc/config/upgrade.sh` afin d'éviter d'interrompre le -service ScoDoc. - - -## Mise à jour rapide de Debian 9 à Debian 10 (obsolète) - -Obsolète, sauf si vous avez encore un serveur avec Debian 9... - -Procédure raccourcie réservée aux personnes à l'aise avec linux. On met à jour -Debian mais on réinstalle ScoDoc proprement. - -Vérifiez que vous avez assez d'espace disque disponible (`df -h`, au moins 3Go -libres sur `/` ou `/opt`). - - 0. Sauvegardez complètement votre système en lieu sûr. Si la procédure - ci-dessous échoue, reprenez la voie normale: - [MigrationDonneesScoDoc](MigrationDonneesScoDoc.md). - - 1. Mettre à jour votre ScoDoc: - - cd /opt/scodoc/Products/ScoDoc/config - ./upgrade.sh - - 2. Arrêter le service (en Debian 9 on utilisait *SysV-style init*, à partir de - Debian 10 ScoDoc utilise `systemd`): - - /etc/init.d/scodoc stop - - - 3. Sauvegarder les données et configurations ScoDoc: - - cd /opt/scodoc/Products/ScoDoc/config - ./save_scodoc_data.sh /opt/data-scodoc-deb9 # par exemple - - - 4. Mettre à jour Debian: pour les détails voir - [https://www.debian.org/releases/stable/amd64/release-notes/ch-upgrading.html](https://www.debian.org/releases/stable/amd64/release-notes/ch-upgrading.html). - - - En résumé: - - - éditer `/etc/apt/sources.list` et indiquer -``` - deb http://deb.debian.org/debian buster main contrib -``` - - - puis: -``` - apt-get remove firehol - apt update - apt-get upgrade - apt full-upgrade - apt autoremove -``` -et **rebooter**. - - - 5. Supprimer postgresql 9.6 - -On enlève carrément l'ancien, le script d'installation de ScoDoc installera la -version 11: - - apt-get --purge remove postgresql - - - 6. Réinstaller ScoDoc - -Déplacer l'ancienne installation de ScoDoc (vous la supprimerez plus tard): - - mv /opt/scodoc /opt/scodoc.deb9 - - -Réinstaller un ScoDoc tout neuf, en suivant [GuideInstallDebianDix](GuideInstallDebianDix.md) - -La plupart des composants de votre système seront déjà présents, donc répondre en général "non" aux questions du script d'installation. - -S'arrêter avant l'initialisation des bases de données. - - 7. Restaurer la sauvegarde: - - cd /opt/scodoc/Products/ScoDoc/config - ./restore_scodoc_data.sh /opt/data-scodoc-deb9 - -Vérifiez et voilà. - - - Faire un peu de ménage (supprimer `/opt/scodoc.deb9` quand vous êtes sûr de n'y avoir rien oublié), vérifiez les logs (`/opt/scodoc/log`). - - - Vérifier que le nouveau système (et ses bases de données) est bien sauvegardé ([SauvegardesBases](SauvegardesBases.md)). - - diff --git a/docs/index.md b/docs/index.md index 9898d5e..a9c7fd9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -94,10 +94,17 @@ Les prochaines versions de ScoDoc (*sous réserve !*): - calcul des moyennes d'UE - bulletin de note v1 - - ScoDoc 9.2 : fin 2021 ou début 2022 nouvelles fonctionnalités liées au BUT - - tenue des jurys de S1 + - ScoDoc 9.2 : mars 2022 nouvelles fonctionnalités liées au BUT + - référentiels de compétences Orébut + - capitalisation des UE dans le BUT + - bonus/malus locaux + - bulletins BUT pdf + - nouveau module de gestion relations avec les entreprises + + - ScoDoc 9.3 : mai 2022 + - tenue des jurys BUT et exports Apogée - gestion des parcours (pour la mise en place des semestre) - - import Orébut avec gestion adaptation locale (à l'étude) +
From 0c23daf1e418aa13c9df64a8723ff0fbfa1ff9d3 Mon Sep 17 00:00:00 2001 From: viennet Date: Wed, 13 Apr 2022 11:17:23 +0200 Subject: [PATCH 18/24] =?UTF-8?q?ajout=20pr=C3=A9cision=20sur=20config=20a?= =?UTF-8?q?vec=20proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/GuideInstallDebian11.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/GuideInstallDebian11.md b/docs/GuideInstallDebian11.md index c286817..c7a778f 100644 --- a/docs/GuideInstallDebian11.md +++ b/docs/GuideInstallDebian11.md @@ -119,6 +119,9 @@ et ajouter les variables d'environnement nécessaires. Typiquement, il s'agit de HTTP_PROXY=http://proxy.univ-xxx.fr:1234 HTTPS_PROXY=http://proxy.univ-xxx.fr:1234 ``` +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). + Après modification de ce fichier (qui _doit_ être lisible par l'utilisateur `scodoc`), redémarrer le service: ``` From ad317ea9f805b3a2f6ef609e8caa39435776f135 Mon Sep 17 00:00:00 2001 From: viennet Date: Sat, 23 Apr 2022 13:18:39 +0200 Subject: [PATCH 19/24] =?UTF-8?q?Mod=C3=A9lisation=20parcours=20BUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/BUT.md | 27 +++++-- docs/ModelisationParcoursBUT.md | 123 ++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 docs/ModelisationParcoursBUT.md diff --git a/docs/BUT.md b/docs/BUT.md index d6163d4..31f80e5 100644 --- a/docs/BUT.md +++ b/docs/BUT.md @@ -162,14 +162,33 @@ Les conditions de passages vers l'année suivante sont: 3. Cas particulier du passage en BUT 3: nécessité d’avoir validé toutes les UE du BUT 1. -TODO *à compléter suivant l'arrêté.* -> La validation des deux UE du niveau d’une compétence emporte la validation de -> l’ensemble des UE du niveau inférieur de cette même compétence. +Note: La validation des deux UE du niveau d’une compétence emporte la validation de + l’ensemble des UE du niveau inférieur de cette même compétence. + +### Redoublements +La poursuite d'études dans un semestre pair d’une même année est *de droit* pour +tout étudiant. La poursuite d’études dans un semestre impair est possible si et +seulement si l’étudiant a obtenu : + + - la moyenne à plus de la moitié des regroupements cohérents d’UE ; + - et une moyenne égale ou supérieure à 8 sur 20 à chaque regroupement cohérent +d’UE. La poursuite d'études dans le semestre 5 nécessite de plus la validation +de toutes les UE des semestres 1 et 2 dans les conditions de validation des +points 4.3 et 4.4, ou par décision de jury. + +Durant la totalité du cursus conduisant au bachelor universitaire de +technologie, l'étudiant peut être autorisé à redoubler une seule fois chaque +semestre dans la limite de *4 redoublements*. Le directeur de l'IUT peut autoriser +un redoublement supplémentaire en cas de force majeure dûment justifiée et +appréciée par ses soins. Tout refus d'autorisation de redoubler est pris après +avoir entendu l'étudiant à sa demande. Il doit être motivé et assorti de +conseils d'orientation. ### Obtention du diplôme -TODO à rédiger à partir de l'arrêté. +Le diplôme de BUT est obtenu lorsque toutes les compétences du parcours suivi +sont validées. ### Modules "bonus" (sport, culture, LV2) diff --git a/docs/ModelisationParcoursBUT.md b/docs/ModelisationParcoursBUT.md new file mode 100644 index 0000000..1895696 --- /dev/null +++ b/docs/ModelisationParcoursBUT.md @@ -0,0 +1,123 @@ +# Les parcours du BUT dans ScoDoc +Cette documenattion est destinée aux développeurs et à tous ceux qui souhaitent +comprendre le fonctionnement du logiciel. + +ScoDoc est livré avec les référentiels de compétences de tous les parcours de toutes +les spécialités de BUT. En effet, ces référentiels sont nationaux, publiés par +le ministère (voir +[https://cache.media.enseignementsup-recherche.gouv.fr/file/SPE4-MESRI-17-6-2021/32/3/_Annexe_1_PN_BUT_version_post_CNESER_20210511_18-05-2021-1_1411323.pdf](https://cache.media.enseignementsup-recherche.gouv.fr/file/SPE4-MESRI-17-6-2021/32/3/_Annexe_1_PN_BUT_version_post_CNESER_20210511_18-05-2021-1_1411323.pdf)) +et ne sont pas susceptibles d'adaptations locales. + +Nous nous sommes basés sur les versions exportées du logiciel Orébut. + +## Rappel général sur le BUT et ScoDoc +Rappel simplifié, se concentrant sur les points utiles pour l'évaluation +et les liens avec le cursus de formation: + + - Chaque parcours de BUT est défini par un ensemble de compétences. + - Une compétence est décomposée en deux ou trois *niveaux*, chacun constitué de + deux UE consécutives (sur semestres pair et impair de la même année + scolaire). + - Les UE sont des UE "LMD" habituelles; associées à des crédits ECTS, + capitalisables. Chaque UE est associée à une note (moyenne d'UE) et une + décision de jury (validée, ajournée, ...). + +Dans le BUT, le référentiel de formation n'est pas fixé nationalement. Une part +est publiée (2/3) par le ministère, le reste est défini localement par les +universités (*adaptation locale*). + +Les modules: on appelle ici "module" tout dispositif pédagogique évalué, dans le +BUT ce sont les *ressources* et les *SAÉ*. + +Dans ScoDoc, le programme pédagogique définit les UE et modules pour l'ensemble +des semestres d'un ou plusieurs parcours. De cette façon, on pourra utiliser les +mêmes éléments dans plusieurs parcours, et grouper les étudiants de plusieurs +parcours dans le même semestre si on le souhaite. + +## Modélisation ScoDoc + +On a d'une part le *programme de formation*, et de l'autre le *référentiel de +compétences*. + +### Programme de formation +Le programme de formation est constitué des classes suivantes (en BUT et dans +tous les types de formation. La notion de "matière" n'est pas utilisée en BUT). + + - Formation (ex: "BUT R&T") + - UniteEns (UE, ex: "Administrer les réseaux") + - Modules (ressources, SAÉs) *<-> ApcAppCritique* + +On voit que les modules ont toujours une UE de rattachement. Cependant, en BUT, +un module peut intervenir dans le calcul des notes de plusieurs UE, via une +matrice de coefficients. + +### Référentiel de compétences +Le référentiel de compétences est structuré par les classes suivantes: + + - ApcReferentielCompetences + - ApcCompetence + - ApcSituationPro + - ApcComposanteEssentielle + - ApcNiveau (année, ordre) + - ApcAppCritique *<-> Module* + - ApcParcours + - ApcAnneeParcours + - ApcParcoursNiveauCompetence + +Notons le lien entre les apprentissages critiques (ApcAppCritique) et les +modules, qui permet d'établir les critères d'évaluation de chaque module. + +### FormSemestres +La formation est mise en œuvre dans des FormSemestre (date début, fin, +enseignants responsables, ...) constitués de ModuleImpl (module avec enseignant, +évaluations, ...). + + - FormSemestre + - ModuleImpl + - Evaluation + +### Inscriptions des étudiants +Les étudiants sont inscrits: + + - dans un FormSemestre (FormSemestreInscription, avec état (I, D, DEF) et étape + Apogée) + - dans un ModuleImpl (ModuleImplInscription) + - et, pour le BUT, dans un ApcParcours (TODO) + +### Associations (nouvelles pour le BUT): + +Pour la gestion des parcours BUT, il faut introduire les associations suivantes, +qui n'existent pas dans ScoDoc 9.2: + + - Module <-> ApcAppCritique : choix sur la page `module_edit` + - UE <-> ApcParcoursNiveauCompetence : choix sur la page `ue_edit` + - FormSemestre <-> ApcParcours : choix sur la page + `formsemestre_editwithmodules` + - Identite <-> ApcParcours : inscription au parcours, page à créer. + +### Cas d'usage + +#### Inscription d'un étudiant aux ModuleImpls +L'inscription reste libre (chaque individu peut être inscrit à un sous-ensemble +quelconque des ModuleImpl du FormSemestre), mais il sera commode de pouvoir: + + - créer des groupes de parcours + - inscrire les étudiants d'un groupe à tous les modules du parcours. + +#### Comment ScoDoc détermine-t-il les modules d'un parcours ? +Un parcours étant associé à des compétences, et les niveaux compétences à des +UE, on peut déterminer, pour un semestre de rang donné, l'ensemble des UE +associées à un parcours. + +Par ailleurs, chaque niveau de compétence est associé à un ensemble d'AC +(ApcAppCritique), et chaque module est aussi associé à son ensemble d'AC. + +Pour chaque parcours d'un FormSemestre, on déterminera l'ensemble des ModuleImpl +de ce semestre ayant des AC communs avec ceux des niveaux de compétences +associés aux UE du semestre (sic). Notons que les niveaux de compétences sont +annuels, mais que les ModuleImpl sont semestriels. + + + + + From d41c026dc66193fd290a49d3f59ee32598942132 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 24 Apr 2022 16:31:39 +0200 Subject: [PATCH 20/24] =?UTF-8?q?d=C3=A9tails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/FAQ.md | 3 +- docs/ModelisationParcoursBUT.md | 32 +++++++++++++++- docs/index.md | 65 ++++++++++++++++++++------------- 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 462b9b8..31092bb 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -17,7 +17,8 @@ L'avenir du logiciel dépend donc de vous: adhérez, ou incitez votre institutio ## Utilisation de ScoDoc ### Comment prendre en compte les notes de sport ou autres bonus ? -Voir [CalculNotes](CalculNotes.md) +Voir [CalculNotes](CalculNotes.md), ou bien +[le tutoriel vidéo par Cédric C.](https://www.youtube.com/watch?v=SVbjuDpq-lI&list=PLw49h6RbvswhasBk9bXj7PzOD8GDW3kG1&index=13). ### Qui peut voir les notes, et quand ? diff --git a/docs/ModelisationParcoursBUT.md b/docs/ModelisationParcoursBUT.md index 1895696..022d11f 100644 --- a/docs/ModelisationParcoursBUT.md +++ b/docs/ModelisationParcoursBUT.md @@ -1,5 +1,5 @@ # Les parcours du BUT dans ScoDoc -Cette documenattion est destinée aux développeurs et à tous ceux qui souhaitent +Cette documentation est destinée aux développeurs et à tous ceux qui souhaitent comprendre le fonctionnement du logiciel. ScoDoc est livré avec les référentiels de compétences de tous les parcours de toutes @@ -117,6 +117,36 @@ de ce semestre ayant des AC communs avec ceux des niveaux de compétences associés aux UE du semestre (sic). Notons que les niveaux de compétences sont annuels, mais que les ModuleImpl sont semestriels. +#### Vérifier que les ModuleImpls d'un parcours couvrent l'ensemble de ses ACs + +...ou du parcours d'un étudiant donné + +TBD + +#### Lister les regroupements d'UE d'un étudiant + +Pour une année donnée: l'étudiant est inscrit dans ScoDoc soit dans le semestre +impair, soit pair, soit les deux (il est rare mais pas impossible d'avoir une +inscription seulement en semestre pair, par exemple suite à un transfert ou un +arrêt temporaire du cursus). + + 1. Déterminer l'*autre* semestre: semestre précédent ou suivant de la même + année, formation compatible (code formation identique ou bien même + référentiel de compétence ?) dans lequel l'étudiant est inscrit. + + 2. Construire les couples d'UE (regroupements cohérent): apparier les UE qui + ont le même ApcParcoursNiveauCompetence. + +#### Déterminer si un étudiant peut passer dans l'année suivante + +Note: on peut bien sûr toujours forcer le passage, pour traiter les cas +particuliers (décision de jury manuelle). + +**Rappel:** le passage est de droit si + + - [x] plus de la moitié des niveaux de compétences de l'année sont validés + - [x] aucun regroupement d'UE (niveau de compétence) de l'année < 8 /20 + - [x] pour le passage en S5, avoir validé toutes les UE du BUT 1 (S1 et S2). diff --git a/docs/index.md b/docs/index.md index a9c7fd9..36b34d4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,14 +1,19 @@ # ScoDoc: un logiciel libre pour le suivi de la scolarité -ScoDoc est un logiciel libre créé par Emmanuel Viennet pour suivre la scolarité des étudiants universitaires. Il est principalement utilisé dans les IUT, mais aussi apprécié par plusieurs Écoles et Masters en France et à l'étranger. Il fournit notamment: +ScoDoc est un logiciel libre créé par Emmanuel Viennet pour suivre la scolarité +des étudiants universitaires. Il est principalement utilisé dans les IUT, mais +aussi apprécié par plusieurs Écoles et Masters en France et à l'étranger. Il +fournit notamment: - - suivi précis de la progression des étudiants, évaluations formatives et certificatives; + - suivi précis de la progression des étudiants, évaluations formatives et + certificatives - saisie et gestion des notes; - aide à la décision pour les jurys; - listes des étudiants (groupes, trombinoscopes, bordereaux divers); - suivi de l'assiduité (saisie et visualisation des absences); - - tableaux de bords, rapports statistiques sur la formation (suivis de cohortes, ...) utiles pour l'évaluation et le suivi des formations; + - tableaux de bords, rapports statistiques sur la formation (suivis de + cohortes, ...) utiles pour l'évaluation et le suivi des formations; - édition des procès-verbaux, bulletins et autres documents liés à la scolarité. @@ -17,11 +22,17 @@ ScoDoc est un *logiciel libre*: vous pouvez [participer à son développement](C ScoDoc s'utilise sur un navigateur web standard: les utilisateurs n'ont rien à installer. Les établissements ou écoles doivent configurer un serveur: voir le [guide d'installation sur Debian 11](GuideInstallDebian11.md). La version ScoDoc 9 est -parue le 19 septembre 2021. +parue le 19 septembre 2021, la version 9.2 en avril 2022. Les mises à jour sont +appliquées régulièrement. -ScoDoc est utilisé dans de nombreux établissement français et étrangers, **dont au moins 58 IUT**: [liste des utilisateurs connus de ScoDoc](UtilisateursScoDoc.md). +ScoDoc est utilisé dans de nombreux établissement français et étrangers, **dont +au moins 58 IUT**: [liste des utilisateurs connus de +ScoDoc](UtilisateursScoDoc.md). -Depuis 2020, ScoDoc est soutenu par une [association à but non lucratif (1901)](AssociationScoDoc.md), à laquelle tous les départements ou établissements utilisateurs sont **invités à adhérer**. Bulletin d'adhésion à retourner à `Emmanuel.Viennet at gmail.com`. +Depuis 2020, ScoDoc est soutenu par une [association à but non lucratif +(1901)](AssociationScoDoc.md), à laquelle tous les départements ou +établissements utilisateurs sont **invités à adhérer**. Bulletin d'adhésion à +retourner à `Emmanuel.Viennet at gmail.com`. ## Présentation générale @@ -29,25 +40,26 @@ Depuis 2020, ScoDoc est soutenu par une [association à but non lucratif (1901)] - Quelques vidéos d'introduction sur YouTube - - Présentation au colloque du [CRI-IUT](https://www.criiut.fr/) en 2013: [diapos en pdf](papers/presScoDocCRIIUT2013.pdf) + - Ancienne présentation au colloque du [CRI-IUT](https://www.criiut.fr/) en 2013: [diapos en pdf](papers/presScoDocCRIIUT2013.pdf) - Un très ancien [article sur ScoDoc](papers/scodoc-reunion2007.pdf) ## Communauté d'utilisateurs - - Le discord des utilisateurs: assistance chat ou audio [rejoindre le salon](https://discord.gg/ybw6ugtFsZ) + - Le Discord des utilisateurs: assistance chat ou audio [rejoindre le salon](https://discord.gg/ybw6ugtFsZ) - [Listes de diffusion e-mail](ListesDeDiffusion.md) - Vous pouvez signaler ici des bugs ou déposer des suggestions d'amélioration via les "tickets": * [Liste des tickets en cours](https://scodoc.org/git/viennet/ScoDoc/issues) - * Déclarer un nouveau ticket: demander un compte sur la liste scodoc-devel (lien ci-dessus). + * Déclarer un nouveau ticket: demander un compte sur la liste `scodoc-devel` (lien ci-dessus). - [Contribuer à ScoDoc](Contribuer.md) ## Actualités -### Parution de ScoDoc 9.0 -Version majeure, avec une architecture logicielle complètement remaniée. Dans un -premier temps, ScoDoc 9 n'offre presque pas de nouvelles fonctions par rapport à -l'ancien ScoDoc 7, mais son code permet des évolutions plus aisées. +### Parution de ScoDoc 9 +Version majeure, avec une architecture logicielle complètement remaniée. Cette +version modernise l'infrastructure logicielle (maintenant basée sur Python +3/Flask/postgresql) et propose de nombreuses améliorations, notamment pour la +gestion du *[Bachelor Universitaire de Technologie (BUT)](BUT.md)*. ### Quatre stagiaires (printemps 2021) @@ -82,8 +94,19 @@ entente. ### Feuille de route (roadmap) Les prochaines versions de ScoDoc (*sous réserve !*): - - ScoDoc 9.0 : publiée le 19 sept. 2021, version complètement remaniée en - Python 3/Flask. + + - ScoDoc 9.3 : prévue en mai 2022 + - tenue des jurys BUT et exports Apogée + - gestion des parcours (pour la mise en place des semestre) + + + - ScoDoc 9.2 : publiée en avril 2022 nouvelles fonctionnalités liées au BUT + - référentiels de compétences Orébut + - capitalisation des UE dans le BUT + - bonus/malus locaux + - bulletins BUT pdf + - nouveau module de gestion relations avec les entreprises + - ScoDoc 9.1 : décembre 2021 gestion du bachelor (BUT) - type de formation BUT @@ -94,16 +117,8 @@ Les prochaines versions de ScoDoc (*sous réserve !*): - calcul des moyennes d'UE - bulletin de note v1 - - ScoDoc 9.2 : mars 2022 nouvelles fonctionnalités liées au BUT - - référentiels de compétences Orébut - - capitalisation des UE dans le BUT - - bonus/malus locaux - - bulletins BUT pdf - - nouveau module de gestion relations avec les entreprises - - - ScoDoc 9.3 : mai 2022 - - tenue des jurys BUT et exports Apogée - - gestion des parcours (pour la mise en place des semestre) + - ScoDoc 9.0 : publiée le 19 sept. 2021, version complètement remaniée en + Python 3/Flask.
From 5c4ebfdffa3461bb1bb3cca7e2022402c33cb4f6 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 24 Apr 2022 16:32:20 +0200 Subject: [PATCH 21/24] Material Theme + styles custom --- docs/assets/grenouille_bleue.png | Bin 0 -> 35044 bytes docs/assets/images/android-chrome-192x192.png | Bin 0 -> 9744 bytes docs/assets/images/android-chrome-512x512.png | Bin 0 -> 27250 bytes docs/assets/images/apple-touch-icon.png | Bin 0 -> 8887 bytes docs/assets/images/favicon-16x16.png | Bin 0 -> 502 bytes docs/assets/images/favicon-32x32.png | Bin 0 -> 1091 bytes docs/assets/images/favicon.png | Bin 0 -> 1091 bytes docs/stylesheets/extra.css | 28 ++++++++ mkdocs.yml | 65 +++++++++++------- 9 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 docs/assets/grenouille_bleue.png create mode 100755 docs/assets/images/android-chrome-192x192.png create mode 100755 docs/assets/images/android-chrome-512x512.png create mode 100755 docs/assets/images/apple-touch-icon.png create mode 100755 docs/assets/images/favicon-16x16.png create mode 100755 docs/assets/images/favicon-32x32.png create mode 100755 docs/assets/images/favicon.png create mode 100644 docs/stylesheets/extra.css diff --git a/docs/assets/grenouille_bleue.png b/docs/assets/grenouille_bleue.png new file mode 100644 index 0000000000000000000000000000000000000000..06746f952888727d60d600bcb7860c9da807cbe0 GIT binary patch literal 35044 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 z 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�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 m8NYv~?_YuUufTin3jBYr*JFkTHAL=@qw literal 0 HcmV?d00001 diff --git a/docs/assets/images/android-chrome-192x192.png b/docs/assets/images/android-chrome-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..24b79905ffb0e4755ba82f42beb1d26b5a9afa78 GIT binary patch literal 9744 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 Qq!&O|QbD3h%rM}80Ade#{Qv*} literal 0 HcmV?d00001 diff --git a/docs/assets/images/android-chrome-512x512.png b/docs/assets/images/android-chrome-512x512.png new file mode 100755 index 0000000000000000000000000000000000000000..df7b68d003a723076bbaafb0173e57b8b918b1b7 GIT binary patch literal 27250 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

pPT#=SiTP0jv@^)i*G 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

mM+L-+I8f5w<$rS6a0&$ zC(4_)%)d9M1u=iUR?n!UWZ>axJG_GbciJAB&OOKSr zH{+IA=0b|4Ije_^HigaQkA88jRlx$wg443FcrYd?S+Sg|hx|s>GT{)~B$AIYddDw(y*#oiviY5&!3rmy}jj%m#rHDdsN2xzi{ct(Rh^b2e-+_53} zQv89$`P)rW8Q#N?2NnIV-lx?xL_tHEq)sLI+_)blD;Naf$l=wNtu5jnJhtgn9@yv z!SNsBBH8vtcbeuvTz`MECJova?{l`uPk4HxsK}tSyh<#n%rrD;nkncHFu+`8ec5mj z25+y{T!fN4R>z8*xHX7mzfdoHG1>Xb9I|SyM7ZIC#bHaot4`BU3tCX2wDl>5=jEJK+%5efVA$3kl4~kro)>!{of?3WfLn5dGEos{V&^txxP|ynsOS4`wUba76Q7D!wG8j!sDaa-nAE!DKYO1eNYL7@1-N- ztcPqHP0io-2Wo$&ULlV?HvPhX3HK!+q{=>GFZ-?rd~I>g`o~|<=K^Yf{47V(eUt5K zWGWI429z^eABbxsSW=Scs?ef~9}F%E#%TfcfHJd*VTco6)%Dn>g#VwnPIxQ30|1Cl z|7ijKmtHWC+^ax}>F|nTBxiF={_Fi~?^**MBMQSLnKP}{1oeHC7m?6LUEek0Hh|%; z{bcQ3Qa~RFdKaYFJk_a4gvWjr?}rLdZYD59HAvz%G7|T#zfA&dZA93{spf#?7)>Wr zQAqHet0(>01nE3m-m@Y}5oeZ&hv_GAzcn^V4)T9g-wV6=10M9#h02N2M7DExW^gq7 z0@6njC_Q24jmDjC0Na-ZC^WWslbt+7JNT( zfo#z3MJNnCWOs@65(DRR_+7Q=$DE6o*j1B)QpoYgPQO_wj7GAPQ5y*#_gmtteF7GG z10;n}EZfzyzA+1Nu_D~YH}X4pejbI{cUq_+6&`bdC|vSh zTC^xeW$+?E5aGh9`bBkCejDhh)ZwV1ES>^ zTO^6UeBYSn^UqO-cy*!C#Hqp>X`$$>G2kc!OgWCXAp#~!x@&w9TjtxB13jQ7@wmEe&(+6st-^^$@imyB{+aOXO}24IQVHC9h8zwHN9Ve YQtcojfBf0FS3wFu4yr6&A!!uwKiQ7N$p8QV literal 0 HcmV?d00001 diff --git a/docs/assets/images/favicon-16x16.png b/docs/assets/images/favicon-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..da06df161a477f075a26216509dfe44e80f9b976 GIT binary patch literal 502 zcmV)(pZpY^_s4SYyaISSGgGog)!>zrBE2gCrg;#h`rjZ+!^@bEG4-?+q}ux38PCsl2*OCI@0gAEY4a*jc6^KynumEB+i zEONscj?GvPF+gF>0tTT=rx-q|Xfg<&JI-(|ua4oTkQjq`egwlCQ(J~VTs#c76AKuO ztJ4`iXzDX?J$uCP+{p(l2loQ=_pc1>@7^$cmy}`n&%_M2733|>mrohKNysoTFfoC} sK>S~Pf((B-xgcr=MM|VNGf|YC0a)O~Q=E;hSO5S307*qoM6N<$g1_I}LjV8( literal 0 HcmV?d00001 diff --git a/docs/assets/images/favicon-32x32.png b/docs/assets/images/favicon-32x32.png new file mode 100755 index 0000000000000000000000000000000000000000..46e39ffcc8a1922874bb40a3715c10810e7c72df GIT binary patch literal 1091 zcmV-J1ibr+P);_V44KAdGUXC-6O5}|B(5c%!`sel9(x7<3-J$re?HIid%oY__xpRE_kDzz z7|}$tohTC%LPe2TJb@4d+D1l5u1Y6f$f^_f3jzn90PZLVQ6yUU?xxuKq$+=ufk6o& zyIvG0qWTAzlLRIecsdnOba!A?e*;WR=yTREJk4(04vI_x#hp%;9SB8zDVM={E|?DV zp=xfRc|#DThdyK2X4?NwT>4goW$aG3;pvKP#dh}p0%xUjiD&V@4rIX`UgX^=F+%1n0{xCY!6uvERPDoDLa+A zH{YdF8_TfG^v720l<_(4iP7BHy^kUF9Ndy(=yP4nZ^=JMIdgx?WLeA}s&_>&;ONTC zD;Jrcol42!G@1go826PC5cGOnzf44v@-Zg5do%>?pzf_O1{_^vM5bRa#&?T1d07SA zS-Mi1b4fdjvbBk_$ipbQ+VS^smcW|*f{eLtNguKxHGy+^^^&EA81o)59qh*`D;1Zt zV<=m1(YPs?Ytc!P4TkUx-^SFQE(*TR9aABv%;R{(?%`C~0HT?hagCy@gV#LmDLt4% z{TsUp;x1(-*D3#&&|ACAaEdDeGx1+J-R1TsySIUwM4dtob#+kxa?#{4h z_09lPO%3FpF9$&mU`SNwoyB`+02h8Np=Zg8hZb}jEKqYf$Lg!b2a{ilw`P^yx;MscE?`IBjP2()-@H_U%p6f@LmMHjG%BoW6=^dcQYhO*s3)X*>>TG3)JN@L5L`JzY%g`;(gB zaDERvfH=j}Sk3&*<1CH;fGNXw(OD=NQJ7Ph^evrUKGGWVjy62s+m7L`==ShJ)zZja zTRV!6r1O`0j&YySr$7|3uCKzPy@h)!D|$80jk4rHw&~yiww0w)H9hXnGcr{%swXTP zYEZS@VraGl{Z0!<%|D%=<1t%%oCYTqm{efmpJo&OIGyO{`9H}U*^pv)3=RMQ002ov JPDHLkV1l-13u^!X literal 0 HcmV?d00001 diff --git a/docs/assets/images/favicon.png b/docs/assets/images/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..46e39ffcc8a1922874bb40a3715c10810e7c72df GIT binary patch literal 1091 zcmV-J1ibr+P);_V44KAdGUXC-6O5}|B(5c%!`sel9(x7<3-J$re?HIid%oY__xpRE_kDzz z7|}$tohTC%LPe2TJb@4d+D1l5u1Y6f$f^_f3jzn90PZLVQ6yUU?xxuKq$+=ufk6o& zyIvG0qWTAzlLRIecsdnOba!A?e*;WR=yTREJk4(04vI_x#hp%;9SB8zDVM={E|?DV zp=xfRc|#DThdyK2X4?NwT>4goW$aG3;pvKP#dh}p0%xUjiD&V@4rIX`UgX^=F+%1n0{xCY!6uvERPDoDLa+A zH{YdF8_TfG^v720l<_(4iP7BHy^kUF9Ndy(=yP4nZ^=JMIdgx?WLeA}s&_>&;ONTC zD;Jrcol42!G@1go826PC5cGOnzf44v@-Zg5do%>?pzf_O1{_^vM5bRa#&?T1d07SA zS-Mi1b4fdjvbBk_$ipbQ+VS^smcW|*f{eLtNguKxHGy+^^^&EA81o)59qh*`D;1Zt zV<=m1(YPs?Ytc!P4TkUx-^SFQE(*TR9aABv%;R{(?%`C~0HT?hagCy@gV#LmDLt4% z{TsUp;x1(-*D3#&&|ACAaEdDeGx1+J-R1TsySIUwM4dtob#+kxa?#{4h z_09lPO%3FpF9$&mU`SNwoyB`+02h8Np=Zg8hZb}jEKqYf$Lg!b2a{ilw`P^yx;MscE?`IBjP2()-@H_U%p6f@LmMHjG%BoW6=^dcQYhO*s3)X*>>TG3)JN@L5L`JzY%g`;(gB zaDERvfH=j}Sk3&*<1CH;fGNXw(OD=NQJ7Ph^evrUKGGWVjy62s+m7L`==ShJ)zZja zTRV!6r1O`0j&YySr$7|3uCKzPy@h)!D|$80jk4rHw&~yiww0w)H9hXnGcr{%swXTP zYEZS@VraGl{Z0!<%|D%=<1t%%oCYTqm{efmpJo&OIGyO{`9H}U*^pv)3=RMQ002ov JPDHLkV1l-13u^!X literal 0 HcmV?d00001 diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..fd7da62 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,28 @@ +div.md-sidebar--secondary, +div.md-sidebar--secondary div { + background-color: rgb(217, 217, 217); + border-radius: 8px; +} + +div.md-sidebar--secondary div.md-sidebar__scrollwrap { + margin-left: 0; + margin-right: 0; +} + +.md-content h1, +.md-content h2, +.md-content h3 { + margin-block-start: 0px; + margin-top: 0px; + margin-bottom: 0px; + font-weight: bold; +} + +.md-content ul { + margin-top: 0px; +} + +.md-content h3+p { + margin-block-start: 0px; + margin-top: 0px; +} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index b682a4b..eab9426 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,33 +1,45 @@ site_name: ScoDoc theme: - name: mkdocs + # name: mkdocs + name: material navigation_depth: 3 + features: + - navigation.tabs + - toc.follow + - navigation.top + palette: + primary: light blue + language: fr + logo: assets/images/android-chrome-192x192.png + +extra_css: + - stylesheets/extra.css nav: - - Documentation: - - 'Guide utilisateur': GuideUtilisateur.md - - 'Tutos vidéos': https://www.youtube.com/playlist?list=PLw49h6RbvswhasBk9bXj7PzOD8GDW3kG1 - - 'Responsables de formations': GuideAdminFormation.md - - 'FAQ': FAQ.md - - - Installation: - - 'Guide administration': GuideAdminSys.md - - 'Installation': GuideInstallDebian11.md - - 'Mises à jour': MisesAJour.md - - 'Interfaces SI': InterrogationPortail.md - - 'Publication des notes': PublicationEtudiants.md - - 'Export Apogée': ScoDocApogee.md + - Accueil: index.md + - Documentation: + - "Guide utilisateur": GuideUtilisateur.md + - "Tutos vidéos": https://www.youtube.com/playlist?list=PLw49h6RbvswhasBk9bXj7PzOD8GDW3kG1 + - "Responsables de formations": GuideAdminFormation.md + - "FAQ": FAQ.md - - Association: - - 'Association 1901': AssociationScoDoc.md - - 'Utilisateurs': UtilisateursScoDoc.md + - Installation: + - "Guide administration": GuideAdminSys.md + - "Installation": GuideInstallDebian11.md + - "Mises à jour": MisesAJour.md + - "Interfaces SI": InterrogationPortail.md + - "Publication des notes": PublicationEtudiants.md + - "Export Apogée": ScoDocApogee.md + + - Association: + - "Association 1901": AssociationScoDoc.md + - "Utilisateurs": UtilisateursScoDoc.md - Développement: - - 'Git': https://scodoc.org/git - - 'Guide Développeurs': GuideDeveloppeurs.md - - 'API (interfaçages autres logiciels)': ScoDoc9API.md - + - "Git": https://scodoc.org/git + - "Guide Développeurs": GuideDeveloppeurs.md + - "API (interfaçages autres logiciels)": ScoDoc9API.md - FAQ: FAQ.md @@ -35,7 +47,7 @@ nav: # Pour LaTex, juste faire pip install python-markdown-math # dans l'environnement choisi (mkdocs) -#extra_javascript: +#extra_javascript: # - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML extra_javascript: @@ -45,5 +57,12 @@ extra_javascript: markdown_extensions: - pymdownx.arithmatex: - generic: true + generic: true - footnotes + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format From edfd1266be8cb9fd4151f6f797b51c09e2f2dac6 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 24 Apr 2022 22:43:36 +0200 Subject: [PATCH 22/24] =?UTF-8?q?D=C3=A9tail=20ssur=20parcours=20BUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ModelisationParcoursBUT.md | 42 ++++++++++++++++++++++++++++----- docs/index.md | 11 ++++++++- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/docs/ModelisationParcoursBUT.md b/docs/ModelisationParcoursBUT.md index 022d11f..0ca7fde 100644 --- a/docs/ModelisationParcoursBUT.md +++ b/docs/ModelisationParcoursBUT.md @@ -45,12 +45,17 @@ tous les types de formation. La notion de "matière" n'est pas utilisée en BUT) - Formation (ex: "BUT R&T") - UniteEns (UE, ex: "Administrer les réseaux") - - Modules (ressources, SAÉs) *<-> ApcAppCritique* + - Modules (ressources, SAÉs) *<-> ApcAppCritique*, *<-> ApcParcours* On voit que les modules ont toujours une UE de rattachement. Cependant, en BUT, un module peut intervenir dans le calcul des notes de plusieurs UE, via une matrice de coefficients. +On va aussi rattacher les Modules à un ou plusieurs ApcParcours, de façon à +pouvoir vérifier que les parcours couvrent les AC, et à faciliter les +inscriptions des étudiants aux modules (par ex. page présentant les modules +auxquels inscrire un groupe). + ### Référentiel de compétences Le référentiel de compétences est structuré par les classes suivantes: @@ -89,11 +94,12 @@ Les étudiants sont inscrits: Pour la gestion des parcours BUT, il faut introduire les associations suivantes, qui n'existent pas dans ScoDoc 9.2: - - Module <-> ApcAppCritique : choix sur la page `module_edit` + - Module ||--o{ ApcAppCritique : choix sur la page `module_edit` + - Module <-> ensemble de ApcParcours - UE <-> ApcParcoursNiveauCompetence : choix sur la page `ue_edit` - - FormSemestre <-> ApcParcours : choix sur la page + - FormSemestre ||--o{ ApcParcours : choix sur la page `formsemestre_editwithmodules` - - Identite <-> ApcParcours : inscription au parcours, page à créer. + - Identite }o--o{ ApcParcours : inscription au parcours, page à créer. ### Cas d'usage @@ -119,9 +125,23 @@ annuels, mais que les ModuleImpl sont semestriels. #### Vérifier que les ModuleImpls d'un parcours couvrent l'ensemble de ses ACs -...ou du parcours d'un étudiant donné +##### En fin de formation, pour un étudiant -TBD +Soit un étudiant inscrit à un parcours. En fin de formation (S6), on peut +facilement vérifier que les AC ont été couverts: + + - Lister les ModuleImpl auxquels l'étudiant a été inscrit dans ses semestres + (S1 à S6); + - En déduire l'ensemble des AC évalués pour cet étudiant (indépendamment de sa + réussite); + - Comparer aux AC du parcours tels que décrits dans le référentiel de compétence. + +##### Au moment de la définition d'une formation + +Le parcours du ref. de compétence indique un ensemble d'AC pour chaque niveau (année). +On pourra vérifier que les Modules de chaque année suffisent à couvrir le +parcours. Mais si les Modules ne sont pas associés à un parcours, on ne peut pas +aller plus loin. #### Lister les regroupements d'UE d'un étudiant @@ -148,6 +168,16 @@ particuliers (décision de jury manuelle). - [x] aucun regroupement d'UE (niveau de compétence) de l'année < 8 /20 - [x] pour le passage en S5, avoir validé toutes les UE du BUT 1 (S1 et S2). +Il faut donc: + 1. Construire les regroupements d'UE et calculer la moyenne des moyennes d'UE + (a priori de même poids, cela n'est pas spécifié dans les textes). + + 2. Vérifier les conditions ci-dessus. + + 3. Pour le passage en S5, construire l'ensemble des semestres de formations + relevant du même référentiel de compétences dans lesquels a été inscrit + l'étudiant, et vérifier que les UE de S1 et S2 sont validées. + diff --git a/docs/index.md b/docs/index.md index 36b34d4..6238de2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -61,7 +61,16 @@ version modernise l'infrastructure logicielle (maintenant basée sur Python 3/Flask/postgresql) et propose de nombreuses améliorations, notamment pour la gestion du *[Bachelor Universitaire de Technologie (BUT)](BUT.md)*. -### Quatre stagiaires (printemps 2021) +### Contrats d'apprentissage + +Deux étudiants ont été recrutés (LP IUT Orléans, et IUT Villetaneuse): + + - développement d'une nouvelle API pour ScoDoc 9; + - développement d'un nouveau module de gestion des relations entreprises + (fichier, contacts, stages, alternance). + + +### Quatre stagiaires - version spéciale pour mobiles, développée par un stagiaire de l'association; - développements de tests unitaires et fonctionnels, par deux stagiaires, l'un From d020dbbe7308e821709be2e7607d2ac8b180d2f0 Mon Sep 17 00:00:00 2001 From: viennet Date: Sun, 24 Apr 2022 23:19:00 +0200 Subject: [PATCH 23/24] Correction Guide Config. --- docs/BUT.md | 12 +++++++++++- docs/GuideAdminSys.md | 3 ++- docs/GuideConfig.md | 32 ++++++++++++++++---------------- mkdocs.yml | 1 + 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/docs/BUT.md b/docs/BUT.md index 31f80e5..e831aba 100644 --- a/docs/BUT.md +++ b/docs/BUT.md @@ -1,5 +1,15 @@ -# Le BUT +# Le Bachelor Universitaire de Technologie (BUT) + +Formation en trois ans dispensées par les IUT français, introduite en 2021, et +basée sur une forme d'approche par compétences nécessitant un système +d'évaluation spécifique. + +Cette page décrit les principaux éléments du BUT utiles à comprendre pour le +gérer avec ScoDoc. Pour les curieux, la page +[modélisation des parcours BUT](ModelisationParcoursBUT.md) +donne quelques détails sur la façon dont ScoDoc organise les objets du BUT. + ## UE, modules, évaluations diff --git a/docs/GuideAdminSys.md b/docs/GuideAdminSys.md index 9f5e7fd..bd93574 100644 --- a/docs/GuideAdminSys.md +++ b/docs/GuideAdminSys.md @@ -19,8 +19,9 @@ Utilisez un **serveur virtuel** ou un container Docker si vous n'avez pas de mac ## Configuration et préférences + * [Administration en ligne de commande](GuideConfig.md) * [ConfigPermissions](ConfigPermissions.md) : description des permissions et rôles utilisés par le système. - * [ Paramétrage](PreferencesScoDoc.md): réglage des préférences + * [Paramétrage](PreferencesScoDoc.md): réglage des préférences ## Autres problèmes diff --git a/docs/GuideConfig.md b/docs/GuideConfig.md index 0e4e46e..24eff04 100644 --- a/docs/GuideConfig.md +++ b/docs/GuideConfig.md @@ -1,5 +1,5 @@ -# Prise en main et paramétrage de ScoDoc 9 +## Prise en main et paramétrage de ScoDoc 9 /!\ Cette page concerne la version ScoDoc 9, distribuée à partir de septembre 2021. @@ -8,7 +8,7 @@ Ce document suppose que le logiciel a été installé suivant la procédure déc [GuideInstallDebian11](GuideInstallDebian11.md). -# Administration en ligne de commande +## Administration en ligne de commande Les opérations d'administration se résument à la création de départements, et l'installation des logos, et la création d'utilisateurs "super admin", c'est à dire admin pour tous les @@ -31,21 +31,21 @@ Après quoi, vous pouvez utiliser les commandes décrites ci-dessous. *Attention: le lancement de chaque commande est assez long (quelques secondes) car toute l'application scodoc est initialisée à chaque fois.* -## Création d'un département +### Création d'un département flask create-dept DEPT où `DEPT` est l'acronyme du département, par exemple "RT". Ce département apparait immédiatement sur la page d'accueil. -## Suppression d'un département +### Suppression d'un département Opération très rarement nécessaire, proposée pour corriger une erreur immédiatement après la création. flask delete-dept DEPT -## Création d'un utilisateur +### Création d'un utilisateur Cette opération s'effectue en général depuis le logiciel, via un formulaire ou un import Excel. Pour créer un utilisateur depuis le terminal, lancer: @@ -54,7 +54,7 @@ ou un import Excel. Pour créer un utilisateur depuis le terminal, lancer: où `LOGIN` sera le pseudo de l'utilisateur (utilisé pour se connecter), et `ROLE` le rôle (`Ens`, `Secr`, `Admin`) dans le département `DEPT`. -## Création d'un super-administrateur +### Création d'un super-administrateur Il s'agit d'un utilisateur ayant tous les droits, comme s'il était `Admin` dans tous les départements. @@ -63,7 +63,7 @@ Il s'agit d'un utilisateur ayant tous les droits, comme s'il était où `admin2` est ici le pseudo du nouvel admin. -## Changement du mot de passe d'un utilisateur +### Changement du mot de passe d'un utilisateur Cette opération peut s'effectuer via la page de gestion web des utilisateurs, mais il est parfois commode de le faire depuis la console: @@ -73,7 +73,7 @@ console: où `LOGIN` est le pseudo de l'utilisateur. Le mot de passe est demandé sur la ligne de commande. -## Création d'un nouveau rôle +### Création d'un nouveau rôle flask create-role role_name [permissions...] @@ -81,13 +81,13 @@ Exemple: création d'une rôle "Observateur" ayant juste la permission de "voir" flask create-role Observateur ScoView -## Édition d'un rôle (ajout/retrait permissions) +### Édition d'un rôle (ajout/retrait permissions) flask edit-role [-a permission] [-r permission] role_name Ajoute ou retire une permission. -## Ajout/retrait d'un rôle à un utilisateur +### Ajout/retrait d'un rôle à un utilisateur flask user-role username [-d departement] [-a RoleAAjouter] [-r RoleARetirer] @@ -102,7 +102,7 @@ Si le département n'est pas spécifié, le rôle est donné dans *tous* les départements (utile pour certains compte administrateurs ou utilisés en lecture par des clients de l'API). -## Migration des données de ScoDoc 7 +### Migration des données de ScoDoc 7 Les données dans ScoDoc 9 ayant un format et une organisation très différents de ScoDoc 7, une étape de conversion (migration) est nécessaire. Elle est automatique mais prend du temps. @@ -112,14 +112,14 @@ Se reporter à [MigrationScoDoc7a9](MigrationScoDoc7a9.md) Ces commandes sont utilisées par le script de migration de ScoDoc 7 à ScoDoc 9. *Ne pas utiliser sauf si vous savez vraiment ce que vous faites.* -### Comptes utilisateurs +#### Comptes utilisateurs Toujours migrer les comptes utilisateurs avant d'importer les départements. flask import-scodoc7-users -### Départements +#### Départements Pour migrer un seul département: flask import-scodoc7-dept DEPT DBNAME @@ -128,7 +128,7 @@ Exemple: flask import-scodoc7-dept InfoComm DBINFOCOMM -## Liste des commandes Flask/ScoDoc +### Liste des commandes Flask/ScoDoc ``` Usage: app [OPTIONS] COMMAND [ARGS]... @@ -315,7 +315,7 @@ Options: (*la liste ci-dessus est générée à l'aide de la commande* `flask dumphelp`). -## Changement des logos apparaissant sur les documents +### Changement des logos apparaissant sur les documents *Note: après migration, vos logos de ScoDoc 7 sont installés dans ScoDoc 9*. @@ -338,7 +338,7 @@ Après quoi, redémarrez ScoDoc après avoir vidé les caches: sudo systemctl restart scodoc9 -# Utilisation via le Web +## Utilisation via le Web * Connectez-vous au site: `https://votre.site.fr/` diff --git a/mkdocs.yml b/mkdocs.yml index eab9426..7d4e759 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,6 +22,7 @@ nav: - "Guide utilisateur": GuideUtilisateur.md - "Tutos vidéos": https://www.youtube.com/playlist?list=PLw49h6RbvswhasBk9bXj7PzOD8GDW3kG1 - "Responsables de formations": GuideAdminFormation.md + - "Le BUT": BUT.md - "FAQ": FAQ.md - Installation: From f2b89431e4b064cd81032d70336f480242b02688 Mon Sep 17 00:00:00 2001 From: viennet Date: Tue, 26 Apr 2022 13:48:25 +0200 Subject: [PATCH 24/24] =?UTF-8?q?Ajouts=20d=C3=A9tails=20sur=20config.=20d?= =?UTF-8?q?'un=20utilisateur=20pour=20l'API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ScoDoc9API.md | 111 +++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 39 deletions(-) diff --git a/docs/ScoDoc9API.md b/docs/ScoDoc9API.md index 644e5c4..e0b8239 100644 --- a/docs/ScoDoc9API.md +++ b/docs/ScoDoc9API.md @@ -1,5 +1,5 @@ -# API pour ScoDoc 9 +## API pour ScoDoc 9 L'API ScoDoc permet à des applications tierces d'interroger ScoDoc. Elle offre un accès aux informations aux formats XML et JSON. La version ScoDoc 9 a introduit une nouvelle API avec un nouveau mécanisme d'authentification. @@ -24,45 +24,51 @@ Les objets ScoDoc manipulables sont identifiés par des id. L'URL complète est de la forme: `https://scodoc.example.com/ScoDoc/api/fonction`. -# Fonctions de l'API ScoDoc 7 portées en ScoDoc 9 +## Configuration de ScoDoc pour utiliser l'API -L'ancienne API ScoDoc 7 est décrite ici: [ScoDocAPI](ScoDocAPI.md) +Il est nécessaire de disposer d'un compte utilisateur avec les droits adéquats. -Afin de garantir l'interopérabilité avec les clients ScoDoc 7 (ENT, etc), les -fonctions suivantes sont disponibles avec le mécanisme d'authentification -basique de ScoDoc 7. Elles sont considérées comme *obsolètes* ("deprecated") et -disparaitront en juillet 2022. +En général, il est recommandé de créer un rôle, de lui attribuer les permissions +que l'on veut utiliser, puis de créer un utilisateur ayant ce rôle. -Certaines ont plusieurs "routes" (URl), car ScoDoc 7 tolérait divers accès. +En ligne de commande, cela peut se faire comme suit (voir détail des commandes +[sur le guide de configuration](GuideConfig.md)). - - `Absences/XMLgetBilletsEtud` (deviendra `api/absences/billets/etud/ etudid>`) - - `Absences/AddBilletAbsence` (deviendra `api/absences/billet/add`) - - `Absences/XMLgetAbsEtud` (deviendra `api/absences/ etudid>`, en json) - - `Notes/evaluation_listenotes` (non existante en ScoDoc9, trop complexe) - - `Notes/formsemestre_id` (deviendra `api/formsemestre`) - - `Notes/formsemestre_bulletinetud` (deviendra `api/etud//bul/`) - - `Notes/XMLgetFormsemestres` (non existante en ScoDoc9, redondant avec `api/formsemestre` ?) - - `etud_info` ou `XMLgetEtudInfos` ou `Absences/XMLgetEtudInfos` ou `Notes/XMLgetEtudInfos` (deviendra `/api/etud/`) - - `groups_view` (deviendra `groups`) +``` +# se connecter comme utilisateur scodoc +su - scodoc -Les routes ci-dessus s'entendent à partir de l'URL de base de votre ScoDoc, c'est -à dire `https://votre.site.fr/ScoDoc//Scolarite/`, et répondent en GET et -en POST. +# Créer un rôle +flask create-role LecteurAPI +# Lui donner les droits nécessaires: ici APIView +flask edit-role LecteurAPI -a APIView -Note: - - `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API. +# Créer un nouvel utilisateur avec ce rôle: +flask user-create lecteur_api LecteurAPI @all -# Fonctions d'API ScoDoc 9 (work in progress) +# Ou bien, si on veut utiliser un compte existant: +# associer notre rôle à un utilisateur +flask user-role lecteur_api -a LecteurAPI + + +# Au besoin, changer le mot de passe de l'utilisateur +# (on aura besoin de ce mot de passe dans la configuration du client d'API) +flask user-password lecteur_api +... +``` + +## Fonctions d'API ScoDoc 9 (work in progress) Basé sur le ticket [#149](https://scodoc.org/git/viennet/ScoDoc/issues/149) -La documentation ci-dessous concerne la **future** version De ScoDoc. +La documentation ci-dessous concerne la **future** version de ScoDoc (9.3, avec +parties expérimentales progressivement mises en production à partir de 9.2.12). -## Accès à l'API REST +### Accès à l'API REST Elle sera accessible à l'adresse: https://scodoc.monsite.tld/ScoDoc/api/fonction -### Authentification +#### Authentification Lors de votre authentification (_connection avec login et mdp_) à Scodoc, il vous sera attribué un jeton (token jwt _généré automatiquement_) vous permettant @@ -87,7 +93,7 @@ La réponse doit ressembler à ceci: Vous trouverez dans `/opt/scodoc/tests/api/exemple-api-basic.py` un exemple complet en python d'interrogation de l'API. -### Codes HTTP +#### Codes HTTP Chaque appel à l'API donne lieu à une réponse retournant un code spécifique en fonction du résultat obtenu. L'analyse de ce code vous permet de vous assurer que la requête a été traitée avec succès. @@ -105,7 +111,7 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ * [503](https://developer.mozilla.org/fr/docs/Web/HTTP/Status/503) : L'API est momentanément indisponible, réessayez dans quelques minutes. -## Départements +### Départements * **`departements`** * **Méthode:** GET * **Paramètres:** `viewable` (optionnel, si faux liste aussi les @@ -142,7 +148,7 @@ Tous les codes >= 400 indiquent que la requête n'a pas été traitée avec succ * XXX obtenir la liste des référentiels -## Etudiants +### Etudiants * **`etud_dept`** * **Méthode:** GET * **Paramètres:** `code_nip` @@ -452,7 +458,7 @@ formsemestre_id": "SEM12345", } ``` -## UE +### UE * **`UEs`** * **Méthode:** GET * **Paramètres:** `dept`, `̀semestre` @@ -463,7 +469,7 @@ formsemestre_id": "SEM12345", -## Semestres de formation +### Semestres de formation Les sessions de formation (dénommées "semestres" même si elles durent une année ou un mois) sont représentées par les `formsemestre`. * **`formsemestre`** @@ -493,7 +499,7 @@ Les sessions de formation (dénommées "semestres" même si elles durent une ann ] ``` -### Note sur les identifiants de sessions +#### Note sur les identifiants de sessions Le `session_id` peut être utilisé pour identifier de façon prévisible et (presque) unique une session dans un établissement, ce qui est utile notamment pour interfacer ScoDoc à d'autres logiciels (par exemple gestion d'emplois @@ -514,7 +520,7 @@ informations suivantes: **Exemple:** `INFO-DUT-FI-S1-2014` équivaut à un semestre S1 d'un DUT informatique de 2014 en formation initiale (FI) -## Modules de formation +### Modules de formation Les moduleimpl sont les modules d'un semestre, ou les ressources, ou les SAÉs. On peut récupérer soit un module par son id, soit la listes des modules d'un semestre. @@ -530,7 +536,7 @@ On peut récupérer soit un module par son id, soit la listes des modules d'un s -## Groupes et partitions +### Groupes et partitions L'ensemble des étudiants d'un semestre peut être réparti selon une ou plusieurs partitions (types de groupes). Chaque partition est constituée @@ -664,7 +670,7 @@ d'un nombre quelconque de groupes d'étudiants. TODO: à changer, passer les paramètres dans le corps de la requête -## Bulletins de notes +### Bulletins de notes * **`evaluations`** * **Méthode:** GET * **Paramètres:** `moduleimpl_id` @@ -702,7 +708,7 @@ d'un nombre quelconque de groupes d'étudiants. TODO vérifier et passer les valeurs dans le corps. -## Absences +### Absences **Remarques**, les dates sont au format iso `yyyy-mm-dd`. Les dates de fin ne sont pas incluses. Et `demi_journee`= 2 si journée complète, =1 si uniquement le matin, =0 si uniquement l'après-midi. @@ -762,7 +768,7 @@ d'un nombre quelconque de groupes d'étudiants. ] ``` -## Logos +### Logos * **`liste des logos globaux`** * **Méthode:** GET @@ -798,6 +804,33 @@ d'un nombre quelconque de groupes d'étudiants. * **Résultat :** l'image (format png ou jpg) +### En savoir plus +Voir exemples d'utilisation de l'API en Python, dans `tests/api/`. -## En savoir plus -Voir exemples d'utilisation de l'API en Python, dans `tests/api/`. \ No newline at end of file +## Fonctions de l'API ScoDoc 7 portées en ScoDoc 9 + +L'ancienne API ScoDoc 7 est décrite ici: [ScoDocAPI](ScoDocAPI.md) + +Afin de garantir l'interopérabilité avec les clients ScoDoc 7 (ENT, etc), les +fonctions suivantes sont disponibles avec le mécanisme d'authentification +basique de ScoDoc 7. Elles sont considérées comme *obsolètes* ("deprecated") et +disparaitront en juillet 2022. + +Certaines ont plusieurs "routes" (URl), car ScoDoc 7 tolérait divers accès. + + - `Absences/XMLgetBilletsEtud` (deviendra `api/absences/billets/etud/ etudid>`) + - `Absences/AddBilletAbsence` (deviendra `api/absences/billet/add`) + - `Absences/XMLgetAbsEtud` (deviendra `api/absences/ etudid>`, en json) + - `Notes/evaluation_listenotes` (non existante en ScoDoc9, trop complexe) + - `Notes/formsemestre_id` (deviendra `api/formsemestre`) + - `Notes/formsemestre_bulletinetud` (deviendra `api/etud//bul/`) + - `Notes/XMLgetFormsemestres` (non existante en ScoDoc9, redondant avec `api/formsemestre` ?) + - `etud_info` ou `XMLgetEtudInfos` ou `Absences/XMLgetEtudInfos` ou `Notes/XMLgetEtudInfos` (deviendra `/api/etud/`) + - `groups_view` (deviendra `groups`) + +Les routes ci-dessus s'entendent à partir de l'URL de base de votre ScoDoc, c'est +à dire `https://votre.site.fr/ScoDoc//Scolarite/`, et répondent en GET et +en POST. + +Note: + - `Absences/listeBillets` est un formulaire et ne fait pas partie de l'API.