Recherche des doublons limitée à l’établissement
This commit is contained in:
@ -71,6 +71,148 @@ index 0db4982..290d66e 100755
|
||||
log.debuglog("Démarrage de LSC...", title=True)
|
||||
nscd_start()
|
||||
log.del_lock()
|
||||
diff --git usr/lib/python3/dist-packages/scribe/eoleldap.py usr/lib/python3/dist-packages/scribe/eoleldap.py
|
||||
index 45ec338..9b80f82 100644
|
||||
--- usr/lib/python3/dist-packages/scribe/eoleldap.py
|
||||
+++ usr/lib/python3/dist-packages/scribe/eoleldap.py
|
||||
@@ -8,21 +8,21 @@
|
||||
# eoleldap.py
|
||||
#
|
||||
# librairie pour la connexion à un serveur ldap
|
||||
#
|
||||
###########################################################################
|
||||
"""
|
||||
Librairie Ldap pour Scribe
|
||||
"""
|
||||
import sys
|
||||
from .ldapconf import SUFFIX, ROOT_DN, USER_FILTER, GROUP_FILTER, SHARE_FILTER, \
|
||||
- SUPPORT_ETAB, ldap_server, ldap_passwd, num_etab, BRANCHE_GROUP_ETAB, LDAP_MODE, acad
|
||||
+ SUPPORT_ETAB, ldap_server, ldap_passwd, num_etab, BRANCHE_GROUP_ETAB, BRANCHE_ETAB, LDAP_MODE, acad
|
||||
from scribe.errors import LdapExistingGroup, LdapExistingUser, \
|
||||
SystemExistingUser, NiveauNotFound
|
||||
from .eoletools import to_list
|
||||
import ldap
|
||||
from ldap import SCOPE_ONELEVEL
|
||||
|
||||
|
||||
def is_system_user(user):
|
||||
"""
|
||||
indique si le login proposé est déjà un utilisateur système
|
||||
@@ -120,60 +120,68 @@ class _Ldap(object):
|
||||
class _LdapEntry(object):
|
||||
"""
|
||||
classe de base pour gérer les entrées ldap
|
||||
"""
|
||||
def __init__(self, serveur=None, passwd=None):
|
||||
self.serveur = serveur
|
||||
self.passwd = passwd
|
||||
self.ldap_admin = Ldap(serveur, passwd)
|
||||
self.cache_etab = {'login': {}, 'group': {}}
|
||||
|
||||
- def _is_group(self, name):
|
||||
+ def _is_group(self, name, etab=None):
|
||||
"""
|
||||
test si le groupe existe dans l'annuaire
|
||||
"""
|
||||
cnfilter = "(&%s(cn=%s))" % (GROUP_FILTER, name)
|
||||
- if self.ldap_admin._search_one(cnfilter):
|
||||
+ if etab:
|
||||
+ branche_etab = BRANCHE_ETAB % {'etab': etab}
|
||||
+ else:
|
||||
+ branche_etab = None
|
||||
+ if self.ldap_admin._search_one(cnfilter, suffix=branche_etab):
|
||||
return True
|
||||
return False
|
||||
|
||||
- def _is_user(self, name):
|
||||
+ def _is_user(self, name, etab=None):
|
||||
"""
|
||||
test si l'utilisateur existe dans l'annuaire
|
||||
"""
|
||||
uidfilter = "(&%s(uid=%s))" % (USER_FILTER, name)
|
||||
- if self.ldap_admin._search_one(uidfilter):
|
||||
+ if etab:
|
||||
+ branche_etab = BRANCHE_ETAB % {'etab': etab}
|
||||
+ else:
|
||||
+ branche_etab = None
|
||||
+ if self.ldap_admin._search_one(uidfilter, suffix=branche_etab):
|
||||
return True
|
||||
return False
|
||||
|
||||
def _is_share(self, name):
|
||||
"""
|
||||
test si le partage existe dans l'annuaire
|
||||
"""
|
||||
shfilter = "(&%s(sambaShareName=%s))" % (SHARE_FILTER, name)
|
||||
if self.ldap_admin._search_one(shfilter):
|
||||
return True
|
||||
return False
|
||||
|
||||
def is_available_name(self, name):
|
||||
self.ldap_admin.connect()
|
||||
res = self._is_available_name(name)
|
||||
self.ldap_admin.close()
|
||||
return res
|
||||
|
||||
- def _is_available_name(self, name):
|
||||
+ def _is_available_name(self, name, etab=None):
|
||||
"""
|
||||
teste la disponibilité d'un uid ou un cn
|
||||
"""
|
||||
- if self._is_group(name):
|
||||
+ if self._is_group(name, etab=etab):
|
||||
return False
|
||||
- elif self._is_user(name):
|
||||
+ elif self._is_user(name, etab=etab):
|
||||
return False
|
||||
elif is_system_user(name):
|
||||
return False
|
||||
return True
|
||||
|
||||
def _test_available_name(self, name):
|
||||
"""
|
||||
Test la disponibilité d'un nom
|
||||
raise une exception si pas disponible
|
||||
"""
|
||||
diff --git usr/lib/python3/dist-packages/scribe/eoleuser.py usr/lib/python3/dist-packages/scribe/eoleuser.py
|
||||
index 05569fd..7a8d46c 100644
|
||||
--- usr/lib/python3/dist-packages/scribe/eoleuser.py
|
||||
+++ usr/lib/python3/dist-packages/scribe/eoleuser.py
|
||||
@@ -536,31 +536,32 @@ class User(LdapEntry):
|
||||
data = [((MOD_REPLACE, attribut, value))]
|
||||
self.ldap_admin._modify(user_dn, data)
|
||||
|
||||
def delete(self, login, remove_data=False, delete_resp=False):
|
||||
"""
|
||||
supprime un utilisateur
|
||||
"""
|
||||
self._delete(login, remove_data=remove_data, need_connect=True,
|
||||
delete_resp=delete_resp)
|
||||
|
||||
- def _delete(self, login, remove_data=False, need_connect=False, delete_resp=False):
|
||||
+ def _delete(self, login, remove_data=False, need_connect=False, delete_resp=False, etab=None):
|
||||
"""
|
||||
supprime un utilisateur
|
||||
"""
|
||||
if self.has_samba:
|
||||
quota.set_quota(login, '0')
|
||||
if remove_data:
|
||||
cmd = ['/usr/sbin/smbldap-userdel', '-r', login]
|
||||
else:
|
||||
cmd = ['/usr/sbin/smbldap-userdel', login]
|
||||
- etab = self.get_etab(login)
|
||||
+ if etab is None:
|
||||
+ etab = self.get_etab(login)
|
||||
force_dn = {'groupsdn="ou=local,ou=Groupes,${etab},${suffix}"':
|
||||
'groupsdn="${suffix}"'}
|
||||
tool.launch_smbldap_tool(cmd, num_etab, etab, force_dn=force_dn)
|
||||
# gestion des données résiduelles
|
||||
if remove_data:
|
||||
ad_user_dir = join(AD_HOME_PATH, login)
|
||||
rmtree(ad_user_dir, ignore_errors=True)
|
||||
perso = join(HOME_PATH, login[0], login)
|
||||
# code uniquement pour AmonEcole (#33013)
|
||||
if islink(perso):
|
||||
diff --git usr/lib/python3/dist-packages/scribe/importation/preferences.py usr/lib/python3/dist-packages/scribe/importation/preferences.py
|
||||
index fdcb142..fe11e3b 100644
|
||||
--- usr/lib/python3/dist-packages/scribe/importation/preferences.py
|
||||
@ -123,9 +265,77 @@ index fdcb142..fe11e3b 100644
|
||||
|
||||
def get_administratifs_prefs():
|
||||
diff --git usr/lib/python3/dist-packages/scribe/importation/writer.py usr/lib/python3/dist-packages/scribe/importation/writer.py
|
||||
index 34ce0fb..40865d5 100644
|
||||
index 34ce0fb..08716e0 100644
|
||||
--- usr/lib/python3/dist-packages/scribe/importation/writer.py
|
||||
+++ usr/lib/python3/dist-packages/scribe/importation/writer.py
|
||||
@@ -58,37 +58,37 @@ def _gen_mail(pref, mail):
|
||||
"""
|
||||
if pref.startswith('perso') and '@' in mail:
|
||||
return mail
|
||||
elif 'internet' in pref:
|
||||
return 'internet'
|
||||
elif 'restreint' in pref:
|
||||
return 'restreint'
|
||||
else:
|
||||
return ''
|
||||
|
||||
-def _gen_new_login(user, pref, prenom='', nom='', force_login=''):
|
||||
+def _gen_new_login(user, pref, prenom='', nom='', force_login='', etab=None):
|
||||
"""
|
||||
génération d'un login unique
|
||||
@user : objet compatible LdapUser()
|
||||
@pref : standard/pnom/nomp/p.nnn/prenom.n
|
||||
@prenom : prénom de l'utilisateur
|
||||
@nom : nom de l'utilisateur
|
||||
@force_login : login forcé
|
||||
"""
|
||||
if force_login != '':
|
||||
login = base_login = force_login
|
||||
else:
|
||||
login = base_login = gen_login(pref, prenom, nom)
|
||||
num = 1
|
||||
# vérification de la disponibilité de l'identifiant
|
||||
# si non disponible, il est suffixé d'un numéro
|
||||
- while not user._is_available_name(login):
|
||||
+ while not user._is_available_name(login, etab=etab):
|
||||
login = "%s%d" % (base_login, num)
|
||||
num += 1
|
||||
if login == '' or login.isdigit():
|
||||
raise BadLogin("""Login "%s" invalide""" % login)
|
||||
return login
|
||||
|
||||
def _sync_passwords(user, new_passwords, change_pwd=False):
|
||||
"""
|
||||
synchronisation des mots de passe
|
||||
@user : objet compatible LdapUser()
|
||||
@@ -769,25 +769,25 @@ def write_responsable(store, connexion, current_ead_user=config.DEFAULT_USER):
|
||||
# -------------------- enseignants -------------------- #
|
||||
|
||||
def _new_enseignant(enseignant, user, prefs, etab=None, new_passwords=[]):
|
||||
"""
|
||||
traitement d'un nouveau enseignant (création)
|
||||
enseignant : store.Enseignant()
|
||||
user : eoleuser.Enseignant()
|
||||
"""
|
||||
if enseignant.force_login:
|
||||
login = _gen_new_login(user, prefs.get_default('login'),
|
||||
- force_login=str(enseignant.force_login))
|
||||
+ force_login=str(enseignant.force_login), etab=etab)
|
||||
else:
|
||||
login = _gen_new_login(user, prefs.get_default('login'),
|
||||
str(enseignant.prenom),
|
||||
- str(enseignant.nom))
|
||||
+ str(enseignant.nom), etab=etab)
|
||||
if enseignant.force_password:
|
||||
password = str(enseignant.force_password)
|
||||
else:
|
||||
password = _gen_password(prefs.get_default('gen_pwd'), str(enseignant.date))
|
||||
log.log.debug("nouvel enseignant : %s" % login)
|
||||
classe = []
|
||||
groups = []
|
||||
for joint in enseignant.get_classes():
|
||||
groups.append('profs-%s' % str(joint.classe.nom))
|
||||
if joint.profprincipal:
|
||||
@@ -834,23 +834,20 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False):
|
||||
enseignant : store.Enseignant()
|
||||
user : eoleuser.Enseignant()
|
||||
@ -150,7 +360,7 @@ index 34ce0fb..40865d5 100644
|
||||
groups.append('profs-%s' % str(option.nom))
|
||||
disciplines = eval(enseignant.disciplines)
|
||||
else:
|
||||
@@ -874,64 +871,70 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False):
|
||||
@@ -874,64 +871,67 @@ def _maj_enseignant(enseignant, user, login, etab, administratif=False):
|
||||
else:
|
||||
info = "%s;%s;%s;%s" % (str(enseignant.nom), str(enseignant.prenom),
|
||||
login, ATTRIB)
|
||||
@ -207,9 +417,6 @@ index 34ce0fb..40865d5 100644
|
||||
_sync_passwords(user, new_passwords, change_pwd=change_pwd)
|
||||
_create_dirs(user, quota, new_passwords)
|
||||
log.infolog("TOTAL : %d enseignants" % num)
|
||||
+ # write unmodified users list
|
||||
+ # filtrer les enseignants avec LastUpdate plus vieux que le début de l’import et vérifier qu’ils ne sont pas dans store.query(Enseignant) ?
|
||||
+ #user.ldap_admin._search(PROF_FILTER, attrlist=['uid'], suffix=branche_etab % {'etab': etab})
|
||||
if num != 0:
|
||||
log.copy_info(config.ENS_INFO, user=current_ead_user)
|
||||
+ return logins
|
||||
@ -223,7 +430,7 @@ index 34ce0fb..40865d5 100644
|
||||
administratif : store.Administratif()
|
||||
user : eoleuser.Administratif()
|
||||
"""
|
||||
@@ -1020,21 +1023,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF
|
||||
@@ -1020,21 +1020,21 @@ def write_administratif(store, connexion, etab=None, current_ead_user=config.DEF
|
||||
if user._is_administratif(str(administratif.force_login)):
|
||||
login = str(administratif.force_login)
|
||||
else:
|
||||
|
Reference in New Issue
Block a user