Projet

Général

Profil

Tâche #37590

Scénario #36204: Ajout de fonctionnalités dans Edition Groupée EAD : changement de classe

etude

Ajouté par Ludwig Seys il y a environ un mois. Mis à jour il y a 12 jours.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Début:
01/10/2022
Echéance:
% réalisé:

100%

Restant à faire (heures):
0.0

Historique

#1 Mis à jour par Ludwig Seys il y a environ un mois

  • Statut changé de Nouveau à En cours

#2 Mis à jour par Ludwig Seys il y a environ un mois

Ajouter dans :

EAD → Gestion → Édition groupée → Utilisateurs

Le fonctionnement attendu doit s’inspirer de l’action existante : Inscrire ces utilisateurs à d'autres groupes avec les adaptations nécessaires pour :

- ne traiter que les élèves ;
- utiliser les fonctions backend existantes de changement de classe ;
- prendre en compte le mode multi-établissement ;
- éviter les synchronisations inutiles lors d'un traitement en masse ;
- ne pas modifier `scribe-backend` si les primitives existantes sont suffisantes.

Dépôt : ead
Paquet installé : eole-ead-server

Le fichier installé correspondant est : /usr/share/ead2/backend/actions/scribe/grouped_edition.py

La modification fonctionnelle devrait être réalisée principalement dans le dépôt ead.

Backend Scribe

Dépôt : scribe-backend
Paquet : eole-scribe-backend

Le backend contient notamment :

- scribe/eleves.py
- scribe/eoleuser.py
- scribe/eolegroup.py
- scribe/importation/writer.py

L'étude du dépôt montre que les fonctions nécessaires au changement de classe existent déjà.
À ce stade, aucune modification de `scribe-backend` ne semble nécessaire.

#3 Mis à jour par Ludwig Seys il y a environ un mois

Fonctionnement actuel de l'édition groupée EAD

Le point d'entrée est : ead/backend/actions/scribe/grouped_edition.py
La liste des formulaires acceptés est déclarée dans : form_result = Dict(...)

La validation est dispatchée dans : def _valid_form(self):

les action existantes sont utilisées comme modèle

Le bouton : => Inscrire ces utilisateurs à d'autres groupes est créé dans : ead/backend/actions/scribe/grouped_edition.py
dans : def _get_action_btns(self, num=''):
Le chargement du formulaire est assuré par : def _get_action_form(self, _type):

Formulaire « inscription à un groupe »

Le formulaire correspondant se trouve dans : ead/backend/actions/scribe/tool/grpedit.py
fonction : def get_inscription_form(server_nb, name, role):
Le nouveau changement de classe peut reprendre ce fonctionnement avec un nouveau formulaire.

Template EAD concerné

L'affichage des formulaires se trouve dans : ead/backend/template/scribe_edition.tmpl
Le formulaire d'inscription à un groupe est actuellement affiché à partir de : subscribe_to_group

Gestion des index des boutons

Les boutons de l'édition groupée sont actuellement indexés :

0 : inscription groupe
1 : quota
2 : domaine
3 : profil
4 : mot de passe
5 : shell
6 : rôle (administrateur uniquement)

Ces index sont utilisés par : ead/backend/actions/scribe/tool/grpedit.py
dans : get_toexec_links()

L'ajout du nouveau bouton devra donc prendre en compte ces index afin d'éviter des effets de bords.

Changement de classe individuel existant

Le changement de classe existe déjà dans l'édition individuelle d'un élève.

Fichier : ead/backend/actions/scribe/usermodify.py
Il n'est donc pas nécessaire de réimplémenter dans EAD les opérations LDAP/Samba associées à un changement de classe, surtout que l'existant gère déjà le mutli-établissement.

Backend de changement de classe

La fonction utilisée se trouve dans : scribe-backend/scribe/eleves.py
plus précisément : def _change_classe(self, user, new_classe, new_etab=None, sync=True):

Elle réalise déjà les opérations nécessaires.

Les attributs modifiés comprennent notamment :
- Divcod
- Meflcf
- ENTEleveClasses
- ENTEleveMEF
- ENTEleveLibelleMEF

Les désinscriptions sont effectuées via : self._desinscription(...)
et les inscriptions via : self._inscription(...)

La fonction est donc adaptée à la fonctionnalité demandée.

Comportement pour les utilisateurs non élèves

L'action doit concerner les élèves uniquement.
Une sélection EAD pouvant contenir plusieurs types d'utilisateurs, le comportement retenu est pour exemple :

20 utilisateurs sélectionnés |
+-- 17 élèves -> changement de classe |
+-- 3 non-élèves -> ignorés

Les utilisateurs non élèves ne doivent donc pas faire échouer l'ensemble du traitement.
L'identification peut être réalisée avec la classe déjà disponible : from scribe.eleves import Eleve.
Un message de résultat devra idéalement indiquer le nombre d'élèves modifiés et le nombre d'utilisateurs ignorés.

Si aucun élève n'est présent dans la sélection, l'opération devra retourner un message explicite plutôt qu'un faux succès.

Étude du mode multi-établissement

Le backend supporte explicitement le multi-établissement.
En multi-établissement, il faut en revanche éviter qu'un élève appartenant à un établissement secondaire soit traité implicitement avec l'établissement principal.

Protection existante contre les changements inter-établissements

Le backend contient déjà une vérification dans : scribe/eoleuser.py
fonction : _inscription(...)

En mode multi-établissement :

if SUPPORT_ETAB:
    etabgroup = self.get_etab_from_group(groupe)

    if check_etab:
        if etab is None:
            etabuser = self.get_etab(login)
        else:
            etabuser = etab

        if etabgroup != etabuser:
            raise Exception(...)

Une inscription dans un groupe ou une classe appartenant à un autre établissement est donc déjà détectée par le backend.

Traitement en masse déjà utilisé par Scribe

Le backend d'importation des élèves fournit déjà un exemple de traitement massif.
Fichier : scribe-backend/scribe/importation/writer.py
Lors d'un changement de classe :

user._change_classe(
    login,
    classe,
    etab,
    sync=False
)

Puis, lorsque tous les élèves ont été traités :

for login in userlist:
    user._gen_ftpdir(login)
    user._gen_groupesdir(login)

Le backend lui-même montre donc que le mode : sync=False est prévu pour les traitements en masse.
Cette approche semble adaptée à l'édition groupée EAD.

Fichiers EAD à modifier

Les modifications devraient rester limitées principalement à trois fichiers.

backend/actions/scribe/grouped_edition.py
backend/actions/scribe/tool/grpedit.py
backend/template/scribe_edition.tmpl

Fichiers étudiés mais ne nécessitant a priori pas de modification

Dépôt `scribe-backend` :

- scribe/eleves.py
- scribe/eoleuser.py
- scribe/eolegroup.py
- scribe/importation/writer.py
- scribe/ldapconf.py

Ces fichiers fournissent :

- `_change_classe()` ;
- `_inscription()` ;
- `_desinscription()` ;
- `get_etab()` ;
- `get_etab_from_group()` ;
- `get_classes(etab=...)` ;
- les protections inter-établissements ;
- le fonctionnement `sync=False` pour les traitements massifs.

Aucune modification de ce dépôt n'est actuellement identifiée comme nécessaire.

#4 Mis à jour par Ludwig Seys il y a environ un mois

  • Statut changé de En cours à Résolu

#5 Mis à jour par Joël Cuissinat il y a 16 jours

  • Statut changé de Résolu à Fermé
  • % réalisé changé de 0 à 100
  • Restant à faire (heures) mis à 0.0

Très belle étude ;)

Formats disponibles : Atom PDF