From c2b65bdff9e8ad766aac45e877d31d3bdff6c65b Mon Sep 17 00:00:00 2001 From: Benjamin Bohard Date: Tue, 2 Sep 2025 13:45:40 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9vision=20du=20changement=20d=E2=80=99?= =?UTF-8?q?=C3=A9tablissement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patches.d/scribe-backend.patch | 84 +++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/patches.d/scribe-backend.patch b/patches.d/scribe-backend.patch index a0e43d2..74c57aa 100644 --- a/patches.d/scribe-backend.patch +++ b/patches.d/scribe-backend.patch @@ -101,7 +101,7 @@ index 0db4982..889dc03 100755 nscd_start() log.del_lock() diff --git usr/lib/python3/dist-packages/scribe/enseignants.py usr/lib/python3/dist-packages/scribe/enseignants.py -index 69f3411..edfc210 100644 +index 69f3411..97cd0df 100644 --- usr/lib/python3/dist-packages/scribe/enseignants.py +++ usr/lib/python3/dist-packages/scribe/enseignants.py @@ -12,21 +12,21 @@ @@ -127,7 +127,7 @@ index 69f3411..edfc210 100644 """ _type = 'personnels' profil = 'enseignant' -@@ -145,38 +145,35 @@ class Enseignant(User): +@@ -145,38 +145,31 @@ class Enseignant(User): rep = join(AD_HOME_PATH, login) # répertoire supérieur clear_acl(rep) @@ -142,28 +142,20 @@ index 69f3411..edfc210 100644 + def _change_etab(self, user, new_etab): old_dn = self.get_user_dn(user) new_dn = self.get_user_dn(user, force_etab=new_etab) -- #copie de l'utilisateur + suppression -- uidfilter = "(&%s(uid=%s))" % (USER_FILTER, user) -- cur_ldif = self.ldap_admin._search_one(uidfilter) + #copie de l'utilisateur + suppression + uidfilter = "(&%s(uid=%s))" % (USER_FILTER, user) + cur_ldif = self.ldap_admin._search_one(uidfilter) - self._desinscription(user, old_etab, sync=False) - self._desinscription(user, 'profs-' + old_etab, sync=False) - for grp in self._get_user_groups(user, old_etab): - self._desinscription(user, grp, sync=False) -- self.ldap_admin._delete(old_dn) -- #Suppression du cache -- self.cache_etab['login'].pop(user) -- self.ldap_admin._add(new_dn, modlist.addModlist(cur_ldif)) -+ if new_dn != old_dn: -+ #copie de l'utilisateur + suppression -+ uidfilter = "(&%s(uid=%s))" % (USER_FILTER, user) -+ cur_ldif = self.ldap_admin._search_one(uidfilter) -+ self.ldap_admin._delete(old_dn) -+ #Suppression du cache -+ self.cache_etab['login'].pop(user) -+ self.ldap_admin._add(new_dn, modlist.addModlist(cur_ldif)) - #inscription dans le groupe du nouvel etablissement - self._inscription(user, new_etab, sync=False, etab=num_etab) - self._inscription(user, 'profs-' + new_etab, sync=False, etab=new_etab) + self.ldap_admin._delete(old_dn) + #Suppression du cache + self.cache_etab['login'].pop(user) + self.ldap_admin._add(new_dn, modlist.addModlist(cur_ldif)) +- #inscription dans le groupe du nouvel etablissement +- self._inscription(user, new_etab, sync=False, etab=num_etab) +- self._inscription(user, 'profs-' + new_etab, sync=False, etab=new_etab) - + @@ -176,7 +168,7 @@ index 69f3411..edfc210 100644 else: user_dn = self.get_user_dn(login) #USER_DN % dict(uid=login, _type=self._type) datas = [] -@@ -196,21 +193,21 @@ class Enseignant(User): +@@ -196,21 +189,21 @@ class Enseignant(User): datas.append((MOD_REPLACE, 'ENTAuxEnsCategoDiscipline', args['disciplines'])) datas.append((MOD_REPLACE, 'sn', args['nom'])) datas.append((MOD_REPLACE, 'givenName', args['prenom'])) @@ -200,7 +192,7 @@ index 69f3411..edfc210 100644 Mise à niveau d'un compte enseignant """ diff --git usr/lib/python3/dist-packages/scribe/eoleldap.py usr/lib/python3/dist-packages/scribe/eoleldap.py -index 45ec338..0ec3129 100644 +index 45ec338..dac52b3 100644 --- usr/lib/python3/dist-packages/scribe/eoleldap.py +++ usr/lib/python3/dist-packages/scribe/eoleldap.py @@ -8,21 +8,21 @@ @@ -262,7 +254,7 @@ index 45ec338..0ec3129 100644 users = [] res = self.ldap_admin._search("(&%s%s)" % (USER_FILTER, filtre), attrs) for user in res: -@@ -572,21 +570,29 @@ elif LDAP_MODE == 'openldap': +@@ -572,21 +570,31 @@ elif LDAP_MODE == 'openldap': récupère le numéro d'etab du cache ou requète LDAP """ if not SUPPORT_ETAB: @@ -280,6 +272,8 @@ index 45ec338..0ec3129 100644 + result = self.ldap_admin._search(ldap_filter, [attr])[0] + if _type == 'login': + etab = [cn[1]['cn'][0] for cn in self.ldap_admin._search(f'(&(objectClass=eolegroupe)(type=Etablissement)(memberUid={name}))', ['cn'])] ++ if not etab: ++ return None + else: + etab = [result[0].split(',ou=')[-3]] + if not multi_etabs: @@ -428,10 +422,34 @@ index 05569fd..f8b4ab3 100644 pass diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py -index 34ce0fb..c61f65b 100644 +index 34ce0fb..972053d 100644 --- usr/lib/python3/dist-packages/scribe/importation/writer.py +++ usr/lib/python3/dist-packages/scribe/importation/writer.py -@@ -835,22 +835,24 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): +@@ -6,21 +6,21 @@ + # eole@ac-dijon.fr + ########################################################################### + """ + écriture dans le ldap des données relationnelles + """ + from os.path import join + from creole.eosfunc import gen_random + from scribe.storage import Niveau, Classe, Eleve, Responsable, Enseignant, \ + Administratif, EnsClasse, Matiere, Groupe, JointureClasseEnseignant, \ + Service, Invite, JointureGroupeEleve, JointureGroupeEnseignant +-from scribe.ldapconf import CIVILITES, EOLE_AD, MIN_PASSWORD_CLASS, GROUP_PATH, LDAP_MODE, FORCED_PASSWORD_MODIFICATION_ALLOWED ++from scribe.ldapconf import CIVILITES, EOLE_AD, MIN_PASSWORD_CLASS, GROUP_PATH, LDAP_MODE, FORCED_PASSWORD_MODIFICATION_ALLOWED, num_etab + from scribe.eoletools import ok_groupe, gen_login, clean_date, \ + gen_strong_password, lsc_sync + from scribe.errors import BadLogin + from scribe.eolegroup import Group + from scribe.eoleshare import Share + from scribe.eleves import Eleve as LdapEleve + from scribe.responsables import Responsable as LdapResponsable + from scribe.enseignants import Enseignant as LdapEnseignant + from scribe.administratifs import Administratif as LdapAdministratif + from scribe.autres import Autre as LdapAutre +@@ -834,23 +834,28 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): + enseignant : store.Enseignant() user : eoleuser.Enseignant() login : uid de l'utilisateur dans ldap administratif : personnel administratif avec un compte enseignant @@ -441,13 +459,17 @@ index 34ce0fb..c61f65b 100644 groups = [] # attention : des administratifs peuvent avoir un compte enseignant if isinstance(enseignant, Enseignant): - old_etab = user.get_etab(login) +- old_etab = user.get_etab(login) - if old_etab != etab: - user._change_etab(login, old_etab, etab) -+ if old_etab is None: # l’utilisateur à été retiré de son dernier établissement mais pas purgé -+ user._inscription(login, etab) -+ elif old_etab != etab: ++ current_dn = user.get_user_dn(login) ++ new_dn = user.get_user_dn(login, force_etab=etab) ++ if current_dn != new_dn: + user._change_etab(login, etab) ++ #inscription dans le groupe du nouvel etablissement si nécessaire ++ if etab not in user.get_etab(user, multi_etabs=True): ++ user._inscription(user, etab, sync=False, etab=num_etab) ++ user._inscription(user, 'profs-' + etab, sync=False, etab=etab) for joint in enseignant.get_classes(): groups.append('profs-%s' % str(joint.classe.nom)) if joint.profprincipal: @@ -458,7 +480,7 @@ index 34ce0fb..c61f65b 100644 groups.append('profs-%s' % str(option.nom)) disciplines = eval(enseignant.disciplines) else: -@@ -885,20 +887,21 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL +@@ -885,20 +890,21 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL log.write_header(config.ENS_HEADER, config.ENS_INFO) user = LdapEnseignant() user.ldap_admin = connexion @@ -480,7 +502,7 @@ index 34ce0fb..c61f65b 100644 else: login = _enseignant_exists(enseignant, user) if login != '': -@@ -909,29 +912,31 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL +@@ -909,29 +915,31 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL if str(enseignant.nom) == '' or str(enseignant.prenom) == '': log.infolog("Enseignant n°%s invalide" % str(enseignant.int_id)) continue