diff --git a/patches.d/scribe-backend.patch b/patches.d/scribe-backend.patch index 418defc..60ef268 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..19ba7a1 100644 +index 69f3411..5e1c1cf 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..19ba7a1 100644 """ _type = 'personnels' profil = 'enseignant' -@@ -145,44 +145,40 @@ class Enseignant(User): +@@ -145,44 +145,41 @@ class Enseignant(User): rep = join(AD_HOME_PATH, login) # répertoire supérieur clear_acl(rep) @@ -142,17 +142,25 @@ index 69f3411..19ba7a1 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)) +- 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) @@ -175,7 +183,7 @@ index 69f3411..19ba7a1 100644 if not_empty(args, 'int_id'): datas.append((MOD_REPLACE, 'intid', args['int_id'] )) if not_empty(args, 'entpersonjointure'): -@@ -196,21 +192,21 @@ class Enseignant(User): +@@ -196,21 +193,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'])) @@ -297,10 +305,10 @@ index 45ec338..0ec3129 100644 else: raise Exception('Unknown mode') diff --git usr/lib/python3/dist-packages/scribe/eoleuser.py usr/lib/python3/dist-packages/scribe/eoleuser.py -index 05569fd..102044a 100644 +index 05569fd..b78c2e1 100644 --- usr/lib/python3/dist-packages/scribe/eoleuser.py +++ usr/lib/python3/dist-packages/scribe/eoleuser.py -@@ -361,23 +361,25 @@ class User(LdapEntry): +@@ -361,25 +361,27 @@ class User(LdapEntry): def _inscription(self, login, groupe, sync=True, etab=None, check_etab=True, touch=True): """ Inscription d'un utilisateur à un groupe @@ -318,7 +326,8 @@ index 05569fd..102044a 100644 + if not isinstance(etab, list): + etab = [etab] etabuser = etab - if etabgroup != etabuser: +- if etabgroup != etabuser: ++ if etabgroup not in etabuser: raise Exception("L'utilisateur {0} ne fait pas partie du même établissement que le groupe {1} : {2} - {3}".format(login, groupe, etabuser, etabgroup)) if not self.has_ftp: return True @@ -327,6 +336,8 @@ index 05569fd..102044a 100644 gtype = grp.c_get_group_type(groupe) if self.profil != 'eleve' and gtype in ['Classe', 'Niveau', 'Option']: # groupes réservés élèves + return True + if self.profil not in ['enseignant', 'administratif'] and gtype in ['Matiere', 'Equipe']: @@ -410,20 +412,32 @@ class User(LdapEntry): grp = Group() grp.ldap_admin = self.ldap_admin @@ -390,11 +401,40 @@ index 05569fd..102044a 100644 self._set_attr(login, 'LastUpdate', tool.format_current_date()) def _get_ead_type(self, login): +@@ -850,20 +864,27 @@ class User(LdapEntry): + return num_etab + + def get_user_dn(self, login, force_etab=None): + if LDAP_MODE == 'ad': + if self.ldap_admin.connexion is None: + self.ldap_admin.connect() + data = self.ldap_admin.connexion.search_s(SUFFIX, SCOPE_SUBTREE, + "(&%s(uid=%s))" % (USER_FILTER, login), ['cn']) + if data[0][0]: + return data[0][0] ++ elif LDAP_MODE == 'openldap': ++ if self.ldap_admin.connexion is None: ++ self.ldap_admin.connect() ++ data = self.ldap_admin.connexion.search_s(SUFFIX, SCOPE_SUBTREE, ++ "(&%s(uid=%s))" % (USER_FILTER, login), ['cn']) ++ if data[0][0]: ++ return data[0][0] + if force_etab is None: + etab = self.get_etab(login) + else: + etab = force_etab + return USER_DN % dict(uid=login, _type=self._type, etab=etab) + + class Machine(User): + """ + classe pour les comptes machine + """ diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py -index 34ce0fb..b1f1e31 100644 +index 34ce0fb..c61f65b 100644 --- usr/lib/python3/dist-packages/scribe/importation/writer.py +++ usr/lib/python3/dist-packages/scribe/importation/writer.py -@@ -836,21 +836,21 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): +@@ -835,22 +835,24 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False): + user : eoleuser.Enseignant() login : uid de l'utilisateur dans ldap administratif : personnel administratif avec un compte enseignant """ @@ -404,8 +444,11 @@ index 34ce0fb..b1f1e31 100644 # attention : des administratifs peuvent avoir un compte enseignant if isinstance(enseignant, Enseignant): old_etab = user.get_etab(login) - if old_etab != etab: +- 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: + user._change_etab(login, etab) for joint in enseignant.get_classes(): groups.append('profs-%s' % str(joint.classe.nom)) @@ -417,7 +460,7 @@ index 34ce0fb..b1f1e31 100644 groups.append('profs-%s' % str(option.nom)) disciplines = eval(enseignant.disciplines) else: -@@ -885,20 +885,21 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL +@@ -885,20 +887,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 @@ -439,7 +482,7 @@ index 34ce0fb..b1f1e31 100644 else: login = _enseignant_exists(enseignant, user) if login != '': -@@ -909,29 +910,31 @@ def write_enseignant(store, connexion, etab=None, current_ead_user=config.DEFAUL +@@ -909,29 +912,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